teamix-evo 0.3.1 → 0.4.1
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/README.md +32 -31
- package/dist/core/index.d.ts +71 -29
- package/dist/core/index.js +357 -255
- package/dist/core/index.js.map +1 -1
- package/dist/index.js +1394 -480
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/design-init.ts","../src/utils/fs.ts","../src/utils/logger.ts","../src/utils/hash.ts","../src/core/design-pack-classify.ts","../src/core/state.ts","../src/core/skills-client.ts","../src/core/skills-installer.ts","../src/utils/template.ts","../src/utils/path.ts","../src/core/skills-add.ts","../src/commands/design/update.ts","../src/commands/design/list.ts","../src/commands/design/list-variants.ts","../src/commands/design/uninstall.ts","../src/commands/skills/index.ts","../src/commands/skills/add.ts","../src/utils/global-root.ts","../src/commands/skills/list.ts","../src/commands/skills/update.ts","../src/commands/skills/uninstall.ts","../src/commands/skills/sync.ts","../src/core/skills-sync.ts","../src/commands/skills/doctor.ts","../src/core/skills-doctor.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","../src/commands/biz-ui/index.ts","../src/commands/biz-ui/add.ts","../src/core/variant-ui-add.ts","../src/commands/biz-ui/list-variants.ts","../src/commands/templates/index.ts","../src/commands/templates/add.ts","../src/commands/templates/list-variants.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';\nimport { bizUiCommand } from './commands/biz-ui/index.js';\nimport { templatesCommand } from './commands/templates/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);\nprogram.addCommand(bizUiCommand);\nprogram.addCommand(templatesCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\nimport { updateCommand } from './update.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.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(listVariantsCommand);\ndesignCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runDesignInit } from '../../core/design-init.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const initCommand = new Command('init')\n .description('初始化设计体系资源(必须显式指定业务变体)')\n .argument('<variant>', '业务变体名称(如 \"opentrek\"、\"uni-manager\")')\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 logger.info(`Loading variant \"${variant}\"...`);\n logger.info('Installing resources...');\n\n const result = await runDesignInit({\n projectRoot,\n variant,\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} (${result.variant} v${result.version})`,\n );\n logger.info(` Variant: ${result.variant}`);\n logger.info(` Tailwind: v4`);\n logger.info(` Resources: ${result.count} files installed`);\n logger.info(\n ` Merge: ${result.merge.overrides.length} overrides / ${result.merge.variantAdds.length} variant-only / ${result.merge.defaultPassThrough.length} default-passthrough`,\n );\n if (result.skills) {\n const { addedSkillIds, skippedSkillIds, missing } = result.skills;\n if (addedSkillIds.length > 0) {\n logger.info(\n ` Skills: auto-installed ${addedSkillIds.join(', ')}`,\n );\n }\n if (skippedSkillIds.length > 0) {\n logger.info(\n ` Skills: already installed (skipped) ${skippedSkillIds.join(', ')}`,\n );\n }\n if (missing.length > 0) {\n logger.info(\n ` Skills: not in manifest (skipped) ${missing.join(', ')}`,\n );\n }\n }\n logger.info('');\n logger.info('Run \"teamix-evo design update\" to update resources later.');\n logger.info(\n 'Run \"teamix-evo design list-variants\" to see all available variants.',\n );\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","/**\n * Programmatic design init — walk-and-merge per ADR 0010.\n *\n * Replaces the old VariantManifest + explicit-resource model\n * (loadVariantData / installResources) with the new file-level override\n * model: walk `default/` + `variants/<name>/`, merge by file path, classify\n * each file by pack-relative path, write to consumer.\n *\n * See [ADR 0010](../../../../docs/adr/0010-design-default-and-variants.md).\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport {\n loadDesignPack,\n loadDesignPackageManifest,\n mergeDefaultAndVariant,\n type MergedFileEntry,\n type DesignPackLock,\n type InstalledManifest,\n type InstalledResource,\n type ProjectConfig,\n type UpdateStrategy,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { classifyPackFile } from './design-pack-classify.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n writeInstalledManifest,\n} from './state.js';\nimport { runSkillsAdd } from './skills-add.js';\nimport { loadSkillsData } from './skills-client.js';\nimport { logger } from '../utils/logger.js';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\n\nconst BASELINE_DESIGN_RULES_SKILL = 'teamix-evo-design-rules';\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst DEFAULT_AUTO_SKILL_IDES: SkillIde[] = ['qoder', 'claude'];\nconst DEFAULT_AUTO_SKILL_SCOPE: SkillScope = 'project';\n\nconst DEFAULT_DESIGN_PACKAGE = '@teamix-evo/design';\n\nconst require = createRequire(import.meta.url);\n\nexport interface RunDesignInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Design variant id (e.g. `\"opentrek\"`, `\"uni-manager\"`). */\n variant: string;\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 * Override resolution of the design package root. When provided, skips\n * `require.resolve(\"<packageName>/package.json\")`. Useful for tests that\n * want to point at a fixture tree, and for embedding inside `create`\n * where the package may not yet be installed in the consumer.\n */\n packageRoot?: string;\n}\n\n/**\n * Outcome of the post-init skill auto-install step. `attempted` lists the skill\n * ids we tried to install (baseline + variant overlay); `addedSkillIds` is what\n * was actually installed (the rest were already present); `missing` lists skill\n * ids that aren't in the manifest (warned, not fatal).\n */\nexport interface SkillsAutoInstallResult {\n attempted: string[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n missing: string[];\n}\n\nexport type RunDesignInitResult =\n | {\n status: 'installed';\n packageName: string;\n variant: string;\n version: string;\n count: number;\n resources: InstalledResource[];\n /** Per ADR 0010 §4 diagnostics. */\n merge: {\n overrides: string[];\n variantAdds: string[];\n defaultPassThrough: string[];\n };\n /** Result of the auto-install of baseline + variant design-rules skills. */\n skills?: SkillsAutoInstallResult;\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 * - Walks `default/` + `variants/<variant>/`, classifies each file by path\n * convention, writes to consumer (skipping `frozen` files that already exist)\n * - Writes `pack.lock.json`, `config.json`, `manifest.json` (installed)\n *\n * No interactive prompts, no `process.exit`. Throws on hard failure (P8).\n */\nexport async function runDesignInit(\n options: RunDesignInitOptions,\n): Promise<RunDesignInitResult> {\n const { projectRoot, variant, ide } = options;\n const packageName = options.packageName ?? DEFAULT_DESIGN_PACKAGE;\n\n await ensureTeamixDir(projectRoot);\n\n // Refuse to clobber an existing design install. Consumer should use\n // `design upgrade` (future) or manually clean .teamix-evo/.\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 packageRoot = options.packageRoot ?? resolveDesignPackageRoot(packageName);\n\n // Validate top-level catalog (also surfaces variant existence in error msg).\n const catalog = await loadDesignPackageManifest(packageRoot);\n const variantEntry = catalog.variants.find((v) => v.name === variant);\n if (!variantEntry) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Design variant not found: \"${variant}\". Known variants: ${known || '(none)'}. Hint: run \"teamix-evo design list-variants\" to see all.`,\n );\n }\n\n const defaultDir = path.join(packageRoot, 'default');\n const variantDir = path.join(packageRoot, 'variants', variant);\n\n // Validate both packs (catches malformed pack.json early — P8).\n const defaultPack = await loadDesignPack(defaultDir);\n const variantPack = await loadDesignPack(variantDir);\n\n // Walk + merge per ADR 0010 §4.\n const merge = await mergeDefaultAndVariant(defaultDir, variantDir);\n\n // Install each merged file according to its classified target & strategy.\n const installed: InstalledResource[] = [];\n for (const file of merge.files) {\n const result = await installPackFile(file, projectRoot);\n if (result) installed.push(result);\n }\n\n // Write consumer-side state files.\n const lock: DesignPackLock = {\n schemaVersion: 1,\n default: { version: defaultPack.version, from: packageName },\n variant: {\n name: variantPack.name,\n displayName: variantPack.displayName,\n version: variantPack.version,\n from: packageName,\n },\n linked: variantPack.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'design', 'pack.lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\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: variantPack.version,\n tailwind: 'v4',\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: variantPack.version,\n installedAt: new Date().toISOString(),\n resources: installed,\n },\n ],\n };\n await writeInstalledManifest(projectRoot, installedManifest);\n\n // After design lock + manifest are persisted, auto-install matching skills.\n // Failures here do NOT roll back the design install — the skill layer is\n // additive, and the user can always re-run `skills add` manually.\n const skills = await tryAutoInstallVariantSkills({\n projectRoot,\n variant,\n ide,\n });\n\n return {\n status: 'installed',\n packageName,\n variant,\n version: variantPack.version,\n count: installed.length,\n resources: installed,\n merge: {\n overrides: merge.overrides,\n variantAdds: merge.variantAdds,\n defaultPassThrough: merge.defaultPassThrough,\n },\n skills,\n };\n}\n\n/**\n * Auto-install the baseline `teamix-evo-design-rules` skill plus the variant\n * overlay `teamix-evo-design-rules-<variant>` (if present in the skills\n * manifest). Missing variant skills produce a warning but do not fail.\n */\nasync function tryAutoInstallVariantSkills(args: {\n projectRoot: string;\n variant: string;\n ide: string;\n}): Promise<SkillsAutoInstallResult> {\n const { projectRoot, variant, ide } = args;\n const variantSkillId = `${BASELINE_DESIGN_RULES_SKILL}-${variant}`;\n const desired = [BASELINE_DESIGN_RULES_SKILL, variantSkillId];\n\n // Filter to skills actually present in the manifest. Anything missing\n // becomes a warning but is not fatal.\n let manifestSkillIds: Set<string>;\n try {\n const { manifest } = await loadSkillsData(DEFAULT_SKILLS_PACKAGE);\n manifestSkillIds = new Set(manifest.skills.map((s) => s.id));\n } catch (err) {\n logger.warn(\n `Skipping skills auto-install: could not load skills manifest (${(err as Error).message}).`,\n );\n return {\n attempted: [],\n addedSkillIds: [],\n skippedSkillIds: [],\n missing: desired,\n };\n }\n\n const present = desired.filter((id) => manifestSkillIds.has(id));\n const missing = desired.filter((id) => !manifestSkillIds.has(id));\n if (missing.length > 0) {\n logger.warn(\n `Skills auto-install: not found in manifest, skipping: ${missing.join(', ')}.`,\n );\n }\n if (present.length === 0) {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n\n try {\n const result = await runSkillsAdd({\n projectRoot,\n names: present,\n ides: DEFAULT_AUTO_SKILL_IDES,\n scope: DEFAULT_AUTO_SKILL_SCOPE,\n ide,\n });\n if (result.status !== 'installed') {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: present,\n missing,\n };\n }\n return {\n attempted: desired,\n addedSkillIds: result.addedSkillIds,\n skippedSkillIds: result.skippedSkillIds,\n missing,\n };\n } catch (err) {\n logger.warn(\n `Skills auto-install failed (continuing): ${(err as Error).message}`,\n );\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n}\n\n/**\n * Install one merged-tree file into the consumer project.\n *\n * Returns `null` when the file is skipped (pack-internal README.md, or a\n * frozen file already present on disk).\n */\nasync function installPackFile(\n file: MergedFileEntry,\n projectRoot: string,\n): Promise<InstalledResource | null> {\n const cls = classifyPackFile(file.relPath);\n if (cls === null) return null; // pack-internal doc, skip\n\n const targetAbs = path.join(projectRoot, cls.target);\n\n // Frozen: install once. If the target already exists, leave it alone.\n if (cls.isFrozen && (await fileExists(targetAbs))) {\n // Still record it in the installed manifest so future tooling knows we\n // own this path semantically — but with the existing hash on disk.\n const existing = await fs.readFile(targetAbs, 'utf-8');\n return {\n id: `pack:${file.relPath}`,\n target: cls.target,\n hash: computeHash(existing),\n strategy: cls.strategy,\n };\n }\n\n const content = await fs.readFile(file.sourcePath, 'utf-8');\n await writeFileSafe(targetAbs, content);\n\n return {\n id: `pack:${file.relPath}`,\n target: cls.target,\n hash: computeHash(content),\n strategy: cls.strategy,\n };\n}\n\n/**\n * Resolve the design package root via `require.resolve` so the CLI works\n * both inside the workspace (pnpm symlinks) and from a published consumer.\n */\nfunction resolveDesignPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n\n/**\n * List all variants advertised by the top-level design catalog. Used by\n * `teamix-evo design list-variants`.\n */\nexport interface ListVariantsResult {\n packageName: string;\n defaultDescription?: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n linked?: { 'biz-ui'?: string; templates?: string };\n }>;\n}\n\nexport async function listDesignVariants(\n packageName: string = DEFAULT_DESIGN_PACKAGE,\n packageRoot?: string,\n): Promise<ListVariantsResult> {\n const root = packageRoot ?? resolveDesignPackageRoot(packageName);\n const catalog = await loadDesignPackageManifest(root);\n return {\n packageName,\n defaultDescription: catalog.default.description,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n linked: v.linked,\n })),\n };\n}\n\n// Re-export the strategy enum constituents so consumers don't have to import\n// from registry separately.\nexport type { UpdateStrategy };\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 { 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 { 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","/**\n * Classify a pack-tree file into its install target & update strategy.\n *\n * The convention (per [ADR 0010](../../../../docs/adr/0010-design-default-and-variants.md))\n * is **path-based, not manifest-declared** — that's the whole point of the\n * walk-and-merge model. The filesystem is the truth.\n *\n * relPath in pack tree → target / strategy\n * ────────────────────────────────────────────────────────────────────────────\n * DESIGN.md → DESIGN.md (managed)\n * AGENTS.md → AGENTS.md (managed)\n * CLAUDE.md → CLAUDE.md (managed)\n * foundations/tokens/tokens.overrides.css → .teamix-evo/tokens/tokens.overrides.css (frozen)\n * foundations/tokens/<rest> → .teamix-evo/tokens/<rest> (regenerable, lifted out of design/)\n * README.md → (skip — pack-internal docs)\n * anything else → .teamix-evo/design/<relPath> (regenerable)\n *\n * Why tokens are lifted: tokens are the most-edited resource by consumers\n * (override colors, radius, shadows). Keeping them at `.teamix-evo/tokens/`\n * (instead of `.teamix-evo/design/foundations/tokens/`) reduces nesting depth\n * by 2 levels and makes them obvious in any file tree view.\n *\n * Why pack-internal `README.md` is skipped:\n * `_template/README.md` etc. are documentation for variant authors, not for\n * consumers. We don't want them ending up in `.teamix-evo/design/README.md`.\n * Subdirectory `README.md` (e.g. `brand/README.md`) is similarly variant-author\n * docs. If a variant truly wants to ship a consumer-facing README, name it\n * something else (e.g. `brand/overview.md`).\n */\nimport * as path from 'node:path';\nimport type { UpdateStrategy } from '@teamix-evo/registry';\n\nconst TEAMIX_DIR = '.teamix-evo/design';\nconst TOKENS_DIR = '.teamix-evo/tokens';\nconst TOKENS_PACK_PREFIX = 'foundations/tokens/';\n\n// DESIGN.md is a thin brand charter (ADR 0016) — single managed region `core`\n// holds the brand statement + index + pointers. Everything outside it is\n// user-owned project notes.\nconst ROOT_MANAGED_FILES: Record<string, { target: string; managedRegions: string[] }> = {\n 'DESIGN.md': { target: 'DESIGN.md', managedRegions: ['core'] },\n 'AGENTS.md': { target: 'AGENTS.md', managedRegions: ['teamix-evo'] },\n 'CLAUDE.md': { target: 'CLAUDE.md', managedRegions: ['teamix-evo'] },\n};\n\nconst FROZEN_FILES = new Set([\n 'foundations/tokens/tokens.overrides.css',\n]);\n\nexport interface ClassifiedFile {\n /** Path relative to consumer project root where the file should land. */\n target: string;\n /** Update strategy at install time. */\n strategy: UpdateStrategy;\n /** For `managed`: list of region IDs to maintain. */\n managedRegions?: string[];\n /** True for `frozen` files that already exist on disk → leave alone. */\n isFrozen: boolean;\n}\n\n/**\n * Classify a file by its pack-relative path. Returns `null` for files that\n * should be excluded from install (e.g. pack-internal README.md).\n *\n * The returned `target` is **always relative** to the consumer project root.\n */\nexport function classifyPackFile(relPath: string): ClassifiedFile | null {\n // Pack-internal docs — skip\n if (path.basename(relPath) === 'README.md') {\n return null;\n }\n\n // Top-level managed files (consumer project root)\n const rootManaged = ROOT_MANAGED_FILES[relPath];\n if (rootManaged) {\n return {\n target: rootManaged.target,\n strategy: 'managed',\n managedRegions: rootManaged.managedRegions,\n isFrozen: false,\n };\n }\n\n // tokens are lifted out of design/ for shallower consumer access\n if (relPath.startsWith(TOKENS_PACK_PREFIX)) {\n const rel = relPath.slice(TOKENS_PACK_PREFIX.length);\n const target = path.posix.join(TOKENS_DIR, rel);\n if (FROZEN_FILES.has(relPath)) {\n return { target, strategy: 'frozen', isFrozen: true };\n }\n return { target, strategy: 'regenerable', isFrozen: false };\n }\n\n // Frozen (user-owned) files outside the tokens tree\n if (FROZEN_FILES.has(relPath)) {\n return {\n target: path.posix.join(TEAMIX_DIR, relPath),\n strategy: 'frozen',\n isFrozen: true,\n };\n }\n\n // Default: regenerable under .teamix-evo/design/\n return {\n target: path.posix.join(TEAMIX_DIR, relPath),\n strategy: 'regenerable',\n isFrozen: false,\n };\n}\n","import * as path from \"node:path\";\nimport type {\n ProjectConfig,\n InstalledManifest,\n SkillsLock,\n DesignPackLock,\n} from \"@teamix-evo/registry\";\nimport {\n validateConfig,\n validateInstalled,\n validateSkillsLock,\n DesignPackLockSchema,\n} 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\";\nconst DESIGN_DIR = \"design\";\nconst DESIGN_LOCK_FILE = \"pack.lock.json\";\nconst SKILLS_DIR = \"skills\";\nconst SKILLS_LOCK_FILE = \"manifest.lock.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\n/**\n * Read .teamix-evo/design/pack.lock.json. Returns null if missing or invalid.\n */\nexport async function readDesignPackLock(\n projectRoot: string,\n): Promise<DesignPackLock | null> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n DESIGN_DIR,\n DESIGN_LOCK_FILE,\n );\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const parsed = DesignPackLockSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n logger.warn(`Invalid design pack.lock.json: ${parsed.error.message}`);\n return null;\n }\n return parsed.data;\n } catch (err) {\n logger.warn(\n `Failed to parse design pack.lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Convenience: read just the variant id from the design pack lock. Returns\n * null when no design package is initialized.\n */\nexport async function readDesignVariant(\n projectRoot: string,\n): Promise<string | null> {\n const lock = await readDesignPackLock(projectRoot);\n return lock?.variant.name ?? null;\n}\n\n/**\n * Absolute path to the per-skill source directory (consumer-side source).\n * Per ADR 0013, this is the truth source from which IDE mirrors are produced.\n */\nexport function getSkillsSourceDir(\n projectRoot: string,\n skillName?: string,\n): string {\n const base = path.join(projectRoot, TEAMIX_DIR, SKILLS_DIR);\n return skillName ? path.join(base, skillName) : base;\n}\n\n/**\n * Read .teamix-evo/skills/manifest.lock.json. Returns null if missing.\n */\nexport async function readSkillsLock(\n projectRoot: string,\n): Promise<SkillsLock | null> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const data = JSON.parse(raw);\n const result = validateSkillsLock(data);\n if (!result.success) {\n logger.warn(`Invalid skills manifest.lock.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(\n `Failed to parse skills manifest.lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Write .teamix-evo/skills/manifest.lock.json.\n */\nexport async function writeSkillsLock(\n projectRoot: string,\n lock: SkillsLock,\n): Promise<void> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n await writeFileSafe(lockPath, JSON.stringify(lock, null, 2) + \"\\n\");\n logger.debug(`Wrote skills lock → ${lockPath}`);\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';\nimport { getSkillsSourceDir } from './state.js';\n\n/**\n * Source-mirror skills installer (per ADR 0013).\n *\n * Two-stage flow:\n * 1. **writeSkillSources** — render upstream `<packageRoot>/<skill.source>` and\n * write to `<projectRoot>/.teamix-evo/skills/<id>/` (the consumer-side\n * source of truth, regenerable, in git).\n * 2. **syncSkillsToIdes** — pure byte-for-byte copy from source dir to each\n * requested IDE mirror path (`.qoder/skills/<id>/`, `.claude/skills/<id>/`).\n * Mirrors are 100% derived; not subject to managed-region preservation.\n *\n * `installSkills` orchestrates both. `updateSkills` re-renders the source with\n * managed-region preservation against the existing source (NOT the mirrors),\n * then re-syncs.\n */\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 using the\n * source-mirror flow. Returns InstalledResource records for both source files\n * and IDE mirror files.\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 const sourceRecords = await writeSkillSource(skill, options);\n installed.push(...sourceRecords);\n\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n options.projectRoot,\n );\n installed.push(...mirrorRecords);\n }\n }\n\n return { resources: installed, count: installed.length };\n}\n\n/**\n * Render upstream skill source(s) and write to `.teamix-evo/skills/<id>/`.\n * Returns InstalledResource records (one per file) describing the source files.\n */\nasync function writeSkillSource(\n skill: SkillEntry,\n options: SkillInstallOptions,\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n const records: 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 records.push(makeSourceRecord(skill, targetFile, content));\n logger.debug(` Wrote source: ${targetFile}`);\n return records;\n }\n\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 const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\n await writeFileSafe(targetFile, content);\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n logger.debug(` Wrote source: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Mirror an installed skill source to a single IDE path. Pure file copy from\n * `.teamix-evo/skills/<id>/` to `.<ide>/skills/<id>/` (or `~/.<ide>/...`).\n */\nasync function mirrorSkillToIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n projectRoot: string,\n): Promise<InstalledResource[]> {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const records: InstalledResource[] = [];\n\n const sourceFiles = await walkDir(sourceDir);\n await ensureDir(targetDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const content = await fs.readFile(src, 'utf-8');\n await writeFileSafe(targetFile, content);\n records.push(makeMirrorRecord(skill, targetFile, content, ide, scope, rel));\n logger.debug(` Mirrored ${ide}:${scope}: ${targetFile}`);\n }\n return records;\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 makeSourceRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n rel?: string,\n): InstalledResource {\n const id = rel ? `${skill.id}:source:${rel}` : `${skill.id}:source`;\n return {\n id,\n target: targetAbs,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n };\n}\n\nfunction makeMirrorRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n ide: SkillIde,\n scope: SkillScope,\n rel?: string,\n): InstalledResource {\n const id = rel && rel !== 'SKILL.md' ? `${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 /**\n * Optional: existing installed records (legacy parameter kept for callers that\n * still pass it). The refactored updater consults the file-system source under\n * `.teamix-evo/skills/<id>/` for managed-region preservation, so this is\n * unused by the new flow. Callers should stop passing it.\n */\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 with managed-region preservation applied at the SOURCE layer\n * (not the mirrors). After source is rewritten, mirrors are re-synced cleanly.\n */\nexport async function updateSkills(\n options: SkillUpdateOptions,\n): Promise<SkillUpdateResult> {\n const { manifest, ides, scope, projectRoot } = options;\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n const updated: InstalledResource[] = [];\n\n for (const skill of manifest.skills) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) continue;\n\n const sourceRecords = await rewriteSkillSource(\n skill,\n options,\n summary,\n );\n updated.push(...sourceRecords);\n\n // Mirrors are always overwritten cleanly from the (now updated) source.\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n projectRoot,\n );\n updated.push(...mirrorRecords);\n }\n }\n\n return { resources: updated, summary };\n}\n\nasync function rewriteSkillSource(\n skill: SkillEntry,\n options: SkillUpdateOptions,\n summary: SkillUpdateResult['summary'],\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n\n if (!stat.isFile()) {\n // Directory skills always overwrite source recursively.\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n const records: InstalledResource[] = [];\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 const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\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 const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n }\n return records;\n }\n\n // Single-file skill: target = .teamix-evo/skills/<id>/SKILL.md\n const targetFile = path.join(targetDir, 'SKILL.md');\n const newContent = await renderSkillContent(sourceAbs, skill, data);\n const exists = await fileExists(targetFile);\n\n if (skill.updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n const current = (await readFileOrNull(targetFile)) ?? newContent;\n return [makeSourceRecord(skill, targetFile, current)];\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n return [makeSourceRecord(skill, targetFile, newContent)];\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 return [makeSourceRecord(skill, targetFile, newContent)];\n }\n\n // managed: preserve outside-region content from the existing SOURCE.\n const current = await readFileOrNull(targetFile);\n let merged = current ?? newContent;\n for (const regionId of skill.managedRegions ?? []) {\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 merged = replaceManagedRegion(merged, 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, merged);\n summary.managed++;\n return [makeSourceRecord(skill, targetFile, merged)];\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Sync existing skill sources to the requested IDE mirror paths.\n *\n * Used by:\n * - `skills add` (immediate mirror after source write — handled by installSkills)\n * - `skills sync` (re-mirror after the user adds an IDE or moves machines)\n * - `skills update` (re-mirror after source is rewritten)\n *\n * `onlyIds` lets the caller limit which skills are synced.\n */\nexport interface SkillSyncOptions {\n projectRoot: string;\n /** Skills present in the source dir to mirror (caller derives from lock). */\n skills: ReadonlyArray<{\n id: string;\n name: string;\n updateStrategy: SkillEntry['updateStrategy'];\n }>;\n ides: readonly SkillIde[];\n scope: SkillScope;\n onlyIds?: string[];\n}\n\nexport interface SkillSyncResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Mirror existing source dirs (`.teamix-evo/skills/<id>/`) to the given IDE\n * paths. Pure byte-for-byte copy — no rendering, no merge.\n */\nexport async function syncSkillsToIdes(\n options: SkillSyncOptions,\n): Promise<SkillSyncResult> {\n const { projectRoot, skills, ides, scope, onlyIds } = options;\n const out: InstalledResource[] = [];\n\n const targets = skills.filter((s) => !onlyIds || onlyIds.includes(s.id));\n for (const skill of targets) {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n if (!(await fileExists(sourceDir))) {\n logger.warn(\n `Skill \"${skill.id}\" has no source at ${sourceDir}; skipped.`,\n );\n continue;\n }\n for (const ide of ides) {\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(\n skill.name,\n scope,\n projectRoot,\n );\n await ensureDir(targetDir);\n const sourceFiles = await walkDir(sourceDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const content = await fs.readFile(src, 'utf-8');\n await writeFileSafe(targetFile, content);\n out.push({\n id: rel === 'SKILL.md' ? skill.id : `${skill.id}:${rel}`,\n target: targetFile,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n ide,\n scope,\n });\n }\n }\n }\n return { resources: out, count: out.length };\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 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 type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\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 readSkillsLock,\n writeSkillsLock,\n readDesignVariant,\n} from './state.js';\nimport { logger } from '../utils/logger.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 // Determine which variant skills should be in scope. Read once up front;\n // null when no design package is initialized.\n const currentDesignVariant = await readDesignVariant(projectRoot);\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 existingLock = await readSkillsLock(projectRoot);\n const existingSkillIds = new Set([\n ...Object.keys(existingLock?.skills ?? {}),\n // Legacy fallback: pre-ADR-0013 installs only had manifest.json. Derive\n // skill ids by stripping the trailing :source / :sub-file suffix.\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 // Bulk mode: filter out variant-bound skills that don't match the current\n // design variant (or all variant skills, when no design pack is installed).\n onlyIds = manifest.skills\n .filter((s) => {\n if (!s.variant) return true;\n if (!currentDesignVariant) {\n logger.debug(\n `Skipping variant-bound skill \"${s.id}\" (variant=${s.variant}): no design pack installed; will be picked up when \"design init\" runs.`,\n );\n return false;\n }\n if (s.variant !== currentDesignVariant) {\n logger.debug(\n `Skipping variant-bound skill \"${s.id}\" (variant=${s.variant}): current design variant is \"${currentDesignVariant}\".`,\n );\n return false;\n }\n return true;\n })\n .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 installedAt = new Date().toISOString();\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,\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 // Update skills source-mirror lock (per ADR 0013).\n const lock: SkillsLock = existingLock ?? {\n schemaVersion: 1,\n skills: {},\n };\n for (const skillId of onlyIds) {\n const skillDef = manifest.skills.find((s) => s.id === skillId);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[skillId] = {\n version: skillDef.version,\n from: packageName,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\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","/**\n * `teamix-evo design update` — placeholder for v0.7.\n *\n * Per [ADR 0010](../../../../docs/adr/0010-design-default-and-variants.md), v0.6\n * delivered the install side of the pack model (`design init` walks\n * `default/` + `variants/<variant>/` with file-level override). Upgrade is a\n * separate problem (semantic merge for managed regions, frozen-file diff\n * surfacing, variant migration) and is scoped to v0.7 alongside the new\n * skill-driven upgrade flow.\n *\n * Until then, `update` reports cleanly. Re-running `design init` after\n * cleaning `.teamix-evo/design/` is the documented escape hatch.\n */\nimport { Command } from 'commander';\nimport { logger } from '../../utils/logger.js';\n\nexport const updateCommand = new Command('update')\n .description('(v0.7) 更新设计体系资源 — 当前未实现,见 ADR 0010 / PLAN §12.6')\n .action(() => {\n logger.warn(\n 'design update is not yet implemented for the design pack model (default + variants/, ADR 0010).',\n );\n logger.info(\n 'Workaround: clean `.teamix-evo/design/` and re-run `teamix-evo design init <variant>`.',\n );\n logger.info(\n 'Tracking: PLAN §12.6 v0.7 — semantic upgrade flow + tokens.overrides.css preservation.',\n );\n process.exitCode = 0;\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","/**\n * `teamix-evo design list-variants` — list AVAILABLE variants in the\n * `@teamix-evo/design` catalog (vs `design list` which lists what's\n * INSTALLED in the consumer project).\n *\n * Per [ADR 0010](../../../../docs/adr/0010-design-default-and-variants.md).\n */\nimport { Command } from 'commander';\nimport { listDesignVariants } from '../../core/design-init.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/design 包内提供的所有变体')\n .action(async () => {\n try {\n const result = await listDesignVariants();\n\n logger.info(`Available design variants in ${result.packageName}:`);\n logger.info('');\n logger.info(' default — B 端通用基线(始终内置,无需选择)');\n if (result.defaultDescription) {\n logger.info(` ${result.defaultDescription}`);\n }\n logger.info('');\n\n if (result.variants.length === 0) {\n logger.info(' (no variants beyond default)');\n return;\n }\n\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n if (v.linked) {\n const links: string[] = [];\n if (v.linked['biz-ui']) links.push(`biz-ui: ${v.linked['biz-ui']}`);\n if (v.linked.templates) links.push(`templates: ${v.linked.templates}`);\n if (links.length) logger.info(` linked: ${links.join(' / ')}`);\n }\n logger.info('');\n }\n\n logger.info('Install a variant: teamix-evo design init <name>');\n } catch (err) {\n logger.error(`Failed to list variants: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\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';\nimport { syncCommand } from './sync.js';\nimport { doctorCommand } from './doctor.js';\n\nexport const skillsCommand = new Command('skills').description(\n '管理 teamix-evo skills(向 AI IDE 注入技能;source-mirror 模型见 ADR 0013)',\n);\n\nskillsCommand.addCommand(addCommand);\nskillsCommand.addCommand(listCommand);\nskillsCommand.addCommand(updateCommand);\nskillsCommand.addCommand(syncCommand);\nskillsCommand.addCommand(doctorCommand);\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 {\n ensureGlobalMetaRoot,\n isTeamixEvoProject,\n} from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const isIncremental = names.length > 0;\n\n const { ides, scope } = await resolveIdesAndScope({\n opts,\n projectRoot: cwd,\n isIncremental,\n });\n\n // scope=global 且 cwd 不是 Teamix Evo 项目 → 把元数据写到全局根,\n // 避免污染 cwd。后续维护命令需 `cd ~/.teamix-evo-global` 操作。\n let projectRoot = cwd;\n if (scope === 'global' && !isTeamixEvoProject(cwd)) {\n projectRoot = await ensureGlobalMetaRoot();\n logger.info(`Global skill install — meta root: ${projectRoot}`);\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 { existsSync } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nconst GLOBAL_META_DIR = '.teamix-evo-global';\nconst TEAMIX_DIR = '.teamix-evo';\nconst CONFIG_FILE = 'config.json';\n\nexport function getGlobalMetaRoot(): string {\n return path.join(os.homedir(), GLOBAL_META_DIR);\n}\n\nexport function isTeamixEvoProject(dir: string): boolean {\n return existsSync(path.join(dir, TEAMIX_DIR, CONFIG_FILE));\n}\n\nexport async function ensureGlobalMetaRoot(): Promise<string> {\n const root = getGlobalMetaRoot();\n await fs.mkdir(root, { recursive: true });\n return root;\n}\n\n/**\n * Resolve the root that holds skills metadata for maintenance commands\n * (update / uninstall / list / sync / doctor).\n *\n * `skills add --scope global` writes metadata to ~/.teamix-evo-global when cwd\n * isn't a teamix-evo project, so maintenance commands must look there too —\n * otherwise the user gets \"Skills not added\" right after a successful install.\n *\n * Resolution order:\n * 1. cwd itself, if it's a teamix-evo project.\n * 2. ~/.teamix-evo-global, if it has been initialized as a meta root.\n * 3. cwd as a fallback (caller surfaces the missing-config error).\n */\nexport function resolveSkillsMaintenanceRoot(cwd: string): string {\n if (isTeamixEvoProject(cwd)) return cwd;\n const globalRoot = getGlobalMetaRoot();\n if (isTeamixEvoProject(globalRoot)) return globalRoot;\n return cwd;\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 { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 {\n SkillIde,\n SkillScope,\n SkillsLock,\n} 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 readSkillsLock,\n writeSkillsLock,\n} from '../../core/state.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 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 });\n\n // Update config version\n config.packages.skills.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // Update installed manifest\n const installedAt = new Date().toISOString();\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,\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 // Update skills source-mirror lock (per ADR 0013).\n const existingLock = (await readSkillsLock(projectRoot)) ?? {\n schemaVersion: 1 as const,\n skills: {},\n };\n const lock: SkillsLock = {\n schemaVersion: 1,\n skills: { ...existingLock.skills },\n };\n for (const skill of manifest.skills) {\n const mirroredTo = skill.ides.filter((i) => ides.includes(i));\n if (mirroredTo.length === 0) continue;\n lock.skills[skill.id] = {\n version: skill.version,\n from: SKILLS_PACKAGE,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\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 * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type { InstalledResource } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n getSkillsSourceDir,\n} from '../../core/state.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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(\n '卸载已安装的 teamix-evo skills;不传 ids 则卸载整包,传 ids 则按 skill 删除',\n )\n .argument(\n '[ids...]',\n '可选:仅卸载指定 skill id;省略则卸载整个 skills 包',\n )\n .option('-y, --yes', '跳过确认')\n .action(async (ids: string[], opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 if (ids.length === 0) {\n await runFullUninstall({\n projectRoot,\n config,\n installedManifest,\n pkg,\n resources,\n opts,\n });\n return;\n }\n\n await runPartialUninstall({\n projectRoot,\n installedManifest,\n pkg,\n resources,\n ids,\n opts,\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\ninterface FullUninstallArgs {\n projectRoot: string;\n config: NonNullable<Awaited<ReturnType<typeof readProjectConfig>>>;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n opts: UninstallOptions;\n}\n\nasync function runFullUninstall(args: FullUninstallArgs): Promise<void> {\n const { projectRoot, config, installedManifest, pkg, resources, opts } = args;\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 const removed = await removeSkillFiles(resources);\n logger.debug(`Removed ${removed.length} files`);\n\n // Per ADR 0013, wipe the source dir entirely on full uninstall.\n const skillsRoot = getSkillsSourceDir(projectRoot);\n try {\n await fs.rm(skillsRoot, { recursive: true, force: true });\n logger.debug(`Removed source dir ${skillsRoot}`);\n } catch (err) {\n logger.warn(\n `Failed to remove ${skillsRoot}: ${(err as Error).message}`,\n );\n }\n\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 delete config.packages.skills;\n await writeProjectConfig(projectRoot, config);\n\n logger.success(`Uninstalled ${SKILLS_PACKAGE}`);\n logger.info(` Removed: ${removed.length} files`);\n logger.info(` Source: ${path.relative(projectRoot, skillsRoot)} (cleaned)`);\n}\n\ninterface PartialUninstallArgs {\n projectRoot: string;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n ids: string[];\n opts: UninstallOptions;\n}\n\nasync function runPartialUninstall(args: PartialUninstallArgs): Promise<void> {\n const { projectRoot, installedManifest, pkg, resources, ids, opts } = args;\n\n const grouped = groupBySkillId(resources);\n const requested = dedupe(ids);\n const matched = requested.filter((id) => grouped.has(id));\n const missing = requested.filter((id) => !grouped.has(id));\n\n if (missing.length > 0) {\n logger.warn(`Not installed (skipped): ${missing.join(', ')}`);\n }\n if (matched.length === 0) {\n logger.info('Nothing to remove.');\n return;\n }\n\n const toRemove: InstalledResource[] = matched.flatMap(\n (id) => grouped.get(id) ?? [],\n );\n\n logger.info(\n `Will remove ${matched.length} skill(s): ${matched.join(', ')} ` +\n `(${toRemove.length} 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 mirror + source files recorded in the manifest.\n const removed = await removeSkillFiles(toRemove);\n logger.debug(`Removed ${removed.length} files`);\n\n // 2. Remove each skill's source dir (may contain non-manifest files like attachments).\n for (const id of matched) {\n const dir = getSkillsSourceDir(projectRoot, id);\n try {\n await fs.rm(dir, { recursive: true, force: true });\n logger.debug(`Removed source dir ${dir}`);\n } catch (err) {\n logger.warn(`Failed to remove ${dir}: ${(err as Error).message}`);\n }\n }\n\n // 3. Prune lock entries so `skills sync` won't re-mirror them.\n const lock = await readSkillsLock(projectRoot);\n if (lock) {\n for (const id of matched) delete lock.skills[id];\n await writeSkillsLock(projectRoot, lock);\n }\n\n // 4. Drop matched resources from the package's installed manifest entry.\n // Keep the package entry itself — the rest is still installed.\n if (installedManifest && pkg) {\n pkg.resources = resources.filter((r) => !matched.includes(skillIdOf(r)));\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n logger.success(\n `Removed ${matched.length} skill(s): ${matched.join(', ')}`,\n );\n logger.info(` Files: ${removed.length}`);\n if (missing.length > 0) {\n logger.info(` Skipped: ${missing.join(', ')} (not installed)`);\n }\n}\n\nfunction findSkillsPkg(\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>,\n) {\n return installedManifest?.installed.find((p) => p.package === SKILLS_PACKAGE);\n}\n\nfunction skillIdOf(r: InstalledResource): string {\n return r.id.split(':')[0]!;\n}\n\nfunction groupBySkillId(\n records: InstalledResource[],\n): Map<string, InstalledResource[]> {\n const map = new Map<string, InstalledResource[]>();\n for (const r of records) {\n const id = skillIdOf(r);\n const bucket = map.get(id);\n if (bucket) bucket.push(r);\n else map.set(id, [r]);\n }\n return map;\n}\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { Command } from 'commander';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { runSkillsSync } from '../../core/skills-sync.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface SyncOptions {\n ide?: string;\n scope?: string;\n}\n\nexport const syncCommand = new Command('sync')\n .description(\n '把 .teamix-evo/skills/ 下的源重新镜像到 IDE 路径(.qoder / .claude)',\n )\n .argument(\n '[names...]',\n '可选:仅同步指定 skill id;省略则同步全部已记录在 lock 内的 skill',\n )\n .option(\n '--ide <list>',\n '逗号分隔的 IDE 列表(覆盖 lock 中记录的 mirroredTo)',\n )\n .option(\n '--scope <scope>',\n 'project | global(覆盖 lock 中记录的 scope)',\n )\n .action(async (names: string[], opts: SyncOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const ides = opts.ide ? parseIdeList(opts.ide) : undefined;\n const scope = opts.scope ? parseScope(opts.scope) : undefined;\n\n const result = await runSkillsSync({\n projectRoot,\n ides,\n scope,\n names: names.length > 0 ? names : undefined,\n });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded in .teamix-evo/skills/manifest.lock.json. Nothing to sync.',\n );\n return;\n }\n\n logger.success(\n `Synced ${result.syncedSkillIds.length} skill(s) → ${result.fileCount} file(s)`,\n );\n if (result.syncedSkillIds.length > 0) {\n logger.info(` Skills: ${result.syncedSkillIds.join(', ')}`);\n }\n if (result.missingSourceIds.length > 0) {\n logger.warn(\n ` Missing source: ${result.missingSourceIds.join(\n ', ',\n )} (run \"skills add <id>\" to (re)install)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to sync skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\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(\n `Unknown IDE: \"${p}\". Expected one of: ${ALL_IDE_KINDS.join(', ')}.`,\n );\n }\n }\n return result;\n}\n\nfunction parseScope(input: string): SkillScope {\n const v = input.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 type {\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport { syncSkillsToIdes } from './skills-installer.js';\nimport {\n readSkillsLock,\n writeSkillsLock,\n readInstalledManifest,\n writeInstalledManifest,\n getSkillsSourceDir,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst SKILLS_PACKAGE_DEFAULT = '@teamix-evo/skills';\n\nexport interface RunSkillsSyncOptions {\n projectRoot: string;\n /** Override IDE list. Defaults to lock-recorded mirrors per skill. */\n ides?: readonly SkillIde[];\n /** Override scope. Defaults to lock-recorded scope per skill. */\n scope?: SkillScope;\n /** Limit to specific skill ids; otherwise sync all in lock. */\n names?: readonly string[];\n}\n\nexport interface RunSkillsSyncResult {\n status: 'synced' | 'no-skills';\n syncedSkillIds: string[];\n fileCount: number;\n resources: InstalledResource[];\n /** Skills that were in the lock but had no source dir on disk (warned, skipped). */\n missingSourceIds: string[];\n}\n\n/**\n * Re-mirror existing source dirs (`.teamix-evo/skills/<id>/`) to IDE paths.\n * The lock file (`.teamix-evo/skills/manifest.lock.json`) drives WHICH skills\n * to sync and (by default) WHERE — caller can override ide/scope.\n *\n * Per ADR 0013, this is idempotent and safe to re-run; mirrors are 100%\n * regenerable so any drift in IDE paths is overwritten cleanly.\n */\nexport async function runSkillsSync(\n options: RunSkillsSyncOptions,\n): Promise<RunSkillsSyncResult> {\n const { projectRoot, names } = options;\n\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return {\n status: 'no-skills',\n syncedSkillIds: [],\n fileCount: 0,\n resources: [],\n missingSourceIds: [],\n };\n }\n\n const skillIds = Object.keys(lock.skills);\n const targets = names ? skillIds.filter((id) => names.includes(id)) : skillIds;\n\n // Group sync by (scope, ides) — ADR 0013 doesn't constrain consumers from\n // mixing scopes per skill; we honor whatever the lock recorded unless caller\n // overrides both.\n const allResources: InstalledResource[] = [];\n const synced: string[] = [];\n const missing: string[] = [];\n\n for (const skillId of targets) {\n const lockEntry = lock.skills[skillId];\n if (!lockEntry) continue; // never happens (skillId came from lock.skills keys), but TS narrows\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n logger.warn(`Skill \"${skillId}\" has no source at ${sourceDir}; skipped.`);\n missing.push(skillId);\n continue;\n }\n\n const ides = (options.ides ?? lockEntry.mirroredTo) as SkillIde[];\n const scope = options.scope ?? lockEntry.scope;\n if (ides.length === 0) {\n logger.warn(`Skill \"${skillId}\" has no IDE mirror targets; skipped.`);\n continue;\n }\n\n // updateStrategy isn't tracked in the lock — pull from current resources\n // table; default to \"regenerable\" if not found (sync semantics: clobber).\n const result = await syncSkillsToIdes({\n projectRoot,\n skills: [\n {\n id: skillId,\n name: skillId,\n updateStrategy: 'regenerable',\n },\n ],\n ides,\n scope,\n });\n allResources.push(...result.resources);\n synced.push(skillId);\n\n // Update the lock entry mirror list / installedAt timestamp.\n lock.skills[skillId] = {\n ...lockEntry,\n mirroredTo: ides,\n scope,\n installedAt: new Date().toISOString(),\n };\n }\n\n await writeSkillsLock(projectRoot, lock);\n\n // Refresh manifest.json mirror records (preserve source records as-is).\n await refreshMirrorRecords(projectRoot, allResources);\n\n return {\n status: 'synced',\n syncedSkillIds: synced,\n fileCount: allResources.length,\n resources: allResources,\n missingSourceIds: missing,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function refreshMirrorRecords(\n projectRoot: string,\n newMirrorRecords: InstalledResource[],\n): Promise<void> {\n const installed = await readInstalledManifest(projectRoot);\n if (!installed) return;\n const pkg = installed.installed.find((p) => p.package === SKILLS_PACKAGE_DEFAULT);\n if (!pkg) return;\n\n // Drop existing mirror records (those with `ide` set) and re-insert fresh ones.\n // Preserve source records (no `ide`).\n const sourceOnly = pkg.resources.filter((r) => r.ide === undefined);\n pkg.resources = [...sourceOnly, ...newMirrorRecords];\n pkg.installedAt = new Date().toISOString();\n await writeInstalledManifest(projectRoot, installed);\n}\n\n// re-export so commands can route through one module\nexport type { InstalledManifest };\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runSkillsDoctor } from '../../core/skills-doctor.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const doctorCommand = new Command('doctor')\n .description(\n '检查 .teamix-evo/skills/ 源与 IDE 镜像是否漂移;提示如何修复',\n )\n .action(async () => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const result = await runSkillsDoctor({ projectRoot });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded. Run \"teamix-evo skills add\" first.',\n );\n return;\n }\n\n if (result.status === 'clean') {\n logger.success('Skills are in sync. No drift detected.');\n return;\n }\n\n logger.warn(\n `Found ${result.findings.length} drift issue(s). Run \"teamix-evo skills sync\" to repair mirrors.`,\n );\n for (const f of result.findings) {\n const idePart = f.ide ? ` [${f.ide}]` : '';\n logger.info(` - ${f.kind}${idePart}: ${f.skillId}`);\n logger.info(` ${f.path}`);\n if (f.detail) logger.info(` ${f.detail}`);\n }\n process.exitCode = 1;\n } catch (err) {\n logger.error(`Failed to run doctor: ${(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 { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { getAdapter } from '../ide/index.js';\nimport { computeHash } from '../utils/hash.js';\nimport { walkDir } from '../utils/path.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readSkillsLock, getSkillsSourceDir } from './state.js';\n\n/**\n * Drift detection per ADR 0013 §4 `skills doctor`.\n *\n * Reports:\n * - \"missing-source\" — lock entry exists but `.teamix-evo/skills/<id>/` is gone\n * - \"missing-mirror\" — source exists, but mirror under `.<ide>/skills/<id>/` missing\n * - \"mirror-drift\" — mirror file content ≠ source file content (user or IDE\n * wrote into the mirror; sync will overwrite)\n *\n * Source-vs-upstream drift is intentionally not in this report — that's\n * `skills update`'s job (it diffs against upstream). doctor only audits the\n * source→mirror leg.\n */\nexport type SkillDriftKind =\n | 'missing-source'\n | 'missing-mirror'\n | 'mirror-drift';\n\nexport interface SkillDriftFinding {\n kind: SkillDriftKind;\n skillId: string;\n ide?: SkillIde;\n scope?: SkillScope;\n /** Absolute path to the file or dir that's drifted/missing. */\n path: string;\n detail?: string;\n}\n\nexport interface RunSkillsDoctorOptions {\n projectRoot: string;\n}\n\nexport interface RunSkillsDoctorResult {\n status: 'clean' | 'drift' | 'no-skills';\n findings: SkillDriftFinding[];\n}\n\nexport async function runSkillsDoctor(\n options: RunSkillsDoctorOptions,\n): Promise<RunSkillsDoctorResult> {\n const { projectRoot } = options;\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return { status: 'no-skills', findings: [] };\n }\n\n const findings: SkillDriftFinding[] = [];\n\n for (const [skillId, entry] of Object.entries(lock.skills)) {\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n findings.push({\n kind: 'missing-source',\n skillId,\n path: sourceDir,\n detail: 'Run \"teamix-evo skills add\" to reinstall.',\n });\n continue;\n }\n\n const sourceFiles = await walkDir(sourceDir);\n const sourceContents = new Map<string, string>();\n for (const f of sourceFiles) {\n const rel = path.relative(sourceDir, f);\n sourceContents.set(rel, await fs.readFile(f, 'utf-8'));\n }\n\n for (const ide of entry.mirroredTo) {\n const adapter = getAdapter(ide);\n const mirrorDir = adapter.getSkillTargetDir(\n skillId,\n entry.scope,\n projectRoot,\n );\n if (!(await dirExists(mirrorDir))) {\n findings.push({\n kind: 'missing-mirror',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorDir,\n detail: 'Run \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n for (const [rel, sourceContent] of sourceContents.entries()) {\n const mirrorFile = path.join(mirrorDir, rel);\n if (!(await fileExists(mirrorFile))) {\n findings.push({\n kind: 'missing-mirror',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail: 'Run \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n const mirrorContent = await fs.readFile(mirrorFile, 'utf-8');\n if (computeHash(mirrorContent) !== computeHash(sourceContent)) {\n findings.push({\n kind: 'mirror-drift',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail:\n 'Mirror differs from source. Re-run \"teamix-evo skills sync\" to overwrite.',\n });\n }\n }\n }\n }\n\n return {\n status: findings.length === 0 ? 'clean' : 'drift',\n findings,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\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 business: DEFAULT_UI_ALIASES.business,\n templates: DEFAULT_UI_ALIASES.templates,\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: {\n components,\n hooks,\n utils,\n lib,\n business: DEFAULT_UI_ALIASES.business,\n templates: DEFAULT_UI_ALIASES.templates,\n },\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 business: 'src/components/business',\n templates: 'src/templates',\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 business: options.aliases?.business ?? DEFAULT_UI_ALIASES.business,\n templates: options.aliases?.templates ?? DEFAULT_UI_ALIASES.templates,\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 // Flatten per-entry directory paths. In the source tree, cross-entry\n // references use `@/<root>/<entry-dir>/<file>` (e.g.\n // `@/components/skeleton/skeleton`), but after install files land flat\n // in the alias directory (`@/components/ui/skeleton`). Strip the\n // intermediate directory when rest has exactly two segments.\n const flatRest = flattenRestPath(rest);\n return `${quote}${normalized}${flatRest}${quote}`;\n },\n );\n}\n\n/**\n * Flatten a source-tree relative path for the installed (flat) layout.\n *\n * In the UI source tree, files live in per-entry directories:\n * `@/components/skeleton/skeleton` → rest = `/skeleton/skeleton`\n * After install, they are placed flat in the alias directory:\n * `@/components/ui/skeleton` → rest = `/skeleton`\n *\n * When rest has exactly two path segments (`/dir/file`), the first segment\n * (the entry directory) is stripped, leaving only the file reference.\n * Single-segment paths (e.g. `/cn`) pass through unchanged.\n */\nfunction flattenRestPath(rest: string | undefined): string {\n if (!rest) return '';\n // Split: \"/skeleton/skeleton\" → [\"\", \"skeleton\", \"skeleton\"]\n const segments = rest.split('/');\n if (segments.length === 3) {\n // Two real segments: /dir/file → /file\n return `/${segments[2]}`;\n }\n return rest;\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","/**\n * `teamix-evo biz-ui` — variant-aware business UI subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const bizUiCommand = new Command('biz-ui').description(\n '管理业务 UI 组件(变体感知 — 与 design / templates 同变体名空间)',\n);\n\nbizUiCommand.addCommand(addCommand);\nbizUiCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runBizUiAdd } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个业务 UI 组件(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '组件 id 列表,如 \"tenant-switcher\" \"org-picker\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n // (Future) auto-detect from .teamix-evo/design/pack.lock.json variant.\n // For now require explicit --variant.\n throw new Error(\n '--variant <name> is required. Run `teamix-evo biz-ui list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\n `Installing biz-ui entries from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runBizUiAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `biz-ui add complete: ${result.written} written, ${result.skipped} skipped, ${result.metaFiles.length} meta.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\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 }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","/**\n * Programmatic install for variant-aware UI packages — biz-ui & templates.\n *\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md), these\n * two packages share the variant-aware shape: top-level catalog + per-variant\n * manifest. The install logic is the same as `runUiAdd` (registry dependency\n * resolution + frozen-on-add + import rewrite) — only differences are:\n *\n * 1. The package source is `<pkg>/variants/<variant>/` rather than `<pkg>/`\n * 2. A `--variant` selector picks which variant to install from\n * 3. The installed manifest entry records `variant: \"<name>\"` rather than\n * `_flat`\n *\n * This module exposes a single shared implementation parametrized by\n * `packageName` (`@teamix-evo/biz-ui` or `@teamix-evo/templates`) and is\n * surfaced via `runBizUiAdd` / `runTemplatesAdd` thin wrappers.\n */\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport type {\n InstalledManifest,\n InstalledResource,\n UiPackageManifest,\n VariantUiPackageName,\n} from '@teamix-evo/registry';\nimport {\n loadVariantUiPackageCatalog,\n loadVariantUiPackageManifest,\n} from '@teamix-evo/registry';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.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\nexport interface RunVariantUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Variant id (e.g. `\"opentrek\"`). */\n variant: string;\n /** Entry ids to install. */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the package name. */\n packageName?: string;\n /**\n * Override resolution of the package root. When set, skips\n * `require.resolve(\"<packageName>/package.json\")`.\n */\n packageRoot?: string;\n}\n\nexport interface RunVariantUiAddResult {\n packageName: string;\n variant: string;\n orderedIds: string[];\n written: number;\n skipped: number;\n metaFiles: string[];\n npmDependencies: Record<string, string>;\n resources: InstalledResource[];\n}\n\nasync function runVariantUiAdd(\n packageName: VariantUiPackageName,\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n const { projectRoot, variant, ids, overwrite } = options;\n const fullPackageName = options.packageName ?? `@teamix-evo/${packageName}`;\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 \\`teamix-evo ui init\\` first — \\`${packageName} add\\` writes into the same alias map (business / templates).`,\n );\n }\n\n const packageRoot =\n options.packageRoot ?? resolvePackageRoot(fullPackageName);\n\n // Validate that this variant exists in the catalog (clear error if not).\n const catalog = await loadVariantUiPackageCatalog(packageRoot);\n if (!catalog.variants.some((v) => v.name === variant)) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Variant \"${variant}\" not found in ${fullPackageName}. Known variants: ${known}. Hint: \\`teamix-evo ${packageName} list-variants\\` shows all.`,\n );\n }\n\n // Load the per-variant manifest from packages/<pkg>/variants/<variant>/.\n const variantDir = path.join(packageRoot, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n\n // Validate requested ids\n const knownIds = new Set(variantManifest.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) in ${packageName}#${variant}: ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ${packageName} list --variant ${variant}\\` to see options.`,\n );\n }\n\n // Adapter: installUiEntries expects UiPackageManifest. The structural\n // schemas differ in `package` literal but `entries` are interchangeable\n // (UiEntry[]). Reuse the existing installer.\n const adaptedManifest: UiPackageManifest = {\n schemaVersion: 1,\n package: 'ui',\n version: variantManifest.version,\n engines: variantManifest.engines,\n entries: variantManifest.entries,\n };\n\n const result = await installUiEntries({\n projectRoot,\n manifest: adaptedManifest,\n packageRoot: variantDir, // sources resolved relative to variant dir\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n // Update installed manifest, keyed by (package, variant). Multiple variants\n // of the same package can co-exist (rare but legal).\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex(\n (p) => p.package === fullPackageName && p.variant === variant,\n );\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: fullPackageName,\n variant,\n version: variantManifest.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 return {\n packageName: fullPackageName,\n variant,\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\n/** `teamix-evo biz-ui add <ids...> --variant <name>`. */\nexport async function runBizUiAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('biz-ui', options);\n}\n\n/** `teamix-evo templates add <ids...> --variant <name>`. */\nexport async function runTemplatesAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('templates', options);\n}\n\n// ─── List variants ───────────────────────────────────────────────────────────\n\nexport interface ListVariantUiResult {\n packageName: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n }>;\n}\n\nasync function listVariantUi(\n packageName: VariantUiPackageName,\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n const fullPackageName = `@teamix-evo/${packageName}`;\n const root = packageRoot ?? resolvePackageRoot(fullPackageName);\n const catalog = await loadVariantUiPackageCatalog(root);\n return {\n packageName: fullPackageName,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n })),\n };\n}\n\nexport async function listBizUiVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('biz-ui', packageRoot);\n}\n\nexport async function listTemplatesVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('templates', packageRoot);\n}\n","import { Command } from 'commander';\nimport { listBizUiVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/biz-ui 包内提供的所有业务变体')\n .action(async () => {\n try {\n const result = await listBizUiVariants();\n logger.info(`Available biz-ui variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo biz-ui add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo templates` — variant-aware page template subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const templatesCommand = new Command('templates').description(\n '管理页面模板(变体感知 — 与 design / biz-ui 同变体名空间)',\n);\n\ntemplatesCommand.addCommand(addCommand);\ntemplatesCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTemplatesAdd } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个页面模板(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '模板 id 列表,如 \"list-detail-page\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n throw new Error(\n '--variant <name> is required. Run `teamix-evo templates list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\n `Installing templates from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runTemplatesAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `templates add complete: ${result.written} written, ${result.skipped} skipped, ${result.metaFiles.length} meta.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\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 }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import { Command } from 'commander';\nimport { listTemplatesVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/templates 包内提供的所有页面模板变体')\n .action(async () => {\n try {\n const result = await listTemplatesVariants();\n logger.info(`Available templates variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo templates add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n"],"mappings":"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","names":["Command","createRequire","Command","os","path","path","fs","createRequire","path","rel","path","rel","path","TEAMIX_DIR","path","fs","require","path","fs","fs","path","fs","stat","rel","targetFile","exists","current","DEFAULT_SKILLS_PACKAGE","require","createRequire","Command","Command","Command","Command","version","Command","Command","Command","fs","path","Command","confirm","Command","Command","Command","prompts","fs","os","path","TEAMIX_DIR","CONFIG_FILE","Command","Command","listCommand","Command","Command","SKILLS_PACKAGE","FLAT_VARIANT","updateCommand","Command","Command","prompts","path","fs","SKILLS_PACKAGE","uninstallCommand","Command","confirm","Command","fs","stat","Command","parseIdeList","parseScope","Command","path","fs","dirExists","rel","stat","Command","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","Command","Command","path","createRequire","require","createRequire","resolvePackageRoot","mergeResources","addCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listVariantsCommand","Command","Command","addCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listVariantsCommand","require","createRequire","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/tokens/index.ts","../src/commands/tokens/init.ts","../src/ide/QoderAdapter.ts","../src/ide/ClaudeAdapter.ts","../src/ide/index.ts","../src/core/tokens-init.ts","../src/utils/fs.ts","../src/utils/logger.ts","../src/utils/hash.ts","../src/core/state.ts","../src/core/skills-client.ts","../src/core/skills-installer.ts","../src/utils/template.ts","../src/utils/path.ts","../src/utils/mcp.ts","../src/core/skills-add.ts","../src/utils/global-root.ts","../src/commands/tokens/update.ts","../src/core/tokens-update.ts","../src/commands/tokens/list.ts","../src/commands/tokens/list-variants.ts","../src/commands/tokens/uninstall.ts","../src/commands/skills/index.ts","../src/commands/skills/add.ts","../src/commands/skills/list.ts","../src/commands/skills/update.ts","../src/commands/skills/uninstall.ts","../src/commands/skills/sync.ts","../src/core/skills-sync.ts","../src/commands/skills/doctor.ts","../src/core/skills-doctor.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","../src/commands/biz-ui/index.ts","../src/commands/biz-ui/add.ts","../src/core/variant-ui-add.ts","../src/commands/biz-ui/list.ts","../src/commands/biz-ui/list-variants.ts","../src/commands/templates/index.ts","../src/commands/templates/add.ts","../src/commands/templates/list.ts","../src/commands/templates/list-variants.ts","../src/commands/logs/index.ts","../src/commands/logs/analyze.ts","../src/commands/logs/trace.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { tokensCommand } from './commands/tokens/index.js';\nimport { skillsCommand } from './commands/skills/index.js';\nimport { uiCommand } from './commands/ui/index.js';\nimport { bizUiCommand } from './commands/biz-ui/index.js';\nimport { templatesCommand } from './commands/templates/index.js';\nimport { logsCommand } from './commands/logs/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(tokensCommand);\nprogram.addCommand(skillsCommand);\nprogram.addCommand(uiCommand);\nprogram.addCommand(bizUiCommand);\nprogram.addCommand(templatesCommand);\nprogram.addCommand(logsCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\nimport { updateCommand } from './update.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\nimport { uninstallCommand } from './uninstall.js';\n\nexport const tokensCommand = new Command('tokens')\n .description('管理 design tokens(变体级 theme.css 等)');\n\ntokensCommand.addCommand(initCommand);\ntokensCommand.addCommand(updateCommand);\ntokensCommand.addCommand(listCommand);\ntokensCommand.addCommand(listVariantsCommand);\ntokensCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensInit } from '../../core/tokens-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const initCommand = new Command('init')\n .description('初始化设计体系资源(必须显式指定业务变体)')\n .argument('<variant>', '业务变体名称(如 \"opentrek\"、\"uni-manager\")')\n .action(async (variant: string) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Refuse to scaffold tokens/ + .teamix-evo/ into a directory that\n // isn't a valid project root.\n if (!hasPackageJson(projectRoot)) {\n logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exit(1);\n }\n\n logger.info(`Initializing design system: variant=\"${variant}\"`);\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 runTokensInit({\n projectRoot,\n variant,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.info(\n `Design system already initialized (variant: ${result.existingVariant}). ` +\n `Use \"teamix-evo tokens update\" to refresh resources.`,\n );\n return;\n }\n\n if (result.status === 'variant-mismatch') {\n logger.error(\n `Cannot switch tokens variant in place. ` +\n `Currently installed: \"${result.existingVariant}\"; requested: \"${result.requestedVariant}\".`,\n );\n logger.info('To switch variants:');\n logger.info(' 1. teamix-evo tokens uninstall --yes');\n logger.info(` 2. teamix-evo tokens init ${result.requestedVariant}`);\n logger.info(\n 'Note: tokens.overrides.css (frozen) is preserved across uninstall/init by default.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.success(\n `Design system initialized: ${result.packageName} (${result.variant} v${result.version})`,\n );\n logger.info(` Variant: ${result.variant}`);\n logger.info(` Tailwind: v4`);\n logger.info(` Resources: ${result.count} files installed`);\n if (result.skills) {\n const { addedSkillIds, skippedSkillIds, missing } = result.skills;\n if (addedSkillIds.length > 0) {\n logger.info(\n ` Skills: auto-installed ${addedSkillIds.join(', ')}`,\n );\n }\n if (skippedSkillIds.length > 0) {\n logger.info(\n ` Skills: already installed (skipped) ${skippedSkillIds.join(', ')}`,\n );\n }\n if (missing.length > 0) {\n logger.info(\n ` Skills: not in manifest (skipped) ${missing.join(', ')}`,\n );\n }\n }\n logger.info('');\n logger.info('Run \"teamix-evo tokens update\" to update resources later.');\n logger.info(\n 'Run \"teamix-evo tokens list-variants\" to see all available variants.',\n );\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","/**\n * Programmatic tokens init — installs one variant's token files into the\n * consumer's project root `tokens/` directory.\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md)\n * the install model is now a flat copy: each variant in `@teamix-evo/tokens`\n * advertises its files in the package manifest; for each advertised file we\n * copy by basename into `<projectRoot>/tokens/`:\n *\n * variants/<variant>/theme.css → tokens/tokens.theme.css (regenerable)\n * variants/<variant>/base.tokens.json → (kept in package only — reference data)\n *\n * Plus we always ensure `tokens/tokens.overrides.css` exists at the consumer\n * (created empty if absent, frozen thereafter so user edits are preserved\n * across re-installs).\n *\n * No walk-and-merge, no `default` baseline — every variant is a\n * self-contained token set per ADR 0020 §3.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type TokensPackLock,\n type InstalledManifest,\n type InstalledResource,\n type ProjectConfig,\n type UpdateStrategy,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { runSkillsAdd } from './skills-add.js';\nimport { ensureMcpJson } from '../utils/mcp.js';\nimport { loadSkillsData } from './skills-client.js';\nimport { logger } from '../utils/logger.js';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst DEFAULT_AUTO_SKILL_IDES: SkillIde[] = ['qoder', 'claude'];\nconst DEFAULT_AUTO_SKILL_SCOPE: SkillScope = 'project';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\n\n/** Consumer-side directory where token files land. */\nconst CONSUMER_TOKENS_DIR = 'tokens';\n\n/** Consumer-side filename for the regenerable theme. */\nconst CONSUMER_THEME_FILE = 'tokens.theme.css';\n\n/** Consumer-side filename for the frozen user-owned override. */\nconst CONSUMER_OVERRIDES_FILE = 'tokens.overrides.css';\n\n/** Default empty content for a fresh `tokens.overrides.css`. */\nconst EMPTY_OVERRIDES_TEMPLATE = `/* User-owned token overrides — frozen on subsequent installs. */\n/* See @teamix-evo/tokens variant theme.css for available CSS custom properties. */\n`;\n\nconst require = createRequire(import.meta.url);\n\nexport interface RunTokensInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Tokens variant id (e.g. `\"opentrek\"`, `\"uni-manager\"`). */\n variant: string;\n /** IDE identifier written into config.json (e.g. `\"qoder\"`, `\"claude\"`). */\n ide: string;\n /** Override the tokens package name (defaults to `\"@teamix-evo/tokens\"`). */\n packageName?: string;\n /**\n * Override resolution of the tokens package root. When provided, skips\n * `require.resolve(\"<packageName>/package.json\")`. Useful for tests that\n * want to point at a fixture tree, and for embedding inside `create`\n * where the package may not yet be installed in the consumer.\n */\n packageRoot?: string;\n}\n\n/**\n * Outcome of the post-init skill auto-install step. `attempted` is the variant\n * skill id we tried to install; `addedSkillIds` is what was actually installed\n * (empty if the skill was already present); `missing` lists ids that aren't in\n * the manifest (warned, not fatal). Per ADR / \"skills self-contained\" decision,\n * each variant skill is fully self-contained — no separate baseline skill.\n */\nexport interface SkillsAutoInstallResult {\n attempted: string[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n missing: string[];\n}\n\nexport type RunTokensInitResult =\n | {\n status: 'installed';\n packageName: string;\n variant: string;\n version: string;\n count: number;\n resources: InstalledResource[];\n /** Result of the auto-install of the matching design skill. */\n skills?: SkillsAutoInstallResult;\n }\n | {\n status: 'already-initialized';\n existingVariant: string;\n }\n | {\n status: 'variant-mismatch';\n existingVariant: string;\n requestedVariant: string;\n };\n\n/**\n * Programmatic equivalent of `teamix-evo tokens init <variant>`.\n *\n * Side effects:\n * - Creates `<projectRoot>/.teamix-evo/`\n * - Copies the variant's `theme.css` to `<projectRoot>/tokens/tokens.theme.css`\n * - Ensures `<projectRoot>/tokens/tokens.overrides.css` exists (frozen)\n * - Writes `tokens-lock.json`, `config.json`, `manifest.json` (installed)\n *\n * No interactive prompts, no `process.exit`. Throws on hard failure (P8).\n */\nexport async function runTokensInit(\n options: RunTokensInitOptions,\n): Promise<RunTokensInitResult> {\n const { projectRoot, variant, ide } = options;\n const packageName = options.packageName ?? DEFAULT_TOKENS_PACKAGE;\n\n await ensureTeamixDir(projectRoot);\n\n // Resolve the catalog up front so variant-name validation runs before any\n // state-driven branching (#P2-3). An unknown variant should produce a\n // clear \"Unknown variant\" error regardless of whether tokens are already\n // installed for the project.\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, variant);\n if (!variantEntry) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Unknown variant \"${variant}\". Available variants: ${\n known || '(none)'\n }.\\nRun \\`teamix-evo tokens list-variants\\` to see all options.`,\n );\n }\n\n // Variant-switching guard: if a different variant is already installed,\n // require the user to explicitly uninstall first (#15). Same-variant re-init\n // is a no-op (already-initialized).\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.tokens) {\n const existingVariant = existingConfig.packages.tokens.variant;\n if (existingVariant === variant) {\n return { status: 'already-initialized', existingVariant };\n }\n return {\n status: 'variant-mismatch',\n existingVariant,\n requestedVariant: variant,\n };\n }\n\n // Install advertised files by basename → consumer tokens/ directory.\n const installed: InstalledResource[] = [];\n for (const fileRel of variantEntry.files) {\n const result = await installVariantFile(fileRel, packageRoot, projectRoot);\n if (result) installed.push(result);\n }\n\n // Always ensure the user-owned overrides file exists (frozen).\n const overridesAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n CONSUMER_OVERRIDES_FILE,\n );\n if (!(await fileExists(overridesAbs))) {\n await writeFileSafe(overridesAbs, EMPTY_OVERRIDES_TEMPLATE);\n }\n const overridesContent = await fs.readFile(overridesAbs, 'utf-8');\n installed.push({\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: path.posix.join(CONSUMER_TOKENS_DIR, CONSUMER_OVERRIDES_FILE),\n hash: computeHash(overridesContent),\n strategy: 'frozen',\n });\n\n // Write consumer-side state files.\n const lock: TokensPackLock = {\n schemaVersion: 1,\n variant: {\n name: variantEntry.name,\n displayName: variantEntry.displayName,\n version: variantEntry.version,\n from: packageName,\n },\n packageVersion: catalog.version,\n linked: variantEntry.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n\n // Merge into existing config so unrelated package entries (skills / ui)\n // aren't clobbered (#18).\n const config: ProjectConfig = {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide: existingConfig?.ide ?? ide,\n packages: {\n ...(existingConfig?.packages ?? {}),\n tokens: {\n variant,\n version: variantEntry.version,\n tailwind: 'v4',\n },\n },\n };\n await writeProjectConfig(projectRoot, config);\n\n // Merge into existing installed manifest so other packages (ui / biz-ui /\n // templates) recorded earlier are preserved.\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const tokensIdx = prior.installed.findIndex((p) => p.package === packageName);\n const tokensEntry = {\n package: packageName,\n variant,\n version: variantEntry.version,\n installedAt: new Date().toISOString(),\n resources: installed,\n };\n if (tokensIdx >= 0) prior.installed[tokensIdx] = tokensEntry;\n else prior.installed.push(tokensEntry);\n await writeInstalledManifest(projectRoot, prior);\n\n // Ensure `.mcp.json` exists for incremental adopters (#BUG-103). Done\n // before the auto-skills install so even if the latter fails the MCP\n // wiring is in place.\n await ensureMcpJson(projectRoot);\n\n // After the lock + manifest are persisted, auto-install matching skills.\n // Failures here do NOT roll back the install — the skill layer is additive,\n // and the user can always re-run `skills add` manually.\n const skills = await tryAutoInstallVariantSkills({\n projectRoot,\n variant,\n ide,\n });\n\n return {\n status: 'installed',\n packageName,\n variant,\n version: variantEntry.version,\n count: installed.length,\n resources: installed,\n skills,\n };\n}\n\n/**\n * Auto-install the variant skill `teamix-evo-design-<variant>` (if present\n * in the skills manifest). Each variant skill is fully self-contained — no\n * separate baseline. A missing variant skill produces a warning, not a failure.\n */\nasync function tryAutoInstallVariantSkills(args: {\n projectRoot: string;\n variant: string;\n ide: string;\n}): Promise<SkillsAutoInstallResult> {\n const { projectRoot, variant, ide } = args;\n const variantSkillId = `teamix-evo-design-${variant}`;\n const desired = [variantSkillId];\n\n // Filter to skills actually present in the manifest. Anything missing\n // becomes a warning but is not fatal.\n let manifestSkillIds: Set<string>;\n try {\n const { manifest } = await loadSkillsData(DEFAULT_SKILLS_PACKAGE);\n manifestSkillIds = new Set(manifest.skills.map((s) => s.id));\n } catch (err) {\n logger.warn(\n `Skipping skills auto-install: could not load skills manifest (${\n (err as Error).message\n }).`,\n );\n return {\n attempted: [],\n addedSkillIds: [],\n skippedSkillIds: [],\n missing: desired,\n };\n }\n\n const present = desired.filter((id) => manifestSkillIds.has(id));\n const missing = desired.filter((id) => !manifestSkillIds.has(id));\n if (missing.length > 0) {\n logger.warn(\n `Skills auto-install: not found in manifest, skipping: ${missing.join(\n ', ',\n )}.`,\n );\n }\n if (present.length === 0) {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n\n try {\n const result = await runSkillsAdd({\n projectRoot,\n names: present,\n ides: DEFAULT_AUTO_SKILL_IDES,\n scope: DEFAULT_AUTO_SKILL_SCOPE,\n ide,\n });\n if (result.status !== 'installed') {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: present,\n missing,\n };\n }\n return {\n attempted: desired,\n addedSkillIds: result.addedSkillIds,\n skippedSkillIds: result.skippedSkillIds,\n missing,\n };\n } catch (err) {\n logger.warn(\n `Skills auto-install failed (continuing): ${(err as Error).message}`,\n );\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n}\n\n/**\n * Install one advertised variant file. Mapping by basename:\n *\n * theme.css → consumer `tokens/tokens.theme.css` (regenerable)\n * overrides.css → consumer `tokens/tokens.overrides.css` (frozen, see runTokensInit)\n * anything else → skipped (reference data — kept in npm package only)\n *\n * The `overrides.css` source file is rare today (variants don't ship one),\n * but the mapping is here so authors can opt in. The \"always-create\" path in\n * `runTokensInit` covers the normal case where no source override is present.\n */\nasync function installVariantFile(\n fileRelToPackage: string,\n packageRoot: string,\n projectRoot: string,\n): Promise<InstalledResource | null> {\n const sourceAbs = path.join(packageRoot, fileRelToPackage);\n const base = path.basename(fileRelToPackage);\n\n if (base === 'theme.css') {\n const targetRel = path.posix.join(\n CONSUMER_TOKENS_DIR,\n CONSUMER_THEME_FILE,\n );\n const targetAbs = path.join(projectRoot, targetRel);\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n return {\n id: `tokens:${CONSUMER_THEME_FILE}`,\n target: targetRel,\n hash: computeHash(content),\n strategy: 'regenerable',\n };\n }\n\n if (base === 'overrides.css' || base === 'tokens.overrides.css') {\n const targetRel = path.posix.join(\n CONSUMER_TOKENS_DIR,\n CONSUMER_OVERRIDES_FILE,\n );\n const targetAbs = path.join(projectRoot, targetRel);\n if (await fileExists(targetAbs)) {\n // Frozen — leave the user's customization alone.\n const existing = await fs.readFile(targetAbs, 'utf-8');\n return {\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: targetRel,\n hash: computeHash(existing),\n strategy: 'frozen',\n };\n }\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n return {\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: targetRel,\n hash: computeHash(content),\n strategy: 'frozen',\n };\n }\n\n // Reference data (e.g. base.tokens.json) — kept in the npm package only.\n return null;\n}\n\n/**\n * Resolve the tokens package root via `require.resolve` so the CLI works\n * both inside the workspace (pnpm symlinks) and from a published consumer.\n */\nfunction resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n\n/**\n * List all variants advertised by the top-level tokens catalog. Used by\n * `teamix-evo tokens list-variants`.\n */\nexport interface ListVariantsResult {\n packageName: string;\n packageVersion: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n linked?: { 'biz-ui'?: string; templates?: string };\n }>;\n}\n\nexport async function listTokenVariants(\n packageName: string = DEFAULT_TOKENS_PACKAGE,\n packageRoot?: string,\n): Promise<ListVariantsResult> {\n const root = packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(root);\n return {\n packageName,\n packageVersion: catalog.version,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n linked: v.linked,\n })),\n };\n}\n\n// Re-export the strategy enum constituents so consumers don't have to import\n// from registry separately.\nexport type { UpdateStrategy };\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 { 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 { 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 * as path from \"node:path\";\nimport type {\n ProjectConfig,\n InstalledManifest,\n SkillsLock,\n TokensPackLock,\n} from \"@teamix-evo/registry\";\nimport {\n validateConfig,\n validateInstalled,\n validateSkillsLock,\n TokensPackLockSchema,\n} 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\";\nconst TOKENS_LOCK_FILE = \"tokens-lock.json\";\nconst SKILLS_DIR = \"skills\";\nconst SKILLS_LOCK_FILE = \"manifest.lock.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; THROWS on corrupted content\n * so callers don't silently clobber prior config (#32 #18).\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 let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Corrupted config.json (${(err as Error).message}). ` +\n `Fix the JSON manually or remove the file to start fresh; refusing to clobber prior config.`,\n );\n }\n const result = validateConfig(data);\n if (!result.success) {\n throw new Error(\n `Invalid config.json schema: ${result.error}. ` +\n `Fix the file manually or remove it to start fresh.`,\n );\n }\n return result.data;\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; THROWS on corrupted content so\n * callers don't silently lose prior installs by treating broken JSON as\n * \"fresh install\" (#32 #18). Use `readInstalledManifestOrNull` for the\n * old lenient behavior.\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 let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Corrupted manifest.json (${(err as Error).message}). ` +\n `Fix the JSON manually or remove the file to start fresh; refusing to clobber prior install records.`,\n );\n }\n const result = validateInstalled(data);\n if (!result.success) {\n throw new Error(\n `Invalid manifest.json schema: ${result.error}. ` +\n `Fix the file manually or remove it to start fresh.`,\n );\n }\n return result.data;\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\n/**\n * Read .teamix-evo/tokens-lock.json. Returns null if missing or invalid.\n */\nexport async function readTokensLock(\n projectRoot: string,\n): Promise<TokensPackLock | null> {\n const lockPath = path.join(projectRoot, TEAMIX_DIR, TOKENS_LOCK_FILE);\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const parsed = TokensPackLockSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n logger.warn(`Invalid tokens-lock.json: ${parsed.error.message}`);\n return null;\n }\n return parsed.data;\n } catch (err) {\n logger.warn(\n `Failed to parse tokens-lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Convenience: read just the variant id from tokens-lock.json. Returns null\n * when no tokens variant has been installed.\n */\nexport async function readTokensVariant(\n projectRoot: string,\n): Promise<string | null> {\n const lock = await readTokensLock(projectRoot);\n return lock?.variant.name ?? null;\n}\n\n/**\n * Absolute path to the per-skill source directory (consumer-side source).\n * Per ADR 0013, this is the truth source from which IDE mirrors are produced.\n */\nexport function getSkillsSourceDir(\n projectRoot: string,\n skillName?: string,\n): string {\n const base = path.join(projectRoot, TEAMIX_DIR, SKILLS_DIR);\n return skillName ? path.join(base, skillName) : base;\n}\n\n/**\n * Read .teamix-evo/skills/manifest.lock.json. Returns null if missing.\n */\nexport async function readSkillsLock(\n projectRoot: string,\n): Promise<SkillsLock | null> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const data = JSON.parse(raw);\n const result = validateSkillsLock(data);\n if (!result.success) {\n logger.warn(`Invalid skills manifest.lock.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(\n `Failed to parse skills manifest.lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Write .teamix-evo/skills/manifest.lock.json.\n */\nexport async function writeSkillsLock(\n projectRoot: string,\n lock: SkillsLock,\n): Promise<void> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n await writeFileSafe(lockPath, JSON.stringify(lock, null, 2) + \"\\n\");\n logger.debug(`Wrote skills lock → ${lockPath}`);\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 {\n replaceManagedRegion,\n hasManagedRegion,\n} 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';\nimport { getSkillsSourceDir } from './state.js';\n\n/**\n * Source-mirror skills installer (per ADR 0013).\n *\n * Two-stage flow:\n * 1. **writeSkillSources** — render upstream `<packageRoot>/<skill.source>` and\n * write to `<projectRoot>/.teamix-evo/skills/<id>/` (the consumer-side\n * source of truth, regenerable, in git).\n * 2. **syncSkillsToIdes** — pure byte-for-byte copy from source dir to each\n * requested IDE mirror path (`.qoder/skills/<id>/`, `.claude/skills/<id>/`).\n * Mirrors are 100% derived; not subject to managed-region preservation.\n *\n * `installSkills` orchestrates both. `updateSkills` re-renders the source with\n * managed-region preservation against the existing source (NOT the mirrors),\n * then re-syncs.\n */\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 using the\n * source-mirror flow. Returns InstalledResource records for both source files\n * and IDE mirror files.\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 const sourceRecords = await writeSkillSource(skill, options);\n installed.push(...sourceRecords);\n\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n options.projectRoot,\n );\n installed.push(...mirrorRecords);\n }\n }\n\n return { resources: installed, count: installed.length };\n}\n\n/**\n * Render upstream skill source(s) and write to `.teamix-evo/skills/<id>/`.\n * Returns InstalledResource records (one per file) describing the source files.\n */\nasync function writeSkillSource(\n skill: SkillEntry,\n options: SkillInstallOptions,\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n const records: 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 records.push(makeSourceRecord(skill, targetFile, content));\n logger.debug(` Wrote source: ${targetFile}`);\n return records;\n }\n\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 const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\n await writeFileSafe(targetFile, content);\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n logger.debug(` Wrote source: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Mirror an installed skill source to a single IDE path.\n *\n * Per ADR 0013, mirrors are normally pure byte-for-byte copies of source.\n * However, when the existing mirror file already contains managed-region\n * markers that match the skill's declared `managedRegions`, the writer falls\n * back to a managed-region replacement (#BUG-101) so user-authored notes\n * outside the markers are preserved across `skills update` / `skills sync`.\n * If markers are absent, the full source content is written (backward-compat).\n */\nasync function mirrorSkillToIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n projectRoot: string,\n): Promise<InstalledResource[]> {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const records: InstalledResource[] = [];\n\n const sourceFiles = await walkDir(sourceDir);\n await ensureDir(targetDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n records.push(\n makeMirrorRecord(skill, targetFile, writtenContent, ide, scope, rel),\n );\n logger.debug(` Mirrored ${ide}:${scope}: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Write a mirror file with optional managed-region preservation (#BUG-101).\n *\n * Behavior:\n * - Target absent → full write of source.\n * - `managedRegions` empty/undefined OR existing mirror has no matching\n * markers → full overwrite (with drift warning if content differs).\n * - Otherwise → replace each present managed region's content from the\n * source into the existing mirror, preserving content outside markers.\n *\n * Returns the bytes actually written (used for the InstalledResource hash).\n */\nasync function writeMirrorContent(\n targetFile: string,\n sourceContent: string,\n managedRegions: readonly string[] | undefined,\n sourceFile: string,\n): Promise<string> {\n const existing = await readFileOrNull(targetFile);\n\n if (existing === null) {\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n\n const regions = managedRegions ?? [];\n const matchedRegions = regions.filter((id) => hasManagedRegion(existing, id));\n\n if (matchedRegions.length === 0) {\n if (existing !== sourceContent) {\n logger.warn(\n `Mirror drift detected at ${targetFile} — overwriting from source. ` +\n `Edit ${sourceFile} (not the mirror) and re-run \\`teamix-evo skills sync\\`.`,\n );\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n return existing;\n }\n\n let merged = existing;\n for (const id of matchedRegions) {\n const newRegion = extractRegionBody(sourceContent, id);\n if (newRegion === null) continue;\n try {\n merged = replaceManagedRegion(merged, id, newRegion);\n } catch {\n // Region present in existing but pattern failed; skip safely.\n }\n }\n if (merged !== existing) {\n await writeFileSafe(targetFile, merged);\n }\n return merged;\n}\n\nfunction extractRegionBody(content: string, id: string): string | null {\n const re = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(\n id,\n )}\" -->`,\n );\n const m = content.match(re);\n if (!m) return null;\n return m[1]!.replace(/^\\n/, '').replace(/\\n$/, '');\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 makeSourceRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n rel?: string,\n): InstalledResource {\n const id = rel ? `${skill.id}:source:${rel}` : `${skill.id}:source`;\n return {\n id,\n target: targetAbs,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n };\n}\n\nfunction makeMirrorRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n ide: SkillIde,\n scope: SkillScope,\n rel?: string,\n): InstalledResource {\n const id = rel && rel !== 'SKILL.md' ? `${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 /**\n * Optional: existing installed records (legacy parameter kept for callers that\n * still pass it). The refactored updater consults the file-system source under\n * `.teamix-evo/skills/<id>/` for managed-region preservation, so this is\n * unused by the new flow. Callers should stop passing it.\n */\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 with managed-region preservation applied at the SOURCE layer\n * (not the mirrors). After source is rewritten, mirrors are re-synced cleanly.\n */\nexport async function updateSkills(\n options: SkillUpdateOptions,\n): Promise<SkillUpdateResult> {\n const { manifest, ides, scope, projectRoot } = options;\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n const updated: InstalledResource[] = [];\n\n for (const skill of manifest.skills) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) continue;\n\n const sourceRecords = await rewriteSkillSource(\n skill,\n options,\n summary,\n );\n updated.push(...sourceRecords);\n\n // Mirrors are always overwritten cleanly from the (now updated) source.\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n projectRoot,\n );\n updated.push(...mirrorRecords);\n }\n }\n\n return { resources: updated, summary };\n}\n\nasync function rewriteSkillSource(\n skill: SkillEntry,\n options: SkillUpdateOptions,\n summary: SkillUpdateResult['summary'],\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n\n if (!stat.isFile()) {\n // Directory skills always overwrite source recursively.\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n const records: InstalledResource[] = [];\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 const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\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 const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n }\n return records;\n }\n\n // Single-file skill: target = .teamix-evo/skills/<id>/SKILL.md\n const targetFile = path.join(targetDir, 'SKILL.md');\n const newContent = await renderSkillContent(sourceAbs, skill, data);\n const exists = await fileExists(targetFile);\n\n if (skill.updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n const current = (await readFileOrNull(targetFile)) ?? newContent;\n return [makeSourceRecord(skill, targetFile, current)];\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n return [makeSourceRecord(skill, targetFile, newContent)];\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 return [makeSourceRecord(skill, targetFile, newContent)];\n }\n\n // managed: preserve outside-region content from the existing SOURCE.\n const current = await readFileOrNull(targetFile);\n let merged = current ?? newContent;\n for (const regionId of skill.managedRegions ?? []) {\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 merged = replaceManagedRegion(merged, 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, merged);\n summary.managed++;\n return [makeSourceRecord(skill, targetFile, merged)];\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Sync existing skill sources to the requested IDE mirror paths.\n *\n * Used by:\n * - `skills add` (immediate mirror after source write — handled by installSkills)\n * - `skills sync` (re-mirror after the user adds an IDE or moves machines)\n * - `skills update` (re-mirror after source is rewritten)\n *\n * `onlyIds` lets the caller limit which skills are synced.\n */\nexport interface SkillSyncOptions {\n projectRoot: string;\n /** Skills present in the source dir to mirror (caller derives from lock). */\n skills: ReadonlyArray<{\n id: string;\n name: string;\n updateStrategy: SkillEntry['updateStrategy'];\n /** Managed-region ids for region-aware mirror sync. */\n managedRegions?: readonly string[];\n }>;\n ides: readonly SkillIde[];\n scope: SkillScope;\n onlyIds?: string[];\n}\n\nexport interface SkillSyncResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Mirror existing source dirs (`.teamix-evo/skills/<id>/`) to the given IDE\n * paths. Pure byte-for-byte copy — no rendering, no merge.\n */\nexport async function syncSkillsToIdes(\n options: SkillSyncOptions,\n): Promise<SkillSyncResult> {\n const { projectRoot, skills, ides, scope, onlyIds } = options;\n const out: InstalledResource[] = [];\n\n const targets = skills.filter((s) => !onlyIds || onlyIds.includes(s.id));\n for (const skill of targets) {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n if (!(await fileExists(sourceDir))) {\n logger.warn(\n `Skill \"${skill.id}\" has no source at ${sourceDir}; skipped.`,\n );\n continue;\n }\n for (const ide of ides) {\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(\n skill.name,\n scope,\n projectRoot,\n );\n await ensureDir(targetDir);\n const sourceFiles = await walkDir(sourceDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n // Region-aware mirror write (#BUG-101): keep user content outside\n // managed markers when the mirror already has them; otherwise full\n // overwrite (with drift warning).\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n out.push({\n id: rel === 'SKILL.md' ? skill.id : `${skill.id}:${rel}`,\n target: targetFile,\n hash: computeHash(writtenContent),\n strategy: skill.updateStrategy,\n ide,\n scope,\n });\n }\n }\n }\n return { resources: out, count: out.length };\n}\n\n/**\n * Remove all installed skill files. Returns the absolute paths removed.\n * After files are unlinked, walks up the directory tree pruning empty dirs\n * until a non-empty ancestor is reached (#33).\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 // Walk-up empty-dir prune. Collect immediate parents, then for each, walk\n // up the tree calling rmdir as long as the dir is empty. Bound the walk\n // to a small depth to prevent runaway in pathological filesystems.\n const startDirs = new Set(records.map((r) => path.dirname(r.target)));\n for (const startDir of startDirs) {\n let dir = startDir;\n for (let depth = 0; depth < 8; depth++) {\n try {\n const entries = await fs.readdir(dir);\n if (entries.length !== 0) break;\n await fs.rmdir(dir);\n } catch {\n break;\n }\n dir = path.dirname(dir);\n }\n }\n return removed;\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 { writeFileSafe, fileExists } from './fs.js';\nimport { logger } from './logger.js';\n\n/**\n * `.mcp.json` content launched by Cursor / Claude Code / Cline.\n *\n * Kept in sync with the scaffold writer in `@teamix-evo/create`. Any change\n * here MUST be mirrored there (see `packages/create/src/orchestrator.ts`).\n */\nconst MCP_JSON_CONTENT = {\n mcpServers: {\n 'teamix-evo': {\n command: 'npx',\n args: ['-y', '@teamix-evo/mcp'],\n },\n },\n} as const;\n\n/**\n * Ensure that `<projectRoot>/.mcp.json` exists.\n *\n * This is called from the incremental entry points (`tokens init`, `skills\n * add`, `ui init`) so projects that adopted teamix-evo without `create` still\n * get the MCP wiring (#BUG-103). Existing files are never overwritten — users\n * may have customised them.\n *\n * Returns `'created'` on first write, `'exists'` if a file is already present,\n * `'failed'` if writing failed (logged as a warning; never throws).\n */\nexport async function ensureMcpJson(\n projectRoot: string,\n): Promise<'created' | 'exists' | 'failed'> {\n const mcpPath = path.join(projectRoot, '.mcp.json');\n if (await fileExists(mcpPath)) return 'exists';\n try {\n await writeFileSafe(mcpPath, JSON.stringify(MCP_JSON_CONTENT, null, 2) + '\\n');\n logger.debug(`Wrote .mcp.json → ${mcpPath}`);\n return 'created';\n } catch (err) {\n logger.warn(`Failed to write .mcp.json: ${(err as Error).message}`);\n return 'failed';\n }\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\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 readSkillsLock,\n writeSkillsLock,\n readTokensVariant,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\nimport { ensureMcpJson } from '../utils/mcp.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 // 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 // Determine which variant skills should be in scope. Read once up front;\n // null when no tokens variant is initialized.\n const currentTokensVariant = await readTokensVariant(projectRoot);\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 existingLock = await readSkillsLock(projectRoot);\n const existingSkillIds = new Set([\n ...Object.keys(existingLock?.skills ?? {}),\n // Legacy fallback: pre-ADR-0013 installs only had manifest.json. Derive\n // skill ids by stripping the trailing :source / :sub-file suffix.\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 // Bulk mode: filter out variant-bound skills that don't match the current\n // tokens variant (or all variant skills, when no tokens variant is installed).\n // Then subtract already-installed skills so a re-run of `skills add` after\n // a partial auto-install (e.g. only `manage` + `design-{variant}` from\n // `tokens init`) still completes the missing default skills (#BUG-102).\n const candidateIds = manifest.skills\n .filter((s) => {\n if (!s.variant) return true;\n if (!currentTokensVariant) {\n logger.debug(\n `Skipping variant-bound skill \"${s.id}\" (variant=${s.variant}): no tokens variant installed; will be picked up when \"tokens init\" runs.`,\n );\n return false;\n }\n if (s.variant !== currentTokensVariant) {\n logger.debug(\n `Skipping variant-bound skill \"${s.id}\" (variant=${s.variant}): current tokens variant is \"${currentTokensVariant}\".`,\n );\n return false;\n }\n return true;\n })\n .map((s) => s.id);\n skippedSkillIds = candidateIds.filter((id) => existingSkillIds.has(id));\n onlyIds = candidateIds.filter((id) => !existingSkillIds.has(id));\n }\n\n // Bulk mode + skills already configured + nothing missing → already-added.\n if (!isIncremental && existingSkillsCfg && onlyIds.length === 0) {\n return { status: 'already-added' };\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 installedAt = new Date().toISOString();\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,\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 // Update skills source-mirror lock (per ADR 0013).\n const lock: SkillsLock = existingLock ?? {\n schemaVersion: 1,\n skills: {},\n };\n for (const skillId of onlyIds) {\n const skillDef = manifest.skills.find((s) => s.id === skillId);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[skillId] = {\n version: skillDef.version,\n from: packageName,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\n\n // After the install completes, ensure the MCP launcher config exists so\n // Cursor / Claude Code / Cline pick up `@teamix-evo/mcp` automatically\n // (#BUG-103). Existing `.mcp.json` files are preserved.\n await ensureMcpJson(projectRoot);\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 { existsSync } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nconst GLOBAL_META_DIR = '.teamix-evo-global';\nconst TEAMIX_DIR = '.teamix-evo';\nconst CONFIG_FILE = 'config.json';\n\nexport function getGlobalMetaRoot(): string {\n return path.join(os.homedir(), GLOBAL_META_DIR);\n}\n\nexport function isTeamixEvoProject(dir: string): boolean {\n return existsSync(path.join(dir, TEAMIX_DIR, CONFIG_FILE));\n}\n\nexport async function ensureGlobalMetaRoot(): Promise<string> {\n const root = getGlobalMetaRoot();\n await fs.mkdir(root, { recursive: true });\n return root;\n}\n\n/**\n * Quick guard for project-scope commands (`tokens init`, `ui init`,\n * `skills add` with project scope): refuses to run when the cwd has no\n * `package.json`, because that almost always means the user is in the\n * wrong directory and we'd otherwise scaffold `.qoder/`/`.claude/`/\n * `.teamix-evo/` into an empty/unintended folder.\n *\n * Returns `true` when a `package.json` exists at the given root.\n */\nexport function hasPackageJson(projectRoot: string): boolean {\n return existsSync(path.join(projectRoot, 'package.json'));\n}\n\n/**\n * Resolve the root that holds skills metadata for maintenance commands\n * (update / uninstall / list / sync / doctor).\n *\n * `skills add --scope global` writes metadata to ~/.teamix-evo-global when cwd\n * isn't a teamix-evo project, so maintenance commands must look there too —\n * otherwise the user gets \"Skills not added\" right after a successful install.\n *\n * Resolution order:\n * 1. cwd itself, if it's a teamix-evo project.\n * 2. ~/.teamix-evo-global, if it has been initialized as a meta root.\n * 3. cwd as a fallback (caller surfaces the missing-config error).\n */\nexport function resolveSkillsMaintenanceRoot(cwd: string): string {\n if (isTeamixEvoProject(cwd)) return cwd;\n const globalRoot = getGlobalMetaRoot();\n if (isTeamixEvoProject(globalRoot)) return globalRoot;\n return cwd;\n}\n","/**\n * `teamix-evo tokens update` — refresh regenerable tokens in place.\n *\n * Replaces the v0.3 placeholder that just printed \"not implemented\".\n * Per ADR 0003: regenerable files rewritten, frozen preserved (#12).\n */\nimport { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensUpdate } from '../../core/tokens-update.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const updateCommand = new Command('update')\n .description(\n '刷新 design tokens(regenerable 覆盖、frozen 保留 — ADR 0003 三态)',\n )\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const result = await runTokensUpdate({ projectRoot });\n\n if (result.status === 'not-initialized') {\n logger.error(\n 'No tokens variant installed. Run `teamix-evo tokens init <variant>` first.',\n );\n process.exitCode = 1;\n return;\n }\n\n if (result.status === 'up-to-date') {\n logger.success(\n `Already at latest: ${result.packageName} (${result.variant} v${result.version})`,\n );\n logger.info(\n ' Regenerable files refreshed in case of manual edits.',\n );\n return;\n }\n\n logger.success(\n `Updated ${result.packageName} (${result.variant}): v${result.from} → v${result.to}`,\n );\n if (result.rewritten.length > 0) {\n logger.info(` Rewrote: ${result.rewritten.join(', ')}`);\n }\n if (result.preserved.length > 0) {\n logger.info(\n ` Preserved: ${result.preserved.join(', ')} (frozen — your customizations kept)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to update tokens: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo tokens update` — refresh regenerable token files in place.\n *\n * Per ADR 0003 三态:\n * - `tokens.theme.css` (regenerable) → overwritten with latest upstream\n * - `tokens.overrides.css` (frozen) → preserved (user-owned)\n * - `tokens-lock.json` (regenerable) → version + installedAt refreshed\n * - `config.json` (managed) → only `packages.tokens.version` bumped\n *\n * Variant switching is NOT performed here — use `tokens uninstall` then\n * `tokens init <other-variant>`. This command is for in-place version bumps.\n *\n * Implements #12. ADR 0019 is updated to reflect the v0.4 design.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledManifest,\n type InstalledResource,\n type TokensPackLock,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_TOKENS_DIR = 'tokens';\nconst CONSUMER_THEME_FILE = 'tokens.theme.css';\n\nconst require = createRequire(import.meta.url);\n\nexport interface RunTokensUpdateOptions {\n projectRoot: string;\n packageName?: string;\n /** Override resolution of the upstream tokens package root. */\n packageRoot?: string;\n}\n\nexport type RunTokensUpdateResult =\n | {\n status: 'updated';\n packageName: string;\n variant: string;\n from: string;\n to: string;\n rewritten: string[];\n preserved: string[];\n }\n | {\n status: 'not-initialized';\n }\n | {\n status: 'up-to-date';\n packageName: string;\n variant: string;\n version: string;\n };\n\nexport async function runTokensUpdate(\n options: RunTokensUpdateOptions,\n): Promise<RunTokensUpdateResult> {\n const { projectRoot } = options;\n const packageName = options.packageName ?? DEFAULT_TOKENS_PACKAGE;\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.tokens) {\n return { status: 'not-initialized' };\n }\n const currentVariant = config.packages.tokens.variant;\n const currentVersion = config.packages.tokens.version;\n\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, currentVariant);\n if (!variantEntry) {\n throw new Error(\n `Currently installed variant \"${currentVariant}\" no longer exists in ${packageName}@${catalog.version}. ` +\n `Available: ${catalog.variants.map((v) => v.name).join(', ')}. ` +\n `Run \\`teamix-evo tokens uninstall\\` then \\`teamix-evo tokens init <variant>\\` to switch.`,\n );\n }\n\n if (variantEntry.version === currentVersion) {\n // Same version — refresh resources anyway so manual edits to regenerable\n // files revert, but report up-to-date for clarity.\n await rewriteRegenerableFiles(variantEntry.files, packageRoot, projectRoot);\n return {\n status: 'up-to-date',\n packageName,\n variant: currentVariant,\n version: currentVersion,\n };\n }\n\n const rewritten = await rewriteRegenerableFiles(\n variantEntry.files,\n packageRoot,\n projectRoot,\n );\n\n const preserved: string[] = [];\n const overridesAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n 'tokens.overrides.css',\n );\n if (await fileExists(overridesAbs)) preserved.push('tokens.overrides.css');\n\n // Update lock.json\n const lock: TokensPackLock = {\n schemaVersion: 1,\n variant: {\n name: variantEntry.name,\n displayName: variantEntry.displayName,\n version: variantEntry.version,\n from: packageName,\n },\n packageVersion: catalog.version,\n linked: variantEntry.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n\n // Bump version in config.json (preserve everything else — fixes #18)\n config.packages.tokens.version = variantEntry.version;\n await writeProjectConfig(projectRoot, config);\n\n // Update installed manifest entry (preserve other packages)\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = prior.installed.findIndex((p) => p.package === packageName);\n if (idx >= 0) {\n prior.installed[idx]!.version = variantEntry.version;\n prior.installed[idx]!.installedAt = new Date().toISOString();\n // Recompute hashes for rewritten files\n for (const r of prior.installed[idx]!.resources) {\n if (r.strategy === 'regenerable') {\n const abs = path.isAbsolute(r.target)\n ? r.target\n : path.join(projectRoot, r.target);\n if (await fileExists(abs)) {\n r.hash = computeHash(await fs.readFile(abs, 'utf-8'));\n }\n }\n }\n await writeInstalledManifest(projectRoot, prior);\n }\n\n return {\n status: 'updated',\n packageName,\n variant: currentVariant,\n from: currentVersion,\n to: variantEntry.version,\n rewritten,\n preserved,\n };\n}\n\nasync function rewriteRegenerableFiles(\n files: readonly string[],\n packageRoot: string,\n projectRoot: string,\n): Promise<string[]> {\n const written: string[] = [];\n for (const fileRel of files) {\n const base = path.basename(fileRel);\n if (base !== 'theme.css') continue; // only theme.css is regenerable in v0.4\n const sourceAbs = path.join(packageRoot, fileRel);\n const targetAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n CONSUMER_THEME_FILE,\n );\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n written.push(CONSUMER_THEME_FILE);\n }\n return written;\n}\n\nfunction resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\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?.tokens) {\n logger.info('No tokens variant installed.');\n logger.info('Run \"teamix-evo tokens init [variant]\" to get started.');\n return;\n }\n\n const { variant, version } = config.packages.tokens;\n\n logger.info('Installed tokens variant:');\n logger.info(` Package: @teamix-evo/tokens`);\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/tokens' && 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","/**\n * `teamix-evo tokens list-variants` — list AVAILABLE variants in the\n * `@teamix-evo/tokens` catalog (vs `tokens list` which lists what's\n * INSTALLED in the consumer project).\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md).\n */\nimport { Command } from 'commander';\nimport { listTokenVariants } from '../../core/tokens-init.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/tokens 包内提供的所有变体')\n .action(async () => {\n try {\n const result = await listTokenVariants();\n\n logger.info(\n `Available variants in ${result.packageName} v${result.packageVersion}:`,\n );\n logger.info('');\n\n if (result.variants.length === 0) {\n logger.info(' (no variants advertised in manifest.json)');\n return;\n }\n\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n if (v.linked) {\n const links: string[] = [];\n if (v.linked['biz-ui']) links.push(`biz-ui: ${v.linked['biz-ui']}`);\n if (v.linked.templates)\n links.push(`templates: ${v.linked.templates}`);\n if (links.length) logger.info(` linked: ${links.join(' / ')}`);\n }\n logger.info('');\n }\n\n logger.info('Install a variant: teamix-evo tokens init <name>');\n } catch (err) {\n logger.error(`Failed to list variants: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\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 TOKENS_PACKAGE = '@teamix-evo/tokens';\n\ninterface UninstallOptions {\n yes?: boolean;\n keepFiles?: boolean;\n purge?: boolean;\n}\n\nexport const uninstallCommand = new Command('uninstall')\n .description(\n '卸载已装的 tokens 变体(默认保留 frozen 文件如 tokens.overrides.css;--purge 才一并删)',\n )\n .option('-y, --yes', '跳过确认')\n .option(\n '--keep-files',\n '仅清理 .teamix-evo 中的记账信息,不删除任何落地资源文件',\n )\n .option(\n '--purge',\n '同时删除 frozen 文件(默认 frozen / managed 都保留 — ADR 0003)',\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?.tokens) {\n logger.info('No tokens variant installed. Nothing to do.');\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === TOKENS_PACKAGE,\n );\n const resources = pkg?.resources ?? [];\n\n // Per ADR 0003 三态: by default keep both frozen (user-owned, immutable\n // across upgrades) and managed (user-edited region). Only regenerable\n // files are removed. `--purge` opts into removing frozen too.\n const removable = opts.keepFiles\n ? []\n : opts.purge\n ? resources.filter((r) => r.strategy !== 'managed')\n : resources.filter((r) => r.strategy === 'regenerable');\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: '确认卸载 tokens 变体?',\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 !== TOKENS_PACKAGE,\n );\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n // 3. Update config (preserve other packages — fixes #18 regression)\n delete config.packages.tokens;\n await writeProjectConfig(projectRoot, config);\n\n // 4. Remove tokens-lock.json (state file, regenerable)\n const lockPath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-lock.json',\n );\n try {\n await fs.unlink(lockPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(\n `Failed to remove tokens-lock.json: ${(err as Error).message}`,\n );\n }\n }\n\n logger.success(`Uninstalled ${TOKENS_PACKAGE}`);\n logger.info(` Removed: ${removed} files`);\n if (kept > 0) {\n const note = opts.purge\n ? 'managed (you may delete manually)'\n : 'frozen / managed (preserved — ADR 0003; --purge to force)';\n logger.info(` Kept: ${kept} files — ${note}`);\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';\nimport { syncCommand } from './sync.js';\nimport { doctorCommand } from './doctor.js';\n\nexport const skillsCommand = new Command('skills').description(\n '管理 teamix-evo skills(向 AI IDE 注入技能;source-mirror 模型见 ADR 0013)',\n);\n\nskillsCommand.addCommand(addCommand);\nskillsCommand.addCommand(listCommand);\nskillsCommand.addCommand(updateCommand);\nskillsCommand.addCommand(syncCommand);\nskillsCommand.addCommand(doctorCommand);\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 {\n ensureGlobalMetaRoot,\n hasPackageJson,\n isTeamixEvoProject,\n} from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const isIncremental = names.length > 0;\n\n const { ides, scope } = await resolveIdesAndScope({\n opts,\n projectRoot: cwd,\n isIncremental,\n });\n\n // scope=global 且 cwd 不是 Teamix Evo 项目 → 把元数据写到全局根,\n // 避免污染 cwd。后续维护命令需 `cd ~/.teamix-evo-global` 操作。\n let projectRoot = cwd;\n if (scope === 'global' && !isTeamixEvoProject(cwd)) {\n projectRoot = await ensureGlobalMetaRoot();\n logger.info(`Global skill install — meta root: ${projectRoot}`);\n } else if (scope !== 'global' && !hasPackageJson(cwd)) {\n // Project-scope install requires a real project root. Refuse early\n // so we don't scaffold `.qoder/`/`.claude/`/`.teamix-evo/` into a\n // wrong/empty directory.\n logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exit(1);\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 { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n readSkillsLock,\n} from '../../core/state.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 const skillsLock = await readSkillsLock(projectRoot);\n\n // Group installed resources by skill id (resource id is \"<skillId>\" or\n // \"<skillId>:<rel>\"). When manifest is stale or missing, fall back to\n // the skills lock — both add+sync update the lock, so it's the most\n // reliable indicator of \"is this skill installed?\" (#19 #35).\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 for (const skillId of Object.keys(skillsLock?.skills ?? {})) {\n if (!installedBySkill.has(skillId)) {\n installedBySkill.set(skillId, 1); // minimum signal: lock says it's installed\n }\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 // installedBySkill is the truth — consult lock + manifest both (#19).\n const isInstalled = installedBySkill.size > 0;\n\n if (isInstalled && config?.packages?.skills && pkg) {\n printInstalledHeader(config.packages.skills, pkg.installedAt);\n } else if (isInstalled) {\n logger.info(\n `Installed (${installedBySkill.size} skill(s)) — config or manifest record missing; run \"teamix-evo skills doctor\" to repair.`,\n );\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 {\n SkillIde,\n SkillScope,\n SkillsLock,\n} 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 readSkillsLock,\n writeSkillsLock,\n} from '../../core/state.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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 cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 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 });\n\n // Update config version\n config.packages.skills.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // Update installed manifest\n const installedAt = new Date().toISOString();\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,\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 // Update skills source-mirror lock (per ADR 0013).\n const existingLock = (await readSkillsLock(projectRoot)) ?? {\n schemaVersion: 1 as const,\n skills: {},\n };\n const lock: SkillsLock = {\n schemaVersion: 1,\n skills: { ...existingLock.skills },\n };\n for (const skill of manifest.skills) {\n const mirroredTo = skill.ides.filter((i) => ides.includes(i));\n if (mirroredTo.length === 0) continue;\n lock.skills[skill.id] = {\n version: skill.version,\n from: SKILLS_PACKAGE,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\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 * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n InstalledResource,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport {\n detectIde,\n getAdapter,\n ALL_IDE_KINDS,\n} from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n getSkillsSourceDir,\n} from '../../core/state.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.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(\n '卸载已安装的 teamix-evo skills;不传 ids 则卸载整包,传 ids 则按 skill 删除',\n )\n .argument(\n '[ids...]',\n '可选:仅卸载指定 skill id;省略则卸载整个 skills 包',\n )\n .option('-y, --yes', '跳过确认')\n .action(async (ids: string[], opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\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 if (ids.length === 0) {\n await runFullUninstall({\n projectRoot,\n config,\n installedManifest,\n pkg,\n resources,\n opts,\n });\n return;\n }\n\n await runPartialUninstall({\n projectRoot,\n installedManifest,\n pkg,\n resources,\n ids,\n opts,\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\ninterface FullUninstallArgs {\n projectRoot: string;\n config: NonNullable<Awaited<ReturnType<typeof readProjectConfig>>>;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n opts: UninstallOptions;\n}\n\nasync function runFullUninstall(args: FullUninstallArgs): Promise<void> {\n const { projectRoot, config, installedManifest, pkg, resources, opts } = args;\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 const removed = await removeSkillFiles(resources);\n logger.debug(`Removed ${removed.length} files`);\n\n // Per ADR 0013, wipe the source dir entirely on full uninstall.\n const skillsRoot = getSkillsSourceDir(projectRoot);\n const sourceSkillNames = await listSkillSourceNames(skillsRoot);\n try {\n await fs.rm(skillsRoot, { recursive: true, force: true });\n logger.debug(`Removed source dir ${skillsRoot}`);\n } catch (err) {\n logger.warn(\n `Failed to remove ${skillsRoot}: ${(err as Error).message}`,\n );\n }\n\n // BUG-105: also wipe the IDE mirror directories so a fresh install can\n // re-populate them cleanly. `removeSkillFiles` deletes per-file records\n // but legacy installs (and partial migrations) sometimes leave an empty\n // `.qoder/skills/<name>/` dir behind; nuke them explicitly.\n const skillNames = collectSkillNames({\n fromSources: sourceSkillNames,\n fromConfig: config,\n fromResources: resources,\n });\n const cleanedMirrorDirs = await removeMirrorDirs(\n projectRoot,\n config?.packages?.skills?.scope,\n config?.packages?.skills?.ides,\n skillNames,\n );\n\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 delete config.packages.skills;\n await writeProjectConfig(projectRoot, config);\n\n logger.success(`Uninstalled ${SKILLS_PACKAGE}`);\n logger.info(` Removed: ${removed.length} files`);\n logger.info(` Source: ${path.relative(projectRoot, skillsRoot)} (cleaned)`);\n if (cleanedMirrorDirs.length > 0) {\n logger.info(\n ` Mirrors: ${cleanedMirrorDirs\n .map((d) => path.relative(projectRoot, d))\n .join(', ')} (cleaned)`,\n );\n }\n}\n\ninterface PartialUninstallArgs {\n projectRoot: string;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n ids: string[];\n opts: UninstallOptions;\n}\n\nasync function runPartialUninstall(args: PartialUninstallArgs): Promise<void> {\n const { projectRoot, installedManifest, pkg, resources, ids, opts } = args;\n\n const grouped = groupBySkillId(resources);\n const requested = dedupe(ids);\n const matched = requested.filter((id) => grouped.has(id));\n const missing = requested.filter((id) => !grouped.has(id));\n\n if (missing.length > 0) {\n logger.warn(`Not installed (skipped): ${missing.join(', ')}`);\n }\n if (matched.length === 0) {\n logger.info('Nothing to remove.');\n return;\n }\n\n const toRemove: InstalledResource[] = matched.flatMap(\n (id) => grouped.get(id) ?? [],\n );\n\n logger.info(\n `Will remove ${matched.length} skill(s): ${matched.join(', ')} ` +\n `(${toRemove.length} 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 mirror + source files recorded in the manifest.\n const removed = await removeSkillFiles(toRemove);\n logger.debug(`Removed ${removed.length} files`);\n\n // 2. Remove each skill's source dir (may contain non-manifest files like attachments).\n for (const id of matched) {\n const dir = getSkillsSourceDir(projectRoot, id);\n try {\n await fs.rm(dir, { recursive: true, force: true });\n logger.debug(`Removed source dir ${dir}`);\n } catch (err) {\n logger.warn(`Failed to remove ${dir}: ${(err as Error).message}`);\n }\n }\n\n // 2b. BUG-105: also wipe each skill's IDE mirror directories so the\n // `.qoder/skills/<name>` and `.claude/skills/<name>` paths don't linger.\n const config = await readProjectConfig(projectRoot);\n const cleanedMirrorDirs = await removeMirrorDirs(\n projectRoot,\n config?.packages?.skills?.scope,\n config?.packages?.skills?.ides,\n matched,\n );\n\n // 3. Prune lock entries so `skills sync` won't re-mirror them.\n const lock = await readSkillsLock(projectRoot);\n if (lock) {\n for (const id of matched) delete lock.skills[id];\n await writeSkillsLock(projectRoot, lock);\n }\n\n // 4. Drop matched resources from the package's installed manifest entry.\n // Keep the package entry itself — the rest is still installed.\n if (installedManifest && pkg) {\n pkg.resources = resources.filter((r) => !matched.includes(skillIdOf(r)));\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n logger.success(\n `Removed ${matched.length} skill(s): ${matched.join(', ')}`,\n );\n logger.info(` Files: ${removed.length}`);\n if (cleanedMirrorDirs.length > 0) {\n logger.info(\n ` Mirrors: ${cleanedMirrorDirs\n .map((d) => path.relative(projectRoot, d))\n .join(', ')} (cleaned)`,\n );\n }\n if (missing.length > 0) {\n logger.info(` Skipped: ${missing.join(', ')} (not installed)`);\n }\n}\n\n/**\n * BUG-105: list child directory names under the skill-source root so we can\n * map them onto IDE mirror paths. Returns an empty array if the directory is\n * absent.\n */\nasync function listSkillSourceNames(skillsRoot: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(skillsRoot, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Collect the union of skill names (= mirror dir basenames) across the\n * source dir, the project config, and the manifest resources. The manifest\n * may carry `<skillId>:<sub>` ids; we strip the suffix.\n */\nfunction collectSkillNames(args: {\n fromSources: string[];\n fromConfig: { ide?: string; packages?: Record<string, unknown> } | null;\n fromResources: InstalledResource[];\n}): string[] {\n const set = new Set<string>(args.fromSources);\n for (const r of args.fromResources) {\n set.add(r.id.split(':')[0]!);\n }\n return [...set];\n}\n\n/**\n * BUG-105: remove `.qoder/skills/<name>` / `.claude/skills/<name>` for every\n * skill name we know about. Falls back to all IDE kinds when the project\n * config doesn't pin a subset. Returns the absolute mirror dirs that were\n * actually removed (for the success summary).\n */\nasync function removeMirrorDirs(\n projectRoot: string,\n scope: SkillScope | string | undefined,\n ides: readonly string[] | undefined,\n skillNames: readonly string[],\n): Promise<string[]> {\n if (skillNames.length === 0) return [];\n const targetIdes: SkillIde[] = (\n ides && ides.length > 0\n ? (ides.filter((i): i is SkillIde => i === 'qoder' || i === 'claude'))\n : [...ALL_IDE_KINDS]\n ) as SkillIde[];\n const targetScope: SkillScope =\n scope === 'global' ? 'global' : 'project';\n\n const removed: string[] = [];\n for (const ide of targetIdes) {\n const adapter = getAdapter(ide);\n for (const name of skillNames) {\n const dir = adapter.getSkillTargetDir(name, targetScope, projectRoot);\n let existed = true;\n try {\n await fs.access(dir);\n } catch {\n existed = false;\n }\n if (!existed) continue;\n try {\n await fs.rm(dir, { recursive: true, force: true });\n removed.push(dir);\n logger.debug(`Removed mirror dir ${dir}`);\n } catch (err) {\n logger.warn(`Failed to remove ${dir}: ${(err as Error).message}`);\n }\n }\n // Try to clean up the now-empty `<ideRoot>/skills` parent so we don't\n // leak an empty dir into the project tree. Best-effort; ignore failure.\n if (removed.length > 0) {\n const skillsParent = path.dirname(\n adapter.getSkillTargetDir('placeholder', targetScope, projectRoot),\n );\n try {\n const remaining = await fs.readdir(skillsParent);\n if (remaining.length === 0) {\n await fs.rmdir(skillsParent);\n }\n } catch {\n // ignored\n }\n }\n }\n return removed;\n}\n\nfunction findSkillsPkg(\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>,\n) {\n return installedManifest?.installed.find((p) => p.package === SKILLS_PACKAGE);\n}\n\nfunction skillIdOf(r: InstalledResource): string {\n return r.id.split(':')[0]!;\n}\n\nfunction groupBySkillId(\n records: InstalledResource[],\n): Map<string, InstalledResource[]> {\n const map = new Map<string, InstalledResource[]>();\n for (const r of records) {\n const id = skillIdOf(r);\n const bucket = map.get(id);\n if (bucket) bucket.push(r);\n else map.set(id, [r]);\n }\n return map;\n}\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { Command } from 'commander';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { runSkillsSync } from '../../core/skills-sync.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface SyncOptions {\n ide?: string;\n scope?: string;\n}\n\nexport const syncCommand = new Command('sync')\n .description(\n '把 .teamix-evo/skills/ 下的源重新镜像到 IDE 路径(.qoder / .claude)',\n )\n .argument(\n '[names...]',\n '可选:仅同步指定 skill id;省略则同步全部已记录在 lock 内的 skill',\n )\n .option(\n '--ide <list>',\n '逗号分隔的 IDE 列表(覆盖 lock 中记录的 mirroredTo)',\n )\n .option(\n '--scope <scope>',\n 'project | global(覆盖 lock 中记录的 scope)',\n )\n .action(async (names: string[], opts: SyncOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const ides = opts.ide ? parseIdeList(opts.ide) : undefined;\n const scope = opts.scope ? parseScope(opts.scope) : undefined;\n\n const result = await runSkillsSync({\n projectRoot,\n ides,\n scope,\n names: names.length > 0 ? names : undefined,\n });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded in .teamix-evo/skills/manifest.lock.json. Nothing to sync.',\n );\n return;\n }\n\n logger.success(\n `Synced ${result.syncedSkillIds.length} skill(s) → ${result.fileCount} file(s)`,\n );\n if (result.syncedSkillIds.length > 0) {\n logger.info(` Skills: ${result.syncedSkillIds.join(', ')}`);\n }\n if (result.missingSourceIds.length > 0) {\n logger.warn(\n ` Missing source: ${result.missingSourceIds.join(\n ', ',\n )} (run \"skills add <id>\" to (re)install)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to sync skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\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(\n `Unknown IDE: \"${p}\". Expected one of: ${ALL_IDE_KINDS.join(', ')}.`,\n );\n }\n }\n return result;\n}\n\nfunction parseScope(input: string): SkillScope {\n const v = input.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 {\n InstalledManifest,\n InstalledResource,\n SkillEntry,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport { loadSkillsPackageManifest } from '@teamix-evo/registry';\nimport { syncSkillsToIdes } from './skills-installer.js';\nimport {\n readSkillsLock,\n writeSkillsLock,\n readInstalledManifest,\n writeInstalledManifest,\n getSkillsSourceDir,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Look up updateStrategy + managedRegions from the upstream @teamix-evo/skills\n * package manifest. Returns null if the package isn't resolvable (e.g. the\n * project never installed it; or skill was added pre-managedRegions schema).\n */\nasync function readSkillMetaFromUpstream(\n skillId: string,\n): Promise<\n | {\n updateStrategy: SkillEntry['updateStrategy'];\n managedRegions?: readonly string[];\n }\n | null\n> {\n try {\n const pkgJson = require.resolve('@teamix-evo/skills/package.json');\n const packageRoot = path.dirname(pkgJson);\n const manifest = await loadSkillsPackageManifest(packageRoot);\n const entry = manifest.skills.find((s) => s.id === skillId);\n if (!entry) return null;\n return {\n updateStrategy: entry.updateStrategy,\n managedRegions: entry.managedRegions,\n };\n } catch {\n return null;\n }\n}\n\nconst SKILLS_PACKAGE_DEFAULT = '@teamix-evo/skills';\n\nexport interface RunSkillsSyncOptions {\n projectRoot: string;\n /** Override IDE list. Defaults to lock-recorded mirrors per skill. */\n ides?: readonly SkillIde[];\n /** Override scope. Defaults to lock-recorded scope per skill. */\n scope?: SkillScope;\n /** Limit to specific skill ids; otherwise sync all in lock. */\n names?: readonly string[];\n}\n\nexport interface RunSkillsSyncResult {\n status: 'synced' | 'no-skills';\n syncedSkillIds: string[];\n fileCount: number;\n resources: InstalledResource[];\n /** Skills that were in the lock but had no source dir on disk (warned, skipped). */\n missingSourceIds: string[];\n}\n\n/**\n * Re-mirror existing source dirs (`.teamix-evo/skills/<id>/`) to IDE paths.\n * The lock file (`.teamix-evo/skills/manifest.lock.json`) drives WHICH skills\n * to sync and (by default) WHERE — caller can override ide/scope.\n *\n * Per ADR 0013, this is idempotent and safe to re-run; mirrors are 100%\n * regenerable so any drift in IDE paths is overwritten cleanly.\n */\nexport async function runSkillsSync(\n options: RunSkillsSyncOptions,\n): Promise<RunSkillsSyncResult> {\n const { projectRoot, names } = options;\n\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return {\n status: 'no-skills',\n syncedSkillIds: [],\n fileCount: 0,\n resources: [],\n missingSourceIds: [],\n };\n }\n\n const skillIds = Object.keys(lock.skills);\n const targets = names ? skillIds.filter((id) => names.includes(id)) : skillIds;\n\n // Group sync by (scope, ides) — ADR 0013 doesn't constrain consumers from\n // mixing scopes per skill; we honor whatever the lock recorded unless caller\n // overrides both.\n const allResources: InstalledResource[] = [];\n const synced: string[] = [];\n const missing: string[] = [];\n\n for (const skillId of targets) {\n const lockEntry = lock.skills[skillId];\n if (!lockEntry) continue; // never happens (skillId came from lock.skills keys), but TS narrows\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n logger.warn(`Skill \"${skillId}\" has no source at ${sourceDir}; skipped.`);\n missing.push(skillId);\n continue;\n }\n\n const ides = (options.ides ?? lockEntry.mirroredTo) as SkillIde[];\n const scope = options.scope ?? lockEntry.scope;\n if (ides.length === 0) {\n logger.warn(`Skill \"${skillId}\" has no IDE mirror targets; skipped.`);\n continue;\n }\n\n // updateStrategy + managedRegions aren't tracked in the lock — read from\n // the upstream skills manifest if available so sync honors the managed\n // contract instead of clobbering user edits (#13). Defaults: regenerable,\n // no managed regions (= legacy clobber semantics).\n const upstreamMeta = await readSkillMetaFromUpstream(skillId);\n const result = await syncSkillsToIdes({\n projectRoot,\n skills: [\n {\n id: skillId,\n name: skillId,\n updateStrategy: upstreamMeta?.updateStrategy ?? 'regenerable',\n managedRegions: upstreamMeta?.managedRegions,\n },\n ],\n ides,\n scope,\n });\n allResources.push(...result.resources);\n synced.push(skillId);\n\n // Update the lock entry mirror list / installedAt timestamp.\n lock.skills[skillId] = {\n ...lockEntry,\n mirroredTo: ides,\n scope,\n installedAt: new Date().toISOString(),\n };\n }\n\n await writeSkillsLock(projectRoot, lock);\n\n // Refresh manifest.json mirror records (preserve source records as-is).\n await refreshMirrorRecords(projectRoot, allResources);\n\n return {\n status: 'synced',\n syncedSkillIds: synced,\n fileCount: allResources.length,\n resources: allResources,\n missingSourceIds: missing,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function refreshMirrorRecords(\n projectRoot: string,\n newMirrorRecords: InstalledResource[],\n): Promise<void> {\n const installed = await readInstalledManifest(projectRoot);\n if (!installed) return;\n const pkg = installed.installed.find((p) => p.package === SKILLS_PACKAGE_DEFAULT);\n if (!pkg) return;\n\n // Drop existing mirror records (those with `ide` set) and re-insert fresh ones.\n // Preserve source records (no `ide`).\n const sourceOnly = pkg.resources.filter((r) => r.ide === undefined);\n pkg.resources = [...sourceOnly, ...newMirrorRecords];\n pkg.installedAt = new Date().toISOString();\n await writeInstalledManifest(projectRoot, installed);\n}\n\n// re-export so commands can route through one module\nexport type { InstalledManifest };\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runSkillsDoctor } from '../../core/skills-doctor.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const doctorCommand = new Command('doctor')\n .description(\n '检查 .teamix-evo/skills/ 源与 IDE 镜像是否漂移;提示如何修复',\n )\n .action(async () => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const result = await runSkillsDoctor({ projectRoot });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded. Run \"teamix-evo skills add\" first.',\n );\n return;\n }\n\n if (result.status === 'clean') {\n logger.success('Skills are in sync. No drift detected.');\n return;\n }\n\n logger.warn(\n `Found ${result.findings.length} drift issue(s). Run \"teamix-evo skills sync\" to repair mirrors.`,\n );\n for (const f of result.findings) {\n const idePart = f.ide ? ` [${f.ide}]` : '';\n logger.info(` - ${f.kind}${idePart}: ${f.skillId}`);\n logger.info(` ${f.path}`);\n if (f.detail) logger.info(` ${f.detail}`);\n }\n process.exitCode = 1;\n } catch (err) {\n logger.error(`Failed to run doctor: ${(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 { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { getAdapter } from '../ide/index.js';\nimport { computeHash } from '../utils/hash.js';\nimport { walkDir } from '../utils/path.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readSkillsLock, getSkillsSourceDir } from './state.js';\n\n/**\n * Drift detection per ADR 0013 §4 `skills doctor`.\n *\n * Reports:\n * - \"missing-source\" — lock entry exists but `.teamix-evo/skills/<id>/` is gone\n * - \"missing-mirror\" — source exists, but mirror under `.<ide>/skills/<id>/` missing\n * - \"mirror-drift\" — mirror file content ≠ source file content (user or IDE\n * wrote into the mirror; sync will overwrite)\n *\n * Source-vs-upstream drift is intentionally not in this report — that's\n * `skills update`'s job (it diffs against upstream). doctor only audits the\n * source→mirror leg.\n */\nexport type SkillDriftKind =\n | 'missing-source'\n | 'missing-mirror'\n | 'mirror-drift';\n\nexport interface SkillDriftFinding {\n kind: SkillDriftKind;\n skillId: string;\n ide?: SkillIde;\n scope?: SkillScope;\n /** Absolute path to the file or dir that's drifted/missing. */\n path: string;\n detail?: string;\n}\n\nexport interface RunSkillsDoctorOptions {\n projectRoot: string;\n}\n\nexport interface RunSkillsDoctorResult {\n status: 'clean' | 'drift' | 'no-skills';\n findings: SkillDriftFinding[];\n}\n\nexport async function runSkillsDoctor(\n options: RunSkillsDoctorOptions,\n): Promise<RunSkillsDoctorResult> {\n const { projectRoot } = options;\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return { status: 'no-skills', findings: [] };\n }\n\n const findings: SkillDriftFinding[] = [];\n\n for (const [skillId, entry] of Object.entries(lock.skills)) {\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n findings.push({\n kind: 'missing-source',\n skillId,\n path: sourceDir,\n detail: 'Run \"teamix-evo skills add\" to reinstall.',\n });\n continue;\n }\n\n const sourceFiles = await walkDir(sourceDir);\n const sourceContents = new Map<string, string>();\n for (const f of sourceFiles) {\n const rel = path.relative(sourceDir, f);\n sourceContents.set(rel, await fs.readFile(f, 'utf-8'));\n }\n\n for (const ide of entry.mirroredTo) {\n const adapter = getAdapter(ide);\n const mirrorDir = adapter.getSkillTargetDir(\n skillId,\n entry.scope,\n projectRoot,\n );\n if (!(await dirExists(mirrorDir))) {\n findings.push({\n kind: 'missing-mirror',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorDir,\n detail: 'Run \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n for (const [rel, sourceContent] of sourceContents.entries()) {\n const mirrorFile = path.join(mirrorDir, rel);\n if (!(await fileExists(mirrorFile))) {\n findings.push({\n kind: 'missing-mirror',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail: 'Run \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n const mirrorContent = await fs.readFile(mirrorFile, 'utf-8');\n if (computeHash(mirrorContent) !== computeHash(sourceContent)) {\n findings.push({\n kind: 'mirror-drift',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail:\n 'Mirror differs from source. Re-run \"teamix-evo skills sync\" to overwrite.',\n });\n }\n }\n }\n }\n\n return {\n status: findings.length === 0 ? 'clean' : 'drift',\n findings,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\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 { hasPackageJson } from '../../utils/global-root.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 // Refuse to scaffold UI config into a directory that isn't a real\n // project root.\n if (!hasPackageJson(projectRoot)) {\n logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exit(1);\n }\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 business: DEFAULT_UI_ALIASES.business,\n templates: DEFAULT_UI_ALIASES.templates,\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: {\n components,\n hooks,\n utils,\n lib,\n business: DEFAULT_UI_ALIASES.business,\n templates: DEFAULT_UI_ALIASES.templates,\n },\n iconLibrary,\n tsx: tsxAns,\n rsc: rscAns,\n };\n}\n","import type { ProjectConfig, UiAliases } from '@teamix-evo/registry';\nimport { ensureMcpJson } from '../utils/mcp.js';\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 business: 'src/components/business',\n templates: 'src/templates',\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 business: options.aliases?.business ?? DEFAULT_UI_ALIASES.business,\n templates: options.aliases?.templates ?? DEFAULT_UI_ALIASES.templates,\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 // Ensure `.mcp.json` exists so editors auto-launch the MCP server even\n // when the user adopted teamix-evo without the create scaffold (#BUG-103).\n await ensureMcpJson(projectRoot);\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 .option(\n '--include-deprecated',\n '允许安装已归档的 deprecated entry(仅迁移 / 审计场景,ADR 0028)',\n )\n .action(\n async (\n ids: string[],\n opts: { overwrite?: boolean; includeDeprecated?: boolean },\n ) => {\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 includeDeprecated: opts.includeDeprecated,\n });\n\n logger.success(\n `UI add complete: ${result.written} written, ${result.skipped} skipped.`,\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 } 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(\n 'UI not initialized. Run `npx teamix-evo ui init` first.',\n );\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 );\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 /**\n * Optional per-entry package root override. When set, entries in the map\n * resolve their `file.source` against the mapped root instead of `packageRoot`.\n * Used by variant-aware packages (biz-ui / templates) that pull in\n * @teamix-evo/ui transitive deps — each entry resolves from its source package.\n */\n entryPackageRoot?: Map<string, 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}\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 entryPackageRoot,\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 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 rootForEntry = entryPackageRoot?.get(entry.id) ?? packageRoot;\n const sourceAbs = path.resolve(rootForEntry, 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 }\n\n return {\n orderedIds,\n resources,\n npmDependencies: npmDeps,\n written,\n skipped,\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 // Flatten per-entry directory paths. In the source tree, cross-entry\n // references use `@/<root>/<entry-dir>/<file>` (e.g.\n // `@/components/skeleton/skeleton`), but after install files land flat\n // in the alias directory (`@/components/ui/skeleton`). Strip the\n // intermediate directory when rest has exactly two segments.\n const flatRest = flattenRestPath(rest);\n return `${quote}${normalized}${flatRest}${quote}`;\n },\n );\n}\n\n/**\n * Flatten a source-tree relative path for the installed (flat) layout.\n *\n * In the UI source tree, files live in per-entry directories:\n * `@/components/skeleton/skeleton` → rest = `/skeleton/skeleton`\n * After install, they are placed flat in the alias directory:\n * `@/components/ui/skeleton` → rest = `/skeleton`\n *\n * When rest has exactly two path segments (`/dir/file`), the first segment\n * (the entry directory) is stripped, leaving only the file reference.\n * Single-segment paths (e.g. `/cn`) pass through unchanged.\n */\nfunction flattenRestPath(rest: string | undefined): string {\n if (!rest) return '';\n // Split: \"/skeleton/skeleton\" → [\"\", \"skeleton\", \"skeleton\"]\n const segments = rest.split('/');\n if (segments.length === 3) {\n // Two real segments: /dir/file → /file\n return `/${segments[2]}`;\n }\n return rest;\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 * When true, allow installing entries that live in `manifest.deprecatedEntries`\n * (ADR 0028). Default: false — deprecated ids are treated as unknown and the\n * call errors with a hint pointing the user at the active replacement.\n */\n includeDeprecated?: boolean;\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 /** 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, includeDeprecated } = 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 // Per ADR 0028: deprecated entries are archived in `deprecatedEntries`\n // and not exposed by default. When the caller opts in, we splice them\n // back into the active list so dependency resolution and install work\n // exactly as for active entries.\n const archived = manifest.deprecatedEntries ?? [];\n const archivedIds = new Set(archived.map((e) => e.id));\n const activeIds = new Set(manifest.entries.map((e) => e.id));\n\n const requestedDeprecated = ids.filter((id) => archivedIds.has(id));\n if (requestedDeprecated.length > 0 && !includeDeprecated) {\n const list = requestedDeprecated.map((s) => `\"${s}\"`).join(', ');\n throw new Error(\n `Refusing to install deprecated entr${\n requestedDeprecated.length === 1 ? 'y' : 'ies'\n } ${list}. ` +\n 'These entries are archived and not part of the active distribution (ADR 0028). ' +\n 'Pass `--include-deprecated` to override (e.g. for migration tooling).',\n );\n }\n\n const effectiveManifest = includeDeprecated\n ? { ...manifest, entries: [...manifest.entries, ...archived] }\n : manifest;\n\n const knownIds = new Set([\n ...activeIds,\n ...(includeDeprecated ? archivedIds : []),\n ]);\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: effectiveManifest,\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 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 .option(\n '--include-deprecated',\n '同时列出已归档的 deprecated entry(默认隐藏,ADR 0028)',\n )\n .action(\n async (opts: { installed?: boolean; includeDeprecated?: 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 includeDeprecated: opts.includeDeprecated,\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 // STATUS column packs install + deprecation in 10 chars wide field.\n const status = e.deprecated\n ? e.installed\n ? 'INST/DEPR'\n : 'DEPRECATED'\n : e.installed\n ? 'INSTALLED'\n : '–';\n logger.info(\n `${e.id.padEnd(idWidth)} ${e.type.padEnd(\n typeWidth,\n )} ${status.padEnd(10)} ${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 );\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 * When true, also include archived entries from `manifest.deprecatedEntries`\n * (ADR 0028). They are flagged with `deprecated: true` in the result.\n */\n includeDeprecated?: boolean;\n}\n\nexport interface UiEntryListItem {\n id: string;\n type: UiEntry['type'];\n description: string;\n installed: boolean;\n /** True when the entry comes from `manifest.deprecatedEntries` (ADR 0028). */\n deprecated: 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, includeDeprecated } = 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 archived = manifest.deprecatedEntries ?? [];\n const pool = includeDeprecated\n ? [\n ...manifest.entries.map((e) => ({ entry: e, deprecated: false })),\n ...archived.map((e) => ({ entry: e, deprecated: true })),\n ]\n : manifest.entries.map((e) => ({ entry: e, deprecated: false }));\n\n const entries: UiEntryListItem[] = pool\n .filter(({ entry }) => !installedOnly || installedIds.has(entry.id))\n .map(({ entry, deprecated }) => ({\n id: entry.id,\n type: entry.type,\n description: entry.description,\n installed: installedIds.has(entry.id),\n deprecated,\n }));\n\n return {\n packageName,\n total: manifest.entries.length + (includeDeprecated ? archived.length : 0),\n installedCount: installedIds.size,\n entries,\n };\n}\n","/**\n * `teamix-evo biz-ui` — variant-aware business UI subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const bizUiCommand = new Command('biz-ui').description(\n '管理业务 UI 组件(变体感知 — 与 design / templates 同变体名空间)',\n);\n\nbizUiCommand.addCommand(addCommand);\nbizUiCommand.addCommand(listCommand);\nbizUiCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runBizUiAdd } from '../../core/variant-ui-add.js';\nimport { readTokensVariant } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个业务 UI 组件(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '组件 id 列表,如 \"tenant-switcher\" \"org-picker\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n // (Future) auto-detect from .teamix-evo/tokens-lock.json variant.\n // For now require explicit --variant.\n throw new Error(\n '--variant <name> is required. Run `teamix-evo biz-ui list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Cross-variant install guard (#BUG-104): if the project is locked\n // to a different variant via tokens-lock.json, fail fast with a\n // clear remediation hint instead of letting the resolver throw an\n // opaque \"Unknown entry id\" later.\n const projectVariant = await readTokensVariant(projectRoot);\n if (projectVariant && projectVariant !== opts.variant) {\n throw new Error(\n `Variant mismatch \\u2014 project is locked to \"${projectVariant}\" but you requested \"${opts.variant}\". ` +\n `Fix: run \\`teamix-evo tokens uninstall -y\\` then ` +\n `\\`teamix-evo tokens init ${opts.variant}\\` to switch, ` +\n `or re-run with \\`--variant ${projectVariant}\\` to install for the current variant.`,\n );\n }\n\n logger.info(\n `Installing biz-ui entries from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runBizUiAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `biz-ui add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\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 }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","/**\n * Programmatic install for variant-aware UI packages — biz-ui & templates.\n *\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md), these\n * two packages share the variant-aware shape: top-level catalog + per-variant\n * manifest. The install logic is the same as `runUiAdd` (registry dependency\n * resolution + frozen-on-add + import rewrite) — only differences are:\n *\n * 1. The package source is `<pkg>/variants/<variant>/` rather than `<pkg>/`\n * 2. A `--variant` selector picks which variant to install from\n * 3. The installed manifest entry records `variant: \"<name>\"` rather than\n * `_flat`\n *\n * This module exposes a single shared implementation parametrized by\n * `packageName` (`@teamix-evo/biz-ui` or `@teamix-evo/templates`) and is\n * surfaced via `runBizUiAdd` / `runTemplatesAdd` thin wrappers.\n */\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport type {\n InstalledManifest,\n InstalledResource,\n UiEntry,\n UiPackageManifest,\n VariantUiPackageName,\n} from '@teamix-evo/registry';\nimport {\n loadUiPackageManifest,\n loadVariantUiPackageCatalog,\n loadVariantUiPackageManifest,\n} from '@teamix-evo/registry';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.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\nexport interface RunVariantUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Variant id (e.g. `\"opentrek\"`). */\n variant: string;\n /** Entry ids to install. */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the package name. */\n packageName?: string;\n /**\n * Override resolution of the package root. When set, skips\n * `require.resolve(\"<packageName>/package.json\")`.\n */\n packageRoot?: string;\n}\n\nexport interface RunVariantUiAddResult {\n packageName: string;\n variant: string;\n orderedIds: string[];\n written: number;\n skipped: number;\n npmDependencies: Record<string, string>;\n resources: InstalledResource[];\n}\n\nasync function runVariantUiAdd(\n packageName: VariantUiPackageName,\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n const { projectRoot, variant, ids, overwrite } = options;\n const fullPackageName = options.packageName ?? `@teamix-evo/${packageName}`;\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 \\`teamix-evo ui init\\` first — \\`${packageName} add\\` writes into the same alias map (business / templates).`,\n );\n }\n\n const packageRoot =\n options.packageRoot ?? resolvePackageRoot(fullPackageName);\n\n // Validate that this variant exists in the catalog (clear error if not).\n const catalog = await loadVariantUiPackageCatalog(packageRoot);\n if (!catalog.variants.some((v) => v.name === variant)) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Variant \"${variant}\" not found in ${fullPackageName}. Known variants: ${known}. Hint: \\`teamix-evo ${packageName} list-variants\\` shows all.`,\n );\n }\n\n // Load the per-variant manifest from packages/<pkg>/variants/<variant>/.\n const variantDir = path.join(packageRoot, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n\n // Validate requested ids (must be defined in this variant package, not in ui)\n const knownIds = new Set(variantManifest.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) in ${packageName}#${variant}: ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ${packageName} list-variants\\` to see this package's variants, or \\`teamix-evo ${packageName} list --variant ${variant}\\` for its entries.`,\n );\n }\n\n // Cross-package dependency resolution (fixes #22).\n // variant-aware entries (biz-ui / templates) reference @teamix-evo/ui entries\n // by id via `registryDependencies` (e.g. tenant-switcher → popover/button/cn).\n // Merge ui package's entries into the dep graph so the resolver can find\n // them. The installer's skipExisting=frozen guard means already-installed ui\n // entries are not rewritten.\n const uiPackageRoot = resolvePackageRoot('@teamix-evo/ui');\n const uiManifest = await loadUiPackageManifest(uiPackageRoot);\n\n // Resolve each entry's true package root for source file paths. Entries from\n // the variant package live under variantDir; entries from @teamix-evo/ui live\n // under uiPackageRoot.\n const entryPackageRoot = new Map<string, string>();\n const mergedEntries: UiEntry[] = [];\n for (const e of variantManifest.entries) {\n entryPackageRoot.set(e.id, variantDir);\n mergedEntries.push(e);\n }\n for (const e of uiManifest.entries) {\n // variant entry id wins over ui entry of same id (rare/illegal but safe).\n if (entryPackageRoot.has(e.id)) continue;\n entryPackageRoot.set(e.id, uiPackageRoot);\n mergedEntries.push(e);\n }\n\n const adaptedManifest: UiPackageManifest = {\n schemaVersion: 1,\n package: 'ui',\n version: variantManifest.version,\n engines: variantManifest.engines,\n entries: mergedEntries,\n };\n\n const result = await installUiEntries({\n projectRoot,\n manifest: adaptedManifest,\n packageRoot: variantDir, // default for variant entries\n entryPackageRoot, // ui entries resolve from uiPackageRoot\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n // Update installed manifest, keyed by (package, variant). Multiple variants\n // of the same package can co-exist (rare but legal).\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex(\n (p) => p.package === fullPackageName && p.variant === variant,\n );\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: fullPackageName,\n variant,\n version: variantManifest.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 return {\n packageName: fullPackageName,\n variant,\n orderedIds: result.orderedIds,\n written: result.written,\n skipped: result.skipped,\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\n/** `teamix-evo biz-ui add <ids...> --variant <name>`. */\nexport async function runBizUiAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('biz-ui', options);\n}\n\n/** `teamix-evo templates add <ids...> --variant <name>`. */\nexport async function runTemplatesAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('templates', options);\n}\n\n// ─── List variants ───────────────────────────────────────────────────────────\n\nexport interface ListVariantUiResult {\n packageName: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n }>;\n}\n\nasync function listVariantUi(\n packageName: VariantUiPackageName,\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n const fullPackageName = `@teamix-evo/${packageName}`;\n const root = packageRoot ?? resolvePackageRoot(fullPackageName);\n const catalog = await loadVariantUiPackageCatalog(root);\n return {\n packageName: fullPackageName,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n })),\n };\n}\n\nexport async function listBizUiVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('biz-ui', packageRoot);\n}\n\nexport async function listTemplatesVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('templates', packageRoot);\n}\n\n// ─── List entries inside a variant ───────────────────────────────────────────\n\nexport interface ListVariantUiEntriesResult {\n packageName: string;\n variant: string;\n entries: Array<{\n id: string;\n name: string;\n type: string;\n description?: string;\n registryDependencies: string[];\n }>;\n}\n\nasync function listVariantUiEntries(\n packageName: VariantUiPackageName,\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n const fullPackageName = `@teamix-evo/${packageName}`;\n const root = packageRoot ?? resolvePackageRoot(fullPackageName);\n const catalog = await loadVariantUiPackageCatalog(root);\n if (!catalog.variants.some((v) => v.name === variant)) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Variant \"${variant}\" not found in ${fullPackageName}. Known: ${known}.`,\n );\n }\n const variantDir = path.join(root, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n return {\n packageName: fullPackageName,\n variant,\n entries: variantManifest.entries.map((e) => ({\n id: e.id,\n name: e.name,\n type: e.type,\n description: e.description,\n registryDependencies: e.registryDependencies ?? [],\n })),\n };\n}\n\nexport async function listBizUiEntries(\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n return listVariantUiEntries('biz-ui', variant, packageRoot);\n}\n\nexport async function listTemplatesEntries(\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n return listVariantUiEntries('templates', variant, packageRoot);\n}\n","import { Command } from 'commander';\nimport { listBizUiEntries } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出指定变体下的 biz-ui entries')\n .requiredOption('--variant <name>', '变体名(如 opentrek / uni-manager)')\n .action(async (opts: { variant: string }) => {\n try {\n const result = await listBizUiEntries(opts.variant);\n logger.info(`${result.packageName}#${result.variant} entries:`);\n logger.info('');\n if (result.entries.length === 0) {\n logger.info(' (no entries — variant skeleton, awaiting components)');\n return;\n }\n for (const e of result.entries) {\n const deps = e.registryDependencies.length\n ? ` [deps: ${e.registryDependencies.join(', ')}]`\n : '';\n logger.info(` ${e.id} (${e.type})${deps}`);\n if (e.description) logger.info(` ${e.description}`);\n logger.info('');\n }\n logger.info(\n `Install: teamix-evo biz-ui add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { listBizUiVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/biz-ui 包内提供的所有业务变体')\n .action(async () => {\n try {\n const result = await listBizUiVariants();\n logger.info(`Available biz-ui variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo biz-ui add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo templates` — variant-aware page template subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const templatesCommand = new Command('templates').description(\n '管理页面模板(变体感知 — 与 design / biz-ui 同变体名空间)',\n);\n\ntemplatesCommand.addCommand(addCommand);\ntemplatesCommand.addCommand(listCommand);\ntemplatesCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTemplatesAdd } from '../../core/variant-ui-add.js';\nimport { readTokensVariant } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个页面模板(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '模板 id 列表,如 \"list-detail-page\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n throw new Error(\n '--variant <name> is required. Run `teamix-evo templates list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Cross-variant install guard (#BUG-104): refuse to install templates\n // from a variant other than the one the project is locked to.\n const projectVariant = await readTokensVariant(projectRoot);\n if (projectVariant && projectVariant !== opts.variant) {\n throw new Error(\n `Variant mismatch \\u2014 project is locked to \"${projectVariant}\" but you requested \"${opts.variant}\". ` +\n `Fix: run \\`teamix-evo tokens uninstall -y\\` then ` +\n `\\`teamix-evo tokens init ${opts.variant}\\` to switch, ` +\n `or re-run with \\`--variant ${projectVariant}\\` to install for the current variant.`,\n );\n }\n\n logger.info(\n `Installing templates from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runTemplatesAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `templates add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\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 }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import { Command } from 'commander';\nimport { listTemplatesEntries } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出指定变体下的 templates entries')\n .requiredOption('--variant <name>', '变体名(如 opentrek / uni-manager)')\n .action(async (opts: { variant: string }) => {\n try {\n const result = await listTemplatesEntries(opts.variant);\n logger.info(`${result.packageName}#${result.variant} entries:`);\n logger.info('');\n if (result.entries.length === 0) {\n logger.info(' (no entries — variant skeleton, awaiting templates)');\n return;\n }\n for (const e of result.entries) {\n const deps = e.registryDependencies.length\n ? ` [deps: ${e.registryDependencies.join(', ')}]`\n : '';\n logger.info(` ${e.id} (${e.type})${deps}`);\n if (e.description) logger.info(` ${e.description}`);\n logger.info('');\n }\n logger.info(\n `Install: teamix-evo templates add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { listTemplatesVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/templates 包内提供的所有页面模板变体')\n .action(async () => {\n try {\n const result = await listTemplatesVariants();\n logger.info(`Available templates variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo templates add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { logsAnalyzeCommand } from './analyze.js';\nimport { logsTraceCommand } from './trace.js';\n\nexport const logsCommand = new Command('logs').description(\n '查询 vibe-logger 输出 (.log/ai/**/*.jsonl) — AI 调用链分析',\n);\n\nlogsCommand.addCommand(logsAnalyzeCommand);\nlogsCommand.addCommand(logsTraceCommand);\n","/**\n * `teamix-evo logs analyze` — summarize vibe-logger JSONL output.\n *\n * vibe-logger writes one record per AI hook event to\n * <projectRoot>/.log/ai/<YYYY-MM-DD>/<agent>-<sessionShort>.jsonl\n *\n * Each record has at least { ts, agent, event, session } and optionally\n * { tool, file, tags[], duration_ms, error, mcpArgs[], prompt, cwd }.\n *\n * The analyzer collects records across one or more day directories and prints\n * three tables: tool frequency, package-tag frequency, MCP-tool frequency.\n * Plus a session summary and an error tail. Output is plain text by default;\n * `--json` switches to a single JSON object suitable for CI dashboards.\n *\n * Design intent: this is a feedback loop into the ecosystem — knowing which\n * skills / packages AI touches most reveals which docs need investment, and\n * the MCP-call frequency tells us which tool descriptions are pulling weight.\n */\nimport { Command } from 'commander';\nimport { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\n\ninterface AnalyzeOptions {\n dir?: string;\n days?: string;\n top?: string;\n json?: boolean;\n}\n\nexport interface LogRecord {\n ts: string;\n agent: string;\n event: string;\n session: string;\n tool?: string;\n file?: string;\n tags?: string[];\n duration_ms?: number;\n error?: boolean;\n mcpArgs?: string[];\n prompt?: string;\n cwd?: string;\n}\n\nexport interface AnalyzeReport {\n range: { from: string | null; to: string | null };\n totals: {\n records: number;\n sessions: number;\n errors: number;\n files: number;\n };\n byAgent: Record<string, number>;\n byEvent: Record<string, number>;\n topTools: Array<{ tool: string; count: number }>;\n topTags: Array<{ tag: string; count: number }>;\n topMcp: Array<{ name: string; count: number; argKeys: string[] }>;\n recentErrors: Array<{\n ts: string;\n tool?: string;\n file?: string;\n session: string;\n }>;\n}\n\nconst DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const logsAnalyzeCommand = new Command('analyze')\n .description(\n '汇总 vibe-logger 输出 (.log/ai/**/*.jsonl) — 工具 / 包标签 / MCP 调用频率,辅助生态优化',\n )\n .option('--dir <path>', 'log 目录 (默认 <project>/.log/ai)')\n .option(\n '--days <n>',\n '只看最近 N 天的目录 (默认全部;按目录名 YYYY-MM-DD 比对,不解析记录 ts)',\n )\n .option('--top <n>', '每个排行展示前 N 项 (默认 10)', '10')\n .option('--json', '以 JSON 输出 (CI/工具友好)')\n .action((opts: AnalyzeOptions) => {\n const baseDir = resolve(opts.dir ?? join(process.cwd(), '.log', 'ai'));\n if (!existsSync(baseDir)) {\n logger.warn(`No log directory at ${baseDir}.`);\n logger.info(\n '运行 vibe-logger hook 触发后会在此目录生成 JSONL — 见 .claude/scripts/vibe-logger.mjs',\n );\n return;\n }\n const dayLimit = parseIntOrUndef(opts.days);\n const top = parseIntOrUndef(opts.top) ?? 10;\n\n const dayDirs = readdirSync(baseDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && DATE_DIR_RE.test(e.name))\n .map((e) => e.name)\n .sort()\n .reverse();\n const selected =\n dayLimit !== undefined ? dayDirs.slice(0, dayLimit) : dayDirs;\n\n const records: LogRecord[] = [];\n for (const day of selected) {\n const dayPath = join(baseDir, day);\n let entries: string[];\n try {\n entries = readdirSync(dayPath);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n const fp = join(dayPath, entry);\n try {\n if (!statSync(fp).isFile()) continue;\n } catch {\n continue;\n }\n const text = readFileSync(fp, 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n records.push(JSON.parse(line) as LogRecord);\n } catch {\n // Skip malformed lines silently — vibe-logger always emits valid\n // JSON, but partial writes mid-flush could leave a torn last line.\n }\n }\n }\n }\n\n const report = buildReport(records, top);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n printReport(baseDir, selected.length, report);\n });\n\nexport function buildReport(\n records: LogRecord[],\n top: number,\n): AnalyzeReport {\n const byAgent: Record<string, number> = {};\n const byEvent: Record<string, number> = {};\n const tools = new Map<string, number>();\n const tags = new Map<string, number>();\n const mcp = new Map<string, { count: number; keys: Set<string> }>();\n const sessions = new Set<string>();\n const filesTouched = new Set<string>();\n const errors: AnalyzeReport['recentErrors'] = [];\n let from: string | null = null;\n let to: string | null = null;\n\n for (const r of records) {\n if (!from || r.ts < from) from = r.ts;\n if (!to || r.ts > to) to = r.ts;\n\n byAgent[r.agent] = (byAgent[r.agent] ?? 0) + 1;\n byEvent[r.event] = (byEvent[r.event] ?? 0) + 1;\n sessions.add(`${r.agent}::${r.session}`);\n if (r.file) filesTouched.add(r.file);\n\n if (r.tool) {\n tools.set(r.tool, (tools.get(r.tool) ?? 0) + 1);\n if (r.tool.startsWith('mcp__')) {\n const name = r.tool.replace(/^mcp__[^_]+__/, '');\n const slot = mcp.get(name) ?? { count: 0, keys: new Set<string>() };\n slot.count += 1;\n for (const k of r.mcpArgs ?? []) slot.keys.add(k);\n mcp.set(name, slot);\n }\n }\n\n for (const tag of r.tags ?? []) {\n tags.set(tag, (tags.get(tag) ?? 0) + 1);\n }\n\n if (r.error) {\n errors.push({\n ts: r.ts,\n tool: r.tool,\n file: r.file,\n session: r.session,\n });\n }\n }\n\n const topTools = sortAndSlice(tools, top).map(([tool, count]) => ({\n tool,\n count,\n }));\n const topTags = sortAndSlice(tags, top).map(([tag, count]) => ({\n tag,\n count,\n }));\n const topMcp = [...mcp.entries()]\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, top)\n .map(([name, v]) => ({\n name,\n count: v.count,\n argKeys: [...v.keys].sort(),\n }));\n const recentErrors = errors.slice(-10);\n\n return {\n range: { from, to },\n totals: {\n records: records.length,\n sessions: sessions.size,\n errors: errors.length,\n files: filesTouched.size,\n },\n byAgent,\n byEvent,\n topTools,\n topTags,\n topMcp,\n recentErrors,\n };\n}\n\nfunction sortAndSlice(\n m: Map<string, number>,\n top: number,\n): Array<[string, number]> {\n return [...m.entries()].sort((a, b) => b[1] - a[1]).slice(0, top);\n}\n\nfunction printReport(\n baseDir: string,\n dayCount: number,\n r: AnalyzeReport,\n): void {\n logger.info(`vibe-logger 分析报告`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 天数: ${dayCount}`);\n logger.info(` 时间: ${r.range.from ?? '-'} → ${r.range.to ?? '-'}`);\n logger.info('');\n logger.info(\n `Totals records=${r.totals.records} sessions=${r.totals.sessions} errors=${r.totals.errors} files=${r.totals.files}`,\n );\n logger.info(`By agent ${formatKv(r.byAgent)}`);\n logger.info(`By event ${formatKv(r.byEvent)}`);\n logger.info('');\n logger.info('Top tools:');\n for (const { tool, count } of r.topTools) {\n logger.info(` ${pad(count, 5)} ${tool}`);\n }\n if (r.topTags.length) {\n logger.info('');\n logger.info('Top package tags (which package the AI touched):');\n for (const { tag, count } of r.topTags) {\n logger.info(` ${pad(count, 5)} ${tag}`);\n }\n }\n if (r.topMcp.length) {\n logger.info('');\n logger.info('Top MCP tools:');\n for (const { name, count, argKeys } of r.topMcp) {\n const keys = argKeys.length ? ` args: ${argKeys.join(', ')}` : '';\n logger.info(` ${pad(count, 5)} ${name}${keys}`);\n }\n }\n if (r.recentErrors.length) {\n logger.info('');\n logger.info(`Recent errors (last ${r.recentErrors.length}):`);\n for (const e of r.recentErrors) {\n logger.info(\n ` ${e.ts} session=${e.session} tool=${e.tool ?? '-'} file=${e.file ?? '-'}`,\n );\n }\n }\n}\n\nfunction formatKv(o: Record<string, number>): string {\n return Object.entries(o)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(' ');\n}\n\nfunction pad(n: number, width: number): string {\n const s = String(n);\n return s.length >= width ? s : ' '.repeat(width - s.length) + s;\n}\n\nfunction parseIntOrUndef(v: string | undefined): number | undefined {\n if (v === undefined) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n","/**\n * `teamix-evo logs trace` — session-level chain trace of vibe-logger output.\n *\n * Reads the same JSONL stream as `logs analyze`, then groups records by\n * `session` and rebuilds, for each user prompt, the chain of tool calls that\n * followed it (up to the next prompt or `Stop`). This turns the raw event\n * stream into a \"what did the AI actually do for this request?\" view.\n *\n * Filters:\n * --prompt <keyword> case-insensitive substring match on UserPromptSubmit\n * --session <id> prefix match on session id\n * --days <n> limit to last N day-directories (same as analyze)\n * --dir <path> override log root (default <project>/.log/ai)\n * --json machine-readable output for CI / dashboards\n */\nimport { Command } from 'commander';\nimport { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport type { LogRecord } from './analyze.js';\n\ninterface TraceOptions {\n dir?: string;\n days?: string;\n prompt?: string;\n session?: string;\n json?: boolean;\n}\n\nexport interface TraceStep {\n ts: string;\n event: string;\n tool?: string;\n file?: string;\n tags?: string[];\n duration_ms?: number;\n error?: boolean;\n}\n\nexport interface TraceChain {\n prompt: string;\n promptTs: string;\n steps: TraceStep[];\n}\n\nexport interface TraceSession {\n id: string;\n agent: string;\n chains: TraceChain[];\n}\n\nexport interface TraceReport {\n sessions: TraceSession[];\n}\n\nconst DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const logsTraceCommand = new Command('trace')\n .description(\n '按会话还原 AI 调用链路:从用户 prompt 起始,串联后续 PreToolUse/PostToolUse 直到下一个 prompt 或 Stop',\n )\n .option('--prompt <keyword>', '按用户输入关键字过滤 (子串匹配,不区分大小写)')\n .option('--session <id>', '指定会话 ID (前缀匹配)')\n .option('--days <n>', '只看最近 N 天的目录 (默认 7)', '7')\n .option('--dir <path>', 'log 目录 (默认 <project>/.log/ai)')\n .option('--json', '以 JSON 输出 (CI/工具友好)')\n .action((opts: TraceOptions) => {\n const baseDir = resolve(opts.dir ?? join(process.cwd(), '.log', 'ai'));\n if (!existsSync(baseDir)) {\n logger.warn(`No log directory at ${baseDir}.`);\n logger.info(\n '运行 vibe-logger hook 触发后会在此目录生成 JSONL — 见 .claude/scripts/vibe-logger.mjs',\n );\n return;\n }\n const dayLimit = parseIntOrUndef(opts.days) ?? 7;\n\n const records = readRecords(baseDir, dayLimit);\n const report = buildTrace(records, {\n prompt: opts.prompt,\n session: opts.session,\n });\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n printTrace(baseDir, report);\n });\n\nfunction readRecords(baseDir: string, dayLimit: number): LogRecord[] {\n const dayDirs = readdirSync(baseDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && DATE_DIR_RE.test(e.name))\n .map((e) => e.name)\n .sort()\n .reverse();\n const selected = dayDirs.slice(0, dayLimit);\n\n const records: LogRecord[] = [];\n for (const day of selected) {\n const dayPath = join(baseDir, day);\n let entries: string[];\n try {\n entries = readdirSync(dayPath);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n const fp = join(dayPath, entry);\n try {\n if (!statSync(fp).isFile()) continue;\n } catch {\n continue;\n }\n const text = readFileSync(fp, 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n records.push(JSON.parse(line) as LogRecord);\n } catch {\n // Skip malformed lines silently (consistent with analyze).\n }\n }\n }\n }\n return records;\n}\n\nexport function buildTrace(\n records: LogRecord[],\n filter: { prompt?: string; session?: string } = {},\n): TraceReport {\n // 1. Group by session id.\n const groups = new Map<string, LogRecord[]>();\n for (const r of records) {\n if (!r.session) continue;\n const arr = groups.get(r.session) ?? [];\n arr.push(r);\n groups.set(r.session, arr);\n }\n\n const promptNeedle = filter.prompt?.toLowerCase();\n const sessionPrefix = filter.session;\n\n const sessions: TraceSession[] = [];\n\n for (const [sessionId, items] of groups.entries()) {\n if (sessionPrefix && !sessionId.startsWith(sessionPrefix)) continue;\n\n // 2. Sort within session by timestamp.\n items.sort((a, b) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0));\n\n // 3. Walk records: each UserPromptSubmit opens a chain; PreToolUse pushes\n // a step, PostToolUse merges duration/error into the matching pre by\n // tool name (FIFO of unmatched). Stop or next prompt closes the chain.\n const chains: TraceChain[] = [];\n let current: TraceChain | null = null;\n let pending: Map<string, number[]> = new Map();\n\n const closeCurrent = () => {\n if (current) chains.push(current);\n current = null;\n pending = new Map();\n };\n\n for (const r of items) {\n if (r.event === 'UserPromptSubmit') {\n if (current) closeCurrent();\n current = { prompt: r.prompt ?? '', promptTs: r.ts, steps: [] };\n pending = new Map();\n continue;\n }\n if (r.event === 'Stop') {\n if (current) closeCurrent();\n continue;\n }\n if (!current) continue; // Skip events before any prompt.\n\n if (r.event === 'PreToolUse') {\n const idx = current.steps.length;\n current.steps.push({\n ts: r.ts,\n event: 'PreToolUse',\n tool: r.tool,\n file: r.file,\n tags: r.tags,\n duration_ms: r.duration_ms,\n error: r.error ?? false,\n });\n if (r.tool) {\n const list = pending.get(r.tool) ?? [];\n list.push(idx);\n pending.set(r.tool, list);\n }\n } else if (r.event === 'PostToolUse') {\n const list = r.tool ? pending.get(r.tool) : undefined;\n if (list && list.length > 0) {\n const idx = list.shift()!;\n if (list.length === 0 && r.tool) pending.delete(r.tool);\n const step = current.steps[idx]!;\n if (r.duration_ms !== undefined) step.duration_ms = r.duration_ms;\n if (r.error !== undefined) step.error = r.error;\n if (!step.file && r.file) step.file = r.file;\n if ((!step.tags || step.tags.length === 0) && r.tags)\n step.tags = r.tags;\n } else {\n // Orphan post (pre clipped or in another file) — record as-is.\n current.steps.push({\n ts: r.ts,\n event: 'PostToolUse',\n tool: r.tool,\n file: r.file,\n tags: r.tags,\n duration_ms: r.duration_ms,\n error: r.error ?? false,\n });\n }\n }\n }\n if (current) closeCurrent();\n\n // 4. Apply prompt filter; drop sessions with no surviving chain.\n const filteredChains = promptNeedle\n ? chains.filter((c) => c.prompt.toLowerCase().includes(promptNeedle))\n : chains;\n if (filteredChains.length === 0) continue;\n\n sessions.push({\n id: sessionId,\n agent: items[0]?.agent ?? 'unknown',\n chains: filteredChains,\n });\n }\n\n // Newest first feels more useful for interactive triage.\n sessions.sort((a, b) => {\n const ta = a.chains[0]?.promptTs ?? '';\n const tb = b.chains[0]?.promptTs ?? '';\n return tb.localeCompare(ta);\n });\n\n return { sessions };\n}\n\nfunction printTrace(baseDir: string, r: TraceReport): void {\n logger.info(`vibe-logger 链路追踪`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 会话: ${r.sessions.length}`);\n logger.info('');\n\n if (r.sessions.length === 0) {\n logger.info('未找到匹配的会话/提示。');\n return;\n }\n\n for (const s of r.sessions) {\n logger.info(`━━━ Session: ${s.id} (${s.agent}) ━━━`);\n logger.info('');\n for (const c of s.chains) {\n logger.info(\n `[${formatTime(c.promptTs)}] 💬 Prompt: ${quote(truncate(c.prompt, 200))}`,\n );\n for (const step of c.steps) {\n logger.info(` ${formatStep(step)}`);\n }\n logger.info('');\n }\n }\n}\n\nfunction formatStep(s: TraceStep): string {\n const ts = `[${formatTime(s.ts)}]`;\n const isEdit =\n s.tool === 'Edit' ||\n s.tool === 'Write' ||\n s.tool === 'MultiEdit' ||\n s.tool === 'create_file' ||\n s.tool === 'search_replace';\n const icon = isEdit ? '📝' : '🔧';\n const head =\n isEdit && s.file\n ? `${s.tool ?? '?'} → ${s.file}`\n : (s.tool ?? s.event ?? '?');\n const dur = s.duration_ms !== undefined ? `${s.duration_ms}ms` : '';\n const tags = s.tags && s.tags.length ? `[${s.tags.join(',')}]` : '';\n const err = s.error ? '❌' : '';\n return [ts, icon, padRight(head, 40), padLeft(dur, 6), tags, err]\n .filter((x) => x !== '')\n .join(' ');\n}\n\nfunction formatTime(ts: string): string {\n const d = new Date(ts);\n if (Number.isNaN(d.getTime())) return ts;\n const hh = String(d.getUTCHours()).padStart(2, '0');\n const mm = String(d.getUTCMinutes()).padStart(2, '0');\n const ss = String(d.getUTCSeconds()).padStart(2, '0');\n return `${hh}:${mm}:${ss}`;\n}\n\nfunction quote(s: string): string {\n return `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n) + '…';\n}\n\nfunction padRight(s: string, n: number): string {\n return s.length >= n ? s : s + ' '.repeat(n - s.length);\n}\n\nfunction padLeft(s: string, n: number): string {\n return s.length >= n ? s : ' '.repeat(n - s.length) + s;\n}\n\nfunction parseIntOrUndef(v: string | undefined): number | undefined {\n if (v === undefined) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : undefined;\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;;;ACjBA,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,OAMK;;;AC9BP,YAAY,QAAQ;AACpB,YAAYC,WAAU;;;ACDtB,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,eAAsB,UAAU,KAA4B;AAC1D,QAAS,SAAM,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,aAAU,KAAK,SAAS,OAAO;AACxC,QAAS,UAAO,KAAK,QAAQ;AAC/B;AAKA,eAAsB,eACpB,UACwB;AACxB,MAAI;AACF,WAAO,MAAS,YAAS,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,aAAU,YAAY,SAAS,OAAO;AAC/C,SAAO,MAAM,aAAaA,IAAG,WAAW,eAAS,aAAa,UAAU,CAAC,EAAE;AAC7E;AAKA,eAAsB,WAAW,UAAoC;AACnE,MAAI;AACF,UAAS,UAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AE9EA,SAAS,kBAAkB;AAMpB,SAAS,YAAY,SAAyB;AACnD,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,KAAK;AACvE,SAAO,UAAU,IAAI;AACvB;;;ACTA,YAAYC,WAAU;AAOtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,aAAa;AACnB,IAAM,mBAAmB;AAKlB,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;AAOA,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;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,0BAA2B,IAAc,OAAO;AAAA,IAElD;AAAA,EACF;AACA,QAAM,SAAS,eAAe,IAAI;AAClC,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,+BAA+B,OAAO,KAAK;AAAA,IAE7C;AAAA,EACF;AACA,SAAO,OAAO;AAChB;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;AASA,eAAsB,sBACpB,aACmC;AACnC,QAAM,eAAoB,WAAK,aAAa,YAAY,aAAa;AACrE,QAAM,MAAM,MAAM,eAAe,YAAY;AAC7C,MAAI,QAAQ,KAAM,QAAO;AAEzB,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,4BAA6B,IAAc,OAAO;AAAA,IAEpD;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB,IAAI;AACrC,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,iCAAiC,OAAO,KAAK;AAAA,IAE/C;AAAA,EACF;AACA,SAAO,OAAO;AAChB;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;AAKA,eAAsB,eACpB,aACgC;AAChC,QAAM,WAAgB,WAAK,aAAa,YAAY,gBAAgB;AACpE,QAAM,MAAM,MAAM,eAAe,QAAQ;AACzC,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI;AACF,UAAM,SAAS,qBAAqB,UAAU,KAAK,MAAM,GAAG,CAAC;AAC7D,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAC/D,aAAO;AAAA,IACT;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,qCAAsC,IAAc,OAAO;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,kBACpB,aACwB;AACxB,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,SAAO,MAAM,QAAQ,QAAQ;AAC/B;AAMO,SAAS,mBACd,aACA,WACQ;AACR,QAAM,OAAY,WAAK,aAAa,YAAY,UAAU;AAC1D,SAAO,YAAiB,WAAK,MAAM,SAAS,IAAI;AAClD;AAKA,eAAsB,eACpB,aAC4B;AAC5B,QAAM,WAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,MAAM,eAAe,QAAQ;AACzC,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,SAAS,mBAAmB,IAAI;AACtC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,sCAAsC,OAAO,KAAK,EAAE;AAChE,aAAO;AAAA,IACT;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,8CAA+C,IAAc,OAAO;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,gBACpB,aACA,MACe;AACf,QAAM,WAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAClE,SAAO,MAAM,4BAAuB,QAAQ,EAAE;AAChD;;;AC3NA,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,qBAAqB;AAE9B,SAAS,iCAAiC;AAG1C,IAAMC,WAAU,cAAc,YAAY,GAAG;AAK7C,SAAS,mBAAmB,aAA6B;AACvD,QAAM,cAAcA,SAAQ,QAAQ,GAAG,WAAW,eAAe;AACjE,SAAY,cAAQ,WAAW;AACjC;AAOA,eAAsB,eAAe,aAIlC;AACD,QAAM,cAAc,mBAAmB,WAAW;AAElD,SAAO,MAAM,iCAAiC,WAAW,EAAE;AAE3D,QAAM,WAAW,MAAM,0BAA0B,WAAW;AAE5D,MAAI,OAAgC,CAAC;AACrC,QAAM,WAAgB,WAAK,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,WAAU;AACtB,YAAYC,SAAQ;AAQpB;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACZP,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;AAmBpB,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;;;AFoCA,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,UAAM,gBAAgB,MAAM,iBAAiB,OAAO,OAAO;AAC3D,cAAU,KAAK,GAAG,aAAa;AAE/B,eAAW,OAAO,WAAW;AAC3B,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA,gBAAU,KAAK,GAAG,aAAa;AAAA,IACjC;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,WAAW,OAAO,UAAU,OAAO;AACzD;AAMA,eAAe,iBACb,OACA,SAC8B;AAC9B,QAAM,EAAE,MAAM,aAAa,YAAY,IAAI;AAC3C,QAAM,YAAiB,cAAQ,aAAa,MAAM,MAAM;AACxD,QAAM,YAAY,mBAAmB,aAAa,MAAM,IAAI;AAC5D,QAAMC,QAAO,MAAS,SAAK,SAAS;AACpC,QAAM,UAA+B,CAAC;AAEtC,MAAIA,MAAK,OAAO,GAAG;AACjB,UAAM,aAAkB,WAAK,WAAW,UAAU;AAClD,UAAM,UAAU,MAAM,mBAAmB,WAAW,OAAO,IAAI;AAC/D,UAAM,cAAc,YAAY,OAAO;AACvC,YAAQ,KAAK,iBAAiB,OAAO,YAAY,OAAO,CAAC;AACzD,WAAO,MAAM,mBAAmB,UAAU,EAAE;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,aAAW,SAAS,SAAS;AAC3B,UAAMC,OAAW,eAAS,WAAW,KAAK;AAC1C,QAAI,aAAkB,WAAK,WAAWA,IAAG;AACzC,QAAI,MAAM,YAAY,WAAW,SAAS,MAAM,GAAG;AACjD,mBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,IACrC;AACA,UAAM,UACJ,MAAM,YAAY,MAAM,SAAS,MAAM,IACnC,eAAe,MAAM,iBAAiB,KAAK,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,IAChE,MAAS,aAAS,OAAO,OAAO;AACtC,UAAM,cAAc,YAAY,OAAO;AACvC,UAAM,aAAkB,eAAS,WAAW,UAAU;AACtD,YAAQ,KAAK,iBAAiB,OAAO,YAAY,SAAS,UAAU,CAAC;AACrE,WAAO,MAAM,mBAAmB,UAAU,EAAE;AAAA,EAC9C;AACA,SAAO;AACT;AAYA,eAAe,iBACb,OACA,KACA,OACA,aAC8B;AAC9B,QAAM,YAAY,mBAAmB,aAAa,MAAM,IAAI;AAC5D,QAAM,UAAU,WAAW,GAAG;AAC9B,QAAM,YAAY,QAAQ,kBAAkB,MAAM,MAAM,OAAO,WAAW;AAC1E,QAAM,UAA+B,CAAC;AAEtC,QAAM,cAAc,MAAM,QAAQ,SAAS;AAC3C,QAAM,UAAU,SAAS;AACzB,aAAW,OAAO,aAAa;AAC7B,UAAMA,OAAW,eAAS,WAAW,GAAG;AACxC,UAAM,aAAkB,WAAK,WAAWA,IAAG;AAC3C,UAAM,gBAAgB,MAAS,aAAS,KAAK,OAAO;AAEpD,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AACA,YAAQ;AAAA,MACN,iBAAiB,OAAO,YAAY,gBAAgB,KAAK,OAAOA,IAAG;AAAA,IACrE;AACA,WAAO,MAAM,cAAc,GAAG,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,EAC1D;AACA,SAAO;AACT;AAcA,eAAe,mBACb,YACA,eACA,gBACA,YACiB;AACjB,QAAM,WAAW,MAAM,eAAe,UAAU;AAEhD,MAAI,aAAa,MAAM;AACrB,UAAM,cAAc,YAAY,aAAa;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,kBAAkB,CAAC;AACnC,QAAM,iBAAiB,QAAQ,OAAO,CAAC,OAAO,iBAAiB,UAAU,EAAE,CAAC;AAE5E,MAAI,eAAe,WAAW,GAAG;AAC/B,QAAI,aAAa,eAAe;AAC9B,aAAO;AAAA,QACL,4BAA4B,UAAU,yCAC5B,UAAU;AAAA,MACtB;AACA,YAAM,cAAc,YAAY,aAAa;AAC7C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,aAAW,MAAM,gBAAgB;AAC/B,UAAM,YAAY,kBAAkB,eAAe,EAAE;AACrD,QAAI,cAAc,KAAM;AACxB,QAAI;AACF,eAAS,qBAAqB,QAAQ,IAAI,SAAS;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,cAAc,YAAY,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAiB,IAA2B;AACrE,QAAM,KAAK,IAAI;AAAA,IACb,qCAAqC;AAAA,MACnC;AAAA,IACF,CAAC,oDAAoD;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,IAAI,QAAQ,MAAM,EAAE;AAC1B,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,EAAE,CAAC,EAAG,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AACnD;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,iBACP,OACA,WACA,SACAA,MACmB;AACnB,QAAM,KAAKA,OAAM,GAAG,MAAM,EAAE,WAAWA,IAAG,KAAK,GAAG,MAAM,EAAE;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,YAAY,OAAO;AAAA,IACzB,UAAU,MAAM;AAAA,EAClB;AACF;AAEA,SAAS,iBACP,OACA,WACA,SACA,KACA,OACAA,MACmB;AACnB,QAAM,KAAKA,QAAOA,SAAQ,aAAa,GAAG,MAAM,EAAE,IAAIA,IAAG,KAAK,MAAM;AACpE,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,YAAY,OAAO;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AA0BA,eAAsB,aACpB,SAC4B;AAC5B,QAAM,EAAE,UAAU,MAAM,OAAO,YAAY,IAAI;AAC/C,QAAM,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE;AACrE,QAAM,UAA+B,CAAC;AAEtC,aAAW,SAAS,SAAS,QAAQ;AACnC,UAAM,YAAY,MAAM,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC3D,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAM,gBAAgB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,KAAK,GAAG,aAAa;AAG7B,eAAW,OAAO,WAAW;AAC3B,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,GAAG,aAAa;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,SAAS,QAAQ;AACvC;AAEA,eAAe,mBACb,OACA,SACA,SAC8B;AAC9B,QAAM,EAAE,MAAM,aAAa,YAAY,IAAI;AAC3C,QAAM,YAAiB,cAAQ,aAAa,MAAM,MAAM;AACxD,QAAM,YAAY,mBAAmB,aAAa,MAAM,IAAI;AAC5D,QAAMD,QAAO,MAAS,SAAK,SAAS;AAEpC,MAAI,CAACA,MAAK,OAAO,GAAG;AAElB,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,UAAM,UAA+B,CAAC;AACtC,eAAW,SAAS,SAAS;AAC3B,YAAMC,OAAW,eAAS,WAAW,KAAK;AAC1C,UAAIC,cAAkB,WAAK,WAAWD,IAAG;AACzC,UAAI,MAAM,YAAYC,YAAW,SAAS,MAAM,GAAG;AACjD,QAAAA,cAAaA,YAAW,MAAM,GAAG,EAAE;AAAA,MACrC;AACA,YAAM,UACJ,MAAM,YAAY,MAAM,SAAS,MAAM,IACnC,eAAe,MAAM,iBAAiB,KAAK,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,IAChE,MAAS,aAAS,OAAO,OAAO;AACtC,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,YAAM,aAAkB,eAAS,WAAWA,WAAU;AACtD,cAAQ,KAAK,iBAAiB,OAAOA,aAAY,SAAS,UAAU,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAGA,QAAM,aAAkB,WAAK,WAAW,UAAU;AAClD,QAAM,aAAa,MAAM,mBAAmB,WAAW,OAAO,IAAI;AAClE,QAAM,SAAS,MAAM,WAAW,UAAU;AAE1C,MAAI,MAAM,mBAAmB,UAAU;AACrC,QAAI,QAAQ;AACV,cAAQ;AACR,YAAME,WAAW,MAAM,eAAe,UAAU,KAAM;AACtD,aAAO,CAAC,iBAAiB,OAAO,YAAYA,QAAO,CAAC;AAAA,IACtD;AACA,UAAM,cAAc,YAAY,UAAU;AAC1C,YAAQ;AACR,WAAO,CAAC,iBAAiB,OAAO,YAAY,UAAU,CAAC;AAAA,EACzD;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,WAAO,CAAC,iBAAiB,OAAO,YAAY,UAAU,CAAC;AAAA,EACzD;AAGA,QAAM,UAAU,MAAM,eAAe,UAAU;AAC/C,MAAI,SAAS,WAAW;AACxB,aAAW,YAAY,MAAM,kBAAkB,CAAC,GAAG;AACjD,UAAM,KAAK,IAAI;AAAA,MACb,qCAAqC;AAAA,QACnC;AAAA,MACF,CAAC,oDAAoD;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,WAAW,MAAM,EAAE;AACjC,QAAI,OAAO;AACT,YAAM,SAAS,MAAM,CAAC,EAAG,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC7D,UAAI;AACF,iBAAS,qBAAqB,QAAQ,UAAU,MAAM;AAAA,MACxD,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,MAAM;AACtC,UAAQ;AACR,SAAO,CAAC,iBAAiB,OAAO,YAAY,MAAM,CAAC;AACrD;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAoCA,eAAsB,iBACpB,SAC0B;AAC1B,QAAM,EAAE,aAAa,QAAQ,MAAM,OAAO,QAAQ,IAAI;AACtD,QAAM,MAA2B,CAAC;AAElC,QAAM,UAAU,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,QAAQ,SAAS,EAAE,EAAE,CAAC;AACvE,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,mBAAmB,aAAa,MAAM,IAAI;AAC5D,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,aAAO;AAAA,QACL,UAAU,MAAM,EAAE,sBAAsB,SAAS;AAAA,MACnD;AACA;AAAA,IACF;AACA,eAAW,OAAO,MAAM;AACtB,YAAM,UAAU,WAAW,GAAG;AAC9B,YAAM,YAAY,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,SAAS;AACzB,YAAM,cAAc,MAAM,QAAQ,SAAS;AAC3C,iBAAW,OAAO,aAAa;AAC7B,cAAMH,OAAW,eAAS,WAAW,GAAG;AACxC,cAAM,aAAkB,WAAK,WAAWA,IAAG;AAC3C,cAAM,gBAAgB,MAAS,aAAS,KAAK,OAAO;AAKpD,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AACA,YAAI,KAAK;AAAA,UACP,IAAIA,SAAQ,aAAa,MAAM,KAAK,GAAG,MAAM,EAAE,IAAIA,IAAG;AAAA,UACtD,QAAQ;AAAA,UACR,MAAM,YAAY,cAAc;AAAA,UAChC,UAAU,MAAM;AAAA,UAChB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,WAAW,KAAK,OAAO,IAAI,OAAO;AAC7C;AAOA,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;AAIA,QAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAW,cAAQ,EAAE,MAAM,CAAC,CAAC;AACpE,aAAW,YAAY,WAAW;AAChC,QAAI,MAAM;AACV,aAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,UAAI;AACF,cAAM,UAAU,MAAS,YAAQ,GAAG;AACpC,YAAI,QAAQ,WAAW,EAAG;AAC1B,cAAS,UAAM,GAAG;AAAA,MACpB,QAAQ;AACN;AAAA,MACF;AACA,YAAW,cAAQ,GAAG;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;;;AG3kBA,YAAYI,WAAU;AAUtB,IAAM,mBAAmB;AAAA,EACvB,YAAY;AAAA,IACV,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,CAAC,MAAM,iBAAiB;AAAA,IAChC;AAAA,EACF;AACF;AAaA,eAAsB,cACpB,aAC0C;AAC1C,QAAM,UAAe,WAAK,aAAa,WAAW;AAClD,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI;AACF,UAAM,cAAc,SAAS,KAAK,UAAU,kBAAkB,MAAM,CAAC,IAAI,IAAI;AAC7E,WAAO,MAAM,0BAAqB,OAAO,EAAE;AAC3C,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAO,KAAK,8BAA+B,IAAc,OAAO,EAAE;AAClE,WAAO;AAAA,EACT;AACF;;;ACpBA,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,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;AAIxE,QAAM,uBAAuB,MAAM,kBAAkB,WAAW;AAGhE,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,eAAe,MAAM,eAAe,WAAW;AACrD,QAAM,mBAAmB,oBAAI,IAAI;AAAA,IAC/B,GAAG,OAAO,KAAK,cAAc,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA,IAGzC,IAAK,aAAa,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EAClE,CAAC;AAGD,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;AAML,UAAM,eAAe,SAAS,OAC3B,OAAO,CAAC,MAAM;AACb,UAAI,CAAC,EAAE,QAAS,QAAO;AACvB,UAAI,CAAC,sBAAsB;AACzB,eAAO;AAAA,UACL,iCAAiC,EAAE,EAAE,cAAc,EAAE,OAAO;AAAA,QAC9D;AACA,eAAO;AAAA,MACT;AACA,UAAI,EAAE,YAAY,sBAAsB;AACtC,eAAO;AAAA,UACL,iCAAiC,EAAE,EAAE,cAAc,EAAE,OAAO,iCAAiC,oBAAoB;AAAA,QACnH;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC,EACA,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,sBAAkB,aAAa,OAAO,CAAC,OAAO,iBAAiB,IAAI,EAAE,CAAC;AACtE,cAAU,aAAa,OAAO,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;AAAA,EACjE;AAGA,MAAI,CAAC,iBAAiB,qBAAqB,QAAQ,WAAW,GAAG;AAC/D,WAAO,EAAE,QAAQ,gBAAgB;AAAA,EACnC;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,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,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;AAAA,IACA,WAAW;AAAA,EACb;AACA,MAAI,OAAO,EAAG,mBAAkB,UAAU,GAAG,IAAI;AAAA,MAC5C,mBAAkB,UAAU,KAAK,KAAK;AAC3C,QAAM,uBAAuB,aAAa,iBAAiB;AAG3D,QAAM,OAAmB,gBAAgB;AAAA,IACvC,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AACA,aAAW,WAAW,SAAS;AAC7B,UAAM,WAAW,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7D,QAAI,CAAC,SAAU;AACf,UAAM,aAAa,SAAS,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC/D,SAAK,OAAO,OAAO,IAAI;AAAA,MACrB,SAAS,SAAS;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,aAAa,IAAI;AAKvC,QAAM,cAAc,WAAW;AAE/B,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;;;AV5PA,IAAMC,0BAAyB;AAC/B,IAAM,0BAAsC,CAAC,SAAS,QAAQ;AAC9D,IAAM,2BAAuC;AAE7C,IAAM,yBAAyB;AAG/B,IAAM,sBAAsB;AAG5B,IAAM,sBAAsB;AAG5B,IAAM,0BAA0B;AAGhC,IAAM,2BAA2B;AAAA;AAAA;AAIjC,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAkE7C,eAAsB,cACpB,SAC8B;AAC9B,QAAM,EAAE,aAAa,SAAS,IAAI,IAAI;AACtC,QAAM,cAAc,QAAQ,eAAe;AAE3C,QAAM,gBAAgB,WAAW;AAMjC,QAAM,cACJ,QAAQ,eAAe,yBAAyB,WAAW;AAC7D,QAAM,UAAU,MAAM,0BAA0B,WAAW;AAC3D,QAAM,eAAe,gBAAgB,SAAS,OAAO;AACrD,MAAI,CAAC,cAAc;AACjB,UAAM,QAAQ,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAC3D,UAAM,IAAI;AAAA,MACR,oBAAoB,OAAO,0BACzB,SAAS,QACX;AAAA;AAAA,IACF;AAAA,EACF;AAKA,QAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,MAAI,gBAAgB,UAAU,QAAQ;AACpC,UAAM,kBAAkB,eAAe,SAAS,OAAO;AACvD,QAAI,oBAAoB,SAAS;AAC/B,aAAO,EAAE,QAAQ,uBAAuB,gBAAgB;AAAA,IAC1D;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,kBAAkB;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,YAAiC,CAAC;AACxC,aAAW,WAAW,aAAa,OAAO;AACxC,UAAM,SAAS,MAAM,mBAAmB,SAAS,aAAa,WAAW;AACzE,QAAI,OAAQ,WAAU,KAAK,MAAM;AAAA,EACnC;AAGA,QAAM,eAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,cAAc,cAAc,wBAAwB;AAAA,EAC5D;AACA,QAAM,mBAAmB,MAAS,aAAS,cAAc,OAAO;AAChE,YAAU,KAAK;AAAA,IACb,IAAI,UAAU,uBAAuB;AAAA,IACrC,QAAa,YAAM,KAAK,qBAAqB,uBAAuB;AAAA,IACpE,MAAM,YAAY,gBAAgB;AAAA,IAClC,UAAU;AAAA,EACZ,CAAC;AAGD,QAAM,OAAuB;AAAA,IAC3B,eAAe;AAAA,IACf,SAAS;AAAA,MACP,MAAM,aAAa;AAAA,MACnB,aAAa,aAAa;AAAA,MAC1B,SAAS,aAAa;AAAA,MACtB,MAAM;AAAA,IACR;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB,QAAQ,aAAa;AAAA,IACrB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACA,QAAM;AAAA,IACC,WAAK,aAAa,eAAe,kBAAkB;AAAA,IACxD,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,EAClC;AAIA,QAAM,SAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK,gBAAgB,OAAO;AAAA,IAC5B,UAAU;AAAA,MACR,GAAI,gBAAgB,YAAY,CAAC;AAAA,MACjC,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB,aAAa,MAAM;AAI5C,QAAM,QAAS,MAAM,sBAAsB,WAAW,KAAM;AAAA,IAC1D,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,YAAY,MAAM,UAAU,UAAU,CAAC,MAAM,EAAE,YAAY,WAAW;AAC5E,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT;AAAA,IACA,SAAS,aAAa;AAAA,IACtB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW;AAAA,EACb;AACA,MAAI,aAAa,EAAG,OAAM,UAAU,SAAS,IAAI;AAAA,MAC5C,OAAM,UAAU,KAAK,WAAW;AACrC,QAAM,uBAAuB,aAAa,KAAK;AAK/C,QAAM,cAAc,WAAW;AAK/B,QAAM,SAAS,MAAM,4BAA4B;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,aAAa;AAAA,IACtB,OAAO,UAAU;AAAA,IACjB,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAOA,eAAe,4BAA4B,MAIN;AACnC,QAAM,EAAE,aAAa,SAAS,IAAI,IAAI;AACtC,QAAM,iBAAiB,qBAAqB,OAAO;AACnD,QAAM,UAAU,CAAC,cAAc;AAI/B,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,eAAeF,uBAAsB;AAChE,uBAAmB,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,iEACG,IAAc,OACjB;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW,CAAC;AAAA,MACZ,eAAe,CAAC;AAAA,MAChB,iBAAiB,CAAC;AAAA,MAClB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,OAAO,CAAC,OAAO,iBAAiB,IAAI,EAAE,CAAC;AAC/D,QAAM,UAAU,QAAQ,OAAO,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;AAChE,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,MACL,yDAAyD,QAAQ;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe,CAAC;AAAA,MAChB,iBAAiB,CAAC;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,QACL,WAAW;AAAA,QACX,eAAe,CAAC;AAAA,QAChB,iBAAiB;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe,OAAO;AAAA,MACtB,iBAAiB,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,4CAA6C,IAAc,OAAO;AAAA,IACpE;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe,CAAC;AAAA,MAChB,iBAAiB,CAAC;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;AAaA,eAAe,mBACb,kBACA,aACA,aACmC;AACnC,QAAM,YAAiB,WAAK,aAAa,gBAAgB;AACzD,QAAM,OAAY,eAAS,gBAAgB;AAE3C,MAAI,SAAS,aAAa;AACxB,UAAM,YAAiB,YAAM;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAiB,WAAK,aAAa,SAAS;AAClD,UAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AACpD,UAAM,cAAc,WAAW,OAAO;AACtC,WAAO;AAAA,MACL,IAAI,UAAU,mBAAmB;AAAA,MACjC,QAAQ;AAAA,MACR,MAAM,YAAY,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS,mBAAmB,SAAS,wBAAwB;AAC/D,UAAM,YAAiB,YAAM;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAiB,WAAK,aAAa,SAAS;AAClD,QAAI,MAAM,WAAW,SAAS,GAAG;AAE/B,YAAM,WAAW,MAAS,aAAS,WAAW,OAAO;AACrD,aAAO;AAAA,QACL,IAAI,UAAU,uBAAuB;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM,YAAY,QAAQ;AAAA,QAC1B,UAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AACpD,UAAM,cAAc,WAAW,OAAO;AACtC,WAAO;AAAA,MACL,IAAI,UAAU,uBAAuB;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM,YAAY,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,SAAO;AACT;AAMA,SAAS,yBAAyB,aAA6B;AAC7D,QAAM,UAAUC,SAAQ,QAAQ,GAAG,WAAW,eAAe;AAC7D,SAAY,cAAQ,OAAO;AAC7B;AAkBA,eAAsB,kBACpB,cAAsB,wBACtB,aAC6B;AAC7B,QAAM,OAAO,eAAe,yBAAyB,WAAW;AAChE,QAAM,UAAU,MAAM,0BAA0B,IAAI;AACpD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB,UAAU,QAAQ,SAAS,IAAI,CAAC,OAAO;AAAA,MACrC,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,IACZ,EAAE;AAAA,EACJ;AACF;;;AWrdA,SAAS,kBAAkB;AAC3B,YAAYE,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,YAAU;AAEtB,IAAM,kBAAkB;AACxB,IAAMC,cAAa;AACnB,IAAMC,eAAc;AAEb,SAAS,oBAA4B;AAC1C,SAAY,YAAQ,YAAQ,GAAG,eAAe;AAChD;AAEO,SAAS,mBAAmB,KAAsB;AACvD,SAAO,WAAgB,YAAK,KAAKD,aAAYC,YAAW,CAAC;AAC3D;AAEA,eAAsB,uBAAwC;AAC5D,QAAM,OAAO,kBAAkB;AAC/B,QAAS,UAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACxC,SAAO;AACT;AAWO,SAAS,eAAe,aAA8B;AAC3D,SAAO,WAAgB,YAAK,aAAa,cAAc,CAAC;AAC1D;AAeO,SAAS,6BAA6B,KAAqB;AAChE,MAAI,mBAAmB,GAAG,EAAG,QAAO;AACpC,QAAM,aAAa,kBAAkB;AACrC,MAAI,mBAAmB,UAAU,EAAG,QAAO;AAC3C,SAAO;AACT;;;AfhDO,IAAM,cAAc,IAAI,QAAQ,MAAM,EAC1C,YAAY,gIAAuB,EACnC,SAAS,aAAa,sFAAoC,EAC1D,OAAO,OAAO,YAAoB;AACjC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAIvC,QAAI,CAAC,eAAe,WAAW,GAAG;AAChC,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO,KAAK,wCAAwC,OAAO,GAAG;AAC9D,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,KAAK,IAAI;AAAA,IACX,CAAC;AAED,QAAI,OAAO,WAAW,uBAAuB;AAC3C,aAAO;AAAA,QACL,+CAA+C,OAAO,eAAe;AAAA,MAEvE;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,oBAAoB;AACxC,aAAO;AAAA,QACL,gEAC2B,OAAO,eAAe,kBAAkB,OAAO,gBAAgB;AAAA,MAC5F;AACA,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,wCAAwC;AACpD,aAAO,KAAK,+BAA+B,OAAO,gBAAgB,EAAE;AACpE,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,8BAA8B,OAAO,WAAW,KAAK,OAAO,OAAO,KAAK,OAAO,OAAO;AAAA,IACxF;AACA,WAAO,KAAK,eAAe,OAAO,OAAO,EAAE;AAC3C,WAAO,KAAK,gBAAgB;AAC5B,WAAO,KAAK,gBAAgB,OAAO,KAAK,kBAAkB;AAC1D,QAAI,OAAO,QAAQ;AACjB,YAAM,EAAE,eAAe,iBAAiB,QAAQ,IAAI,OAAO;AAC3D,UAAI,cAAc,SAAS,GAAG;AAC5B,eAAO;AAAA,UACL,8BAA8B,cAAc,KAAK,IAAI,CAAC;AAAA,QACxD;AAAA,MACF;AACA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,eAAO;AAAA,UACL,2CAA2C,gBAAgB,KAAK,IAAI,CAAC;AAAA,QACvE;AAAA,MACF;AACA,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,yCAAyC,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,2DAA2D;AACvE,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,yBAA0B,IAAc,OAAO,EAAE;AAC9D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AgBvFH,SAAS,WAAAC,gBAAe;;;ACQxB,YAAYC,YAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE,6BAAAC;AAAA,EACA,mBAAAC;AAAA,OAIK;AAUP,IAAMC,0BAAyB;AAC/B,IAAMC,uBAAsB;AAC5B,IAAMC,uBAAsB;AAE5B,IAAMC,WAAUC,eAAc,YAAY,GAAG;AA6B7C,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,cAAc,QAAQ,eAAeJ;AAE3C,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,MAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,WAAO,EAAE,QAAQ,kBAAkB;AAAA,EACrC;AACA,QAAM,iBAAiB,OAAO,SAAS,OAAO;AAC9C,QAAM,iBAAiB,OAAO,SAAS,OAAO;AAE9C,QAAM,cACJ,QAAQ,eAAeK,0BAAyB,WAAW;AAE7D,QAAM,UAAU,MAAMC,2BAA0B,WAAW;AAC3D,QAAM,eAAeC,iBAAgB,SAAS,cAAc;AAC5D,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR,gCAAgC,cAAc,yBAAyB,WAAW,IAAI,QAAQ,OAAO,gBACrF,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAEhE;AAAA,EACF;AAEA,MAAI,aAAa,YAAY,gBAAgB;AAG3C,UAAM,wBAAwB,aAAa,OAAO,aAAa,WAAW;AAC1E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,eAAoB;AAAA,IACxB;AAAA,IACAN;AAAA,IACA;AAAA,EACF;AACA,MAAI,MAAM,WAAW,YAAY,EAAG,WAAU,KAAK,sBAAsB;AAGzE,QAAM,OAAuB;AAAA,IAC3B,eAAe;AAAA,IACf,SAAS;AAAA,MACP,MAAM,aAAa;AAAA,MACnB,aAAa,aAAa;AAAA,MAC1B,SAAS,aAAa;AAAA,MACtB,MAAM;AAAA,IACR;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB,QAAQ,aAAa;AAAA,IACrB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACA,QAAM;AAAA,IACC,YAAK,aAAa,eAAe,kBAAkB;AAAA,IACxD,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,EAClC;AAGA,SAAO,SAAS,OAAO,UAAU,aAAa;AAC9C,QAAM,mBAAmB,aAAa,MAAM;AAG5C,QAAM,QAAS,MAAM,sBAAsB,WAAW,KAAM;AAAA,IAC1D,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,MAAM,MAAM,UAAU,UAAU,CAAC,MAAM,EAAE,YAAY,WAAW;AACtE,MAAI,OAAO,GAAG;AACZ,UAAM,UAAU,GAAG,EAAG,UAAU,aAAa;AAC7C,UAAM,UAAU,GAAG,EAAG,eAAc,oBAAI,KAAK,GAAE,YAAY;AAE3D,eAAW,KAAK,MAAM,UAAU,GAAG,EAAG,WAAW;AAC/C,UAAI,EAAE,aAAa,eAAe;AAChC,cAAM,MAAW,kBAAW,EAAE,MAAM,IAChC,EAAE,SACG,YAAK,aAAa,EAAE,MAAM;AACnC,YAAI,MAAM,WAAW,GAAG,GAAG;AACzB,YAAE,OAAO,YAAY,MAAS,aAAS,KAAK,OAAO,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AACA,UAAM,uBAAuB,aAAa,KAAK;AAAA,EACjD;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,IAAI,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,wBACb,OACA,aACA,aACmB;AACnB,QAAM,UAAoB,CAAC;AAC3B,aAAW,WAAW,OAAO;AAC3B,UAAM,OAAY,gBAAS,OAAO;AAClC,QAAI,SAAS,YAAa;AAC1B,UAAM,YAAiB,YAAK,aAAa,OAAO;AAChD,UAAM,YAAiB;AAAA,MACrB;AAAA,MACAA;AAAA,MACAC;AAAA,IACF;AACA,UAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AACpD,UAAM,cAAc,WAAW,OAAO;AACtC,YAAQ,KAAKA,oBAAmB;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAASG,0BAAyB,aAA6B;AAC7D,QAAM,UAAUF,SAAQ,QAAQ,GAAG,WAAW,eAAe;AAC7D,SAAY,eAAQ,OAAO;AAC7B;;;AD5LO,IAAM,gBAAgB,IAAIK,SAAQ,QAAQ,EAC9C;AAAA,EACC;AACF,EACC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,gBAAgB,EAAE,YAAY,CAAC;AAEpD,QAAI,OAAO,WAAW,mBAAmB;AACvC,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,cAAc;AAClC,aAAO;AAAA,QACL,sBAAsB,OAAO,WAAW,KAAK,OAAO,OAAO,KAAK,OAAO,OAAO;AAAA,MAChF;AACA,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,OAAO,WAAW,KAAK,OAAO,OAAO,OAAO,OAAO,IAAI,YAAO,OAAO,EAAE;AAAA,IACpF;AACA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,aAAO,KAAK,eAAe,OAAO,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1D;AACA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,aAAO;AAAA,QACL,gBAAgB,OAAO,UAAU,KAAK,IAAI,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA6B,IAAc,OAAO,EAAE;AACjE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AExDH,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,8BAA8B;AAC1C,aAAO,KAAK,wDAAwD;AACpE;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,SAAAC,SAAQ,IAAI,OAAO,SAAS;AAE7C,WAAO,KAAK,2BAA2B;AACvC,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;;;ACrCH,SAAS,WAAAC,gBAAe;AAIjB,IAAM,sBAAsB,IAAIC,SAAQ,eAAe,EAC3D,YAAY,wFAAiC,EAC7C,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAEvC,WAAO;AAAA,MACL,yBAAyB,OAAO,WAAW,KAAK,OAAO,cAAc;AAAA,IACvE;AACA,WAAO,KAAK,EAAE;AAEd,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,aAAO,KAAK,6CAA6C;AACzD;AAAA,IACF;AAEA,eAAW,KAAK,OAAO,UAAU;AAC/B,aAAO,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,aAAQ,EAAE,OAAO,EAAE;AAC5D,UAAI,EAAE,YAAa,QAAO,KAAK,OAAO,EAAE,WAAW,EAAE;AACrD,UAAI,EAAE,QAAQ;AACZ,cAAM,QAAkB,CAAC;AACzB,YAAI,EAAE,OAAO,QAAQ,EAAG,OAAM,KAAK,WAAW,EAAE,OAAO,QAAQ,CAAC,EAAE;AAClE,YAAI,EAAE,OAAO;AACX,gBAAM,KAAK,cAAc,EAAE,OAAO,SAAS,EAAE;AAC/C,YAAI,MAAM,OAAQ,QAAO,KAAK,eAAe,MAAM,KAAK,KAAK,CAAC,EAAE;AAAA,MAClE;AACA,aAAO,KAAK,EAAE;AAAA,IAChB;AAEA,WAAO,KAAK,kDAAkD;AAAA,EAChE,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA6B,IAAc,OAAO,EAAE;AACjE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AC9CH,SAAS,WAAAC,gBAAe;AACxB,YAAYC,SAAQ;AACpB,YAAYC,YAAU;AACtB,YAAY,aAAa;AAUzB,IAAM,iBAAiB;AAQhB,IAAM,mBAAmB,IAAIC,SAAQ,WAAW,EACpD;AAAA,EACC;AACF,EACC,OAAO,aAAa,0BAAM,EAC1B;AAAA,EACC;AAAA,EACA;AACF,EACC;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,6CAA6C;AACzD;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,UAAM,MAAM,mBAAmB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAY;AAAA,IACvB;AACA,UAAM,YAAY,KAAK,aAAa,CAAC;AAKrC,UAAM,YAAY,KAAK,YACnB,CAAC,IACD,KAAK,QACL,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,IAChD,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,aAAa;AACxD,UAAM,OAAO,UAAU,SAAS,UAAU;AAE1C,WAAO;AAAA,MACL,eAAe,UAAU,MAAM,kBAAkB,IAAI;AAAA,IACvD;AAEA,QAAI,CAAC,KAAK,KAAK;AACb,YAAMC,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,kBAAW,EAAE,MAAM,IACnC,EAAE,SACG,YAAK,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,YAAY;AAAA,MACvB;AACA,YAAM,uBAAuB,aAAa,iBAAiB;AAAA,IAC7D;AAGA,WAAO,OAAO,SAAS;AACvB,UAAM,mBAAmB,aAAa,MAAM;AAG5C,UAAM,WAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI;AACF,YAAS,WAAO,QAAQ;AAAA,IAC1B,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,UAAU;AACpD,eAAO;AAAA,UACL,sCAAuC,IAAc,OAAO;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,eAAe,cAAc,EAAE;AAC9C,WAAO,KAAK,cAAc,OAAO,QAAQ;AACzC,QAAI,OAAO,GAAG;AACZ,YAAM,OAAO,KAAK,QACd,sCACA;AACJ,aAAO,KAAK,cAAc,IAAI,iBAAY,IAAI,EAAE;AAAA,IAClD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC7D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ArBhII,IAAM,gBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,iEAAmC;AAElD,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,aAAa;AACtC,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,mBAAmB;AAC5C,cAAc,WAAW,gBAAgB;;;AsBdzC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,gBAAe;AACxB,YAAYC,cAAa;AAkBlB,IAAM,aAAa,IAAIC,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,MAAM,IAAI,eAAe;AAC/B,UAAM,gBAAgB,MAAM,SAAS;AAErC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,oBAAoB;AAAA,MAChD;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAID,QAAI,cAAc;AAClB,QAAI,UAAU,YAAY,CAAC,mBAAmB,GAAG,GAAG;AAClD,oBAAc,MAAM,qBAAqB;AACzC,aAAO,KAAK,0CAAqC,WAAW,EAAE;AAAA,IAChE,WAAW,UAAU,YAAY,CAAC,eAAe,GAAG,GAAG;AAIrD,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,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;;;AC5MA,SAAS,WAAAC,gBAAe;AAWxB,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,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,6BAA6B,GAAG;AACpD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAEA,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,UAAM,MAAM,mBAAmB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAY;AAAA,IACvB;AACA,UAAM,aAAa,MAAM,eAAe,WAAW;AAMnD,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;AACA,eAAW,WAAW,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,GAAG;AAC3D,UAAI,CAAC,iBAAiB,IAAI,OAAO,GAAG;AAClC,yBAAiB,IAAI,SAAS,CAAC;AAAA,MACjC;AAAA,IACF;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;AAEA,UAAM,cAAc,iBAAiB,OAAO;AAE5C,QAAI,eAAe,QAAQ,UAAU,UAAU,KAAK;AAClD,2BAAqB,OAAO,SAAS,QAAQ,IAAI,WAAW;AAAA,IAC9D,WAAW,aAAa;AACtB,aAAO;AAAA,QACL,cAAc,iBAAiB,IAAI;AAAA,MACrC;AAAA,IACF,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;;;ACpIA,SAAS,WAAAC,gBAAe;AAoBxB,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,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,6BAA6B,GAAG;AACpD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAEA,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,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,IACF,CAAC;AAGD,WAAO,SAAS,OAAO,UAAU,SAAS;AAC1C,UAAM,mBAAmB,aAAa,MAAM;AAG5C,UAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,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;AAAA,MACA,WAAW,OAAO;AAAA,IACpB;AACA,QAAI,OAAO,EAAG,mBAAkB,UAAU,GAAG,IAAI;AAAA,QAC5C,mBAAkB,UAAU,KAAK,KAAK;AAC3C,UAAM,uBAAuB,aAAa,iBAAiB;AAG3D,UAAM,eAAgB,MAAM,eAAe,WAAW,KAAM;AAAA,MAC1D,eAAe;AAAA,MACf,QAAQ,CAAC;AAAA,IACX;AACA,UAAM,OAAmB;AAAA,MACvB,eAAe;AAAA,MACf,QAAQ,EAAE,GAAG,aAAa,OAAO;AAAA,IACnC;AACA,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,aAAa,MAAM,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC5D,UAAI,WAAW,WAAW,EAAG;AAC7B,WAAK,OAAO,MAAM,EAAE,IAAI;AAAA,QACtB,SAAS,MAAM;AAAA,QACf,MAAMD;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,gBAAgB,aAAa,IAAI;AAEvC,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;;;AC/HH,SAAS,WAAAI,iBAAe;AACxB,YAAYC,cAAa;AACzB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AAwBpB,IAAMC,kBAAiB;AAMhB,IAAMC,oBAAmB,IAAIC,UAAQ,WAAW,EACpD;AAAA,EACC;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,aAAa,0BAAM,EAC1B,OAAO,OAAO,KAAe,SAA2B;AACvD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,6BAA6B,GAAG;AACpD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAEA,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,QAAI,IAAI,WAAW,GAAG;AACpB,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC7D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAWH,eAAe,iBAAiB,MAAwC;AACtE,QAAM,EAAE,aAAa,QAAQ,mBAAmB,KAAK,WAAW,KAAK,IAAI;AAEzE,SAAO;AAAA,IACL,eAAe,UAAU,MAAM,+BAA+BA,eAAc;AAAA,EAC9E;AAEA,MAAI,CAAC,KAAK,KAAK;AACb,UAAMG,WAAU,MAAc,iBAAQ;AAAA,MACpC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAY,kBAASA,QAAO,KAAK,CAACA,UAAS;AACzC,aAAO,KAAK,YAAY;AACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,SAAO,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAG9C,QAAM,aAAa,mBAAmB,WAAW;AACjD,QAAM,mBAAmB,MAAM,qBAAqB,UAAU;AAC9D,MAAI;AACF,UAAS,QAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD,WAAO,MAAM,sBAAsB,UAAU,EAAE;AAAA,EACjD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,oBAAoB,UAAU,KAAM,IAAc,OAAO;AAAA,IAC3D;AAAA,EACF;AAMA,QAAM,aAAa,kBAAkB;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA,QAAQ,UAAU,QAAQ;AAAA,IAC1B,QAAQ,UAAU,QAAQ;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,qBAAqB,KAAK;AAC5B,sBAAkB,YAAY,kBAAkB,UAAU;AAAA,MACxD,CAAC,MAAM,EAAE,YAAYH;AAAA,IACvB;AACA,UAAM,uBAAuB,aAAa,iBAAiB;AAAA,EAC7D;AAEA,SAAO,OAAO,SAAS;AACvB,QAAM,mBAAmB,aAAa,MAAM;AAE5C,SAAO,QAAQ,eAAeA,eAAc,EAAE;AAC9C,SAAO,KAAK,cAAc,QAAQ,MAAM,QAAQ;AAChD,SAAO,KAAK,cAAmB,gBAAS,aAAa,UAAU,CAAC,YAAY;AAC5E,MAAI,kBAAkB,SAAS,GAAG;AAChC,WAAO;AAAA,MACL,cAAc,kBACX,IAAI,CAAC,MAAW,gBAAS,aAAa,CAAC,CAAC,EACxC,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AACF;AAWA,eAAe,oBAAoB,MAA2C;AAC5E,QAAM,EAAE,aAAa,mBAAmB,KAAK,WAAW,KAAK,KAAK,IAAI;AAEtE,QAAM,UAAU,eAAe,SAAS;AACxC,QAAM,YAAY,OAAO,GAAG;AAC5B,QAAM,UAAU,UAAU,OAAO,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AACxD,QAAM,UAAU,UAAU,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AAEzD,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,KAAK,4BAA4B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9D;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,KAAK,oBAAoB;AAChC;AAAA,EACF;AAEA,QAAM,WAAgC,QAAQ;AAAA,IAC5C,CAAC,OAAO,QAAQ,IAAI,EAAE,KAAK,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,eAAe,QAAQ,MAAM,cAAc,QAAQ,KAAK,IAAI,CAAC,KACvD,SAAS,MAAM;AAAA,EACvB;AAEA,MAAI,CAAC,KAAK,KAAK;AACb,UAAMG,WAAU,MAAc,iBAAQ;AAAA,MACpC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAY,kBAASA,QAAO,KAAK,CAACA,UAAS;AACzC,aAAO,KAAK,YAAY;AACxB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,iBAAiB,QAAQ;AAC/C,SAAO,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAG9C,aAAW,MAAM,SAAS;AACxB,UAAM,MAAM,mBAAmB,aAAa,EAAE;AAC9C,QAAI;AACF,YAAS,QAAG,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACjD,aAAO,MAAM,sBAAsB,GAAG,EAAE;AAAA,IAC1C,SAAS,KAAK;AACZ,aAAO,KAAK,oBAAoB,GAAG,KAAM,IAAc,OAAO,EAAE;AAAA,IAClE;AAAA,EACF;AAIA,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA,QAAQ,UAAU,QAAQ;AAAA,IAC1B,QAAQ,UAAU,QAAQ;AAAA,IAC1B;AAAA,EACF;AAGA,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,MAAI,MAAM;AACR,eAAW,MAAM,QAAS,QAAO,KAAK,OAAO,EAAE;AAC/C,UAAM,gBAAgB,aAAa,IAAI;AAAA,EACzC;AAIA,MAAI,qBAAqB,KAAK;AAC5B,QAAI,YAAY,UAAU,OAAO,CAAC,MAAM,CAAC,QAAQ,SAAS,UAAU,CAAC,CAAC,CAAC;AACvE,UAAM,uBAAuB,aAAa,iBAAiB;AAAA,EAC7D;AAEA,SAAO;AAAA,IACL,WAAW,QAAQ,MAAM,cAAc,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC3D;AACA,SAAO,KAAK,cAAc,QAAQ,MAAM,EAAE;AAC1C,MAAI,kBAAkB,SAAS,GAAG;AAChC,WAAO;AAAA,MACL,cAAc,kBACX,IAAI,CAAC,MAAW,gBAAS,aAAa,CAAC,CAAC,EACxC,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,KAAK,cAAc,QAAQ,KAAK,IAAI,CAAC,kBAAkB;AAAA,EAChE;AACF;AAOA,eAAe,qBAAqB,YAAuC;AACzE,MAAI;AACF,UAAM,UAAU,MAAS,aAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACjE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAOA,SAAS,kBAAkB,MAId;AACX,QAAM,MAAM,IAAI,IAAY,KAAK,WAAW;AAC5C,aAAW,KAAK,KAAK,eAAe;AAClC,QAAI,IAAI,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAE;AAAA,EAC7B;AACA,SAAO,CAAC,GAAG,GAAG;AAChB;AAQA,eAAe,iBACb,aACA,OACA,MACA,YACmB;AACnB,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AACrC,QAAM,aACJ,QAAQ,KAAK,SAAS,IACjB,KAAK,OAAO,CAAC,MAAqB,MAAM,WAAW,MAAM,QAAQ,IAClE,CAAC,GAAG,aAAa;AAEvB,QAAM,cACJ,UAAU,WAAW,WAAW;AAElC,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,WAAW,GAAG;AAC9B,eAAW,QAAQ,YAAY;AAC7B,YAAM,MAAM,QAAQ,kBAAkB,MAAM,aAAa,WAAW;AACpE,UAAI,UAAU;AACd,UAAI;AACF,cAAS,YAAO,GAAG;AAAA,MACrB,QAAQ;AACN,kBAAU;AAAA,MACZ;AACA,UAAI,CAAC,QAAS;AACd,UAAI;AACF,cAAS,QAAG,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACjD,gBAAQ,KAAK,GAAG;AAChB,eAAO,MAAM,sBAAsB,GAAG,EAAE;AAAA,MAC1C,SAAS,KAAK;AACZ,eAAO,KAAK,oBAAoB,GAAG,KAAM,IAAc,OAAO,EAAE;AAAA,MAClE;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,eAAoB;AAAA,QACxB,QAAQ,kBAAkB,eAAe,aAAa,WAAW;AAAA,MACnE;AACA,UAAI;AACF,cAAM,YAAY,MAAS,aAAQ,YAAY;AAC/C,YAAI,UAAU,WAAW,GAAG;AAC1B,gBAAS,WAAM,YAAY;AAAA,QAC7B;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQA,SAAS,UAAU,GAA8B;AAC/C,SAAO,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;AAC1B;AAEA,SAAS,eACP,SACkC;AAClC,QAAM,MAAM,oBAAI,IAAiC;AACjD,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,UAAU,CAAC;AACtB,UAAM,SAAS,IAAI,IAAI,EAAE;AACzB,QAAI,OAAQ,QAAO,KAAK,CAAC;AAAA,QACpB,KAAI,IAAI,IAAI,CAAC,CAAC,CAAC;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,OAAO,QAA4B;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AACnC;;;AClYA,SAAS,WAAAC,iBAAe;;;ACAxB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AACpB,SAAS,iBAAAC,sBAAqB;AAQ9B,SAAS,6BAAAC,kCAAiC;AAW1C,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAO7C,eAAe,0BACb,SAOA;AACA,MAAI;AACF,UAAM,UAAUD,SAAQ,QAAQ,iCAAiC;AACjE,UAAM,cAAmB,eAAQ,OAAO;AACxC,UAAM,WAAW,MAAME,2BAA0B,WAAW;AAC5D,UAAM,QAAQ,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC1D,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO;AAAA,MACL,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,yBAAyB;AA6B/B,eAAsB,cACpB,SAC8B;AAC9B,QAAM,EAAE,aAAa,MAAM,IAAI;AAE/B,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,MAAI,CAAC,QAAQ,OAAO,KAAK,KAAK,MAAM,EAAE,WAAW,GAAG;AAClD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC;AAAA,MACjB,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,KAAK,KAAK,MAAM;AACxC,QAAM,UAAU,QAAQ,SAAS,OAAO,CAAC,OAAO,MAAM,SAAS,EAAE,CAAC,IAAI;AAKtE,QAAM,eAAoC,CAAC;AAC3C,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAoB,CAAC;AAE3B,aAAW,WAAW,SAAS;AAC7B,UAAM,YAAY,KAAK,OAAO,OAAO;AACrC,QAAI,CAAC,UAAW;AAChB,UAAM,YAAY,mBAAmB,aAAa,OAAO;AACzD,QAAI,CAAE,MAAM,UAAU,SAAS,GAAI;AACjC,aAAO,KAAK,UAAU,OAAO,sBAAsB,SAAS,YAAY;AACxE,cAAQ,KAAK,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,OAAQ,QAAQ,QAAQ,UAAU;AACxC,UAAM,QAAQ,QAAQ,SAAS,UAAU;AACzC,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,KAAK,UAAU,OAAO,uCAAuC;AACpE;AAAA,IACF;AAMA,UAAM,eAAe,MAAM,0BAA0B,OAAO;AAC5D,UAAM,SAAS,MAAM,iBAAiB;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,QACN;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,gBAAgB,cAAc,kBAAkB;AAAA,UAChD,gBAAgB,cAAc;AAAA,QAChC;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,iBAAa,KAAK,GAAG,OAAO,SAAS;AACrC,WAAO,KAAK,OAAO;AAGnB,SAAK,OAAO,OAAO,IAAI;AAAA,MACrB,GAAG;AAAA,MACH,YAAY;AAAA,MACZ;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,gBAAgB,aAAa,IAAI;AAGvC,QAAM,qBAAqB,aAAa,YAAY;AAEpD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,WAAW,aAAa;AAAA,IACxB,WAAW;AAAA,IACX,kBAAkB;AAAA,EACpB;AACF;AAEA,eAAe,UAAU,GAA6B;AACpD,MAAI;AACF,UAAMC,QAAO,MAAS,UAAK,CAAC;AAC5B,WAAOA,MAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBACb,aACA,kBACe;AACf,QAAM,YAAY,MAAM,sBAAsB,WAAW;AACzD,MAAI,CAAC,UAAW;AAChB,QAAM,MAAM,UAAU,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,sBAAsB;AAChF,MAAI,CAAC,IAAK;AAIV,QAAM,aAAa,IAAI,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAS;AAClE,MAAI,YAAY,CAAC,GAAG,YAAY,GAAG,gBAAgB;AACnD,MAAI,eAAc,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,uBAAuB,aAAa,SAAS;AACrD;;;ADpLO,IAAM,cAAc,IAAIC,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,OAAiB,SAAsB;AACpD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,6BAA6B,GAAG;AACpD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAEA,UAAM,OAAO,KAAK,MAAMC,cAAa,KAAK,GAAG,IAAI;AACjD,UAAM,QAAQ,KAAK,QAAQC,YAAW,KAAK,KAAK,IAAI;AAEpD,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,IACpC,CAAC;AAED,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,OAAO,eAAe,MAAM,oBAAe,OAAO,SAAS;AAAA,IACvE;AACA,QAAI,OAAO,eAAe,SAAS,GAAG;AACpC,aAAO,KAAK,aAAa,OAAO,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7D;AACA,QAAI,OAAO,iBAAiB,SAAS,GAAG;AACtC,aAAO;AAAA,QACL,qBAAqB,OAAO,iBAAiB;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,0BAA2B,IAAc,OAAO,EAAE;AAC/D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,SAASD,cAAa,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;AAAA,QACR,iBAAiB,CAAC,uBAAuB,cAAc,KAAK,IAAI,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASC,YAAW,OAA2B;AAC7C,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,MAAM,aAAa,MAAM,SAAU,QAAO;AAC9C,QAAM,IAAI,MAAM,qBAAqB,KAAK,+BAA+B;AAC3E;;;AEhGA,SAAS,WAAAC,iBAAe;;;ACAxB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AA6CpB,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,MAAI,CAAC,QAAQ,OAAO,KAAK,KAAK,MAAM,EAAE,WAAW,GAAG;AAClD,WAAO,EAAE,QAAQ,aAAa,UAAU,CAAC,EAAE;AAAA,EAC7C;AAEA,QAAM,WAAgC,CAAC;AAEvC,aAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAC1D,UAAM,YAAY,mBAAmB,aAAa,OAAO;AACzD,QAAI,CAAE,MAAMC,WAAU,SAAS,GAAI;AACjC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,QAAQ,SAAS;AAC3C,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,eAAW,KAAK,aAAa;AAC3B,YAAMC,OAAW,gBAAS,WAAW,CAAC;AACtC,qBAAe,IAAIA,MAAK,MAAS,cAAS,GAAG,OAAO,CAAC;AAAA,IACvD;AAEA,eAAW,OAAO,MAAM,YAAY;AAClC,YAAM,UAAU,WAAW,GAAG;AAC9B,YAAM,YAAY,QAAQ;AAAA,QACxB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AACA,UAAI,CAAE,MAAMD,WAAU,SAAS,GAAI;AACjC,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,OAAO,MAAM;AAAA,UACb,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AACA,iBAAW,CAACC,MAAK,aAAa,KAAK,eAAe,QAAQ,GAAG;AAC3D,cAAM,aAAkB,YAAK,WAAWA,IAAG;AAC3C,YAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,OAAO,MAAM;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,UACV,CAAC;AACD;AAAA,QACF;AACA,cAAM,gBAAgB,MAAS,cAAS,YAAY,OAAO;AAC3D,YAAI,YAAY,aAAa,MAAM,YAAY,aAAa,GAAG;AAC7D,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,OAAO,MAAM;AAAA,YACb,MAAM;AAAA,YACN,QACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,SAAS,WAAW,IAAI,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,eAAeD,WAAU,GAA6B;AACpD,MAAI;AACF,UAAME,QAAO,MAAS,UAAK,CAAC;AAC5B,WAAOA,MAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADlIO,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAC9C;AAAA,EACC;AACF,EACC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,6BAA6B,GAAG;AACpD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAEA,UAAM,SAAS,MAAM,gBAAgB,EAAE,YAAY,CAAC;AAEpD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO,QAAQ,wCAAwC;AACvD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,OAAO,SAAS,MAAM;AAAA,IACjC;AACA,eAAW,KAAK,OAAO,UAAU;AAC/B,YAAM,UAAU,EAAE,MAAM,KAAK,EAAE,GAAG,MAAM;AACxC,aAAO,KAAK,OAAO,EAAE,IAAI,GAAG,OAAO,KAAK,EAAE,OAAO,EAAE;AACnD,aAAO,KAAK,SAAS,EAAE,IAAI,EAAE;AAC7B,UAAI,EAAE,OAAQ,QAAO,KAAK,SAAS,EAAE,MAAM,EAAE;AAAA,IAC/C;AACA,YAAQ,WAAW;AAAA,EACrB,SAAS,KAAK;AACZ,WAAO,MAAM,yBAA0B,IAAc,OAAO,EAAE;AAC9D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;APxCI,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAW,UAAU;AACnC,cAAc,WAAWC,YAAW;AACpC,cAAc,WAAWC,cAAa;AACtC,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,aAAa;AACtC,cAAc,WAAWC,iBAAgB;;;ASjBzC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,iBAAe;AACxB,YAAYC,cAAa;;;ACOlB,IAAM,qBAAgC;AAAA,EAC3C,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AAAA,EACV,WAAW;AACb;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,IAChD,UAAU,QAAQ,SAAS,YAAY,mBAAmB;AAAA,IAC1D,WAAW,QAAQ,SAAS,aAAa,mBAAmB;AAAA,EAC9D;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;AAI5C,QAAM,cAAc,WAAW;AAE/B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADrFO,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;AAIvC,QAAI,CAAC,eAAe,WAAW,GAAG;AAChC,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,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,QACpC,UAAU,mBAAmB;AAAA,QAC7B,WAAW,mBAAmB;AAAA,MAChC;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;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,mBAAmB;AAAA,MAC7B,WAAW,mBAAmB;AAAA,IAChC;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;;;AElKA,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,MAAMC,QAAe,MAAc,SAA6B;AAC/D,YAAM,WAAW,yBAAyB,IAAI;AAC9C,UAAI,CAAC,SAAU,QAAO;AACtB,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,YAAM,aAAa,kBAAkB,KAAK;AAM1C,YAAM,WAAW,gBAAgB,IAAI;AACrC,aAAO,GAAGA,MAAK,GAAG,UAAU,GAAG,QAAQ,GAAGA,MAAK;AAAA,IACjD;AAAA,EACF;AACF;AAcA,SAAS,gBAAgB,MAAkC;AACzD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,MAAI,SAAS,WAAW,GAAG;AAEzB,WAAO,IAAI,SAAS,CAAC,CAAC;AAAA,EACxB;AACA,SAAO;AACT;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;;;AD7BA,eAAsB,iBACpB,SAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;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,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,eAAe,kBAAkB,IAAI,MAAM,EAAE,KAAK;AACxD,YAAM,YAAiB,eAAQ,cAAc,KAAK,MAAM;AACxD,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;AAAA,EAEF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;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;;;AEnIA,IAAM,qBAAqB;AAuC3B,eAAsB,SACpB,SACyB;AACzB,QAAM,EAAE,aAAa,KAAK,WAAW,kBAAkB,IAAI;AAC3D,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;AAM9D,QAAM,WAAW,SAAS,qBAAqB,CAAC;AAChD,QAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACrD,QAAM,YAAY,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAE3D,QAAM,sBAAsB,IAAI,OAAO,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;AAClE,MAAI,oBAAoB,SAAS,KAAK,CAAC,mBAAmB;AACxD,UAAM,OAAO,oBAAoB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC/D,UAAM,IAAI;AAAA,MACR,sCACE,oBAAoB,WAAW,IAAI,MAAM,KAC3C,IAAI,IAAI;AAAA,IAGV;AAAA,EACF;AAEA,QAAM,oBAAoB,oBACtB,EAAE,GAAG,UAAU,SAAS,CAAC,GAAG,SAAS,SAAS,GAAG,QAAQ,EAAE,IAC3D;AAEJ,QAAM,WAAW,oBAAI,IAAI;AAAA,IACvB,GAAG;AAAA,IACH,GAAI,oBAAoB,cAAc,CAAC;AAAA,EACzC,CAAC;AACD,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,UAAU;AAAA,IACV;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,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;;;AJ3JO,IAAMC,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,YAAY,qDAAiC,EACtD,OAAO,eAAe,sHAA4B,EAClD;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC,OACE,KACA,SACG;AACH,QAAI;AACF,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAEvC,aAAO,KAAK,uBAAuB,IAAI,KAAK,IAAI,CAAC,EAAE;AAEnD,YAAM,SAAS,MAAM,SAAS;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAED,aAAO;AAAA,QACL,oBAAoB,OAAO,OAAO,aAAa,OAAO,OAAO;AAAA,MAC/D;AACA,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,mBAAmB,OAAO,WAAW,KAAK,UAAK,CAAC,EAAE;AAE9D,YAAM,UAAU,OAAO,QAAQ,OAAO,eAAe;AACrD,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,2CAA2C;AACvD,cAAM,aAAa,QAChB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,GAAG;AACX,eAAO,KAAK,cAAc,UAAU,EAAE;AACtC,eAAO,KAAK,uBAAuB,UAAU,EAAE;AAAA,MACjD;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,UAAW,IAAc;AAG/B,UAAI,QAAQ,WAAW,oBAAoB,GAAG;AAC5C,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,MAAM,6BAA6B,OAAO,EAAE;AAAA,MACrD;AACA,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AKhEF,SAAS,WAAAC,iBAAe;;;ACIxB,IAAMC,sBAAqB;AAwC3B,eAAsB,UACpB,SAC0B;AAC1B,QAAM,EAAE,aAAa,eAAe,kBAAkB,IAAI;AAC1D,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,WAAW,SAAS,qBAAqB,CAAC;AAChD,QAAM,OAAO,oBACT;AAAA,IACE,GAAG,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,MAAM,EAAE;AAAA,IAChE,GAAG,SAAS,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,KAAK,EAAE;AAAA,EACzD,IACA,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,MAAM,EAAE;AAEjE,QAAM,UAA6B,KAChC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,iBAAiB,aAAa,IAAI,MAAM,EAAE,CAAC,EAClE,IAAI,CAAC,EAAE,OAAO,WAAW,OAAO;AAAA,IAC/B,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,WAAW,aAAa,IAAI,MAAM,EAAE;AAAA,IACpC;AAAA,EACF,EAAE;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS,QAAQ,UAAU,oBAAoB,SAAS,SAAS;AAAA,IACxE,gBAAgB,aAAa;AAAA,IAC7B;AAAA,EACF;AACF;;;ADjFO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,2FAAoC,EAChD,OAAO,eAAe,kDAAe,EACrC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC,OAAO,SAA+D;AACpE,QAAI;AACF,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAEvC,YAAM,EAAE,SAAS,OAAO,eAAe,IAAI,MAAM,UAAU;AAAA,QACzD;AAAA,QACA,eAAe,KAAK;AAAA,QACpB,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAED,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,UACL,KAAK,YACD,6BACA;AAAA,QACN;AACA;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC;AAC9D,YAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,CAAC;AAElE,aAAO;AAAA,QACL,GAAG,KAAK,OAAO,OAAO,CAAC,KAAK,OAAO;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,GAAG,SAAI,OAAO,OAAO,CAAC,KAAK,SAAI;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAEA,iBAAW,KAAK,SAAS;AAEvB,cAAM,SAAS,EAAE,aACb,EAAE,YACA,cACA,eACF,EAAE,YACF,cACA;AACJ,eAAO;AAAA,UACL,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK;AAAA,YACjC;AAAA,UACF,CAAC,KAAK,OAAO,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW;AAAA,QAC3C;AAAA,MACF;AAEA,aAAO,KAAK,EAAE;AACd,aAAO;AAAA,QACL,UAAU,KAAK,QACb,UAAU,IAAI,MAAM,KACtB,KAAK,cAAc;AAAA,MACrB;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,8BAA+B,IAAc,OAAO,EAAE;AACnE,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;ARtEK,IAAM,YAAY,IAAIC,UAAQ,IAAI,EAAE;AAAA,EACzC;AACF;AAEA,UAAU,WAAWC,YAAW;AAChC,UAAU,WAAWC,WAAU;AAC/B,UAAU,WAAWC,YAAW;;;AUPhC,SAAS,WAAAC,iBAAe;;;ACJxB,SAAS,WAAAC,iBAAe;;;ACiBxB,YAAYC,YAAU;AACtB,SAAS,iBAAAC,sBAAqB;AAQ9B;AAAA,EACE,yBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAE7C,SAASC,oBAAmB,aAA6B;AACvD,QAAM,cAAcF,SAAQ,QAAQ,GAAG,WAAW,eAAe;AACjE,SAAY,eAAQ,WAAW;AACjC;AA8BA,eAAe,gBACb,aACA,SACgC;AAChC,QAAM,EAAE,aAAa,SAAS,KAAK,UAAU,IAAI;AACjD,QAAM,kBAAkB,QAAQ,eAAe,eAAe,WAAW;AAEzE,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,iEAA4D,WAAW;AAAA,IACzE;AAAA,EACF;AAEA,QAAM,cACJ,QAAQ,eAAeE,oBAAmB,eAAe;AAG3D,QAAM,UAAU,MAAM,4BAA4B,WAAW;AAC7D,MAAI,CAAC,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG;AACrD,UAAM,QAAQ,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAC3D,UAAM,IAAI;AAAA,MACR,YAAY,OAAO,kBAAkB,eAAe,qBAAqB,KAAK,wBAAwB,WAAW;AAAA,IACnH;AAAA,EACF;AAGA,QAAM,aAAkB,YAAK,aAAa,YAAY,OAAO;AAC7D,QAAM,kBAAkB,MAAM,6BAA6B,UAAU;AAGrE,QAAM,WAAW,IAAI,IAAI,gBAAgB,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACjE,QAAM,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AACpD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,0BAA0B,WAAW,IAAI,OAAO,KAAK,QAClD,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC,sBAAsB,WAAW,oEAAoE,WAAW,mBAAmB,OAAO;AAAA,IACzJ;AAAA,EACF;AAQA,QAAM,gBAAgBA,oBAAmB,gBAAgB;AACzD,QAAM,aAAa,MAAMC,uBAAsB,aAAa;AAK5D,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,QAAM,gBAA2B,CAAC;AAClC,aAAW,KAAK,gBAAgB,SAAS;AACvC,qBAAiB,IAAI,EAAE,IAAI,UAAU;AACrC,kBAAc,KAAK,CAAC;AAAA,EACtB;AACA,aAAW,KAAK,WAAW,SAAS;AAElC,QAAI,iBAAiB,IAAI,EAAE,EAAE,EAAG;AAChC,qBAAiB,IAAI,EAAE,IAAI,aAAa;AACxC,kBAAc,KAAK,CAAC;AAAA,EACtB;AAEA,QAAM,kBAAqC;AAAA,IACzC,eAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS,gBAAgB;AAAA,IACzB,SAAS,gBAAgB;AAAA,IACzB,SAAS;AAAA,EACX;AAEA,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA;AAAA,IACb;AAAA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,IACX,cAAc,CAAC;AAAA,EACjB,CAAC;AAID,QAAM,YAAgC,MAAM;AAAA,IAC1C;AAAA,EACF,KAAM,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE;AAExC,QAAM,MAAM,UAAU,UAAU;AAAA,IAC9B,CAAC,MAAM,EAAE,YAAY,mBAAmB,EAAE,YAAY;AAAA,EACxD;AACA,QAAM,QAAQ,OAAO,IAAI,UAAU,UAAU,GAAG,IAAI;AACpD,QAAM,kBAAkBC;AAAA,IACtB,OAAO,aAAa,CAAC;AAAA,IACrB,OAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA,SAAS,gBAAgB;AAAA,IACzB,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,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAASA,gBAAyC,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;AAGA,eAAsB,YACpB,SACgC;AAChC,SAAO,gBAAgB,UAAU,OAAO;AAC1C;AAGA,eAAsB,gBACpB,SACgC;AAChC,SAAO,gBAAgB,aAAa,OAAO;AAC7C;AAcA,eAAe,cACb,aACA,aAC8B;AAC9B,QAAM,kBAAkB,eAAe,WAAW;AAClD,QAAM,OAAO,eAAeF,oBAAmB,eAAe;AAC9D,QAAM,UAAU,MAAM,4BAA4B,IAAI;AACtD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU,QAAQ,SAAS,IAAI,CAAC,OAAO;AAAA,MACrC,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,IACjB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,kBACpB,aAC8B;AAC9B,SAAO,cAAc,UAAU,WAAW;AAC5C;AAEA,eAAsB,sBACpB,aAC8B;AAC9B,SAAO,cAAc,aAAa,WAAW;AAC/C;AAgBA,eAAe,qBACb,aACA,SACA,aACqC;AACrC,QAAM,kBAAkB,eAAe,WAAW;AAClD,QAAM,OAAO,eAAeA,oBAAmB,eAAe;AAC9D,QAAM,UAAU,MAAM,4BAA4B,IAAI;AACtD,MAAI,CAAC,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG;AACrD,UAAM,QAAQ,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAC3D,UAAM,IAAI;AAAA,MACR,YAAY,OAAO,kBAAkB,eAAe,YAAY,KAAK;AAAA,IACvE;AAAA,EACF;AACA,QAAM,aAAkB,YAAK,MAAM,YAAY,OAAO;AACtD,QAAM,kBAAkB,MAAM,6BAA6B,UAAU;AACrE,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA,SAAS,gBAAgB,QAAQ,IAAI,CAAC,OAAO;AAAA,MAC3C,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,sBAAsB,EAAE,wBAAwB,CAAC;AAAA,IACnD,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,iBACpB,SACA,aACqC;AACrC,SAAO,qBAAqB,UAAU,SAAS,WAAW;AAC5D;AAEA,eAAsB,qBACpB,SACA,aACqC;AACrC,SAAO,qBAAqB,aAAa,SAAS,WAAW;AAC/D;;;ADvTO,IAAMG,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,YAAY,oEAA2C,EAChE,OAAO,oBAAoB,oEAAsC,EACjE,OAAO,eAAe,0EAAc,EACpC;AAAA,EACC,OACE,KACA,SACG;AACH,QAAI;AACF,UAAI,CAAC,KAAK,SAAS;AAGjB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAMvC,YAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,UAAI,kBAAkB,mBAAmB,KAAK,SAAS;AACrD,cAAM,IAAI;AAAA,UACR,iDAAiD,cAAc,wBAAwB,KAAK,OAAO,gFAErE,KAAK,OAAO,4CACV,cAAc;AAAA,QAChD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,2CAA2C,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MAC7E;AAEA,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,SAAS,KAAK;AAAA,QACd;AAAA,QACA,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL,wBAAwB,OAAO,OAAO,aAAa,OAAO,OAAO;AAAA,MACnE;AACA,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,YAAY,OAAO,OAAO,EAAE;AACxC,aAAO,KAAK,mBAAmB,OAAO,WAAW,KAAK,UAAK,CAAC,EAAE;AAE9D,YAAM,UAAU,OAAO,QAAQ,OAAO,eAAe;AACrD,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,2CAA2C;AACvD,cAAM,aAAa,QAChB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,GAAG;AACX,eAAO,KAAK,cAAc,UAAU,EAAE;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AE5EF,SAAS,WAAAC,iBAAe;AAIjB,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,iEAAyB,EACrC,eAAe,oBAAoB,6DAA+B,EAClE,OAAO,OAAO,SAA8B;AAC3C,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB,KAAK,OAAO;AAClD,WAAO,KAAK,GAAG,OAAO,WAAW,IAAI,OAAO,OAAO,WAAW;AAC9D,WAAO,KAAK,EAAE;AACd,QAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,aAAO,KAAK,6DAAwD;AACpE;AAAA,IACF;AACA,eAAW,KAAK,OAAO,SAAS;AAC9B,YAAM,OAAO,EAAE,qBAAqB,SAChC,WAAW,EAAE,qBAAqB,KAAK,IAAI,CAAC,MAC5C;AACJ,aAAO,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE;AAC1C,UAAI,EAAE,YAAa,QAAO,KAAK,OAAO,EAAE,WAAW,EAAE;AACrD,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,WAAO;AAAA,MACL,iDAAiD,OAAO,OAAO;AAAA,IACjE;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AC/BH,SAAS,WAAAC,iBAAe;AAIjB,IAAMC,uBAAsB,IAAIC,UAAQ,eAAe,EAC3D,YAAY,oGAAmC,EAC/C,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AACvC,WAAO,KAAK,gCAAgC,OAAO,WAAW,GAAG;AACjE,WAAO,KAAK,EAAE;AACd,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,aAAO,KAAK,qBAAqB;AACjC;AAAA,IACF;AACA,eAAW,KAAK,OAAO,UAAU;AAC/B,aAAO,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,aAAQ,EAAE,OAAO,EAAE;AAC5D,UAAI,EAAE,YAAa,QAAO,KAAK,OAAO,EAAE,WAAW,EAAE;AACrD,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,WAAO,KAAK,qEAAqE;AAAA,EACnF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AJhBI,IAAM,eAAe,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,aAAa,WAAWC,WAAU;AAClC,aAAa,WAAWC,YAAW;AACnC,aAAa,WAAWC,oBAAmB;;;AKX3C,SAAS,WAAAC,iBAAe;;;ACJxB,SAAS,WAAAC,iBAAe;AAMjB,IAAMC,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,YAAY,wDAA+B,EACpD,OAAO,oBAAoB,oEAAsC,EACjE,OAAO,eAAe,0EAAc,EACpC;AAAA,EACC,OACE,KACA,SACG;AACH,QAAI;AACF,UAAI,CAAC,KAAK,SAAS;AACjB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAIvC,YAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,UAAI,kBAAkB,mBAAmB,KAAK,SAAS;AACrD,cAAM,IAAI;AAAA,UACR,iDAAiD,cAAc,wBAAwB,KAAK,OAAO,gFAErE,KAAK,OAAO,4CACV,cAAc;AAAA,QAChD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,sCAAsC,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MACxE;AAEA,YAAM,SAAS,MAAM,gBAAgB;AAAA,QACnC;AAAA,QACA,SAAS,KAAK;AAAA,QACd;AAAA,QACA,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL,2BAA2B,OAAO,OAAO,aAAa,OAAO,OAAO;AAAA,MACtE;AACA,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,YAAY,OAAO,OAAO,EAAE;AACxC,aAAO,KAAK,mBAAmB,OAAO,WAAW,KAAK,UAAK,CAAC,EAAE;AAE9D,YAAM,UAAU,OAAO,QAAQ,OAAO,eAAe;AACrD,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,2CAA2C;AACvD,cAAM,aAAa,QAChB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,GAAG;AACX,eAAO,KAAK,cAAc,UAAU,EAAE;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;ACxEF,SAAS,WAAAC,iBAAe;AAIjB,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,oEAA4B,EACxC,eAAe,oBAAoB,6DAA+B,EAClE,OAAO,OAAO,SAA8B;AAC3C,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,KAAK,OAAO;AACtD,WAAO,KAAK,GAAG,OAAO,WAAW,IAAI,OAAO,OAAO,WAAW;AAC9D,WAAO,KAAK,EAAE;AACd,QAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,aAAO,KAAK,4DAAuD;AACnE;AAAA,IACF;AACA,eAAW,KAAK,OAAO,SAAS;AAC9B,YAAM,OAAO,EAAE,qBAAqB,SAChC,WAAW,EAAE,qBAAqB,KAAK,IAAI,CAAC,MAC5C;AACJ,aAAO,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE;AAC1C,UAAI,EAAE,YAAa,QAAO,KAAK,OAAO,EAAE,WAAW,EAAE;AACrD,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,WAAO;AAAA,MACL,oDAAoD,OAAO,OAAO;AAAA,IACpE;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AC/BH,SAAS,WAAAC,iBAAe;AAIjB,IAAMC,uBAAsB,IAAIC,UAAQ,eAAe,EAC3D,YAAY,mHAAwC,EACpD,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,sBAAsB;AAC3C,WAAO,KAAK,mCAAmC,OAAO,WAAW,GAAG;AACpE,WAAO,KAAK,EAAE;AACd,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,aAAO,KAAK,qBAAqB;AACjC;AAAA,IACF;AACA,eAAW,KAAK,OAAO,UAAU;AAC/B,aAAO,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,aAAQ,EAAE,OAAO,EAAE;AAC5D,UAAI,EAAE,YAAa,QAAO,KAAK,OAAO,EAAE,WAAW,EAAE;AACrD,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,WAAO,KAAK,wEAAwE;AAAA,EACtF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAY,IAAc,OAAO,EAAE;AAChD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AHhBI,IAAM,mBAAmB,IAAIC,UAAQ,WAAW,EAAE;AAAA,EACvD;AACF;AAEA,iBAAiB,WAAWC,WAAU;AACtC,iBAAiB,WAAWC,YAAW;AACvC,iBAAiB,WAAWC,oBAAmB;;;AIf/C,SAAS,WAAAC,iBAAe;;;ACkBxB,SAAS,WAAAC,iBAAe;AACxB,SAAS,cAAc,aAAa,cAAAC,aAAY,gBAAgB;AAChE,SAAS,WAAAC,UAAS,QAAAC,cAAY;AA8C9B,IAAM,cAAc;AAEb,IAAM,qBAAqB,IAAIC,UAAQ,SAAS,EACpD;AAAA,EACC;AACF,EACC,OAAO,gBAAgB,mDAA+B,EACtD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,aAAa,yEAAuB,IAAI,EAC/C,OAAO,UAAU,wDAAqB,EACtC,OAAO,CAAC,SAAyB;AAChC,QAAM,UAAUC,SAAQ,KAAK,OAAOC,OAAK,QAAQ,IAAI,GAAG,QAAQ,IAAI,CAAC;AACrE,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,WAAO,KAAK,uBAAuB,OAAO,GAAG;AAC7C,WAAO;AAAA,MACL;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,WAAW,gBAAgB,KAAK,IAAI;AAC1C,QAAM,MAAM,gBAAgB,KAAK,GAAG,KAAK;AAEzC,QAAM,UAAU,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC,EACzD,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,KAAK,EAAE,IAAI,CAAC,EACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EACL,QAAQ;AACX,QAAM,WACJ,aAAa,SAAY,QAAQ,MAAM,GAAG,QAAQ,IAAI;AAExD,QAAM,UAAuB,CAAC;AAC9B,aAAW,OAAO,UAAU;AAC1B,UAAM,UAAUD,OAAK,SAAS,GAAG;AACjC,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,OAAO;AAAA,IAC/B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,SAAS,QAAQ,EAAG;AAC/B,YAAM,KAAKA,OAAK,SAAS,KAAK;AAC9B,UAAI;AACF,YAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAG;AAAA,MAC9B,QAAQ;AACN;AAAA,MACF;AACA,YAAME,QAAO,aAAa,IAAI,MAAM;AACpC,iBAAW,QAAQA,MAAK,MAAM,IAAI,GAAG;AACnC,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,kBAAQ,KAAK,KAAK,MAAM,IAAI,CAAc;AAAA,QAC5C,QAAQ;AAAA,QAGR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,SAAS,GAAG;AAEvC,MAAI,KAAK,MAAM;AACb,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAC3D;AAAA,EACF;AACA,cAAY,SAAS,SAAS,QAAQ,MAAM;AAC9C,CAAC;AAEI,SAAS,YACd,SACA,KACe;AACf,QAAM,UAAkC,CAAC;AACzC,QAAM,UAAkC,CAAC;AACzC,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,MAAM,oBAAI,IAAkD;AAClE,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,SAAwC,CAAC;AAC/C,MAAI,OAAsB;AAC1B,MAAI,KAAoB;AAExB,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,QAAQ,EAAE,KAAK,KAAM,QAAO,EAAE;AACnC,QAAI,CAAC,MAAM,EAAE,KAAK,GAAI,MAAK,EAAE;AAE7B,YAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK,KAAK,KAAK;AAC7C,YAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK,KAAK,KAAK;AAC7C,aAAS,IAAI,GAAG,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE;AACvC,QAAI,EAAE,KAAM,cAAa,IAAI,EAAE,IAAI;AAEnC,QAAI,EAAE,MAAM;AACV,YAAM,IAAI,EAAE,OAAO,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC;AAC9C,UAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC9B,cAAM,OAAO,EAAE,KAAK,QAAQ,iBAAiB,EAAE;AAC/C,cAAM,OAAO,IAAI,IAAI,IAAI,KAAK,EAAE,OAAO,GAAG,MAAM,oBAAI,IAAY,EAAE;AAClE,aAAK,SAAS;AACd,mBAAW,KAAK,EAAE,WAAW,CAAC,EAAG,MAAK,KAAK,IAAI,CAAC;AAChD,YAAI,IAAI,MAAM,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,eAAW,OAAO,EAAE,QAAQ,CAAC,GAAG;AAC9B,WAAK,IAAI,MAAM,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IACxC;AAEA,QAAI,EAAE,OAAO;AACX,aAAO,KAAK;AAAA,QACV,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,IAChE;AAAA,IACA;AAAA,EACF,EAAE;AACF,QAAM,UAAU,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,EACF,EAAE;AACF,QAAM,SAAS,CAAC,GAAG,IAAI,QAAQ,CAAC,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EACtC,MAAM,GAAG,GAAG,EACZ,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,IACnB;AAAA,IACA,OAAO,EAAE;AAAA,IACT,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK;AAAA,EAC5B,EAAE;AACJ,QAAM,eAAe,OAAO,MAAM,GAAG;AAErC,SAAO;AAAA,IACL,OAAO,EAAE,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,OAAO,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,aACP,GACA,KACyB;AACzB,SAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG;AAClE;AAEA,SAAS,YACP,SACA,UACA,GACM;AACN,SAAO,KAAK,sCAAkB;AAC9B,SAAO,KAAK,oBAAU,OAAO,EAAE;AAC/B,SAAO,KAAK,oBAAU,QAAQ,EAAE;AAChC,SAAO,KAAK,oBAAU,EAAE,MAAM,QAAQ,GAAG,WAAM,EAAE,MAAM,MAAM,GAAG,EAAE;AAClE,SAAO,KAAK,EAAE;AACd,SAAO;AAAA,IACL,mBAAmB,EAAE,OAAO,OAAO,cAAc,EAAE,OAAO,QAAQ,YAAY,EAAE,OAAO,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,EACxH;AACA,SAAO,KAAK,aAAa,SAAS,EAAE,OAAO,CAAC,EAAE;AAC9C,SAAO,KAAK,aAAa,SAAS,EAAE,OAAO,CAAC,EAAE;AAC9C,SAAO,KAAK,EAAE;AACd,SAAO,KAAK,YAAY;AACxB,aAAW,EAAE,MAAM,MAAM,KAAK,EAAE,UAAU;AACxC,WAAO,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE;AAAA,EAC3C;AACA,MAAI,EAAE,QAAQ,QAAQ;AACpB,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,kDAAkD;AAC9D,eAAW,EAAE,KAAK,MAAM,KAAK,EAAE,SAAS;AACtC,aAAO,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,GAAG,EAAE;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,EAAE,OAAO,QAAQ;AACnB,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,gBAAgB;AAC5B,eAAW,EAAE,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ;AAC/C,YAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,KAAK,IAAI,CAAC,KAAK;AAChE,aAAO,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE;AAAA,IAClD;AAAA,EACF;AACA,MAAI,EAAE,aAAa,QAAQ;AACzB,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,uBAAuB,EAAE,aAAa,MAAM,IAAI;AAC5D,eAAW,KAAK,EAAE,cAAc;AAC9B,aAAO;AAAA,QACL,KAAK,EAAE,EAAE,aAAa,EAAE,OAAO,UAAU,EAAE,QAAQ,GAAG,UAAU,EAAE,QAAQ,GAAG;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,SAAS,GAAmC;AACnD,SAAO,OAAO,QAAQ,CAAC,EACpB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AACd;AAEA,SAAS,IAAI,GAAW,OAAuB;AAC7C,QAAM,IAAI,OAAO,CAAC;AAClB,SAAO,EAAE,UAAU,QAAQ,IAAI,IAAI,OAAO,QAAQ,EAAE,MAAM,IAAI;AAChE;AAEA,SAAS,gBAAgB,GAA2C;AAClE,MAAI,MAAM,OAAW,QAAO;AAC5B,QAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAC/B,SAAO,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAC3C;;;ACpRA,SAAS,WAAAC,iBAAe;AACxB,SAAS,gBAAAC,eAAc,eAAAC,cAAa,cAAAC,aAAY,YAAAC,iBAAgB;AAChE,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAsC9B,IAAMC,eAAc;AAEb,IAAM,mBAAmB,IAAIC,UAAQ,OAAO,EAChD;AAAA,EACC;AACF,EACC,OAAO,sBAAsB,8HAA0B,EACvD,OAAO,kBAAkB,wDAAgB,EACzC,OAAO,cAAc,wEAAsB,GAAG,EAC9C,OAAO,gBAAgB,mDAA+B,EACtD,OAAO,UAAU,wDAAqB,EACtC,OAAO,CAAC,SAAuB;AAC9B,QAAM,UAAUC,SAAQ,KAAK,OAAOC,OAAK,QAAQ,IAAI,GAAG,QAAQ,IAAI,CAAC;AACrE,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,WAAO,KAAK,uBAAuB,OAAO,GAAG;AAC7C,WAAO;AAAA,MACL;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,WAAWC,iBAAgB,KAAK,IAAI,KAAK;AAE/C,QAAM,UAAU,YAAY,SAAS,QAAQ;AAC7C,QAAM,SAAS,WAAW,SAAS;AAAA,IACjC,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAChB,CAAC;AAED,MAAI,KAAK,MAAM;AACb,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAC3D;AAAA,EACF;AACA,aAAW,SAAS,MAAM;AAC5B,CAAC;AAEH,SAAS,YAAY,SAAiB,UAA+B;AACnE,QAAM,UAAUC,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,EACzD,OAAO,CAAC,MAAM,EAAE,YAAY,KAAKN,aAAY,KAAK,EAAE,IAAI,CAAC,EACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EACL,QAAQ;AACX,QAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ;AAE1C,QAAM,UAAuB,CAAC;AAC9B,aAAW,OAAO,UAAU;AAC1B,UAAM,UAAUG,OAAK,SAAS,GAAG;AACjC,QAAI;AACJ,QAAI;AACF,gBAAUG,aAAY,OAAO;AAAA,IAC/B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,SAAS,QAAQ,EAAG;AAC/B,YAAM,KAAKH,OAAK,SAAS,KAAK;AAC9B,UAAI;AACF,YAAI,CAACI,UAAS,EAAE,EAAE,OAAO,EAAG;AAAA,MAC9B,QAAQ;AACN;AAAA,MACF;AACA,YAAMC,QAAOC,cAAa,IAAI,MAAM;AACpC,iBAAW,QAAQD,MAAK,MAAM,IAAI,GAAG;AACnC,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,kBAAQ,KAAK,KAAK,MAAM,IAAI,CAAc;AAAA,QAC5C,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,WACd,SACA,SAAgD,CAAC,GACpC;AAEb,QAAM,SAAS,oBAAI,IAAyB;AAC5C,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,EAAE,QAAS;AAChB,UAAM,MAAM,OAAO,IAAI,EAAE,OAAO,KAAK,CAAC;AACtC,QAAI,KAAK,CAAC;AACV,WAAO,IAAI,EAAE,SAAS,GAAG;AAAA,EAC3B;AAEA,QAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,QAAM,gBAAgB,OAAO;AAE7B,QAAM,WAA2B,CAAC;AAElC,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,GAAG;AACjD,QAAI,iBAAiB,CAAC,UAAU,WAAW,aAAa,EAAG;AAG3D,UAAM,KAAK,CAAC,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAE;AAK7D,UAAM,SAAuB,CAAC;AAC9B,QAAI,UAA6B;AACjC,QAAI,UAAiC,oBAAI,IAAI;AAE7C,UAAM,eAAe,MAAM;AACzB,UAAI,QAAS,QAAO,KAAK,OAAO;AAChC,gBAAU;AACV,gBAAU,oBAAI,IAAI;AAAA,IACpB;AAEA,eAAW,KAAK,OAAO;AACrB,UAAI,EAAE,UAAU,oBAAoB;AAClC,YAAI,QAAS,cAAa;AAC1B,kBAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,UAAU,EAAE,IAAI,OAAO,CAAC,EAAE;AAC9D,kBAAU,oBAAI,IAAI;AAClB;AAAA,MACF;AACA,UAAI,EAAE,UAAU,QAAQ;AACtB,YAAI,QAAS,cAAa;AAC1B;AAAA,MACF;AACA,UAAI,CAAC,QAAS;AAEd,UAAI,EAAE,UAAU,cAAc;AAC5B,cAAM,MAAM,QAAQ,MAAM;AAC1B,gBAAQ,MAAM,KAAK;AAAA,UACjB,IAAI,EAAE;AAAA,UACN,OAAO;AAAA,UACP,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,OAAO,EAAE,SAAS;AAAA,QACpB,CAAC;AACD,YAAI,EAAE,MAAM;AACV,gBAAM,OAAO,QAAQ,IAAI,EAAE,IAAI,KAAK,CAAC;AACrC,eAAK,KAAK,GAAG;AACb,kBAAQ,IAAI,EAAE,MAAM,IAAI;AAAA,QAC1B;AAAA,MACF,WAAW,EAAE,UAAU,eAAe;AACpC,cAAM,OAAO,EAAE,OAAO,QAAQ,IAAI,EAAE,IAAI,IAAI;AAC5C,YAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,gBAAM,MAAM,KAAK,MAAM;AACvB,cAAI,KAAK,WAAW,KAAK,EAAE,KAAM,SAAQ,OAAO,EAAE,IAAI;AACtD,gBAAM,OAAO,QAAQ,MAAM,GAAG;AAC9B,cAAI,EAAE,gBAAgB,OAAW,MAAK,cAAc,EAAE;AACtD,cAAI,EAAE,UAAU,OAAW,MAAK,QAAQ,EAAE;AAC1C,cAAI,CAAC,KAAK,QAAQ,EAAE,KAAM,MAAK,OAAO,EAAE;AACxC,eAAK,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW,MAAM,EAAE;AAC9C,iBAAK,OAAO,EAAE;AAAA,QAClB,OAAO;AAEL,kBAAQ,MAAM,KAAK;AAAA,YACjB,IAAI,EAAE;AAAA,YACN,OAAO;AAAA,YACP,MAAM,EAAE;AAAA,YACR,MAAM,EAAE;AAAA,YACR,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,OAAO,EAAE,SAAS;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAS,cAAa;AAG1B,UAAM,iBAAiB,eACnB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,SAAS,YAAY,CAAC,IAClE;AACJ,QAAI,eAAe,WAAW,EAAG;AAEjC,aAAS,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ,OAAO,MAAM,CAAC,GAAG,SAAS;AAAA,MAC1B,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,WAAS,KAAK,CAAC,GAAG,MAAM;AACtB,UAAM,KAAK,EAAE,OAAO,CAAC,GAAG,YAAY;AACpC,UAAM,KAAK,EAAE,OAAO,CAAC,GAAG,YAAY;AACpC,WAAO,GAAG,cAAc,EAAE;AAAA,EAC5B,CAAC;AAED,SAAO,EAAE,SAAS;AACpB;AAEA,SAAS,WAAW,SAAiB,GAAsB;AACzD,SAAO,KAAK,sCAAkB;AAC9B,SAAO,KAAK,oBAAU,OAAO,EAAE;AAC/B,SAAO,KAAK,oBAAU,EAAE,SAAS,MAAM,EAAE;AACzC,SAAO,KAAK,EAAE;AAEd,MAAI,EAAE,SAAS,WAAW,GAAG;AAC3B,WAAO,KAAK,qEAAc;AAC1B;AAAA,EACF;AAEA,aAAW,KAAK,EAAE,UAAU;AAC1B,WAAO,KAAK,+BAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,sBAAO;AACnD,WAAO,KAAK,EAAE;AACd,eAAW,KAAK,EAAE,QAAQ;AACxB,aAAO;AAAA,QACL,IAAI,WAAW,EAAE,QAAQ,CAAC,uBAAgB,MAAM,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC;AAAA,MAC1E;AACA,iBAAW,QAAQ,EAAE,OAAO;AAC1B,eAAO,KAAK,KAAK,WAAW,IAAI,CAAC,EAAE;AAAA,MACrC;AACA,aAAO,KAAK,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,WAAW,GAAsB;AACxC,QAAM,KAAK,IAAI,WAAW,EAAE,EAAE,CAAC;AAC/B,QAAM,SACJ,EAAE,SAAS,UACX,EAAE,SAAS,WACX,EAAE,SAAS,eACX,EAAE,SAAS,iBACX,EAAE,SAAS;AACb,QAAM,OAAO,SAAS,cAAO;AAC7B,QAAM,OACJ,UAAU,EAAE,OACR,GAAG,EAAE,QAAQ,GAAG,WAAM,EAAE,IAAI,KAC3B,EAAE,QAAQ,EAAE,SAAS;AAC5B,QAAM,MAAM,EAAE,gBAAgB,SAAY,GAAG,EAAE,WAAW,OAAO;AACjE,QAAM,OAAO,EAAE,QAAQ,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM;AACjE,QAAM,MAAM,EAAE,QAAQ,WAAM;AAC5B,SAAO,CAAC,IAAI,MAAM,SAAS,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,GAAG,MAAM,GAAG,EAC7D,OAAO,CAAC,MAAM,MAAM,EAAE,EACtB,KAAK,GAAG;AACb;AAEA,SAAS,WAAW,IAAoB;AACtC,QAAM,IAAI,IAAI,KAAK,EAAE;AACrB,MAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AACtC,QAAM,KAAK,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,EAAE,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,QAAM,KAAK,OAAO,EAAE,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,SAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAC1B;AAEA,SAAS,MAAM,GAAmB;AAChC,SAAO,IAAI,EAAE,QAAQ,MAAM,KAAK,CAAC;AACnC;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC9C,MAAI,EAAE,UAAU,EAAG,QAAO;AAC1B,SAAO,EAAE,MAAM,GAAG,CAAC,IAAI;AACzB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC9C,SAAO,EAAE,UAAU,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,EAAE,MAAM;AACxD;AAEA,SAAS,QAAQ,GAAW,GAAmB;AAC7C,SAAO,EAAE,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,EAAE,MAAM,IAAI;AACxD;AAEA,SAASH,iBAAgB,GAA2C;AAClE,MAAI,MAAM,OAAW,QAAO;AAC5B,QAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAC/B,SAAO,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAC3C;;;AF9TO,IAAM,cAAc,IAAIK,UAAQ,MAAM,EAAE;AAAA,EAC7C;AACF;AAEA,YAAY,WAAW,kBAAkB;AACzC,YAAY,WAAW,gBAAgB;;;AnDAvC,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;AAC5B,QAAQ,WAAW,YAAY;AAC/B,QAAQ,WAAW,gBAAgB;AACnC,QAAQ,WAAW,WAAW;AAE9B,QAAQ,MAAM;","names":["Command","createRequire","Command","os","path","path","fs","createRequire","path","rel","path","path","fs","require","path","fs","fs","path","fs","stat","rel","targetFile","exists","current","path","DEFAULT_SKILLS_PACKAGE","require","createRequire","fs","os","path","TEAMIX_DIR","CONFIG_FILE","Command","path","fs","createRequire","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","CONSUMER_TOKENS_DIR","CONSUMER_THEME_FILE","require","createRequire","resolveTokensPackageRoot","loadTokensPackageManifest","getVariantEntry","Command","Command","Command","version","Command","Command","Command","fs","path","Command","confirm","Command","Command","Command","prompts","Command","Command","listCommand","Command","Command","SKILLS_PACKAGE","FLAT_VARIANT","updateCommand","Command","Command","prompts","path","fs","SKILLS_PACKAGE","uninstallCommand","Command","confirm","Command","path","fs","createRequire","loadSkillsPackageManifest","require","createRequire","loadSkillsPackageManifest","stat","Command","parseIdeList","parseScope","Command","path","fs","dirExists","rel","stat","Command","Command","listCommand","updateCommand","uninstallCommand","Command","Command","prompts","initCommand","Command","Command","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","quote","addCommand","Command","Command","DEFAULT_UI_PACKAGE","listCommand","Command","Command","initCommand","addCommand","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","require","createRequire","resolvePackageRoot","loadUiPackageManifest","mergeResources","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","existsSync","resolve","join","Command","resolve","join","existsSync","text","Command","readFileSync","readdirSync","existsSync","statSync","resolve","join","DATE_DIR_RE","Command","resolve","join","existsSync","parseIntOrUndef","readdirSync","statSync","text","readFileSync","Command","require","createRequire","Command"]}
|