teamix-evo 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codemods/hsl-to-v4.ts","../src/codemods/hex-to-token.ts","../src/codemods/tw-scale-to-semantic.ts","../src/codemods/space-to-gap.ts","../src/codemods/arbitrary-to-token.ts","../src/codemods/registry.ts","../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/utils/error.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/core/upgrade-hints.ts","../src/core/managed-merge.ts","../src/commands/tokens/list.ts","../src/commands/tokens/list-variants.ts","../src/commands/tokens/uninstall.ts","../src/commands/tokens/audit.ts","../src/core/tokens-audit.ts","../src/commands/tokens/codemod.ts","../src/codemods/index.ts","../src/codemods/runner.ts","../src/core/tokens-treat.ts","../src/utils/lint.ts","../src/commands/tokens/diagnose.ts","../src/core/tokens-diagnose.ts","../src/commands/tokens/treat.ts","../src/commands/tokens/reflect.ts","../src/core/tokens-reflect.ts","../src/commands/tokens/baseline-check.ts","../src/core/baseline-check.ts","../src/commands/skills/index.ts","../src/commands/skills/init.ts","../src/utils/cancelled.ts","../src/commands/skills/_parse.ts","../src/commands/skills/add.ts","../src/commands/skills/list.ts","../src/commands/skills/update.ts","../src/core/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/core/ui-adopt.ts","../src/commands/ui/list.ts","../src/core/ui-list.ts","../src/commands/_upgrade-command-factory.ts","../src/core/ui-upgrade.ts","../src/core/ui-upgrade-detector.ts","../src/core/ui-upgrade-staging.ts","../src/commands/ui/upgrade.ts","../src/commands/ui/promote.ts","../src/core/ui-promote.ts","../src/core/ui-promote-imports.ts","../src/core/file-changes.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/biz-ui/upgrade.ts","../src/commands/blocks/index.ts","../src/commands/blocks/add.ts","../src/core/blocks-add.ts","../src/commands/blocks/list.ts","../src/commands/blocks/upgrade.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/_io.ts","../src/commands/logs/trace.ts","../src/commands/lint/index.ts","../src/commands/lint/init.ts","../src/core/lint-init.ts","../src/commands/init/index.ts","../src/core/init-detect.ts","../src/core/init-conflicts.ts","../src/core/agents-md.ts","../src/core/deps-install.ts","../src/core/init-checklist-template.ts","../src/core/project-init.ts","../src/commands/init/wizard.ts","../src/commands/_shared/step-icon.ts","../src/commands/restore/index.ts","../src/core/snapshot.ts","../src/commands/switch/index.ts","../src/core/variant-switch.ts"],"sourcesContent":["/**\n * Codemod: `hsl-to-v4` — L2 format, full-auto.\n *\n * Rewrites the shadcn v3 CSS color pattern:\n * `hsl(var(--xxx))` → `var(--color-xxx)`\n *\n * This is the single highest-volume lint error after init (TrekClaw: 2300+\n * hits). The rewrite is purely syntactic — no semantic mapping needed.\n *\n * Target files: `.css`, `.tsx`, `.ts` (inline styles / Tailwind arbitrary).\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/**\n * Pattern: `hsl(var(--<name>))` with optional whitespace.\n * Captures the CSS custom property name (without `--`).\n */\nconst HSL_VAR_RE = /hsl\\(\\s*var\\(\\s*--([\\w-]+)\\s*\\)\\s*\\)/g;\n\nexport const hslToV4: CodemodDefinition = {\n id: 'hsl-to-v4',\n description: 'hsl(var(--xxx)) → var(--color-xxx) (shadcn v3 → v4)',\n layer: 'L2-format',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{css,tsx,ts}',\n extensions: ['css', 'tsx', 'ts'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(HSL_VAR_RE.source, HSL_VAR_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const varName = m[1]!;\n const original = m[0];\n const replacement = `var(--color-${varName})`;\n matches.push({\n line: i + 1,\n original,\n replacement,\n reason: 'shadcn v3 hsl() wrapper → Tailwind v4 native CSS variable',\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(HSL_VAR_RE, (_match, varName: string) => {\n return `var(--color-${varName})`;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `hex-to-token` — L3 semantic, full-auto.\n *\n * Replaces hard-coded hex colour literals with their corresponding semantic\n * token CSS variable. Requires the project's token map (`tokenMap` parameter)\n * to resolve `#1a2b3c` → `var(--color-xxx)`.\n *\n * Target files: `.css`, `.tsx`, `.ts`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches 3/4/6/8-digit hex colour values. */\nconst HEX_COLOR_RE = /#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\b/g;\n\n/** Normalise any hex value to lowercase 6-digit form for map lookup. */\nfunction normaliseHex(hex: string): string {\n const raw = hex.slice(1).toLowerCase();\n if (raw.length === 3) return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 4) return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 8) return `#${raw.slice(0, 6)}`;\n return `#${raw}`;\n}\n\nexport const hexToToken: CodemodDefinition = {\n id: 'hex-to-token',\n description: 'hex colour literal → semantic token var (requires token map)',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{css,tsx,ts}',\n extensions: ['css', 'tsx', 'ts'],\n\n transform(content, filePath, tokenMap): CodemodFileResult | null {\n if (!tokenMap || tokenMap.size === 0) return null;\n\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(HEX_COLOR_RE.source, HEX_COLOR_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const norm = normaliseHex(m[0]);\n const token = tokenMap.get(norm);\n if (token) {\n matches.push({\n line: i + 1,\n original: m[0],\n replacement: `var(--${token})`,\n reason: `hex ${m[0]} maps to semantic token --${token}`,\n });\n }\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(HEX_COLOR_RE, (match) => {\n const norm = normaliseHex(match);\n const token = tokenMap.get(norm);\n return token ? `var(--${token})` : match;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `tw-scale-to-semantic` — L3 semantic, full-auto.\n *\n * Replaces Tailwind built-in colour scale classes (e.g. `text-gray-500`,\n * `bg-blue-100`) with their semantic token equivalents from the project's\n * design system (`text-foreground`, `bg-muted`, etc.).\n *\n * Requires `tokenMap` mapping Tailwind scale names → semantic class names.\n *\n * Target files: `.tsx`, `.ts`, `.jsx` (className / class attributes).\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/**\n * Matches Tailwind colour-scale utility classes. Captures:\n * - group 1: prefix (e.g. `text`, `bg`, `border`, `ring`)\n * - group 2: colour-scale (e.g. `gray-500`, `blue-100`)\n */\nconst TW_SCALE_RE =\n /\\b(text|bg|border|ring|fill|stroke|shadow|outline|accent|decoration)-((?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\\d{1,3})\\b/g;\n\nexport const twScaleToSemantic: CodemodDefinition = {\n id: 'tw-scale-to-semantic',\n description: 'Tailwind colour scale (e.g. text-gray-500) → semantic token class',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath, tokenMap): CodemodFileResult | null {\n if (!tokenMap || tokenMap.size === 0) return null;\n\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(TW_SCALE_RE.source, TW_SCALE_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const prefix = m[1]!;\n const scaleName = m[2]!;\n const key = `${prefix}-${scaleName}`;\n const semantic = tokenMap.get(key);\n if (semantic) {\n matches.push({\n line: i + 1,\n original: m[0],\n replacement: semantic,\n reason: `Tailwind scale ${key} → semantic ${semantic}`,\n });\n }\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(\n TW_SCALE_RE,\n (match, prefix: string, scaleName: string) => {\n const key = `${prefix}-${scaleName}`;\n const semantic = tokenMap?.get(key);\n return semantic ?? match;\n },\n );\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `space-to-gap` — L3 semantic, full-auto.\n *\n * Replaces the legacy `space-x-*` / `space-y-*` Tailwind utilities with\n * the modern `gap-x-*` / `gap-y-*` equivalents. Aligns with the\n * `prefer-gap-over-space` ESLint rule (ADR 0008).\n *\n * Caveat: `space-*` uses `> * + *` selector (margin-based), while `gap-*`\n * uses CSS `gap` on the parent (requires flex/grid). The codemod only\n * rewrites when the pattern is detected; full flex/grid context validation\n * is deferred to Wave 2.\n *\n * Target files: `.tsx`, `.ts`, `.jsx`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches `space-x-<value>` / `space-y-<value>` Tailwind classes. */\nconst SPACE_RE = /\\bspace-(x|y)-(\\d+(?:\\.\\d+)?|px|reverse)\\b/g;\n\nexport const spaceToGap: CodemodDefinition = {\n id: 'space-to-gap',\n description: 'space-x-* / space-y-* → gap-x-* / gap-y-* (flex/grid context)',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(SPACE_RE.source, SPACE_RE.flags);\n while ((m = re.exec(line)) !== null) {\n if (m[2] === 'reverse') continue;\n const axis = m[1]!;\n const value = m[2]!;\n const replacement = `gap-${axis}-${value}`;\n matches.push({\n line: i + 1,\n original: m[0],\n replacement,\n reason: `space-${axis} (margin-based) → gap-${axis} (CSS gap); ensure parent is flex/grid`,\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(SPACE_RE, (match, axis: string, value: string) => {\n if (value === 'reverse') return match;\n return `gap-${axis}-${value}`;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `arbitrary-to-token` — L3 semantic, semi-auto.\n *\n * Detects Tailwind arbitrary value classes (`w-[200px]`, `p-[1.5rem]`,\n * `text-[#ff0000]`, etc.) and produces candidate replacements using the\n * project's spacing / colour / sizing token scale.\n *\n * **Semi-auto**: the codemod identifies matches and suggests candidates but\n * does NOT auto-apply. The AI / user must confirm each replacement because\n * the \"correct\" token may depend on design intent.\n *\n * Target files: `.tsx`, `.ts`, `.jsx`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches Tailwind arbitrary-value classes: `<utility>-[<value>]`. */\nconst ARBITRARY_RE = /\\b([a-z][a-z0-9-]*)-\\[([^\\]]+)\\]/g;\n\nexport const arbitraryToToken: CodemodDefinition = {\n id: 'arbitrary-to-token',\n description:\n 'Tailwind arbitrary values (w-[200px]) → token / spacing var candidates (AI-assisted)',\n layer: 'L3-semantic',\n automation: 'semi-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(ARBITRARY_RE.source, ARBITRARY_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const utility = m[1]!;\n const value = m[2]!;\n matches.push({\n line: i + 1,\n original: m[0],\n // Semi-auto: replacement is null — AI / user decides\n replacement: null,\n reason: `arbitrary value ${utility}-[${value}]: consider replacing with a design token or spacing variable`,\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n // Semi-auto: rewritten is null (never auto-apply)\n return { file: filePath, matches, rewritten: null };\n },\n};\n","/**\n * Codemod registry — single source of truth for all built-in codemods.\n *\n * Import this module to enumerate available codemods, look up by id, or\n * iterate the full list for `--help` / `tokens codemod --list`.\n */\nimport type { CodemodDefinition } from './types.js';\nimport { hslToV4 } from './hsl-to-v4.js';\nimport { hexToToken } from './hex-to-token.js';\nimport { twScaleToSemantic } from './tw-scale-to-semantic.js';\nimport { spaceToGap } from './space-to-gap.js';\nimport { arbitraryToToken } from './arbitrary-to-token.js';\n\n/** All built-in codemods, ordered by recommended execution sequence. */\nexport const ALL_CODEMODS: readonly CodemodDefinition[] = [\n hslToV4,\n hexToToken,\n twScaleToSemantic,\n spaceToGap,\n arbitraryToToken,\n];\n\n/** Look up a codemod by id. Returns `undefined` if not found. */\nexport function getCodemod(id: string): CodemodDefinition | undefined {\n return ALL_CODEMODS.find((c) => c.id === id);\n}\n\n/** All registered codemod ids. */\nexport function listCodemodIds(): string[] {\n return ALL_CODEMODS.map((c) => c.id);\n}\n","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 { blocksCommand } from './commands/blocks/index.js';\nimport { templatesCommand } from './commands/templates/index.js';\nimport { logsCommand } from './commands/logs/index.js';\nimport { lintCommand } from './commands/lint/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { restoreCommand } from './commands/restore/index.js';\nimport { switchCommand } from './commands/switch/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(blocksCommand);\nprogram.addCommand(templatesCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(lintCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(restoreCommand);\nprogram.addCommand(switchCommand);\n\n// 未知命令 / 未知 option 时自动追加该层级的完整 help 输出。\n// commander v12 的 addCommand() 不继承父级 showHelpAfterError 配置,\n// 所以递归遍历整棵命令树挨个开启。\nfunction enableHelpAfterError(cmd: Command): void {\n cmd.showHelpAfterError(true);\n for (const child of cmd.commands) enableHelpAfterError(child);\n}\nenableHelpAfterError(program);\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';\nimport { auditCommand } from './audit.js';\nimport { codemodCommand } from './codemod.js';\nimport { diagnoseCommand } from './diagnose.js';\nimport { treatCommand } from './treat.js';\nimport { reflectCommand } from './reflect.js';\nimport { baselineCheckCommand } from './baseline-check.js';\n\nexport const tokensCommand = new Command('tokens').description(\n '管理 design tokens(变体级 theme.css 等)',\n);\n\ntokensCommand.addCommand(initCommand);\ntokensCommand.addCommand(updateCommand);\ntokensCommand.addCommand(listCommand);\ntokensCommand.addCommand(listVariantsCommand);\ntokensCommand.addCommand(uninstallCommand);\ntokensCommand.addCommand(auditCommand);\ntokensCommand.addCommand(codemodCommand);\ntokensCommand.addCommand(diagnoseCommand);\ntokensCommand.addCommand(treatCommand);\ntokensCommand.addCommand(reflectCommand);\ntokensCommand.addCommand(baselineCheckCommand);\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';\nimport { getErrorMessage } from '../../utils/error.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.exitCode = 1;\n return;\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 \"npx teamix-evo@latest 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. npx teamix-evo@latest tokens uninstall --yes');\n logger.info(\n ` 2. npx teamix-evo@latest tokens init ${result.requestedVariant}`,\n );\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(` Skills: auto-installed ${addedSkillIds.join(', ')}`);\n }\n if (skippedSkillIds.length > 0) {\n logger.info(\n ` Skills: already installed (skipped) ${skippedSkillIds.join(\n ', ',\n )}`,\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(\n 'Run \"npx teamix-evo@latest tokens update\" to update resources later.',\n );\n logger.info(\n 'Run \"npx teamix-evo@latest tokens list-variants\" to see all available variants.',\n );\n } catch (err) {\n logger.error(`Failed to initialize: ${getErrorMessage(err)}`);\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 {\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 { backupFile, 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';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { getErrorMessage } from '../utils/error.js';\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\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 \\`npx teamix-evo@latest 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 // Dedup: only add overrides resource if installVariantFile didn't already\n // register it (happens when the variant ships an overrides.css file).\n const overridesId = `tokens:${CONSUMER_OVERRIDES_FILE}`;\n if (!installed.some((r) => r.id === overridesId)) {\n const overridesContent = await fs.readFile(overridesAbs, 'utf-8');\n installed.push({\n id: overridesId,\n target: path.posix.join(CONSUMER_TOKENS_DIR, CONSUMER_OVERRIDES_FILE),\n hash: computeHash(overridesContent),\n strategy: 'frozen',\n });\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/v2.json',\n schemaVersion: 2,\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 init` (bulk) or `skills add <id>`\n // (incremental) 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 (${getErrorMessage(\n err,\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): ${getErrorMessage(err)}`,\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(CONSUMER_TOKENS_DIR, CONSUMER_THEME_FILE);\n const targetAbs = path.join(projectRoot, targetRel);\n const content = await fs.readFile(sourceAbs, 'utf-8');\n // Phase 1.A2: theme.css is regenerable but users sometimes hand-edit it.\n // Stash any pre-existing copy under .teamix-evo/.backups/ before we\n // overwrite so a stale-state recovery is always possible.\n if (await fileExists(targetAbs)) {\n await backupFile(targetAbs, projectRoot);\n }\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 * 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 InstalledPackage,\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 { getErrorMessage } from '../utils/error.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';\n/**\n * Consumer-side directory under `.teamix-evo/` that holds the skill source\n * mirrors (per ADR 0013). Renamed from `skills` → `skills-source` in the Init\n * landing improvement plan to avoid name-clash with installed package roots\n * and IDE mirror buckets; legacy paths are migrated lazily via\n * `migrateLegacySkillsSourceDir` (see `skills-installer.ts`).\n */\nconst SKILLS_DIR = 'skills-source';\n/** Legacy directory name retained for one-shot migration detection. */\nexport const LEGACY_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 (${getErrorMessage(err)}). ` +\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 (${getErrorMessage(err)}). ` +\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(`Failed to parse tokens-lock.json: ${getErrorMessage(err)}`);\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 * Resolves under `<projectRoot>/.teamix-evo/skills-source/[<skillName>]`.\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 * Absolute path to the legacy `<projectRoot>/.teamix-evo/skills/` directory.\n * Used **only** by the lazy migration path; do not write into this location.\n */\nexport function getLegacySkillsSourceDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR, LEGACY_SKILLS_DIR);\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: ${getErrorMessage(err)}`,\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\n/**\n * Look up an installed package record by package name.\n *\n * The {@link InstalledManifest} schema does not enforce uniqueness on the\n * `package` key — variant switches re-append a new record rather than\n * mutating the old one. We therefore return the **last** match (chronological\n * latest) and `null` when no record exists.\n *\n * Shared helper consumed by both {@link ui-upgrade-detector} and\n * {@link ui-upgrade-staging} to keep the lookup semantics aligned.\n */\nexport function findInstalledPackage(\n installed: InstalledManifest | null,\n packageName: string,\n): InstalledPackage | null {\n if (!installed) return null;\n const matches = installed.installed.filter((p) => p.package === packageName);\n if (matches.length === 0) return null;\n return matches[matches.length - 1] ?? null;\n}\n","/**\n * Safely extract an error message from an unknown thrown value.\n *\n * JavaScript allows `throw \"string\"` / `throw 42` / `throw null` — using\n * `(err as Error).message` directly is unsafe. This normaliser covers all\n * runtime cases.\n */\nexport function getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\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 extractFrontmatter,\n replaceFrontmatter,\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 { getErrorMessage } from '../utils/error.js';\nimport { walkDir } from '../utils/path.js';\nimport {\n getSkillsSourceDir,\n getLegacySkillsSourceDir,\n LEGACY_SKILLS_DIR,\n readInstalledManifest,\n writeInstalledManifest,\n} 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-source/<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 // One-shot lazy migration: rename legacy `.teamix-evo/skills/` to\n // `.teamix-evo/skills-source/` and rewrite manifest target paths if needed.\n // Runs unconditionally on every install; the function short-circuits when\n // there is nothing to migrate.\n await migrateLegacySkillsSourceDir(options.projectRoot);\n\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 \\`npx teamix-evo@latest skills sync\\`.`,\n );\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n return existing;\n }\n\n let merged = existing;\n // ADR 0015: frontmatter is the IDE-facing protocol — always pull from\n // upstream so trigger/description changes propagate through update + sync\n // without requiring uninstall + reinstall. Body outside managed regions\n // remains user-owned.\n const upstreamFm = extractFrontmatter(sourceContent);\n if (upstreamFm) {\n merged = replaceFrontmatter(merged, upstreamFm);\n }\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 * Optional: limit the update to these skill ids. When provided, skills not\n * in the set are skipped (no source rewrite, no mirror). Per ADR 0035,\n * the high-level `runSkillsUpdate` always passes this with the intersection\n * of `keys(lock.skills)` and the current install scope, ensuring update\n * never accidentally installs new skills or skills from a mismatched scope.\n *\n * Type matches `SkillInstallOptions.onlyIds` (mutable `string[] | undefined`).\n */\n onlyIds?: string[];\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 idFilter = options.onlyIds ? new Set(options.onlyIds) : null;\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n const updated: InstalledResource[] = [];\n\n for (const skill of manifest.skills) {\n if (idFilter && !idFilter.has(skill.id)) continue;\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) continue;\n\n const sourceRecords = await rewriteSkillSource(skill, options, summary);\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 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 newContent =\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\n const written = await rewriteSingleFile({\n targetFile,\n newContent,\n exists,\n updateStrategy: skill.updateStrategy,\n managedRegions: skill.managedRegions,\n projectRoot,\n summary,\n });\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, written, 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 const written = await rewriteSingleFile({\n targetFile,\n newContent,\n exists,\n updateStrategy: skill.updateStrategy,\n managedRegions: skill.managedRegions,\n projectRoot,\n summary,\n });\n return [makeSourceRecord(skill, targetFile, written)];\n}\n\n/**\n * Apply updateStrategy logic to a single file (used by both single-file and\n * directory skill update paths).\n *\n * Returns the content actually on disk after the operation.\n */\nasync function rewriteSingleFile(args: {\n targetFile: string;\n newContent: string;\n exists: boolean;\n updateStrategy: SkillEntry['updateStrategy'];\n managedRegions: readonly string[] | undefined;\n projectRoot: string;\n summary: SkillUpdateResult['summary'];\n}): Promise<string> {\n const {\n targetFile,\n newContent,\n exists,\n updateStrategy,\n managedRegions,\n projectRoot,\n summary,\n } = args;\n\n if (updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n return (await readFileOrNull(targetFile)) ?? newContent;\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n return newContent;\n }\n\n if (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 newContent;\n }\n\n // managed: preserve outside-region content from the existing SOURCE.\n // Per ADR 0015, the YAML frontmatter is part of the skill's PROTOCOL\n // (name / description / trigger contract) and MUST always follow the\n // upstream package — only the body outside managed regions is treated\n // as user-owned. We therefore overlay the upstream frontmatter first,\n // then apply managed-region replacement on the body.\n const current = await readFileOrNull(targetFile);\n let merged = current ?? newContent;\n const upstreamFm = extractFrontmatter(newContent);\n if (upstreamFm) {\n merged = replaceFrontmatter(merged, upstreamFm);\n }\n for (const regionId of 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 if (merged !== current) {\n await backupFile(targetFile, projectRoot);\n await writeFileSafe(targetFile, merged);\n }\n summary.managed++;\n return 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 // One-shot lazy migration so a stale `.teamix-evo/skills/` from a prior CLI\n // version is moved to the new layout before we walk source dirs.\n await migrateLegacySkillsSourceDir(options.projectRoot);\n\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 * One-shot migration of the consumer-side skill source directory from the\n * legacy `<projectRoot>/.teamix-evo/skills/` layout to the current\n * `<projectRoot>/.teamix-evo/skills-source/` layout (Init landing plan §A3).\n *\n * Behavior:\n * - When **only** the legacy dir exists → rename it to `skills-source`.\n * - When both exist → keep `skills-source` authoritative; warn that legacy\n * `skills/` is now stale (caller may delete manually).\n * - When neither exists or only `skills-source/` exists → no-op.\n *\n * Side effects:\n * - Updates `InstalledManifest` resources whose `target` still references the\n * legacy `.teamix-evo/skills/` path so subsequent `findInstalledPackage` /\n * uninstall lookups don't dangle.\n *\n * Failures are logged and swallowed: the rest of the install/sync should not\n * be blocked by a best-effort migration step.\n */\nexport async function migrateLegacySkillsSourceDir(\n projectRoot: string,\n): Promise<void> {\n const legacyDir = getLegacySkillsSourceDir(projectRoot);\n const newDir = getSkillsSourceDir(projectRoot);\n\n let legacyExists = false;\n let newExists = false;\n try {\n legacyExists = (await fs.stat(legacyDir)).isDirectory();\n } catch {\n legacyExists = false;\n }\n try {\n newExists = (await fs.stat(newDir)).isDirectory();\n } catch {\n newExists = false;\n }\n\n if (!legacyExists) return;\n if (newExists) {\n logger.warn(\n `Detected stale legacy skills source dir at ${legacyDir} alongside ${newDir}; ` +\n `the new layout takes precedence — you can safely delete the legacy dir.`,\n );\n return;\n }\n\n try {\n await fs.rename(legacyDir, newDir);\n logger.info(\n `Migrated skills source dir: \\`.teamix-evo/${LEGACY_SKILLS_DIR}/\\` → \\`.teamix-evo/skills-source/\\``,\n );\n } catch (err) {\n logger.warn(\n `Failed to rename legacy skills source dir (${getErrorMessage(\n err,\n )}); leaving as-is. New skills will install under the new layout.`,\n );\n return;\n }\n\n // Rewrite manifest targets that still reference the legacy path. We match\n // both POSIX and platform-native separators because Windows installs may\n // have stored back-slashed absolute paths.\n try {\n const manifest = await readInstalledManifest(projectRoot);\n if (!manifest) return;\n const legacyFragmentPosix = `/.teamix-evo/${LEGACY_SKILLS_DIR}/`;\n const newFragmentPosix = `/.teamix-evo/skills-source/`;\n const legacyFragmentNative = `${path.sep}.teamix-evo${path.sep}${LEGACY_SKILLS_DIR}${path.sep}`;\n const newFragmentNative = `${path.sep}.teamix-evo${path.sep}skills-source${path.sep}`;\n let touched = 0;\n for (const pkg of manifest.installed) {\n for (const r of pkg.resources) {\n if (typeof r.target !== 'string') continue;\n const before = r.target;\n let after = before.replace(legacyFragmentPosix, newFragmentPosix);\n after = after.replace(legacyFragmentNative, newFragmentNative);\n if (after !== before) {\n r.target = after;\n touched += 1;\n }\n }\n }\n if (touched > 0) {\n await writeInstalledManifest(projectRoot, manifest);\n logger.debug(\n `Rewrote ${touched} manifest target(s) to the new skills-source path.`,\n );\n }\n } catch (err) {\n logger.warn(\n `Migrated skills source dir but failed to update manifest paths (${getErrorMessage(\n err,\n )}); manifest may still reference legacy paths.`,\n );\n }\n}\n\n/**\n * Prune empty IDE skill directories under each adapter's skill root.\n *\n * Some workflows leave behind empty `<ide-root>/skills/<id>/` shells — e.g.\n * the upstream package dropped a skill, the user toggled it out via\n * `onlyIds`, or a partial mirror failed mid-write and removed the SKILL.md\n * but not the parent dir. Per the Init landing plan §G, every install /\n * sync run sweeps these out so the IDE side stays tidy.\n *\n * Safety:\n * - Only completely empty dirs are removed (no SKILL.md AND no other files).\n * - Non-empty dirs without SKILL.md are LEFT ALONE; deciding whether they\n * are user content vs stale mirror is out of scope for this best-effort\n * pass.\n * - All errors are swallowed; this is decoration, never a hard failure.\n *\n * Returns the list of absolute paths that were removed (for diagnostics).\n */\nexport async function pruneEmptyIdeSkillDirs(args: {\n projectRoot: string;\n ides: readonly SkillIde[];\n scope: SkillScope;\n}): Promise<string[]> {\n const removed: string[] = [];\n for (const ide of args.ides) {\n const adapter = getAdapter(ide);\n // Use a placeholder name to derive the per-IDE skill root, then take\n // dirname — every adapter returns `<root>/<name>/` shape.\n const placeholderDir = adapter.getSkillTargetDir(\n '__placeholder__',\n args.scope,\n args.projectRoot,\n );\n const skillsRoot = path.dirname(placeholderDir);\n let entries: string[];\n try {\n entries = await fs.readdir(skillsRoot);\n } catch {\n continue;\n }\n for (const name of entries) {\n const dir = path.join(skillsRoot, name);\n let stat;\n try {\n stat = await fs.stat(dir);\n } catch {\n continue;\n }\n if (!stat.isDirectory()) continue;\n let children: string[];\n try {\n children = await fs.readdir(dir);\n } catch {\n continue;\n }\n // Skip dirs that still contain a SKILL.md — they're live.\n if (children.some((c) => c === 'SKILL.md')) continue;\n // Only delete completely empty dirs; preserve any user content\n // sitting in a SKILL.md-less directory.\n if (children.length !== 0) continue;\n try {\n await fs.rmdir(dir);\n removed.push(dir);\n logger.debug(`Pruned empty IDE skill dir: ${dir}`);\n } catch {\n // Best-effort; ignore.\n }\n }\n }\n return removed;\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}: ${getErrorMessage(err)}`);\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';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\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 * Common directory names to skip when walking user project trees.\n */\nexport const DEFAULT_SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.teamix-evo',\n]);\n\n/**\n * Recursively walk a directory and return all file paths.\n * When `skipDirs` is provided, directories whose names are in the set will not\n * be entered — this avoids the cost of recursing into large trees like\n * `node_modules/` only to discard results later.\n */\nexport async function walkDir(\n dir: string,\n skipDirs?: Set<string>,\n): 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 if (skipDirs && skipDirs.has(entry.name)) continue;\n files.push(...(await walkDir(fullPath, skipDirs)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Locate the root directory of an installed npm package by resolving its\n * `package.json`. Used to read token source CSS and variant manifests.\n */\nexport function resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n","import * as path from 'node:path';\nimport { writeFileSafe, fileExists } from './fs.js';\nimport { getErrorMessage } from './error.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(\n mcpPath,\n JSON.stringify(MCP_JSON_CONTENT, null, 2) + '\\n',\n );\n logger.debug(`Wrote .mcp.json → ${mcpPath}`);\n return 'created';\n } catch (err) {\n logger.warn(`Failed to write .mcp.json: ${getErrorMessage(err)}`);\n return 'failed';\n }\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\n SkillsPackageManifest,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport {\n installSkills,\n updateSkills,\n pruneEmptyIdeSkillDirs,\n} 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\n// ─── runSkillsInit ────────────────────────────────────────────────────────────\n// Bulk bootstrap: install every skill in the manifest that matches the current\n// tokens variant + install scope (per ADR 0033). No skill ids accepted —\n// granular adds go through `runSkillsAdd`. Verb split per ADR 0034.\n\nexport interface RunSkillsInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Target IDEs to inject skills into. Required (bulk has no fallback source). */\n ides: readonly SkillIde[];\n /** Install scope. Required (bulk has no fallback source). */\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\nexport type RunSkillsInitResult =\n | {\n status: 'installed';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n skillCount: number;\n fileCount: number;\n resources: InstalledResource[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n /**\n * Skill ids that were auto-upgraded because their locked version was\n * older than the manifest version.\n */\n autoUpdatedSkillIds: string[];\n /**\n * @deprecated Outdated skills are now auto-upgraded; kept for compat.\n */\n outdatedSkills: OutdatedSkillInfo[];\n }\n | {\n /** Returned when a skills package is already installed and bulk has nothing new to add. */\n status: 'already-initialized';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo skills init`.\n *\n * Installs every manifest skill that matches the current tokens variant +\n * install scope (per ADR 0033 scope filter). Re-running on a project whose\n * `packages.skills` is already configured AND has no missing candidates\n * returns `'already-initialized'`.\n */\nexport async function runSkillsInit(\n options: RunSkillsInitOptions,\n): Promise<RunSkillsInitResult> {\n const { projectRoot } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\n const ides = [...options.ides] as SkillIde[];\n const scope = options.scope;\n if (ides.length === 0) {\n throw new Error('At least one IDE must be selected.');\n }\n\n await ensureTeamixDir(projectRoot);\n const existingConfig = await readProjectConfig(projectRoot);\n const existingSkillsCfg = existingConfig?.packages?.skills;\n\n const { manifest, data, packageRoot } = await loadSkillsData(packageName);\n const currentTokensVariant = await readTokensVariant(projectRoot);\n\n const existing = await readExistingState(projectRoot, packageName);\n\n // ADR 0033 + tokens variant: filter manifest skills to those eligible for\n // this install scope and current variant.\n const candidateIds = manifest.skills\n .filter((s) => {\n const effectiveScope = s.scope ?? 'project';\n if (effectiveScope !== scope) {\n logger.debug(\n `Skipping skill \"${s.id}\" (scope=${effectiveScope}): current install scope is \"${scope}\". Use \\`skills add ${s.id} --scope ${effectiveScope}\\` to install.`,\n );\n return false;\n }\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\n // Partition candidate skills the same way `runSkillsAdd` does: brand-new go\n // to `onlyIds`; already installed and at-or-above manifest version go to\n // `skippedSkillIds`; already installed but with `lock.version < manifest.version`\n // surface as `outdatedSkills` so callers can suggest `skills update <id>`.\n const { onlyIds, skippedSkillIds, outdatedSkills } = partitionByVersion(\n candidateIds,\n manifest,\n existing,\n );\n\n // Idempotent fast path: nothing new and nothing outdated. Preserve the\n // historical `already-initialized` status only when there's literally\n // nothing for the caller to act on; if any skill is outdated we fall\n // through to the empty-install fast path below so the upgrade hint is\n // surfaced to the CLI layer.\n if (\n existingSkillsCfg &&\n onlyIds.length === 0 &&\n outdatedSkills.length === 0\n ) {\n return { status: 'already-initialized' };\n }\n\n // Empty-install fast path mirrors `runSkillsAdd`: nothing new to install,\n // but at least one outdated skill needs to be auto-upgraded.\n if (onlyIds.length === 0) {\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig,\n });\n }\n return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n autoUpdatedSkillIds,\n outdatedSkills: [],\n };\n }\n\n return finalizeSkillsInstall({\n projectRoot,\n packageName,\n ideIdent: options.ide ?? 'qoder',\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n });\n}\n\n// ─── runSkillsAdd ─────────────────────────────────────────────────────────────\n// Incremental: install named skill ids. `names` is required (≥ 1).\n// Skills already present are skipped. ADR 0034.\n\nexport interface RunSkillsAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Skill ids to add. **Required, must contain at least one id.** Use\n * {@link runSkillsInit} for bulk bootstrap (no ids).\n */\n names: readonly string[];\n /** Target IDEs. Optional — falls back to the previously installed config. */\n ides?: readonly SkillIde[];\n /** Install scope. Optional — falls back to existing config. */\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\n/**\n * Detail for an already-installed skill whose locked version is older than\n * the manifest's latest version. Use `skills update <id>` to upgrade.\n */\nexport interface OutdatedSkillInfo {\n /** Skill id */\n id: string;\n /** Version recorded in `.teamix-evo/skills.lock.json` */\n installed: string;\n /** Version available in the upstream manifest (i.e. `npx` resolved `@latest`) */\n latest: string;\n}\n\nexport type RunSkillsAddResult = {\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 /**\n * Skill ids that were requested but already installed at the latest version;\n * nothing to do.\n */\n skippedSkillIds: string[];\n /**\n * Skill ids that were auto-upgraded because their locked version was older\n * than the manifest version.\n */\n autoUpdatedSkillIds: string[];\n /**\n * @deprecated Outdated skills are now auto-upgraded; this array is always\n * empty. Kept for backward-compatible callers; will be removed in next major.\n */\n outdatedSkills: OutdatedSkillInfo[];\n};\n\n/**\n * Programmatic equivalent of `teamix-evo skills add <names...>` (ADR 0034).\n *\n * Installs only the listed skills. Skills already present are skipped (use\n * `skills update` to refresh). `ides` / `scope` may be omitted — they fall\n * back to the previously installed config.\n *\n * Throws if `names` is empty — bulk bootstrap belongs to {@link runSkillsInit}.\n */\nexport async function runSkillsAdd(\n options: RunSkillsAddOptions,\n): Promise<RunSkillsAddResult> {\n if (!options.names || options.names.length === 0) {\n throw new Error(\n 'runSkillsAdd requires at least one skill id. Use runSkillsInit() for bulk install.',\n );\n }\n\n const { projectRoot, names: requestedNames } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\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 // Validate requested names against manifest.\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 // ADR 0033: warn when explicitly naming a skill whose declared scope\n // doesn't match the current install scope. Don't block — explicit\n // naming overrides the default; user takes responsibility.\n for (const s of manifest.skills) {\n if (requestedNames.includes(s.id) && s.scope && s.scope !== scope) {\n logger.warn(\n `\"${s.id}\" 推荐 ${s.scope} scope 安装。当前以 ${scope} scope 强制安装,可能与另一 scope 的副本冲突。建议改用 \\`skills add ${s.id} --scope ${s.scope}\\`。`,\n );\n }\n }\n\n const existing = await readExistingState(projectRoot, packageName);\n\n // Partition requested names: already-installed-and-up-to-date go to\n // `skippedSkillIds`; already-installed-but-older go to `outdatedSkills`\n // (caller surfaces an upgrade hint); brand-new go to `onlyIds`.\n const { onlyIds, skippedSkillIds, outdatedSkills } = partitionByVersion(\n requestedNames,\n manifest,\n existing,\n );\n\n // Incremental fast path: nothing new to install. But if there are\n // outdated skills, auto-upgrade them before returning.\n if (onlyIds.length === 0) {\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig,\n });\n }\n return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n autoUpdatedSkillIds,\n outdatedSkills: [],\n };\n }\n\n return finalizeSkillsInstall({\n projectRoot,\n packageName,\n ideIdent: options.ide ?? 'qoder',\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n });\n}\n\n// ─── partition helper (shared by init + add) ────────────────────────────────\n// Split a list of skill ids into three buckets based on `existing` lock state\n// vs `manifest` version. `onlyIds` (new) → drives `installSkills`;\n// `skippedSkillIds` (already at latest) and `outdatedSkills` (lock < manifest)\n// are surfaced to the CLI for messaging. Pre-ADR-0013 legacy installs whose\n// lock is missing fall through to `skippedSkillIds` (conservative — don't\n// nag a user we can't reliably version-check).\nfunction partitionByVersion(\n ids: readonly string[],\n manifest: SkillsPackageManifest,\n existing: ExistingState,\n): {\n onlyIds: string[];\n skippedSkillIds: string[];\n outdatedSkills: OutdatedSkillInfo[];\n} {\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n const onlyIds: string[] = [];\n const skippedSkillIds: string[] = [];\n const outdatedSkills: OutdatedSkillInfo[] = [];\n for (const name of ids) {\n if (!existing.skillIds.has(name)) {\n onlyIds.push(name);\n continue;\n }\n const installedVer = existing.lock?.skills?.[name]?.version;\n const latestVer = manifestById.get(name)?.version;\n if (\n installedVer &&\n latestVer &&\n compareSemver(installedVer, latestVer) < 0\n ) {\n outdatedSkills.push({\n id: name,\n installed: installedVer,\n latest: latestVer,\n });\n } else {\n skippedSkillIds.push(name);\n }\n }\n return { onlyIds, skippedSkillIds, outdatedSkills };\n}\n\n// ─── semver helpers (light, no dep) ───────────────────────────────────────────\n// Only needed by `runSkillsAdd` to decide whether an already-installed skill is\n// truly outdated (installed < manifest). We deliberately avoid pulling in a\n// `semver` runtime dep; manifest versions are validated against\n// `^\\d+\\.\\d+\\.\\d+/` by the registry schema, so a numeric major.minor.patch\n// triple is sufficient. Pre-release / build metadata is ignored — if two\n// versions share the same triple they're considered equal here.\nfunction parseSemverTriple(v: string): [number, number, number] | null {\n const m = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(v);\n if (!m) return null;\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\n/** -1 if a < b, 0 if equal (or unparseable + identical strings), 1 if a > b. */\nfunction compareSemver(a: string, b: string): number {\n const pa = parseSemverTriple(a);\n const pb = parseSemverTriple(b);\n if (!pa || !pb) {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n }\n for (let i = 0; i < 3; i++) {\n if (pa[i]! !== pb[i]!) return pa[i]! < pb[i]! ? -1 : 1;\n }\n return 0;\n}\n\n// ─── shared internals ─────────────────────────────────────────────────────────\n\ninterface ExistingState {\n installed: InstalledManifest | null;\n pkg:\n | {\n package: string;\n resources: InstalledResource[];\n }\n | undefined;\n lock: SkillsLock | null;\n skillIds: Set<string>;\n}\n\nasync function readExistingState(\n projectRoot: string,\n packageName: string,\n): Promise<ExistingState> {\n const installed = await readInstalledManifest(projectRoot);\n const pkg = installed?.installed.find((p) => p.package === packageName);\n const lock = await readSkillsLock(projectRoot);\n const skillIds = new Set<string>([\n ...Object.keys(lock?.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 ...(pkg?.resources ?? []).map((r) => r.id.split(':')[0] ?? r.id),\n ]);\n return { installed, pkg, lock, skillIds };\n}\n\ninterface FinalizeArgs {\n projectRoot: string;\n packageName: string;\n ideIdent: string;\n manifest: SkillsPackageManifest;\n data: Parameters<typeof installSkills>[0]['data'];\n packageRoot: string;\n ides: SkillIde[];\n scope: SkillScope;\n onlyIds: string[];\n skippedSkillIds: string[];\n /** Optional — only populated by `runSkillsAdd`. `runSkillsInit` leaves empty. */\n outdatedSkills?: OutdatedSkillInfo[];\n existing: ExistingState;\n existingConfig: ProjectConfig | null;\n}\n\nasync function finalizeSkillsInstall(args: FinalizeArgs): Promise<{\n status: 'installed';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n skillCount: number;\n fileCount: number;\n resources: InstalledResource[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n autoUpdatedSkillIds: string[];\n outdatedSkills: OutdatedSkillInfo[];\n}> {\n const {\n projectRoot,\n packageName,\n ideIdent,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n } = args;\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/v2.json',\n schemaVersion: 2,\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 = existing.installed ?? {\n schemaVersion: 1,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n const mergedResources = mergeInstalledResources(\n existing.pkg?.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 = existing.lock ?? {\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 // Phase 5.G: sweep empty IDE skill dirs left over from prior installs\n // (e.g. a removed upstream skill). Best-effort — swallows errors.\n try {\n await pruneEmptyIdeSkillDirs({ projectRoot, ides, scope });\n } catch {\n // Cleanup is decoration; never a hard failure.\n }\n\n // Auto-upgrade outdated skills alongside the fresh install.\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills && outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig: existingConfig ?? config,\n });\n }\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 autoUpdatedSkillIds,\n outdatedSkills: [],\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// ─── auto-upgrade outdated skills ──────────────────────────────────────────────\n// When `skills add` detects already-installed skills whose locked version is\n// older than the manifest version, we auto-upgrade them in-place rather than\n// just surfacing a hint. This ensures the client-side AI always uses the latest\n// skill version available in the resolved `@latest` package.\n\ninterface AutoUpgradeArgs {\n projectRoot: string;\n packageName: string;\n manifest: SkillsPackageManifest;\n data: Parameters<typeof installSkills>[0]['data'];\n packageRoot: string;\n ides: SkillIde[];\n scope: SkillScope;\n outdatedSkills: OutdatedSkillInfo[];\n existing: ExistingState;\n existingConfig: ProjectConfig | null;\n}\n\nasync function autoUpgradeOutdatedSkills(\n args: AutoUpgradeArgs,\n): Promise<string[]> {\n const {\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n } = args;\n\n const targetIds = outdatedSkills.map((o) => o.id);\n\n // Use the updateSkills flow which preserves managed regions.\n await updateSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds: targetIds,\n });\n\n // Update the lock for auto-upgraded skills.\n const lock: SkillsLock = existing.lock ?? {\n schemaVersion: 1,\n skills: {},\n };\n const installedAt = new Date().toISOString();\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n for (const id of targetIds) {\n const skillDef = manifestById.get(id);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[id] = {\n version: skillDef.version,\n from: packageName,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\n\n // Update installed manifest resources for upgraded skills.\n const installedManifest = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n if (idx >= 0) {\n installedManifest.installed[idx]!.version = manifest.version;\n installedManifest.installed[idx]!.installedAt = installedAt;\n }\n await writeInstalledManifest(projectRoot, installedManifest);\n\n logger.debug(\n `Auto-upgraded ${targetIds.length} outdated skill(s): ${targetIds.join(\n ', ',\n )}`,\n );\n\n return targetIds;\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 init` / `skills add` with project scope): refuses to run when the\n * cwd has no `package.json`, because that almost always means the user is in\n * the 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 init --scope global` (or `skills add ... --scope global`) writes\n * metadata to ~/.teamix-evo-global when cwd isn't a teamix-evo project, so\n * maintenance commands must look there too — otherwise the user gets\n * \"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 tokens with three-state semantics.\n *\n * Per ADR 0003 + ADR 0019 §D2: regenerable files rewritten, managed regions\n * replaced (markers preserved), frozen files preserved with upstream-drift\n * warnings surfaced (`--accept-upstream` is a future batch).\n */\nimport { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensUpdate } from '../../core/tokens-update.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const updateCommand = new Command('update')\n .description(\n '刷新 design tokens(regenerable 覆盖 / managed 区段替换 / 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 `npx teamix-evo@latest 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(' Regenerable files refreshed in case of manual edits.');\n printFrozenDrift(result.frozenDrift);\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.managedReplaced.length > 0) {\n logger.info(\n ` Managed regions updated: ${result.managedReplaced.join(', ')}`,\n );\n }\n if (result.preserved.length > 0) {\n logger.info(\n ` Preserved: ${result.preserved.join(\n ', ',\n )} (frozen — your customizations kept)`,\n );\n }\n printFrozenDrift(result.frozenDrift);\n if (result.hintPath) {\n logger.info('');\n logger.info(`💡 token rename hint: ${result.hintPath}`);\n logger.info(\n ` 检测到 ${result.renames.length} 个 token rename,建议调用 \\`teamix-evo-upgrade\\` skill 扫 src/** 给 codemod 建议(ADR 0019 §D4)。`,\n );\n }\n } catch (err) {\n logger.error(`Failed to update tokens: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nfunction printFrozenDrift(\n drift: ReadonlyArray<{ target: string; reason: string }>,\n): void {\n if (drift.length === 0) return;\n logger.warn(\n ` ⚠️ frozen drift(上游有变动,但本地属用户受控文件 — ADR 0019 §D2):${drift\n .map((d) => d.target)\n .join(', ')}`,\n );\n logger.info(\n ' 如需对照上游变动,请手动 diff 或后续使用 `--accept-upstream <target>`(待批次 5 落地)。',\n );\n}\n","/**\n * `teamix-evo tokens update` — refresh tokens with three-state semantics.\n *\n * Per [ADR 0003](../../../../docs/adr/0003-update-strategy-tri-state.md) +\n * [ADR 0019 §D2](../../../../docs/adr/0019-project-upgrade-flow.md), the\n * update is **strategy-driven** off the consumer-side InstalledManifest\n * (recorded at install time):\n *\n * - `regenerable` → upstream content rewrites the file in place.\n * - `managed` → only the marked regions are rewritten via\n * `replaceManagedRegion`; user content outside markers\n * is preserved verbatim. Missing markers in the upstream\n * payload skip that region; missing markers in the\n * consumer file fail loudly (per ADR 0003 Negative — no\n * silent rewrite when anchors are gone).\n * - `frozen` → never overwritten. We still hash-compare upstream vs.\n * the recorded baseline and report \"upstream changed\"\n * drift so the CLI can prompt the user (`--accept-upstream`\n * in a future batch; today we just surface the list).\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 */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledResource,\n type TokensPackLock,\n type TokenRenameEntry,\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';\nimport {\n selectApplicableRenames,\n writeTokensUpgradeHint,\n} from './upgrade-hints.js';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { mergeManagedRegions } from './managed-merge.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_TOKENS_DIR = 'tokens';\n/** Consumer basename ↔ upstream basename mapping (variants ship `theme.css` / `overrides.css`). */\nconst CONSUMER_BASENAME_BY_UPSTREAM: Record<string, string> = {\n 'theme.css': 'tokens.theme.css',\n 'overrides.css': 'tokens.overrides.css',\n};\n\nexport interface RunTokensUpdateOptions {\n projectRoot: string;\n packageName?: string;\n /** Override resolution of the upstream tokens package root. */\n packageRoot?: string;\n}\n\n/**\n * Per-frozen-resource drift report (ADR 0019 §D2 — surfaced, never\n * auto-applied). Today the only reason we surface is `upstream-changed`:\n * a frozen resource whose upstream content moved since install. Consumer-\n * only files (no upstream counterpart, e.g. an empty `overrides.css`\n * template) are silent — there is nothing to compare against.\n */\nexport interface FrozenDrift {\n /** Consumer-relative path (e.g. `tokens/tokens.overrides.css`). */\n target: string;\n reason: 'upstream-changed';\n}\n\nexport type RunTokensUpdateResult =\n | {\n status: 'updated';\n packageName: string;\n variant: string;\n from: string;\n to: string;\n /** Files fully rewritten (regenerable). */\n rewritten: string[];\n /** Files whose managed regions were replaced. Empty when no managed resource exists. */\n managedReplaced: string[];\n /** Frozen files preserved verbatim. */\n preserved: string[];\n /** Frozen drift hints — surfaced only, never auto-merged. */\n frozenDrift: FrozenDrift[];\n /** Token renames that took effect in this version range (oldest first). */\n renames: TokenRenameEntry[];\n /** Absolute path of the `.teamix-evo/.upgrade-hints/tokens-<ts>.json` file written when `renames` is non-empty. */\n hintPath?: string;\n }\n | {\n status: 'not-initialized';\n }\n | {\n status: 'up-to-date';\n packageName: string;\n variant: string;\n version: string;\n /** Frozen drift may still be reported on `up-to-date` if upstream catalog moved hashes. */\n frozenDrift: FrozenDrift[];\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 \\`npx teamix-evo@latest tokens uninstall\\` then \\`npx teamix-evo@latest tokens init <variant>\\` to switch.`,\n );\n }\n\n // Build upstream basename → absolute path index for strategy dispatch.\n const upstreamByBasename = new Map<string, string>();\n for (const fileRel of variantEntry.files) {\n upstreamByBasename.set(\n path.basename(fileRel),\n path.join(packageRoot, fileRel),\n );\n }\n\n // Pull installed resources for this package — they carry the strategy\n // recorded at install time, which is the dispatch key.\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const installedIdx = prior.installed.findIndex(\n (p) => p.package === packageName,\n );\n const priorResources: InstalledResource[] =\n installedIdx >= 0 ? prior.installed[installedIdx]!.resources : [];\n\n const rewritten: string[] = [];\n const managedReplaced: string[] = [];\n const preserved: string[] = [];\n const frozenDrift: FrozenDrift[] = [];\n const refreshedResources: InstalledResource[] = [];\n\n for (const resource of priorResources) {\n const consumerAbs = path.isAbsolute(resource.target)\n ? resource.target\n : path.join(projectRoot, resource.target);\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'regenerable') {\n if (!upstreamAbs) {\n // Upstream dropped this regenerable resource — leave the consumer file\n // alone and keep the prior record so removal is the user's call.\n refreshedResources.push(resource);\n continue;\n }\n const content = await fs.readFile(upstreamAbs, 'utf-8');\n await writeFileSafe(consumerAbs, content);\n rewritten.push(resource.target);\n refreshedResources.push({\n ...resource,\n hash: computeHash(content),\n });\n continue;\n }\n\n if (resource.strategy === 'managed') {\n if (!upstreamAbs || !(await fileExists(consumerAbs))) {\n refreshedResources.push(resource);\n continue;\n }\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const consumerContent = await fs.readFile(consumerAbs, 'utf-8');\n const merged = mergeManagedRegions(upstreamContent, consumerContent);\n if (merged !== consumerContent) {\n await writeFileSafe(consumerAbs, merged);\n managedReplaced.push(resource.target);\n }\n refreshedResources.push({\n ...resource,\n hash: computeHash(merged),\n });\n continue;\n }\n\n // strategy === 'frozen' — never overwrite. Surface drift only when an\n // upstream counterpart exists AND its hash moved.\n if (await fileExists(consumerAbs)) preserved.push(resource.target);\n if (upstreamAbs) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const upstreamHash = computeHash(upstreamContent);\n if (resource.hash && upstreamHash !== resource.hash) {\n frozenDrift.push({\n target: resource.target,\n reason: 'upstream-changed',\n });\n }\n }\n refreshedResources.push(resource);\n }\n\n // Same-version path: still ran regenerable rewrites + managed merges +\n // collected frozen drift. Report `up-to-date` for clarity but include drift.\n if (variantEntry.version === currentVersion) {\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n }\n return {\n status: 'up-to-date',\n packageName,\n variant: currentVariant,\n version: currentVersion,\n frozenDrift,\n };\n }\n\n // Version bump path: lock + config + manifest refresh.\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 config.packages.tokens.version = variantEntry.version;\n await writeProjectConfig(projectRoot, config);\n\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n version: variantEntry.version,\n installedAt: new Date().toISOString(),\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n }\n\n // Emit `.teamix-evo/.upgrade-hints/tokens-<ts>.json` when this version\n // bump introduced any token renames (ADR 0019 §D4 — codemod hint, not\n // codemod). Empty rename list → no file written.\n const renames = selectApplicableRenames(\n variantEntry.renames ?? [],\n currentVersion,\n variantEntry.version,\n );\n let hintPath: string | undefined;\n if (renames.length > 0) {\n const hint = await writeTokensUpgradeHint({\n projectRoot,\n trigger: 'update',\n fromVariant: currentVariant,\n toVariant: currentVariant,\n fromVersion: currentVersion,\n toVersion: variantEntry.version,\n renames,\n });\n if (hint) hintPath = hint.path;\n }\n\n return {\n status: 'updated',\n packageName,\n variant: currentVariant,\n from: currentVersion,\n to: variantEntry.version,\n rewritten,\n managedReplaced,\n preserved,\n frozenDrift,\n renames,\n ...(hintPath ? { hintPath } : {}),\n };\n}\n\nfunction lookupUpstreamBasename(consumerBasename: string): string | undefined {\n for (const [upstream, consumer] of Object.entries(\n CONSUMER_BASENAME_BY_UPSTREAM,\n )) {\n if (consumer === consumerBasename) return upstream;\n }\n // managed resources may share basename across upstream/consumer.\n return consumerBasename;\n}\n","/**\n * `.teamix-evo/.upgrade-hints/` writer — emits codemod hint files consumed\n * by the future `teamix-evo-upgrade` skill ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §D4).\n *\n * The hint is **passive guidance**: the CLI never auto-rewrites consumer\n * source code (frozen boundary). Hints describe the rename surface so an\n * AI agent / human can scan `src/**` and propose codemods, with the user\n * deciding whether to accept each suggestion.\n *\n * Storage layout:\n * ```\n * .teamix-evo/\n * └── .upgrade-hints/\n * ├── tokens-2026-06-12T03-15-00-000Z.json\n * └── …\n * ```\n *\n * Naming convention: `tokens-<filesystem-safe-iso-ts>.json`. The ts is\n * isoToFsSafe-encoded so directory listings sort chronologically.\n */\nimport * as path from 'node:path';\nimport { writeFileSafe } from '../utils/fs.js';\nimport type { TokenRenameEntry } from '@teamix-evo/registry';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst HINTS_DIR = '.upgrade-hints';\n\n/** Source of the hint — identifies which command produced it. */\nexport type TokensUpgradeHintTrigger = 'update' | 'switch';\n\n/**\n * Schema of a single `tokens-<ts>.json` hint file. Versioned so we can\n * evolve the shape without breaking older AI skill consumers.\n */\nexport interface TokensUpgradeHint {\n schemaVersion: 1;\n /** ISO timestamp the hint was generated (matches the filename ts). */\n ts: string;\n /** Always `'tokens'` today; reserved for future per-package hints. */\n package: 'tokens';\n /** Which command emitted the hint. */\n trigger: TokensUpgradeHintTrigger;\n /** Variant in effect *before* the operation that produced the hint. */\n fromVariant: string;\n /** Variant in effect *after* the operation. */\n toVariant: string;\n /** Variant version the consumer was on before the operation. */\n fromVersion: string;\n /** Variant version the consumer is on after the operation. */\n toVersion: string;\n /** Rename entries that apply to this transition (ordered by sinceVersion ASC). */\n renames: ReadonlyArray<TokenRenameEntry>;\n}\n\n/**\n * Convert an ISO-8601 timestamp into a filesystem-safe directory / filename\n * fragment. Mirrors `snapshot.isoToFsSafe` — kept private here to avoid a\n * cross-module dependency for one tiny helper.\n */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\nexport interface WriteTokensUpgradeHintOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Trigger that produced the hint. */\n trigger: TokensUpgradeHintTrigger;\n fromVariant: string;\n toVariant: string;\n fromVersion: string;\n toVersion: string;\n /** Pre-filtered rename entries that apply to this transition. */\n renames: ReadonlyArray<TokenRenameEntry>;\n /** Optional ISO ts override (testing hook). Defaults to `new Date().toISOString()`. */\n isoTs?: string;\n}\n\n/**\n * Result of `writeTokensUpgradeHint` — `null` when there were no renames to\n * record (writer skips file creation rather than emit a noisy empty file).\n */\nexport interface TokensUpgradeHintResult {\n /** Absolute path of the written hint file. */\n path: string;\n /** Filesystem-safe ts that appears in the filename. */\n ts: string;\n /** Number of rename entries persisted. */\n renameCount: number;\n}\n\n/**\n * Persist a `tokens-<ts>.json` hint file when there are renames worth\n * surfacing. Returns `null` when `renames` is empty (no-op contract).\n */\nexport async function writeTokensUpgradeHint(\n options: WriteTokensUpgradeHintOptions,\n): Promise<TokensUpgradeHintResult | null> {\n if (options.renames.length === 0) return null;\n\n const isoTs = options.isoTs ?? new Date().toISOString();\n const fsTs = isoToFsSafe(isoTs);\n const filename = `tokens-${fsTs}.json`;\n const target = path.join(\n options.projectRoot,\n TEAMIX_DIR,\n HINTS_DIR,\n filename,\n );\n\n const payload: TokensUpgradeHint = {\n schemaVersion: 1,\n ts: isoTs,\n package: 'tokens',\n trigger: options.trigger,\n fromVariant: options.fromVariant,\n toVariant: options.toVariant,\n fromVersion: options.fromVersion,\n toVersion: options.toVersion,\n renames: options.renames,\n };\n\n await writeFileSafe(target, JSON.stringify(payload, null, 2) + '\\n');\n\n return {\n path: target,\n ts: fsTs,\n renameCount: options.renames.length,\n };\n}\n\n/**\n * Filter a variant's rename log down to the entries that apply when moving\n * from `fromVersion` to `toVersion`. Inclusive of `toVersion`, exclusive of\n * `fromVersion` (the consumer was already on `fromVersion` so any rename\n * recorded at that exact version was already absorbed).\n *\n * Pure semver comparison via numeric splitting (`\\d+\\.\\d+\\.\\d+` shape\n * enforced by `TokenRenameEntrySchema`). Pre-release suffixes use\n * `localeCompare` with `{ numeric: true }` so `rc.10` sorts after `rc.2`\n * (lexicographic comparison is wrong for numeric suffixes).\n */\nexport function selectApplicableRenames(\n renames: ReadonlyArray<TokenRenameEntry>,\n fromVersion: string,\n toVersion: string,\n): TokenRenameEntry[] {\n return renames\n .filter(\n (r) =>\n compareSemver(r.sinceVersion, fromVersion) > 0 &&\n compareSemver(r.sinceVersion, toVersion) <= 0,\n )\n .sort((a, b) => compareSemver(a.sinceVersion, b.sinceVersion));\n}\n\n/**\n * Tri-state semver comparator: returns negative / zero / positive matching\n * the standard `Array.prototype.sort` contract.\n */\nfunction compareSemver(a: string, b: string): number {\n const [aMain = '', aRest = ''] = a.split('-', 2);\n const [bMain = '', bRest = ''] = b.split('-', 2);\n const aParts = aMain.split('.').map((n) => Number.parseInt(n, 10));\n const bParts = bMain.split('.').map((n) => Number.parseInt(n, 10));\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const ai = aParts[i] ?? 0;\n const bi = bParts[i] ?? 0;\n if (ai !== bi) return ai - bi;\n }\n // Pre-release suffixes — numeric-aware compare so `rc.10` > `rc.2`;\n // absent suffix > present (per semver §11).\n if (aRest === '' && bRest !== '') return 1;\n if (aRest !== '' && bRest === '') return -1;\n return aRest.localeCompare(bRest, undefined, { numeric: true });\n}\n","import { hasManagedRegion, replaceManagedRegion } from '@teamix-evo/registry';\n\n/**\n * Walk every managed region present in the upstream payload and apply it\n * onto the consumer file. Regions present upstream but missing in the\n * consumer file fail-fast (ADR 0003 Negative — corrupted anchors must not be\n * silently rewritten). Regions absent upstream are left untouched.\n */\nexport function mergeManagedRegions(\n upstreamContent: string,\n consumerContent: string,\n): string {\n let updated = consumerContent;\n const re =\n /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->([\\s\\S]*?)<!-- teamix-evo:managed:end(?: id=\"\\1\")? -->/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(upstreamContent)) !== null) {\n const id = match[1]!;\n const body = match[2]!.replace(/^\\n/, '').replace(/\\n$/, '');\n if (!hasManagedRegion(updated, id)) {\n throw new Error(\n `Managed region \"${id}\" missing from consumer file — refusing to silently rewrite (ADR 0003).`,\n );\n }\n updated = replaceManagedRegion(updated, id, body);\n }\n return updated;\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Run \"npx teamix-evo@latest tokens init [variant]\" to get started.',\n );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install a variant: npx teamix-evo@latest tokens init <name>',\n );\n } catch (err) {\n logger.error(`Failed to list variants: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(`Failed to remove ${target}: ${getErrorMessage(err)}`);\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: ${getErrorMessage(err)}`,\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: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport {\n runTokensAudit,\n renderAuditSummary,\n type AuditCategory,\n} from '../../core/tokens-audit.js';\n\n/**\n * `teamix-evo tokens audit` — read-only analysis of `tokens.overrides.css`\n * against `tokens.theme.css`. Classifies each override into one of four\n * buckets (redundant / kept / migrate / custom) per the Init landing plan\n * §C.5. Never mutates files; the user (or AI skill) decides what to act on.\n */\nexport const auditCommand = new Command('audit')\n .description(\n '审计 tokens/tokens.overrides.css:与变体 theme.css 对照,分类输出冗余/保留/迁移/项目特有',\n )\n .option('--json', '以 JSON 格式输出结果(便于 skill 消费)')\n .option(\n '--filter <category>',\n '仅显示指定 bucket(redundant|kept|migrate|custom),可逗号分隔',\n )\n .action(async (opts: { json?: boolean; filter?: string }) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n const result = await runTokensAudit({ projectRoot });\n\n if (result.status === 'no-theme') {\n logger.error(\n `No tokens.theme.css found at ${result.themePath}. Run \\`tokens init <variant>\\` first.`,\n );\n process.exitCode = 1;\n return;\n }\n if (result.status === 'no-overrides') {\n logger.info(\n `No tokens.overrides.css at ${result.overridesPath}. Nothing to audit.`,\n );\n return;\n }\n if (result.status !== 'audited') {\n // Exhaustiveness fence — TS narrows to 'audited' below.\n return;\n }\n\n // Optional category filter (comma-separated, case-insensitive).\n const filterSet = parseFilter(opts.filter);\n const filtered = filterSet\n ? {\n ...result,\n entries: result.entries.filter((e) => filterSet.has(e.category)),\n }\n : result;\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(filtered, null, 2) + '\\n');\n return;\n }\n\n logger.info(renderAuditSummary(filtered));\n logger.info('');\n logger.info(\n '提示:此命令只读,不会修改 overrides.css;按上面的 REDUNDANT / MIGRATE 分类自行裁剪。',\n );\n } catch (err) {\n logger.error(`Failed to audit tokens: ${getErrorMessage(err)}`);\n process.exitCode = 1;\n }\n });\n\nfunction parseFilter(raw: string | undefined): Set<AuditCategory> | null {\n if (!raw) return null;\n const valid: AuditCategory[] = ['redundant', 'kept', 'migrate', 'custom'];\n const out = new Set<AuditCategory>();\n for (const part of raw.split(',').map((s) => s.trim().toLowerCase())) {\n if (!part) continue;\n if ((valid as string[]).includes(part)) {\n out.add(part as AuditCategory);\n }\n }\n return out.size > 0 ? out : null;\n}\n","/**\n * Token overrides audit — analyses `tokens/tokens.overrides.css` against the\n * regenerable `tokens/tokens.theme.css` and classifies every override entry\n * into one of four buckets per the Init landing plan §C.5:\n *\n * - `redundant` — override value already matches the variant theme\n * (after v3 ↔ v4 semantic normalisation). Safe to delete.\n * - `kept` — override genuinely differs from theme; user-owned tweak.\n * - `migrate` — override is written in legacy v3 shadcn shape\n * (`--primary: 218.6 100% 46.7%`) while the theme is in Tailwind v4\n * `@theme` shape (`--color-primary: hsl(218.6 100% 46.7%)`). Recommend\n * rewriting to the v4 form (still classifies as redundant/kept underneath).\n * - `custom` — override has no matching theme variable; project-specific\n * extension.\n *\n * The audit is **read-only**: it never mutates `overrides.css`. Callers\n * surface the entries to the user (CLI / skill) for manual decision-making.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nconst THEME_REL = 'tokens/tokens.theme.css';\nconst OVERRIDES_REL = 'tokens/tokens.overrides.css';\n\n/** Single CSS custom-property declaration parsed out of a theme/overrides file. */\nexport interface ParsedToken {\n /** Variable name including the leading `--`. */\n name: string;\n /** Raw value as it appears in source (post `:` pre `;`, trimmed). */\n value: string;\n /** 1-based line number for diagnostics. */\n line: number;\n}\n\nexport type AuditCategory = 'redundant' | 'kept' | 'migrate' | 'custom';\n\nexport interface TokenAuditEntry {\n /** Override variable name (as authored in `tokens.overrides.css`). */\n name: string;\n /** Override value (as authored). */\n value: string;\n /** 1-based line number inside `tokens.overrides.css`. */\n line: number;\n /** Primary classification bucket. */\n category: AuditCategory;\n /** Theme variable matched against (after v3 → v4 mapping if needed). */\n themeName?: string;\n /** Theme variable value (raw). */\n themeValue?: string;\n /**\n * `migrate` flag is orthogonal to the redundant/kept axis: an override may\n * simultaneously be redundant **and** in legacy v3 shape. We still classify\n * it as `migrate` so the user is nudged to rewrite the form first; the\n * `compareCategory` field carries the redundant/kept verdict for that case.\n */\n compareCategory?: 'redundant' | 'kept';\n /** Human-readable explanation. */\n reason: string;\n}\n\nexport interface RunTokensAuditOptions {\n /** Absolute project root. */\n projectRoot: string;\n}\n\nexport type RunTokensAuditResult =\n | {\n status: 'audited';\n themePath: string;\n overridesPath: string;\n totalOverrides: number;\n entries: TokenAuditEntry[];\n /** Bucket counts for quick CLI summary. */\n summary: Record<AuditCategory, number>;\n }\n | {\n status: 'no-theme' | 'no-overrides';\n themePath: string;\n overridesPath: string;\n };\n\n/**\n * Run the audit for `<projectRoot>/tokens/`. Both files are read directly off\n * disk; no manifest lookup. Missing theme is fatal-ish (status `no-theme` —\n * caller decides whether to error). Missing overrides means nothing to audit.\n */\nexport async function runTokensAudit(\n options: RunTokensAuditOptions,\n): Promise<RunTokensAuditResult> {\n const themePath = path.join(options.projectRoot, THEME_REL);\n const overridesPath = path.join(options.projectRoot, OVERRIDES_REL);\n\n const themeSrc = await safeRead(themePath);\n if (themeSrc === null) {\n return { status: 'no-theme', themePath, overridesPath };\n }\n const overridesSrc = await safeRead(overridesPath);\n if (overridesSrc === null) {\n return { status: 'no-overrides', themePath, overridesPath };\n }\n\n const themeTokens = parseCssVariables(themeSrc);\n const overrideTokens = parseCssVariables(overridesSrc);\n\n const themeIndex = new Map<string, ParsedToken>();\n for (const tok of themeTokens) themeIndex.set(tok.name, tok);\n\n const entries: TokenAuditEntry[] = [];\n for (const tok of overrideTokens) {\n entries.push(classifyOverride(tok, themeIndex));\n }\n\n const summary: Record<AuditCategory, number> = {\n redundant: 0,\n kept: 0,\n migrate: 0,\n custom: 0,\n };\n for (const entry of entries) summary[entry.category] += 1;\n\n return {\n status: 'audited',\n themePath,\n overridesPath,\n totalOverrides: entries.length,\n entries,\n summary,\n };\n}\n\nasync function safeRead(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Parse `--name: value;` declarations out of CSS source. We deliberately keep\n * this tolerant: comments are stripped first, then a single regex captures\n * any custom-property assignment regardless of which selector / at-rule block\n * it sits inside (`@theme {}`, `:root {}`, `[data-theme=\"...\"] {}`, etc.).\n *\n * A given variable may legitimately appear multiple times across blocks\n * (e.g. dark-mode override). The parser returns *every* occurrence so callers\n * can decide; the audit code uses last-write-wins on the theme side.\n */\nexport function parseCssVariables(source: string): ParsedToken[] {\n // Strip block comments so they can't shadow a `--var:` inside a comment.\n const stripped = source.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (m) =>\n m.replace(/[^\\n]/g, ' '),\n );\n const out: ParsedToken[] = [];\n const lines = stripped.split('\\n');\n for (let i = 0; i < lines.length; i += 1) {\n const lineRaw = lines[i] ?? '';\n const match = /^\\s*(--[A-Za-z0-9_-]+)\\s*:\\s*([^;]+?)\\s*;/.exec(lineRaw);\n if (!match) continue;\n const name = match[1];\n const value = match[2];\n if (!name || !value) continue;\n out.push({ name, value: value.trim(), line: i + 1 });\n }\n return out;\n}\n\n/**\n * Classify one override token against the theme index.\n *\n * Strategy (in priority order):\n * 1. Direct same-name match (`--color-primary` ↔ `--color-primary`):\n * compare normalised values → redundant / kept.\n * 2. v3 → v4 mapping (`--primary` ↔ `--color-primary`): the override is in\n * legacy shadcn shape (no `--color-` prefix, bare HSL triplet); we wrap\n * it into `hsl(...)` and look up the v4 sibling. Always classified as\n * `migrate`, but we still surface the redundant/kept verdict via\n * `compareCategory`.\n * 3. No match anywhere → `custom`.\n *\n * Note: v3 mapping is best-effort. `--background: 0 0% 100%` maps to\n * `--color-background`. Tokens like `--radius: 0.5rem` (where the v4 `@theme`\n * spec keeps `--radius` un-prefixed) fall through to step 1 cleanly.\n */\nfunction classifyOverride(\n override: ParsedToken,\n themeIndex: Map<string, ParsedToken>,\n): TokenAuditEntry {\n // Step 1 — direct same-name match.\n const direct = themeIndex.get(override.name);\n if (direct) {\n const equal = areValuesSemanticallyEqual(override.value, direct.value);\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: equal ? 'redundant' : 'kept',\n themeName: direct.name,\n themeValue: direct.value,\n reason: equal\n ? `theme already declares ${direct.name} with an equivalent value — safe to delete`\n : `genuinely differs from theme value — kept as user override`,\n };\n }\n\n // Step 2 — v3 → v4 colour mapping. Heuristics:\n // - override name does NOT start with `--color-`\n // - theme has a `--color-<same-suffix>` entry\n // - override value parses as a bare HSL triplet (e.g. `220 9% 7%`) or\n // as a CSS color function. Either way wrapping with `hsl(...)` lets\n // us compare against the theme's v4 form.\n if (!override.name.startsWith('--color-')) {\n const v4Name = `--color-${override.name.slice(2)}`; // strip `--`\n const v4Match = themeIndex.get(v4Name);\n if (v4Match) {\n const wrapped = wrapAsHslIfBare(override.value);\n const equal = areValuesSemanticallyEqual(wrapped, v4Match.value);\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: 'migrate',\n themeName: v4Match.name,\n themeValue: v4Match.value,\n compareCategory: equal ? 'redundant' : 'kept',\n reason: equal\n ? `legacy v3 shape; theme has ${v4Match.name} with equivalent value — rewrite as v4 (or delete)`\n : `legacy v3 shape; rewrite as v4 \\`${v4Name}: hsl(...)\\` and keep override`,\n };\n }\n }\n\n // Step 3 — no match: project-specific extension.\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: 'custom',\n reason: `no matching theme variable — project-specific extension`,\n };\n}\n\n/**\n * Compare two CSS values for semantic equality. Implementation is intentionally\n * narrow: collapse whitespace, lower-case function names, drop trailing zero\n * fractions on numbers. We do NOT attempt full colour-space conversion — the\n * audit is heuristic; users still get a `kept` if values diverge in a way we\n * can't normalise (e.g. `oklch(...)` vs `hsl(...)`).\n */\nexport function areValuesSemanticallyEqual(a: string, b: string): boolean {\n return normaliseCssValue(a) === normaliseCssValue(b);\n}\n\nfunction normaliseCssValue(value: string): string {\n let v = value.trim().toLowerCase();\n // Collapse whitespace runs.\n v = v.replace(/\\s+/g, ' ');\n // Strip whitespace around commas / parens.\n v = v.replace(/\\s*([(),/])\\s*/g, '$1');\n // Drop trailing-zero fractions: `46.700` → `46.7`, `12.0` → `12`.\n v = v\n .replace(/(\\d+\\.\\d*?)0+(?=[^0-9]|$)/g, '$1')\n .replace(/\\.(?=[^0-9]|$)/g, '');\n return v;\n}\n\n/**\n * If the value looks like a bare HSL triplet (`<deg> <pct>% <pct>%` with optional\n * alpha), wrap it as `hsl(...)`. Otherwise return as-is.\n *\n * Examples:\n * `220 9% 7%` → `hsl(220 9% 7%)`\n * `218.6 100% 46.7%` → `hsl(218.6 100% 46.7%)`\n * `0 0% 100% / 0.5` → `hsl(0 0% 100% / 0.5)`\n * `hsl(220 9% 7%)` → unchanged\n * `oklch(0.55 0.22 250)` → unchanged\n */\nexport function wrapAsHslIfBare(value: string): string {\n const trimmed = value.trim();\n // Already a function call.\n if (/^[a-z-]+\\s*\\(/i.test(trimmed)) return trimmed;\n // Bare triplet: <num> <num>% <num>% [/ <num>]\n const triplet =\n /^-?\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?%\\s+\\d+(?:\\.\\d+)?%(?:\\s*\\/\\s*\\S+)?$/;\n if (triplet.test(trimmed)) {\n return `hsl(${trimmed})`;\n }\n return trimmed;\n}\n\n/** Format a single audit entry for human display. */\nexport function formatAuditEntry(entry: TokenAuditEntry): string {\n const head = ` ${entry.name}: ${entry.value};`;\n switch (entry.category) {\n case 'redundant':\n return `${head}\\n → REDUNDANT — ${entry.reason}`;\n case 'kept':\n return `${head}\\n → KEEP — ${entry.reason}`;\n case 'migrate': {\n const sub = entry.compareCategory\n ? ` (currently ${entry.compareCategory})`\n : '';\n return `${head}\\n → MIGRATE${sub} — ${entry.reason}`;\n }\n case 'custom':\n return `${head}\\n → CUSTOM — ${entry.reason}`;\n }\n}\n\n/** Render a section grouped by category for CLI output. */\nexport function renderAuditSummary(\n result: Extract<RunTokensAuditResult, { status: 'audited' }>,\n): string {\n const lines: string[] = [];\n lines.push(`tokens audit · ${result.totalOverrides} override(s) inspected`);\n lines.push(\n ` redundant=${result.summary.redundant} kept=${result.summary.kept} migrate=${result.summary.migrate} custom=${result.summary.custom}`,\n );\n for (const cat of ['redundant', 'migrate', 'custom', 'kept'] as const) {\n const subset = result.entries.filter((e) => e.category === cat);\n if (subset.length === 0) continue;\n lines.push('');\n lines.push(`[${cat.toUpperCase()}] (${subset.length})`);\n for (const entry of subset) lines.push(formatAuditEntry(entry));\n }\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport {\n runCodemod,\n ALL_CODEMODS,\n listCodemodIds,\n} from '../../codemods/index.js';\nimport { buildTokenMapFromProject } from '../../core/tokens-treat.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const codemodCommand = new Command('codemod')\n .description('运行内置 token codemod(默认 dry-run)')\n .argument('[name]', '要运行的 codemod 名称(留空列出所有可用 codemod)')\n .option('--glob <pattern>', '覆盖默认文件匹配规则')\n .option('--apply', '实际应用变更(默认仅展示 dry-run 结果)')\n .option('--list', '列出所有可用 codemod')\n .action(\n async (\n name: string | undefined,\n opts: { glob?: string; apply?: boolean; list?: boolean },\n ) => {\n // --list or no name: show available codemods\n if (opts.list || !name) {\n logger.info('可用 codemods:\\n');\n for (const cm of ALL_CODEMODS) {\n const auto =\n cm.automation === 'full-auto' ? '全自动' : '半自动(AI辅助)';\n logger.info(` ${cm.id.padEnd(24)} ${cm.layer.padEnd(12)} ${auto}`);\n logger.info(`${''.padEnd(24)} ${cm.description}`);\n logger.info('');\n }\n return;\n }\n\n const dryRun = !opts.apply;\n const projectRoot = process.cwd();\n\n try {\n // Build tokenMap for L3-semantic codemods\n const tokenMap = await buildTokenMapFromProject(projectRoot);\n\n const result = await runCodemod({\n projectRoot,\n codemodId: name,\n glob: opts.glob,\n dryRun,\n tokenMap,\n });\n\n const mode = dryRun ? '[dry-run]' : '[applied]';\n logger.info(\n `\\n${mode} ${result.codemodId}: 扫描 ${result.scanned} 个文件, ${result.affected} 个文件命中, ${result.totalMatches} 处匹配\\n`,\n );\n\n for (const file of result.files) {\n logger.info(` 📄 ${file.file} (${file.matches.length} 处)`);\n for (const m of file.matches.slice(0, 5)) {\n const arrow = m.replacement ? ` → ${m.replacement}` : '';\n logger.info(` L${m.line}: ${m.original}${arrow}`);\n logger.info(` ${m.reason}`);\n }\n if (file.matches.length > 5) {\n logger.info(` ... 及其余 ${file.matches.length - 5} 处`);\n }\n }\n\n if (dryRun && result.totalMatches > 0) {\n logger.info('\\n💡 确认后使用 --apply 实际执行变更');\n }\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n },\n );\n","/**\n * Built-in codemod system — public API.\n *\n * Re-exports types, registry, and runner so consumers (CLI commands, tests)\n * can import from a single entry point:\n *\n * ```ts\n * import { runCodemod, ALL_CODEMODS } from '../codemods/index.js';\n * ```\n */\nexport type {\n CodemodLayer,\n CodemodAutomation,\n CodemodMatch,\n CodemodFileResult,\n CodemodDefinition,\n RunCodemodOptions,\n RunCodemodResult,\n} from './types.js';\n\nexport { ALL_CODEMODS, getCodemod, listCodemodIds } from './registry.js';\nexport { runCodemod } from './runner.js';\n","/**\n * Codemod runner — scans project files and applies (or dry-runs) a codemod.\n *\n * Orchestrates: walk → filter by extension → read → transform → optionally\n * write back. The runner is the shared execution engine consumed by the CLI\n * command (`teamix-evo tokens codemod <name>`) and future `tokens treat`.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { walkDir, DEFAULT_SKIP_DIRS } from '../utils/path.js';\nimport { getCodemod } from './registry.js';\nimport type {\n RunCodemodOptions,\n RunCodemodResult,\n CodemodFileResult,\n} from './types.js';\n\n/**\n * Run a single codemod against the project.\n *\n * @throws if the codemod id is unknown.\n */\nexport async function runCodemod(\n options: RunCodemodOptions,\n): Promise<RunCodemodResult> {\n const { projectRoot, codemodId, dryRun = true } = options;\n\n const codemod = getCodemod(codemodId);\n if (!codemod) {\n throw new Error(\n `Unknown codemod \"${codemodId}\". Available: ${(\n await import('./registry.js')\n )\n .listCodemodIds()\n .join(', ')}`,\n );\n }\n\n // Determine the scan root from the glob pattern or default to `src/`.\n // The skeleton uses a simple walkDir approach; full glob support lands\n // in Wave 2 with the `tokens treat` pipeline.\n const scanRoot = path.join(projectRoot, 'src');\n\n let allFiles: string[];\n try {\n allFiles = await walkDir(scanRoot, DEFAULT_SKIP_DIRS);\n } catch {\n // src/ may not exist (e.g. dry-run on a fresh project)\n allFiles = [];\n }\n\n // Filter to target extensions only (dir-level filtering handled by walkDir skipDirs)\n const files = allFiles.filter((abs) => {\n const ext = path.extname(abs).slice(1);\n return codemod.extensions.includes(ext);\n });\n\n const results: CodemodFileResult[] = [];\n let scanned = 0;\n\n for (const absPath of files) {\n scanned++;\n const relFile = path.relative(projectRoot, absPath);\n const content = await fs.readFile(absPath, 'utf-8');\n const result = codemod.transform(content, relFile, options.tokenMap);\n\n if (result) {\n results.push(result);\n\n // Apply changes when not in dry-run mode and the codemod is full-auto\n if (!dryRun && result.rewritten !== null) {\n await fs.writeFile(absPath, result.rewritten, 'utf-8');\n }\n }\n }\n\n const totalMatches = results.reduce((sum, r) => sum + r.matches.length, 0);\n\n return {\n codemodId,\n scanned,\n affected: results.length,\n totalMatches,\n files: results,\n applied: !dryRun && codemod.automation === 'full-auto',\n };\n}\n","/**\n * `tokens treat` — one-click treatment pipeline with metrics.\n *\n * Orchestrates the token treatment flow:\n * 1. Run lint → capture pre-baseline\n * 2. Execute codemods in phase order (L2 → L3 auto)\n * 3. Run lint → capture post-baseline\n * 4. Generate treatment report with delta metrics\n * 5. Optionally lock baseline\n *\n * See PLAN Task 6.3.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { collectTeamixEvoViolations } from '../utils/lint.js';\nimport { logger } from '../utils/logger.js';\nimport { runCodemod } from '../codemods/runner.js';\nimport { listCodemodIds } from '../codemods/registry.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface TreatOptions {\n projectRoot: string;\n /** Lock the post-treatment baseline */\n lockBaseline?: boolean;\n /** Skip npm install after treatment */\n skipInstall?: boolean;\n /** Apply codemods (false = dry-run only) */\n apply?: boolean;\n /** Pre-built token map for L3 codemods. If omitted, auto-parsed from tokens/tokens.theme.css. */\n tokenMap?: Map<string, string>;\n}\n\nexport interface BaselineSnapshot {\n timestamp: string;\n rules: Record<string, number>;\n total: number;\n}\n\nexport interface TreatmentDelta {\n rule: string;\n before: number;\n after: number;\n delta: number;\n percentage: string;\n}\n\nexport interface TreatResult {\n /** Pre-treatment baseline */\n preBaseline: BaselineSnapshot;\n /** Post-treatment baseline */\n postBaseline: BaselineSnapshot;\n /** Per-rule deltas */\n deltas: TreatmentDelta[];\n /** Total reduction */\n totalReduction: number;\n /** Treatment report path */\n reportPath: string;\n /** Whether baseline was locked */\n baselineLocked: boolean;\n}\n\n// ─── Codemod execution order ─────────────────────────────────────────────────\n\n/**\n * Codemods to execute in treatment order.\n * Only full-auto codemods are included in the automatic pipeline.\n */\nconst TREATMENT_CODEMODS = [\n 'hsl-to-v4', // L2 format\n 'hex-to-token', // L3 semantic\n 'tw-scale-to-semantic', // L3 semantic\n 'space-to-gap', // L3 semantic\n] as const;\n\n// ─── Core treat logic ────────────────────────────────────────────────────────\n\nexport async function runTokensTreat(\n options: TreatOptions,\n): Promise<TreatResult> {\n const { projectRoot, lockBaseline = false, apply = false } = options;\n\n // Build token map for L3-semantic codemods\n const tokenMap =\n options.tokenMap ?? (await buildTokenMapFromProject(projectRoot));\n\n // Step 1: Capture pre-treatment baseline\n logger.info(' capturing pre-treatment baseline...');\n const preBaseline = await captureBaseline(projectRoot);\n\n // Step 2: Run codemods\n const codemodResults: Array<{\n id: string;\n matches: number;\n applied: boolean;\n }> = [];\n\n for (const codemodId of TREATMENT_CODEMODS) {\n const availableIds = listCodemodIds();\n if (!availableIds.includes(codemodId)) {\n logger.debug(` codemod ${codemodId} not found, skipping`);\n continue;\n }\n\n logger.info(` running codemod: ${codemodId}...`);\n try {\n const result = await runCodemod({\n projectRoot,\n codemodId,\n dryRun: !apply,\n tokenMap,\n });\n\n const totalMatches = result.files.reduce(\n (sum, f) => sum + f.matches.length,\n 0,\n );\n\n codemodResults.push({\n id: codemodId,\n matches: totalMatches,\n applied: apply && totalMatches > 0,\n });\n\n if (totalMatches > 0) {\n logger.info(\n ` ${codemodId}: ${totalMatches} matches${\n apply ? ' (applied)' : ' (dry-run)'\n }`,\n );\n }\n } catch (err) {\n logger.warn(\n ` ${codemodId} failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n codemodResults.push({ id: codemodId, matches: 0, applied: false });\n }\n }\n\n // Step 3: Capture post-treatment baseline\n logger.info(' capturing post-treatment baseline...');\n const postBaseline = await captureBaseline(projectRoot);\n\n // Step 4: Calculate deltas\n const deltas: TreatmentDelta[] = [];\n const allRules = new Set([\n ...Object.keys(preBaseline.rules),\n ...Object.keys(postBaseline.rules),\n ]);\n\n for (const rule of allRules) {\n const before = preBaseline.rules[rule] ?? 0;\n const after = postBaseline.rules[rule] ?? 0;\n if (before === 0 && after === 0) continue;\n\n const delta = after - before;\n const percentage =\n before > 0\n ? `${delta >= 0 ? '+' : ''}${Math.round((delta / before) * 100)}%`\n : after > 0\n ? '+∞'\n : '0%';\n\n deltas.push({ rule, before, after, delta, percentage });\n }\n\n const totalReduction = preBaseline.total - postBaseline.total;\n\n // Step 5: Generate report\n const reportPath = await generateTreatmentReport(\n projectRoot,\n preBaseline,\n postBaseline,\n deltas,\n codemodResults,\n );\n\n // Step 6: Optionally lock baseline\n let baselineLocked = false;\n if (lockBaseline) {\n await lockBaselineFile(projectRoot, postBaseline);\n baselineLocked = true;\n logger.info(' baseline locked → .teamix-evo/tokens-baseline.json');\n }\n\n return {\n preBaseline,\n postBaseline,\n deltas,\n totalReduction,\n reportPath,\n baselineLocked,\n };\n}\n\n// ─── Baseline capture ────────────────────────────────────────────────────────\n\nasync function captureBaseline(projectRoot: string): Promise<BaselineSnapshot> {\n const rules = await collectTeamixEvoViolations(projectRoot);\n const total = Object.values(rules).reduce((sum, n) => sum + n, 0);\n\n return {\n timestamp: new Date().toISOString(),\n rules,\n total,\n };\n}\n\n// ─── Report generation ───────────────────────────────────────────────────────\n\nasync function generateTreatmentReport(\n projectRoot: string,\n pre: BaselineSnapshot,\n post: BaselineSnapshot,\n deltas: TreatmentDelta[],\n codemodResults: Array<{ id: string; matches: number; applied: boolean }>,\n): Promise<string> {\n const reportsDir = path.join(\n projectRoot,\n '.teamix-evo',\n '.treatment-reports',\n );\n await ensureDir(reportsDir);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const reportPath = path.join(reportsDir, `${ts}.md`);\n\n let content = `# Token 治理报告\n\n> 执行时间: ${post.timestamp}\n> 前置基线: ${pre.total} violations\n> 后置基线: ${post.total} violations\n> **总降幅: ${pre.total - post.total} (${\n pre.total > 0 ? Math.round(((pre.total - post.total) / pre.total) * 100) : 0\n }%)**\n\n## 降幅对比表\n\n| 规则 | 治理前 | 治理后 | 变化 |\n| ---- | ------ | ------ | ---- |\n`;\n\n for (const d of deltas) {\n content += `| \\`${d.rule}\\` | ${d.before} | ${d.after} | ${d.percentage} |\\n`;\n }\n\n content += `\\n## Codemod 执行记录\\n\\n`;\n content += '| Codemod | 匹配数 | 已应用 |\\n| ------- | ------ | ------ |\\n';\n\n for (const c of codemodResults) {\n content += `| \\`${c.id}\\` | ${c.matches} | ${\n c.applied ? '✅' : '❌ (dry-run)'\n } |\\n`;\n }\n\n content += `\\n---\\n\\n> 锁定基线: \\`npx teamix-evo tokens treat --lock-baseline\\`\\n`;\n\n await fs.writeFile(reportPath, content, 'utf-8');\n return reportPath;\n}\n\n// ─── Baseline lock ───────────────────────────────────────────────────────────\n\nasync function lockBaselineFile(\n projectRoot: string,\n baseline: BaselineSnapshot,\n): Promise<void> {\n const baselinePath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-baseline.json',\n );\n await fs.writeFile(\n baselinePath,\n JSON.stringify(baseline, null, 2) + '\\n',\n 'utf-8',\n );\n}\n\n// ─── Token map builder ───────────────────────────────────────────────────────────\n\n/**\n * Parse CSS custom properties from the project's token files and build\n * a reverse lookup map: normalised hex value → CSS variable name (without --).\n *\n * Reads `tokens/tokens.theme.css` and `tokens/tokens.overrides.css`.\n */\nexport async function buildTokenMapFromProject(\n projectRoot: string,\n): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n const tokenFiles = [\n path.join(projectRoot, 'tokens', 'tokens.theme.css'),\n path.join(projectRoot, 'tokens', 'tokens.overrides.css'),\n ];\n\n for (const file of tokenFiles) {\n const content = await readFileOrNull(file);\n if (!content) continue;\n\n // Match lines like: --color-primary: #1a2b3c;\n const propRe = /--([\\w-]+):\\s*(#[0-9a-fA-F]{3,8})\\b/g;\n let m: RegExpExecArray | null;\n while ((m = propRe.exec(content)) !== null) {\n const varName = m[1]!;\n const hex = normaliseHexForMap(m[2]!);\n // First occurrence wins (theme > overrides handled by file order)\n if (!map.has(hex)) {\n map.set(hex, varName);\n }\n }\n }\n\n return map;\n}\n\n/** Normalise hex to lowercase 6-digit form for consistent map lookup. */\nfunction normaliseHexForMap(hex: string): string {\n const raw = hex.slice(1).toLowerCase();\n if (raw.length === 3)\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 4)\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 8) return `#${raw.slice(0, 6)}`;\n return `#${raw}`;\n}\n","/**\n * Shared ESLint execution utilities for baseline/treatment modules.\n */\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Run ESLint in JSON format and collect `teamix-evo/` rule violation counts.\n *\n * Returns an empty record when ESLint is unavailable, produces no output,\n * or when JSON parsing fails. This makes it safe to call in environments\n * without ESLint installed (e.g. CI without devDeps).\n */\nexport async function collectTeamixEvoViolations(\n projectRoot: string,\n): Promise<Record<string, number>> {\n const rules: Record<string, number> = {};\n\n try {\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n messages: Array<{ ruleId: string | null }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n if (msg.ruleId && msg.ruleId.startsWith('teamix-evo/')) {\n rules[msg.ruleId] = (rules[msg.ruleId] ?? 0) + 1;\n }\n }\n }\n } catch {\n // JSON parse failure — return empty\n }\n }\n } catch {\n // ESLint not available or timed out\n }\n\n return rules;\n}\n","/**\n * CLI command: `teamix-evo tokens diagnose`\n * See PLAN Task 6.2.\n */\nimport { Command } from 'commander';\nimport { runTokensDiagnose } from '../../core/tokens-diagnose.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const diagnoseCommand = new Command('diagnose')\n .description('生成分级 token 治理计划(.teamix-evo/.treatment-plan.md)')\n .action(async () => {\n const projectRoot = process.cwd();\n logger.info('Running tokens diagnose...');\n\n try {\n const result = await runTokensDiagnose({ projectRoot });\n\n logger.info(`\\nToken 治理计划已生成: ${result.planPath}`);\n logger.info(`总违规数: ${result.totalViolations}`);\n logger.info('');\n\n const phases = [\n { key: 'L1-structure' as const, label: 'L1 结构' },\n { key: 'L2-format' as const, label: 'L2 格式' },\n { key: 'L3-semantic-auto' as const, label: 'L3 自动' },\n { key: 'L3-semantic-semi' as const, label: 'L3 半自动' },\n { key: 'L3-manual' as const, label: 'L3 人工' },\n { key: 'reflect' as const, label: '反哺' },\n ];\n\n for (const p of phases) {\n const count = result.phaseSummary[p.key];\n if (count > 0) {\n logger.info(` ${p.label}: ${count} violations`);\n }\n }\n\n logger.info('\\n执行治理: npx teamix-evo tokens treat');\n } catch (err) {\n logger.error(\n `diagnose failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * `tokens diagnose` — tiered treatment plan generator.\n *\n * Scans the project for token-related lint violations and classifies them\n * into treatment phases (L1 structure → L2 format → L3 semantic → L3 semi-auto\n * → L3 manual → reflect). Produces `.teamix-evo/.treatment-plan.md`.\n *\n * See PLAN Task 6.2.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport type TreatmentPhase =\n | 'L1-structure'\n | 'L2-format'\n | 'L3-semantic-auto'\n | 'L3-semantic-semi'\n | 'L3-manual'\n | 'reflect';\n\nexport interface DiagnosticEntry {\n /** ESLint/Stylelint rule id */\n ruleId: string;\n /** Phase classification */\n phase: TreatmentPhase;\n /** Number of violations */\n count: number;\n /** Recommended codemod or action */\n action: string;\n /** Automation level */\n automation: 'full-auto' | 'semi-auto' | 'manual';\n}\n\nexport interface DiagnoseResult {\n /** Treatment plan file path */\n planPath: string;\n /** All diagnostic entries by phase */\n entries: DiagnosticEntry[];\n /** Total violation count */\n totalViolations: number;\n /** Per-phase summary */\n phaseSummary: Record<TreatmentPhase, number>;\n}\n\n// ─── Rule → Phase mapping ────────────────────────────────────────────────────\n\nconst RULE_PHASE_MAP: Record<\n string,\n {\n phase: TreatmentPhase;\n action: string;\n automation: DiagnosticEntry['automation'];\n }\n> = {\n // L2 format\n 'teamix-evo/no-color-literal': {\n phase: 'L2-format',\n action: 'codemod: hsl-to-v4 → hex-to-token',\n automation: 'full-auto',\n },\n // L3 semantic auto\n 'teamix-evo/no-raw-color-scale': {\n phase: 'L3-semantic-auto',\n action: 'codemod: tw-scale-to-semantic',\n automation: 'full-auto',\n },\n 'teamix-evo/prefer-gap-over-space': {\n phase: 'L3-semantic-auto',\n action: 'codemod: space-to-gap',\n automation: 'full-auto',\n },\n // L3 semi-auto\n 'teamix-evo/no-arbitrary-tw-value': {\n phase: 'L3-semantic-semi',\n action: 'codemod: arbitrary-to-token (AI assist)',\n automation: 'semi-auto',\n },\n // L3 manual\n 'teamix-evo/no-large-radius': {\n phase: 'L3-manual',\n action: 'manual: use semantic radius tokens',\n automation: 'manual',\n },\n 'teamix-evo/no-bare-border': {\n phase: 'L3-manual',\n action: 'manual: use semantic border tokens',\n automation: 'manual',\n },\n 'teamix-evo/no-manual-dark-classnames': {\n phase: 'L3-manual',\n action: 'manual: use CSS custom properties for dark mode',\n automation: 'manual',\n },\n};\n\n// ─── Core diagnose logic ─────────────────────────────────────────────────────\n\n/**\n * Run lint and classify violations into treatment phases.\n */\nexport async function runTokensDiagnose(options: {\n projectRoot: string;\n}): Promise<DiagnoseResult> {\n const { projectRoot } = options;\n\n // Try to run ESLint and parse output\n const violations = await collectLintViolations(projectRoot);\n\n // Classify into diagnostic entries\n const entryMap = new Map<string, DiagnosticEntry>();\n\n for (const { ruleId } of violations) {\n if (!ruleId) continue;\n const mapping = RULE_PHASE_MAP[ruleId];\n if (!mapping) continue;\n\n const existing = entryMap.get(ruleId);\n if (existing) {\n existing.count++;\n } else {\n entryMap.set(ruleId, {\n ruleId,\n phase: mapping.phase,\n count: 1,\n action: mapping.action,\n automation: mapping.automation,\n });\n }\n }\n\n const entries = [...entryMap.values()].sort((a, b) => {\n const phaseOrder: TreatmentPhase[] = [\n 'L1-structure',\n 'L2-format',\n 'L3-semantic-auto',\n 'L3-semantic-semi',\n 'L3-manual',\n 'reflect',\n ];\n return phaseOrder.indexOf(a.phase) - phaseOrder.indexOf(b.phase);\n });\n\n const totalViolations = entries.reduce((sum, e) => sum + e.count, 0);\n\n const phaseSummary: Record<TreatmentPhase, number> = {\n 'L1-structure': 0,\n 'L2-format': 0,\n 'L3-semantic-auto': 0,\n 'L3-semantic-semi': 0,\n 'L3-manual': 0,\n reflect: 0,\n };\n\n for (const entry of entries) {\n phaseSummary[entry.phase] += entry.count;\n }\n\n // Generate treatment plan markdown\n const planPath = await generateTreatmentPlan(\n projectRoot,\n entries,\n totalViolations,\n phaseSummary,\n );\n\n return { planPath, entries, totalViolations, phaseSummary };\n}\n\n// ─── Lint runner ─────────────────────────────────────────────────────────────\n\ninterface LintViolation {\n ruleId: string | null;\n file: string;\n line: number;\n}\n\nasync function collectLintViolations(\n projectRoot: string,\n): Promise<LintViolation[]> {\n const violations: LintViolation[] = [];\n\n try {\n // Run ESLint with JSON formatter\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n filePath: string;\n messages: Array<{\n ruleId: string | null;\n line: number;\n }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n violations.push({\n ruleId: msg.ruleId,\n file: path.relative(projectRoot, result.filePath),\n line: msg.line,\n });\n }\n }\n } catch {\n logger.debug('Failed to parse ESLint JSON output');\n }\n }\n } catch {\n logger.debug('ESLint not available or failed — using empty violations');\n }\n\n return violations;\n}\n\n// ─── Treatment plan generator ────────────────────────────────────────────────\n\nasync function generateTreatmentPlan(\n projectRoot: string,\n entries: DiagnosticEntry[],\n totalViolations: number,\n phaseSummary: Record<TreatmentPhase, number>,\n): Promise<string> {\n const teamixDir = path.join(projectRoot, '.teamix-evo');\n await ensureDir(teamixDir);\n const planPath = path.join(teamixDir, '.treatment-plan.md');\n\n const now = new Date().toISOString().slice(0, 19).replace('T', ' ');\n\n const phases: Array<{\n phase: TreatmentPhase;\n title: string;\n description: string;\n }> = [\n {\n phase: 'L1-structure',\n title: 'Phase 1 · L1 结构治理',\n description: '`tokens audit` 输出:token 文件结构完整性检查',\n },\n {\n phase: 'L2-format',\n title: 'Phase 2 · L2 格式归一化',\n description: '推荐 codemod: `hsl-to-v4`',\n },\n {\n phase: 'L3-semantic-auto',\n title: 'Phase 3 · L3 语义替换(自动批次)',\n description:\n 'codemod: `hex-to-token` / `tw-scale-to-semantic` / `space-to-gap`',\n },\n {\n phase: 'L3-semantic-semi',\n title: 'Phase 4 · L3 半自动(AI 引导)',\n description: '`no-arbitrary-tw-value` 清单,由 AI 选候选 token',\n },\n {\n phase: 'L3-manual',\n title: 'Phase 5 · L3 纯人工',\n description: '需要开发者判断语义的 lint 违规',\n },\n {\n phase: 'reflect',\n title: 'Phase 6 · Token 反哺建议',\n description: '高频色值 → 项目级 token 候选',\n },\n ];\n\n let content = `# Token 治理计划\n\n> 生成时间: ${now}\n> 总违规数: ${totalViolations}\n\n## 概览\n\n| Phase | 违规数 | 自动化 |\n| ----- | ------ | ------ |\n`;\n\n for (const p of phases) {\n const count = phaseSummary[p.phase];\n const auto =\n p.phase === 'L1-structure'\n ? 'audit'\n : p.phase === 'L2-format' || p.phase === 'L3-semantic-auto'\n ? '全自动'\n : p.phase === 'L3-semantic-semi'\n ? 'AI 辅助'\n : p.phase === 'reflect'\n ? '分析'\n : '人工';\n content += `| ${p.title} | ${count} | ${auto} |\\n`;\n }\n\n content += '\\n---\\n\\n';\n\n for (const p of phases) {\n const phaseEntries = entries.filter((e) => e.phase === p.phase);\n content += `## ${p.title}\\n\\n${p.description}\\n\\n`;\n\n if (phaseEntries.length > 0) {\n content += '| 规则 | 违规数 | 处理方式 |\\n| ---- | ------ | -------- |\\n';\n for (const e of phaseEntries) {\n content += `| \\`${e.ruleId}\\` | ${e.count} | ${e.action} |\\n`;\n }\n } else {\n content += '_(无违规)_\\n';\n }\n content += '\\n';\n }\n\n content += `---\\n\\n> 执行治理流水线: \\`npx teamix-evo tokens treat\\`\\n`;\n\n await fs.writeFile(planPath, content, 'utf-8');\n return planPath;\n}\n","/**\n * CLI command: `teamix-evo tokens treat`\n * See PLAN Task 6.3.\n */\nimport { Command } from 'commander';\nimport { runTokensTreat } from '../../core/tokens-treat.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const treatCommand = new Command('treat')\n .description('一键 token 治理流水线(codemod + 度量报告)')\n .option('--lock-baseline', '治理后锁定基线到 tokens-baseline.json')\n .option('--apply', '应用 codemod 修改(默认 dry-run)')\n .option('--skip-install', '跳过 npm install')\n .action(\n async (opts: {\n lockBaseline?: boolean;\n apply?: boolean;\n skipInstall?: boolean;\n }) => {\n const projectRoot = process.cwd();\n logger.info('Running tokens treat...');\n\n try {\n const result = await runTokensTreat({\n projectRoot,\n lockBaseline: opts.lockBaseline,\n apply: opts.apply,\n skipInstall: opts.skipInstall,\n });\n\n logger.info(`\\n治理报告: ${result.reportPath}`);\n logger.info(`前置基线: ${result.preBaseline.total} violations`);\n logger.info(`后置基线: ${result.postBaseline.total} violations`);\n logger.info(\n `总降幅: -${result.totalReduction} (${\n result.preBaseline.total > 0\n ? Math.round(\n (result.totalReduction / result.preBaseline.total) * 100,\n )\n : 0\n }%)`,\n );\n\n if (result.deltas.length > 0) {\n logger.info('\\n降幅明细:');\n for (const d of result.deltas) {\n logger.info(\n ` ${d.rule}: ${d.before} → ${d.after} (${d.percentage})`,\n );\n }\n }\n\n if (result.baselineLocked) {\n logger.info('\\n基线已锁定 → .teamix-evo/tokens-baseline.json');\n }\n } catch (err) {\n logger.error(\n `treat failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n },\n );\n","/**\n * CLI command: `teamix-evo tokens reflect`\n * See PLAN Task 6.4.\n */\nimport { Command } from 'commander';\nimport { runTokensReflect } from '../../core/tokens-reflect.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const reflectCommand = new Command('reflect')\n .description('扫描重复色值,推荐新增项目级 token(反哺)')\n .option('--min-frequency <n>', '最少出现次数(默认 3)', '3')\n .action(async (opts: { minFrequency?: string }) => {\n const projectRoot = process.cwd();\n const minFrequency = parseInt(opts.minFrequency ?? '3', 10) || 3;\n logger.info('Running tokens reflect...');\n\n try {\n const result = await runTokensReflect({ projectRoot, minFrequency });\n\n logger.info(`\\n扫描完成: ${result.totalUniqueColors} 个唯一色值`);\n logger.info(`低于阈值: ${result.belowThreshold} 个`);\n logger.info(`推荐新增 token: ${result.candidates.length} 个\\n`);\n\n if (result.candidates.length > 0) {\n logger.info('建议新增的 token:');\n logger.info('');\n for (const c of result.candidates.slice(0, 20)) {\n logger.info(\n ` ${c.value.padEnd(10)} (${c.frequency}次) → --${c.suggestedName}`,\n );\n logger.info(\n `${''.padEnd(14)}出现于: ${[...c.files].slice(0, 3).join(', ')}${\n c.files.length > 3 ? ` +${c.files.length - 3}` : ''\n }`,\n );\n }\n if (result.candidates.length > 20) {\n logger.info(`\\n ... 及其余 ${result.candidates.length - 20} 个`);\n }\n logger.info(\n '\\n💡 将建议的 token 添加到 tokens/tokens.overrides.css 中',\n );\n } else {\n logger.info('✅ 当前项目无高频重复色值,无需新增 token');\n }\n } catch (err) {\n logger.error(\n `reflect failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * Token reflect (反哺) mechanism.\n *\n * Scans remaining `no-color-literal` violations, clusters color values\n * by frequency and hue proximity, and suggests new project-level tokens.\n *\n * See PLAN Task 6.4.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface ColorCandidate {\n /** Raw color value (hex) */\n value: string;\n /** Number of occurrences across the project */\n frequency: number;\n /** Files where this color appears */\n files: string[];\n /** Suggested semantic token name */\n suggestedName: string;\n}\n\nexport interface ReflectResult {\n /** Color candidates grouped by frequency ≥ threshold */\n candidates: ColorCandidate[];\n /** Total unique colors found */\n totalUniqueColors: number;\n /** Colors with frequency below threshold (not suggested) */\n belowThreshold: number;\n}\n\nexport interface ReflectOptions {\n projectRoot: string;\n /** Minimum occurrence count to suggest a token (default: 3) */\n minFrequency?: number;\n}\n\n// ─── Core reflect logic ──────────────────────────────────────────────────────\n\n/**\n * Scan project for repeated color literals and suggest project-level tokens.\n */\nexport async function runTokensReflect(\n options: ReflectOptions,\n): Promise<ReflectResult> {\n const { projectRoot, minFrequency = 3 } = options;\n\n // Collect color literals from ESLint violations\n const colorMap = new Map<string, { frequency: number; files: Set<string> }>();\n\n try {\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --rule \\'{\"teamix-evo/no-color-literal\": \"error\"}\\' --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n filePath: string;\n messages: Array<{\n ruleId: string | null;\n message: string;\n }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n if (msg.ruleId !== 'teamix-evo/no-color-literal') continue;\n\n // Extract color value from message\n const colorMatch = msg.message.match(/#[0-9a-fA-F]{3,8}/);\n if (!colorMatch) continue;\n const color = normaliseHex(colorMatch[0]);\n const relFile = path.relative(projectRoot, result.filePath);\n\n const entry = colorMap.get(color) ?? {\n frequency: 0,\n files: new Set<string>(),\n };\n entry.frequency++;\n entry.files.add(relFile);\n colorMap.set(color, entry);\n }\n }\n } catch {\n // Parse failure\n }\n }\n } catch {\n // ESLint not available\n }\n\n const totalUniqueColors = colorMap.size;\n const candidates: ColorCandidate[] = [];\n let belowThreshold = 0;\n\n for (const [value, entry] of colorMap) {\n if (entry.frequency >= minFrequency) {\n candidates.push({\n value,\n frequency: entry.frequency,\n files: [...entry.files],\n suggestedName: suggestTokenName(value, entry.files),\n });\n } else {\n belowThreshold++;\n }\n }\n\n // Sort by frequency descending\n candidates.sort((a, b) => b.frequency - a.frequency);\n\n return { candidates, totalUniqueColors, belowThreshold };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction normaliseHex(hex: string): string {\n const h = hex.replace('#', '').toLowerCase();\n if (h.length === 3) {\n return `#${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n }\n return `#${h.slice(0, 6)}`;\n}\n\n/**\n * Suggest a semantic token name based on file context.\n * Simple heuristic: extract the most common parent directory name.\n */\nfunction suggestTokenName(color: string, files: Iterable<string>): string {\n const dirCounts = new Map<string, number>();\n for (const file of files) {\n const parts = file.split('/');\n // Take the component/feature directory name (usually 2nd-to-last segment)\n const dirName = parts.length >= 2 ? parts[parts.length - 2] : 'project';\n if (dirName) {\n dirCounts.set(dirName, (dirCounts.get(dirName) ?? 0) + 1);\n }\n }\n\n let topDir = 'custom';\n let topCount = 0;\n for (const [dir, count] of dirCounts) {\n if (count > topCount) {\n topDir = dir;\n topCount = count;\n }\n }\n\n // Convert to kebab-case token name\n const kebab = topDir\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '');\n return `--color-${kebab}-accent`;\n}\n\n// ─── CLI command ─────────────────────────────────────────────────────────────\n\nexport { type ColorCandidate as ReflectColorCandidate };\n","/**\n * CLI command: `teamix-evo tokens baseline-check`\n *\n * Compares current lint violations against the locked baseline\n * (`.teamix-evo/tokens-baseline.json`). Fails when violations exceed\n * baseline counts — suitable for CI integration.\n */\nimport { Command } from 'commander';\nimport { checkBaseline } from '../../core/baseline-check.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const baselineCheckCommand = new Command('baseline-check')\n .description('对比 baseline 检查 token 违规是否超标(CI 友好)')\n .action(async () => {\n const projectRoot = process.cwd();\n\n try {\n const result = await checkBaseline(projectRoot);\n\n if (result.status === 'no-baseline') {\n logger.info(\n 'No baseline found (.teamix-evo/tokens-baseline.json). Run `tokens treat --lock-baseline` first.',\n );\n return;\n }\n\n if (result.status === 'pass') {\n logger.info(\n `✅ Baseline check PASSED (${result.currentTotal}/${result.baselineTotal} violations)`,\n );\n return;\n }\n\n // status === 'fail'\n const violations = result.violations ?? [];\n logger.error(\n `❌ Baseline check FAILED — ${violations.length} rule(s) exceeded:`,\n );\n for (const v of violations) {\n logger.error(\n ` ${v.rule}: ${v.current} > ${v.baseline} (+${v.exceeded})`,\n );\n }\n logger.error(\n `\\n Total: ${result.currentTotal} (baseline: ${result.baselineTotal})`,\n );\n process.exitCode = 1;\n } catch (err) {\n logger.error(\n `baseline-check failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * Lint baseline enforcement module.\n *\n * Reads `.teamix-evo/tokens-baseline.json` (written by `tokens treat\n * --lock-baseline`) and compares current violation counts. Returns PASS\n * when current ≤ baseline, FAIL when exceeded.\n *\n * This is NOT an ESLint rule but a standalone check suitable for CI\n * integration. Called by `tokens treat --lock-baseline` validation and\n * can be wired into `package.json` scripts.\n *\n * See PLAN Task 6.5.\n */\nimport * as path from 'node:path';\nimport { readFileOrNull } from '../utils/fs.js';\nimport { collectTeamixEvoViolations } from '../utils/lint.js';\nimport { logger } from '../utils/logger.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface BaselineData {\n timestamp: string;\n rules: Record<string, number>;\n total: number;\n}\n\nexport interface BaselineCheckResult {\n status: 'pass' | 'fail' | 'no-baseline';\n /** Present when status is 'fail' */\n violations?: Array<{\n rule: string;\n baseline: number;\n current: number;\n exceeded: number;\n }>;\n /** Total current violations */\n currentTotal?: number;\n /** Total baseline violations */\n baselineTotal?: number;\n}\n\n// ─── Core check logic ────────────────────────────────────────────────────────\n\n/**\n * Check whether current lint violations exceed the locked baseline.\n */\nexport async function checkBaseline(\n projectRoot: string,\n): Promise<BaselineCheckResult> {\n // Read baseline\n const baselinePath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-baseline.json',\n );\n const raw = await readFileOrNull(baselinePath);\n if (!raw) {\n return { status: 'no-baseline' };\n }\n\n let baseline: BaselineData;\n try {\n baseline = JSON.parse(raw) as BaselineData;\n } catch {\n logger.warn('Invalid tokens-baseline.json format');\n return { status: 'no-baseline' };\n }\n\n // Get current violations\n const currentRules = await collectTeamixEvoViolations(projectRoot);\n\n const currentTotal = Object.values(currentRules).reduce(\n (sum, n) => sum + n,\n 0,\n );\n\n // Compare per-rule\n const violations: BaselineCheckResult['violations'] = [];\n\n for (const [rule, baselineCount] of Object.entries(baseline.rules)) {\n const currentCount = currentRules[rule] ?? 0;\n if (currentCount > baselineCount) {\n violations.push({\n rule,\n baseline: baselineCount,\n current: currentCount,\n exceeded: currentCount - baselineCount,\n });\n }\n }\n\n // Check for new rules not in baseline\n for (const [rule, currentCount] of Object.entries(currentRules)) {\n if (!(rule in baseline.rules) && currentCount > 0) {\n violations.push({\n rule,\n baseline: 0,\n current: currentCount,\n exceeded: currentCount,\n });\n }\n }\n\n if (violations.length > 0) {\n return {\n status: 'fail',\n violations,\n currentTotal,\n baselineTotal: baseline.total,\n };\n }\n\n return {\n status: 'pass',\n currentTotal,\n baselineTotal: baseline.total,\n };\n}\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\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(initCommand);\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 { runSkillsInit } from '../../core/skills-add.js';\nimport {\n ensureGlobalMetaRoot,\n hasPackageJson,\n isTeamixEvoProject,\n} from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface InitOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '自举 teamix-evo skills(按 tokens variant + scope 全装符合条件的 skill;scope 为 global-only 的 entry skill 自动跳过 — ADR 0033)',\n )\n .option('--ide <list>', '逗号分隔的 IDE 列表,如 \"qoder,claude\"')\n .option('--scope <scope>', 'project | global(默认 project)')\n .option('-y, --yes', '使用默认值,跳过交互')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n\n const { ides, scope } = await resolveIdesAndScope({ opts });\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.exitCode = 1;\n return;\n }\n\n logger.info(\n `Initializing skills (bulk): ides=[${ides.join(\n ',',\n )}], scope=\"${scope}\"`,\n );\n logger.debug(`Project root: ${projectRoot}`);\n\n const result = await runSkillsInit({\n projectRoot,\n ides,\n scope,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n `Skills already initialized. Use \"npx teamix-evo@latest skills add <name>\" to add specific skills, ` +\n `\"npx teamix-evo@latest skills update\" to refresh, or \"npx teamix-evo@latest skills uninstall\" to remove.`,\n );\n return;\n }\n\n logger.success(`Skills initialized: ${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 if (result.autoUpdatedSkillIds.length > 0) {\n logger.success(\n ` Auto-upgraded: ${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info(\n 'Run \"npx teamix-evo@latest skills list\" to see installed skills.',\n );\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('skills init 已取消。');\n return;\n }\n logger.error(`Failed to init skills: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: InitOptions;\n}): Promise<{ ides: SkillIde[]; scope: SkillScope }> {\n const { opts } = args;\n\n // Non-TTY (CI / AI agent / piped stdin): default to \"yes\" so @clack/prompts\n // never tries `uv_tty_init` and crashes with `EINVAL`. The user can still\n // override via --ide / --scope.\n const isInteractive = Boolean(process.stdin.isTTY);\n\n // From CLI flags / -y / non-TTY\n if (opts.ide || opts.yes || !isInteractive) {\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 CancelledError();\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 CancelledError();\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\n}\n","/**\n * Sentinel error thrown when an interactive prompt is cancelled (Ctrl-C / Esc\n * inside `@clack/prompts`). Command-layer entry points use `instanceof\n * CancelledError` to print a soft \"cancelled\" message and exit cleanly,\n * instead of fragile string matching against `err.message`.\n *\n * Library / core code MUST NOT swallow `CancelledError` — let it propagate so\n * the command layer can distinguish a real failure from a user-aborted prompt.\n */\nexport class CancelledError extends Error {\n constructor(message = 'Cancelled by user.') {\n super(message);\n this.name = 'CancelledError';\n }\n}\n","import type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { ALL_IDE_KINDS } from '../../ide/index.js';\n\nexport function 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\nexport function parseScope(input?: string): 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 * 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';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface AddOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const addCommand = new Command('add')\n .description(\n '增量添加 teamix-evo skills(必须指定至少一个 skill id;自举请用 `skills init`)',\n )\n .argument('<names...>', '至少一个 skill id(增量装)')\n .option('--ide <list>', '逗号分隔的 IDE 列表,如 \"qoder,claude\"')\n .option(\n '--scope <scope>',\n 'project | global(默认沿用既有 skills 配置;首次安装默认 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\n const { ides, scope } = await resolveIdesAndScope({\n opts,\n projectRoot: cwd,\n });\n\n // scope=global 且 cwd 不是 Teamix Evo 项目 → 元数据写到全局根\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 logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(\n `Adding skills [${names.join(',')}]: ides=[${ides.join(\n ',',\n )}], 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,\n });\n\n const hasAdded = result.addedSkillIds.length > 0;\n const hasSkipped = result.skippedSkillIds.length > 0;\n const hasAutoUpdated = result.autoUpdatedSkillIds.length > 0;\n\n // Branch 1: nothing freshly added.\n if (!hasAdded) {\n if (hasAutoUpdated) {\n logger.success(\n `已自动升级至最新版本:${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n if (hasSkipped) {\n if (hasAutoUpdated) {\n logger.info(`其余已是最新:${result.skippedSkillIds.join(', ')}`);\n } else {\n logger.warn(\n `已存在,无需添加:${result.skippedSkillIds.join(\n ', ',\n )}。如需刷新内容请运行 \"npx teamix-evo@latest skills update\"。`,\n );\n }\n }\n return;\n }\n\n // Branch 2: at least one new skill installed.\n logger.success(`Skills added: ${result.skillCount} skill(s)`);\n logger.info(` IDEs: ${result.ides.join(', ')}`);\n logger.info(` Scope: ${result.scope}`);\n logger.info(` Added: ${result.addedSkillIds.join(', ')}`);\n if (hasSkipped) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (already added)`,\n );\n }\n if (hasAutoUpdated) {\n logger.success(\n ` Auto-upgraded: ${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info(\n 'Run \"npx teamix-evo@latest skills list\" to see installed skills.',\n );\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('skills add 已取消。');\n return;\n }\n logger.error(`Failed to add skills: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: AddOptions;\n projectRoot: string;\n}): Promise<{ ides: SkillIde[]; scope: SkillScope }> {\n const { opts, projectRoot } = args;\n\n // Default: silently reuse existing config when no flags are given.\n if (!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 / -y\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 CancelledError();\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 CancelledError();\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Run \"npx teamix-evo@latest skills init\" to get started.',\n );\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 \"npx teamix-evo@latest skills doctor\" to repair.`,\n );\n } else {\n logger.info('Skills package not yet added.');\n logger.info(\n 'Run \"npx teamix-evo@latest skills init\" to bootstrap, or \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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: ${getErrorMessage(err)}`);\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 { createRequire } from 'node:module';\nimport { detectIde } from '../../ide/index.js';\nimport {\n runSkillsUpdate,\n type UpdatePlanItem,\n} from '../../core/skills-update.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport {\n resolveSkillsMaintenanceRoot,\n getGlobalMetaRoot,\n isTeamixEvoProject,\n} from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { parseScope } from './_parse.js';\n\nconst require = createRequire(import.meta.url);\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface UpdateOptions {\n dryRun?: boolean;\n scope?: string;\n}\n\nexport const updateCommand = new Command('update')\n .description(\n '更新已安装的 teamix-evo skills(仅升级 lock 已记录且 scope 匹配的 skill — ADR 0035)',\n )\n .argument('[names...]', '可选:仅升级指定 skill id;省略则升级全部已装')\n .option('--dry-run', '预览变更,不写盘')\n .option(\n '--scope <scope>',\n 'project | global(默认按 cwd 推断:cwd 是项目→project;否则 fallback 到全局)',\n )\n .action(async (names: string[], opts: UpdateOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveUpdateRoot(cwd, opts.scope);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n // Banner: CLI version + skills package version.\n await printVersionBanner();\n\n const result = await runSkillsUpdate({\n projectRoot,\n names: names.length > 0 ? names : undefined,\n dryRun: opts.dryRun,\n });\n\n switch (result.status) {\n case 'no-skills':\n logger.error(\n 'Skills not added. Run \"npx teamix-evo@latest skills init\" first.',\n );\n process.exitCode = 1;\n return;\n\n case 'no-changes':\n logger.success(\n `Already up-to-date (skills package v${result.version}).`,\n );\n logger.info(\n ` Checked: ${result.checkedSkillIds.join(', ') || '(none)'}`,\n );\n return;\n\n case 'dry-run':\n logger.info(\n `Plan (${result.currentVersion} → ${result.availableVersion}):`,\n );\n if (result.plan.length === 0) {\n logger.info(' (no skills to update)');\n } else {\n for (const item of result.plan) {\n logger.info(formatPlanItem(item));\n }\n }\n logger.info('');\n logger.info('Re-run without --dry-run to apply.');\n return;\n\n case 'updated': {\n const { summary } = result;\n logger.success(\n `Skills updated to v${result.version} (${result.updatedSkillIds.length} skill(s)).`,\n );\n if (result.updatedSkillIds.length > 0) {\n logger.info(` Updated: ${result.updatedSkillIds.join(', ')}`);\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(\n ', ',\n )} (scope mismatch / removed upstream)`,\n );\n }\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n return;\n }\n }\n } catch (err) {\n logger.error(`Failed to update skills: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\n/**\n * Resolve maintenance root for `skills update`.\n *\n * - `--scope project` (or no flag + cwd is a teamix-evo project): use cwd\n * - `--scope global`: force ~/.teamix-evo-global, regardless of cwd\n * - no flag + cwd is not a project: fall back to ~/.teamix-evo-global if it\n * has been initialized (legacy behavior preserved by\n * `resolveSkillsMaintenanceRoot`)\n */\nexport function resolveUpdateRoot(\n cwd: string,\n scopeFlag: string | undefined,\n): string {\n if (scopeFlag === undefined) {\n return resolveSkillsMaintenanceRoot(cwd);\n }\n const scope = parseScope(scopeFlag);\n if (scope === 'global') {\n const globalRoot = getGlobalMetaRoot();\n if (!isTeamixEvoProject(globalRoot)) {\n throw new Error(\n `No global skills installed at ${globalRoot}. ` +\n 'Run \"npx teamix-evo@latest skills add <id> --scope global\" first.',\n );\n }\n return globalRoot;\n }\n // scope === 'project'\n if (!isTeamixEvoProject(cwd)) {\n throw new Error(\n `Current directory is not a teamix-evo project (.teamix-evo/config.json missing). ` +\n 'Re-run without --scope, or use \"--scope global\".',\n );\n }\n return cwd;\n}\n\nfunction formatPlanItem(item: UpdatePlanItem): string {\n const tag =\n item.action === 'up-to-date'\n ? ' ='\n : item.strategy === 'frozen'\n ? ' ⊘ '\n : item.strategy === 'managed'\n ? ' ⊕ '\n : ' → ';\n const ver =\n item.action === 'up-to-date'\n ? `v${item.current} (no change)`\n : `v${item.current} → v${item.next} [${item.strategy}]`;\n return `${tag}${item.id} ${ver}`;\n}\n\nasync function printVersionBanner(): Promise<void> {\n let cliVersion: string | undefined;\n // After bundling, this file lives at dist/index.js; `../package.json`\n // resolves to packages/cli/package.json. Source-mode (e.g. tests) won't\n // reach this path — banner is silenced rather than printed with `undefined`.\n try {\n const pkg = require('../package.json') as { version: string };\n cliVersion = pkg.version;\n } catch {\n /* dev mode: skip CLI version */\n }\n try {\n const { manifest } = await loadSkillsData(SKILLS_PACKAGE);\n if (cliVersion) {\n logger.info(\n `teamix-evo CLI v${cliVersion} · skills package v${manifest.version}`,\n );\n } else {\n logger.info(`skills package v${manifest.version}`);\n }\n } catch {\n // banner is informational only; never block update on banner failure.\n }\n}\n","import type {\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport { updateSkills } from './skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\n// ─── runSkillsUpdate ──────────────────────────────────────────────────────────\n// ADR 0035: update only refreshes skills that are (a) recorded in the lock and\n// (b) match the current install scope. New skills added to the manifest are NOT\n// auto-installed by update — use `skills add <id>` for that. version-diff\n// short-circuits when nothing has actually changed.\n\nexport interface RunSkillsUpdateOptions {\n /** Absolute project (or global meta) root. */\n projectRoot: string;\n /**\n * Optional: limit the update to these skill ids. Falls back to \"every\n * skill in lock that matches the current install scope\".\n */\n names?: readonly string[];\n /** When true, plan only — no source rewrite, no mirror, no lock write. */\n dryRun?: boolean;\n /** Override the skills package name (defaults to `@teamix-evo/skills`). */\n packageName?: string;\n}\n\nexport interface UpdatePlanItem {\n id: string;\n current: string;\n next: string;\n /** Same as updateStrategy semantics, computed from the manifest. */\n strategy: 'frozen' | 'regenerable' | 'managed';\n /**\n * Predicted action for this skill source file in non-dryRun mode.\n * - `up-to-date` — version unchanged; safe to skip\n * - `version-bump` — version changed; will overwrite/merge per strategy\n */\n action: 'up-to-date' | 'version-bump';\n}\n\nexport type RunSkillsUpdateResult =\n | { status: 'no-skills' }\n | {\n status: 'no-changes';\n packageName: string;\n version: string;\n checkedSkillIds: string[];\n }\n | {\n status: 'dry-run';\n packageName: string;\n currentVersion: string;\n availableVersion: string;\n plan: UpdatePlanItem[];\n }\n | {\n status: 'updated';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n updatedSkillIds: string[];\n skippedSkillIds: string[];\n summary: { overwritten: number; managed: number; skipped: number; created: number };\n resources: InstalledResource[];\n };\n\n/**\n * Programmatic equivalent of `teamix-evo skills update [names...] [--dry-run]`.\n *\n * Per ADR 0035:\n * 1. Range = `keys(lock.skills) ∩ scope-match ∩ (names if given)`\n * 2. version-diff short-circuit when every target id has the same lock\n * version as the manifest\n * 3. New skills (not in lock) are NEVER auto-installed by update\n * 4. lock writeback only touches `targetIds` — existing entries are preserved\n */\nexport async function runSkillsUpdate(\n options: RunSkillsUpdateOptions,\n): Promise<RunSkillsUpdateResult> {\n const { projectRoot, names: requestedNames, dryRun } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\n\n const config = await readProjectConfig(projectRoot);\n const skillsCfg = config?.packages?.skills;\n if (!skillsCfg) {\n return { status: 'no-skills' };\n }\n\n const ides = (skillsCfg.ides ?? ['qoder', 'claude']) as SkillIde[];\n const scope = (skillsCfg.scope ?? 'project') as SkillScope;\n\n const existingLock = await readSkillsLock(projectRoot);\n if (!existingLock || Object.keys(existingLock.skills).length === 0) {\n return { status: 'no-skills' };\n }\n\n const { manifest, data, packageRoot } = await loadSkillsData(packageName);\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n\n // Three-gate intersection: lock ∩ scope ∩ names.\n const lockIds = Object.keys(existingLock.skills);\n const requestedSet = requestedNames ? new Set(requestedNames) : null;\n if (requestedSet) {\n const unknown = requestedNames!.filter(\n (n) => !lockIds.includes(n) && !manifestById.has(n),\n );\n if (unknown.length > 0) {\n throw new Error(\n `Unknown skill id(s): ${unknown.join(\n ', ',\n )}. Available (installed): ${lockIds.join(', ') || '(none)'}.`,\n );\n }\n }\n\n const targetIds: string[] = [];\n const skippedSkillIds: string[] = [];\n for (const id of lockIds) {\n if (requestedSet && !requestedSet.has(id)) continue;\n const entry = manifestById.get(id);\n if (!entry) {\n // Lock has it, manifest no longer does (skill removed upstream).\n // Skip without error — uninstall is the user's call.\n logger.debug(\n `Skipping \"${id}\": no longer in upstream manifest. Use \\`skills uninstall ${id}\\` to remove.`,\n );\n skippedSkillIds.push(id);\n continue;\n }\n const effectiveScope = entry.scope ?? 'project';\n if (effectiveScope !== scope) {\n logger.debug(\n `Skipping \"${id}\" (scope=${effectiveScope}): current install scope is \"${scope}\".`,\n );\n skippedSkillIds.push(id);\n continue;\n }\n targetIds.push(id);\n }\n\n // version-diff short-circuit\n const allSame = targetIds.every((id) => {\n const lockVer = existingLock.skills[id]!.version;\n const manVer = manifestById.get(id)!.version;\n return lockVer === manVer;\n });\n if (targetIds.length > 0 && allSame && !dryRun) {\n return {\n status: 'no-changes',\n packageName,\n version: manifest.version,\n checkedSkillIds: targetIds,\n };\n }\n\n if (dryRun) {\n const plan: UpdatePlanItem[] = targetIds.map((id) => {\n const lockVer = existingLock.skills[id]!.version;\n const entry = manifestById.get(id)!;\n const sameVersion = lockVer === entry.version;\n return {\n id,\n current: lockVer,\n next: entry.version,\n strategy: entry.updateStrategy ?? 'managed',\n action: sameVersion ? 'up-to-date' : 'version-bump',\n };\n });\n return {\n status: 'dry-run',\n packageName,\n currentVersion: skillsCfg.version,\n availableVersion: manifest.version,\n plan,\n };\n }\n\n if (targetIds.length === 0) {\n return {\n status: 'updated',\n packageName,\n version: manifest.version,\n ides,\n scope,\n updatedSkillIds: [],\n skippedSkillIds,\n summary: { overwritten: 0, managed: 0, skipped: 0, created: 0 },\n resources: [],\n };\n }\n\n const result = await updateSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds: targetIds,\n });\n\n // Update config.version (track the package-level version we last consumed).\n config!.packages.skills = {\n ...skillsCfg,\n version: manifest.version,\n };\n await writeProjectConfig(projectRoot, config!);\n\n // Update installed manifest (replace the package-level entry's resources).\n const installedManifest = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n const installedAt = new Date().toISOString();\n // Merge: keep resources from skills NOT in targetIds (preserve existing\n // entries for skills we didn't touch this round).\n const prior = idx >= 0 ? installedManifest.installed[idx]!.resources : [];\n const targetSet = new Set(targetIds);\n const preserved = prior.filter((r) => {\n const skillId = r.id.split(':')[0];\n return skillId ? !targetSet.has(skillId) : true;\n });\n const entry = {\n package: packageName,\n variant: FLAT_VARIANT,\n version: manifest.version,\n installedAt,\n resources: [...preserved, ...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 lock — only for targetIds, preserving other entries.\n const lock: SkillsLock = {\n schemaVersion: 1,\n skills: { ...existingLock.skills },\n };\n for (const id of targetIds) {\n const skillDef = manifestById.get(id);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[id] = {\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: 'updated',\n packageName,\n version: manifest.version,\n ides,\n scope,\n updatedSkillIds: targetIds,\n skippedSkillIds,\n summary: result.summary,\n resources: result.resources,\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 { detectIde, getAdapter, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport { getErrorMessage } from '../../utils/error.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('[ids...]', '可选:仅卸载指定 skill id;省略则卸载整个 skills 包')\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: ${getErrorMessage(err)}`);\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(`Failed to remove ${skillsRoot}: ${getErrorMessage(err)}`);\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}: ${getErrorMessage(err)}`);\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(`Removed ${matched.length} skill(s): ${matched.join(', ')}`);\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 = 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}: ${getErrorMessage(err)}`);\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 } from '../../ide/index.js';\nimport { runSkillsSync } from '../../core/skills-sync.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface SyncOptions {\n ide?: string;\n scope?: string;\n}\n\nexport const syncCommand = new Command('sync')\n .description(\n '把 .teamix-evo/skills-source/ 下的源重新镜像到 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('--scope <scope>', 'project | global(覆盖 lock 中记录的 scope)')\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-source/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: ${getErrorMessage(err)}`);\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 {\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';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const doctorCommand = new Command('doctor')\n .description(\n '检查 .teamix-evo/skills-source/ 源与 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 \"npx teamix-evo@latest skills init\" 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 \"npx teamix-evo@latest 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: ${getErrorMessage(err)}`);\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 \"npx teamix-evo@latest skills init\" 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 \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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';\nimport { upgradeCommand } from './upgrade.js';\nimport { promoteCommand } from './promote.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);\nuiCommand.addCommand(upgradeCommand);\nuiCommand.addCommand(promoteCommand);\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';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.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.exitCode = 1;\n return;\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 `npx teamix-evo@latest 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@latest ui add button`');\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('ui init 已取消。');\n return;\n }\n logger.error(`Failed to initialize ui: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.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 // Non-TTY (CI / AI agent / piped stdin): silently fall back to defaults so\n // @clack/prompts does not throw `uv_tty_init EINVAL`. Equivalent to passing\n // --yes; any flags the caller provided still take precedence.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (opts.yes || !isInteractive) {\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 blocks: DEFAULT_UI_ALIASES.blocks,\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 CancelledError();\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 CancelledError();\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 CancelledError();\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 CancelledError();\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 CancelledError();\n\n const tsxAns = await prompts.confirm({\n message: '使用 TSX?',\n initialValue: opts.tsx ?? true,\n });\n if (prompts.isCancel(tsxAns)) throw new CancelledError();\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 CancelledError();\n\n return {\n aliases: {\n components,\n hooks,\n utils,\n lib,\n business: DEFAULT_UI_ALIASES.business,\n blocks: DEFAULT_UI_ALIASES.blocks,\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 blocks: 'src/blocks',\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 blocks: options.aliases?.blocks ?? DEFAULT_UI_ALIASES.blocks,\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/v2.json',\n schemaVersion: 2,\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 { runUiAdopt } from '../../core/ui-adopt.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个 ui entry(按 id,自动展开 registryDependencies)',\n )\n // Make ids optional when --adopt scans the existing tree.\n .argument('[ids...]', 'entry id 列表,如 \"button\" \"dialog\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .option(\n '--include-deprecated',\n '允许安装已归档的 deprecated entry(仅迁移 / 审计场景,ADR 0028)',\n )\n .option('--adopt', '扫描项目现有 UI 源码纳管到 manifest,不写入任何文件内容')\n .option(\n '--dry-run',\n '仅扫描 + 输出报告,不修改 manifest(仅与 --adopt 同用)',\n )\n .action(\n async (\n ids: string[],\n opts: {\n overwrite?: boolean;\n includeDeprecated?: boolean;\n adopt?: boolean;\n dryRun?: boolean;\n },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n if (opts.adopt) {\n await runAdoptCli(projectRoot, opts.dryRun ?? false);\n return;\n }\n\n if (opts.dryRun) {\n logger.warn(\n '`--dry-run` only takes effect together with `--adopt`; ignoring for plain ui add.',\n );\n }\n\n if (!ids || ids.length === 0) {\n throw new Error(\n 'At least one entry id must be provided (or pass `--adopt`).',\n );\n }\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 = getErrorMessage(err);\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\nasync function runAdoptCli(\n projectRoot: string,\n dryRun: boolean,\n): Promise<void> {\n logger.info(\n dryRun\n ? 'Adopt scan (dry-run) — no manifest changes will be written.'\n : 'Adopting existing UI source files into manifest...',\n );\n const result = await runUiAdopt({ projectRoot, dryRun });\n\n logger.success(\n `UI adopt complete: ${result.adopted.length} adopted, ${result.foreign.length} foreign, ${result.hooks.length} hooks, ${result.utils.length} utils, ${result.types.length} types.`,\n );\n\n if (result.adopted.length > 0) {\n logger.info('');\n logger.info('Adopted (matched registry id):');\n for (const a of result.adopted) {\n logger.info(` • ${a.id} ← ${a.rel} [${a.sourceLineage}]`);\n }\n }\n if (result.foreign.length > 0) {\n logger.info('');\n logger.info('Foreign (no registry match — keep as-is):');\n for (const f of result.foreign) logger.info(` • ${f.rel}`);\n }\n if (result.hooks.length > 0) {\n logger.info('');\n logger.info('Hooks:');\n for (const h of result.hooks) logger.info(` • ${h.rel}`);\n }\n if (result.utils.length > 0) {\n logger.info('');\n logger.info('Utils:');\n for (const u of result.utils) logger.info(` • ${u.rel}`);\n }\n if (result.types.length > 0) {\n logger.info('');\n logger.info('Type-only modules:');\n for (const t of result.types) logger.info(` • ${t.rel}`);\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 { backupFile, 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';\nimport { getErrorMessage } from '../utils/error.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 /** When false, preserve directory structure in import paths (skip flattenRestPath). Defaults to true. */\n flatten?: 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 flatten = 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, { flatten });\n // Phase 1.A2: any existing user file we are about to overwrite must be\n // backed up under .teamix-evo/.backups/. This applies to:\n // - regenerable entries on re-install,\n // - frozen entries when caller passes overwrite=true (init conflict\n // decision \"shadcn-source: overwrite\").\n if (exists) {\n await backupFile(targetAbs, projectRoot);\n }\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 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}: ${getErrorMessage(err)}`);\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 blocks: 'blocks',\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(\n source: string,\n aliases: UiAliases,\n opts?: { flatten?: boolean },\n): string {\n const shouldFlatten = opts?.flatten !== false;\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 const resolvedRest = shouldFlatten ? flattenRestPath(rest) : (rest ?? '');\n return `${quote}${normalized}${resolvedRest}${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 * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n InstalledManifest,\n InstalledResource,\n UiEntry,\n UiPackageManifest,\n UiAliases,\n} from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\n/**\n * File classification used by `ui add --adopt` to bucket existing user files\n * before deciding whether they map to a registry entry. Mirrors the buckets\n * defined in the Init landing plan §1.1 (file-type triage).\n */\nexport type AdoptFileType =\n | 'component'\n | 'hook'\n | 'util'\n | 'type'\n | 'provider'\n | 'unknown';\n\n/**\n * Lineage assigned to an adopted file.\n *\n * - `teamix-evo` — id matched **and** byte-content equals the upstream entry\n * (modulo alias rewriting), so the file is effectively a\n * pristine copy of the registry source\n * - `custom` — id matched but content drifted from upstream\n * - `detected` — id matched but content was not compared (shouldn't normally\n * happen in the adopt flow, kept for forward compatibility)\n */\nexport type AdoptedLineage = 'teamix-evo' | 'custom' | 'detected';\n\nexport interface AdoptedRecord {\n /** registry entry id */\n id: string;\n /** absolute target path on disk */\n target: string;\n /** project-relative path (posix) for human-readable output */\n rel: string;\n /** file classification */\n fileType: AdoptFileType;\n /** content lineage assignment */\n sourceLineage: AdoptedLineage;\n /** content hash recorded into manifest */\n hash: string;\n}\n\nexport interface ForeignRecord {\n /** project-relative path (posix) */\n rel: string;\n /** file classification — may be component/hook/util/type/provider */\n fileType: AdoptFileType;\n /** absolute path on disk */\n target: string;\n /** absolute reason this file is foreign (no registry match by basename) */\n reason: 'no-registry-match';\n}\n\nexport interface RunUiAdoptOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n /**\n * When true, do not write the installed manifest. Useful for `--dry-run`.\n * Defaults to false.\n */\n dryRun?: boolean;\n}\n\nexport interface RunUiAdoptResult {\n packageName: string;\n /** Files that matched a registry entry by id (basename → entry id). */\n adopted: AdoptedRecord[];\n /** Files under `aliases.components/business` that did not match any entry. */\n foreign: ForeignRecord[];\n /** Hooks discovered under `aliases.hooks` (or `use-*.ts(x)` under components). */\n hooks: ForeignRecord[];\n /** Utils discovered under `aliases.utils|lib`. */\n utils: ForeignRecord[];\n /** Type-only files (`.d.ts` or modules that only export types). */\n types: ForeignRecord[];\n /** When true the manifest was not modified. */\n dryRun: boolean;\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui add --adopt`.\n *\n * Walks the project's UI source tree, classifies files by type, and registers\n * components matching a known registry entry id into the installed manifest as\n * `strategy=frozen, sourceLineage=detected|teamix-evo|custom`.\n *\n * NEVER modifies any source file — the goal is to surface the existing surface\n * area to the registry layer so downstream commands (`ui upgrade`,\n * `promote-to-biz`) can reason about it.\n */\nexport async function runUiAdopt(\n options: RunUiAdoptOptions,\n): Promise<RunUiAdoptResult> {\n const { projectRoot, dryRun = false } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\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 const aliases = uiCfg.aliases;\n\n const adopted: AdoptedRecord[] = [];\n const foreign: ForeignRecord[] = [];\n const hooks: ForeignRecord[] = [];\n const utils: ForeignRecord[] = [];\n const types: ForeignRecord[] = [];\n\n // 1. Build lookup maps from manifest.\n // Multiple entries may collide on the same id within deprecatedEntries —\n // the active list wins.\n const idToEntry = new Map<string, UiEntry>();\n for (const e of manifest.deprecatedEntries ?? []) idToEntry.set(e.id, e);\n for (const e of manifest.entries) idToEntry.set(e.id, e);\n\n // 2. Walk all alias roots concurrently.\n const aliasRoots: Array<{\n abs: string;\n bucket: 'components' | 'hooks' | 'utils' | 'business';\n }> = [\n { abs: path.join(projectRoot, aliases.components), bucket: 'components' },\n { abs: path.join(projectRoot, aliases.hooks), bucket: 'hooks' },\n { abs: path.join(projectRoot, aliases.utils), bucket: 'utils' },\n { abs: path.join(projectRoot, aliases.business), bucket: 'components' },\n ];\n // `lib` is optional/may overlap with utils; only walk if it differs.\n if (aliases.lib && aliases.lib !== aliases.utils) {\n aliasRoots.push({\n abs: path.join(projectRoot, aliases.lib),\n bucket: 'utils',\n });\n }\n\n for (const root of aliasRoots) {\n const files = await listSourceFiles(root.abs);\n for (const abs of files) {\n const rel = toPosixRel(projectRoot, abs);\n const content = await fs.readFile(abs, 'utf-8');\n const fileType = classifyFile(abs, content);\n const id = inferEntryId(abs);\n\n // Hooks/utils/types go into their own bucket and are NOT registered into\n // the installed manifest (registry hooks/utils are addressable but the\n // adopt path keeps writes minimal — explicit `ui add <id>` will pick\n // them up).\n if (fileType === 'type') {\n types.push({ rel, fileType, target: abs, reason: 'no-registry-match' });\n continue;\n }\n if (fileType === 'hook' || root.bucket === 'hooks') {\n hooks.push({\n rel,\n fileType: 'hook',\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n if (fileType === 'util' || root.bucket === 'utils') {\n utils.push({\n rel,\n fileType: 'util',\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n\n const entry = id ? idToEntry.get(id) : undefined;\n if (!entry) {\n foreign.push({\n rel,\n fileType: fileType === 'unknown' ? 'component' : fileType,\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n\n // Match found. Compare with upstream content (alias-rewritten) to decide\n // lineage. We pick the first .tsx file in the entry — multi-file entries\n // are rare for components and the lineage tag is best-effort.\n const upstream = await readUpstreamContent(\n packageRoot,\n entry,\n aliases,\n ).catch((err) => {\n logger.debug(\n `Failed to read upstream for ${entry.id}: ${(err as Error).message}`,\n );\n return null;\n });\n const lineage: AdoptedLineage =\n upstream === null\n ? 'detected'\n : normalize(upstream) === normalize(content)\n ? 'teamix-evo'\n : 'custom';\n\n adopted.push({\n id: entry.id,\n target: abs,\n rel,\n fileType: fileType === 'unknown' ? 'component' : fileType,\n sourceLineage: lineage,\n hash: computeHash(content),\n });\n }\n }\n\n if (!dryRun && adopted.length > 0) {\n await mergeIntoInstalledManifest({\n projectRoot,\n packageName,\n manifest,\n adopted,\n });\n }\n\n return {\n packageName,\n adopted,\n foreign,\n hooks,\n utils,\n types,\n dryRun,\n };\n}\n\n/**\n * Recursively list `.ts/.tsx` source files (including `.d.ts`) under `dir`.\n * Type-only modules are NOT filtered here — `classifyFile` later routes\n * `.d.ts` into the `types` bucket. Returns an empty array if the directory\n * does not exist.\n */\nasync function listSourceFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const stack: string[] = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw err;\n }\n for (const e of entries) {\n const abs = path.join(current, e.name);\n if (e.isDirectory()) {\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n stack.push(abs);\n continue;\n }\n if (!e.isFile()) continue;\n if (/\\.(ts|tsx)$/.test(e.name)) out.push(abs);\n }\n }\n return out;\n}\n\n/**\n * Best-effort file-type classifier. Pure regex / heuristic — avoids ts-morph\n * to keep the adopt path fast even on large UI trees.\n */\nexport function classifyFile(abs: string, content: string): AdoptFileType {\n const base = path.basename(abs);\n if (base.endsWith('.d.ts')) return 'type';\n if (/^use-[a-z0-9-]+\\.tsx?$/i.test(base)) return 'hook';\n\n const hasJsx = /<[A-Za-z][^>]*?>/.test(content);\n const hasReactImport = /from ['\"]react['\"]/.test(content);\n const hasForwardRef = /forwardRef\\s*[<(]/.test(content);\n const hasProvider =\n /\\.Provider\\b/.test(content) || /createContext\\s*[<(]/.test(content);\n\n if (hasProvider && (hasJsx || hasReactImport)) return 'provider';\n if (hasJsx || hasForwardRef) return 'component';\n if (hasReactImport && /export\\s+(const|function|default)/.test(content))\n return 'component';\n\n // Type-only check: only `export type` / `export interface` / `import type` —\n // no values exported.\n const exportsValue = /export\\s+(const|function|class|default|let|var)\\b/.test(\n content,\n );\n const exportsType =\n /export\\s+(type|interface)\\b/.test(content) || /^\\s*type\\s+/m.test(content);\n if (!exportsValue && exportsType) return 'type';\n\n if (base.startsWith('use-')) return 'hook';\n if (/\\b(use[A-Z]\\w+)\\s*\\(/.test(content) && !hasJsx) {\n // Util that consumes a hook — treat as util.\n return 'util';\n }\n if (!hasJsx && !hasReactImport) return 'util';\n\n return 'unknown';\n}\n\n/**\n * Derive the canonical registry entry id from an on-disk filename.\n * `button.tsx` → `button`; `card-header.tsx` → `card-header`.\n */\nfunction inferEntryId(abs: string): string | null {\n const base = path.basename(abs).replace(/\\.(tsx?|d\\.ts)$/i, '');\n if (!base) return null;\n if (!/^[a-z0-9][a-z0-9-]*$/.test(base)) return null;\n // Hooks live in their own bucket; never treat them as components.\n if (base.startsWith('use-')) return null;\n return base;\n}\n\nasync function readUpstreamContent(\n packageRoot: string,\n entry: UiEntry,\n aliases: UiAliases,\n): Promise<string | null> {\n const file = entry.files[0];\n if (!file) return null;\n const sourceAbs = path.resolve(packageRoot, file.source);\n let raw: string;\n try {\n raw = await fs.readFile(sourceAbs, 'utf-8');\n } catch {\n return null;\n }\n return rewriteImports(raw, aliases);\n}\n\nfunction normalize(s: string): string {\n return s.replace(/\\r\\n/g, '\\n').trim();\n}\n\nfunction toPosixRel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs).split(path.sep).join('/');\n}\n\ninterface MergeArgs {\n projectRoot: string;\n packageName: string;\n manifest: UiPackageManifest;\n adopted: AdoptedRecord[];\n}\n\nasync function mergeIntoInstalledManifest(args: MergeArgs): Promise<void> {\n const { projectRoot, packageName, manifest, adopted } = args;\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\n const newResources: InstalledResource[] = adopted.map((a) => {\n // `id` follows the same `${entryId}:${targetName}` convention as `ui add`\n // so a subsequent `ui add <id>` writes back to the same record.\n const targetName = path.basename(a.target);\n return {\n id: `${a.id}:${targetName}`,\n target: a.target,\n hash: a.hash,\n strategy: 'frozen',\n sourceLineage: a.sourceLineage,\n };\n });\n\n const merged = mergeResources(prior?.resources ?? [], newResources);\n const entry = {\n package: packageName,\n variant: '_flat',\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: merged,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n\n await writeInstalledManifest(projectRoot, installed);\n}\n\nfunction mergeResources(\n prior: InstalledResource[],\n next: InstalledResource[],\n): InstalledResource[] {\n const merged = new Map<string, InstalledResource>();\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';\nimport { getErrorMessage } from '../../utils/error.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: ${getErrorMessage(err)}`);\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 * Shared factory for the `ui upgrade` and `biz-ui upgrade` commands\n * ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md)).\n *\n * Both commands share the same staging-only contract — the only differences\n * are the install dir hint, the \"not installed\" follow-up command, and the\n * trigger string written into the staging manifest. We materialise those\n * differences via {@link CategoryMeta} and build a single `commander` Command.\n *\n * Frozen boundary preserved: the command **never writes** into\n * `src/components/{ui,business}/**`. Application is delegated to the\n * `teamix-evo-upgrade` skill via the staging dir.\n */\nimport { Command } from 'commander';\nimport type { ComponentCategory } from '../core/ui-upgrade-detector.js';\nimport { detectIde } from '../ide/index.js';\nimport { runUiUpgrade } from '../core/ui-upgrade.js';\nimport { logger } from '../utils/logger.js';\nimport { getErrorMessage } from '../utils/error.js';\n\ninterface CategoryMeta {\n /** ui-installer alias key surface (kept identical to category for clarity). */\n category: ComponentCategory;\n /** Frozen install dir, used in error messaging only. */\n installDirHint: string;\n /** Recovery command suggested when the package is not installed. */\n notInstalledHint: string;\n /** Trigger string persisted in the staging manifest. */\n trigger: 'ui-upgrade' | 'biz-ui-upgrade' | 'blocks-upgrade';\n}\n\nconst META: Record<ComponentCategory, CategoryMeta> = {\n ui: {\n category: 'ui',\n installDirHint: 'src/components/ui',\n notInstalledHint: 'npx teamix-evo ui init',\n trigger: 'ui-upgrade',\n },\n 'biz-ui': {\n category: 'biz-ui',\n installDirHint: 'src/components/business',\n notInstalledHint: 'npx teamix-evo biz-ui add <id>',\n trigger: 'biz-ui-upgrade',\n },\n blocks: {\n category: 'blocks',\n installDirHint: 'src/blocks',\n notInstalledHint: 'npx teamix-evo blocks add <id>',\n trigger: 'blocks-upgrade',\n },\n};\n\n/**\n * Build a `commander` Command implementing the source-layer upgrade pipeline\n * for the given component category.\n */\nexport function makeUpgradeCommand(category: ComponentCategory): Command {\n const meta = META[category];\n return new Command('upgrade')\n .description(\n `为 ${category} 组件生成升级 staging(不写 src,需通过 teamix-evo-upgrade skill 应用)`,\n )\n .argument(\n '[ids...]',\n '可选 entry id 列表;省略时对全部已安装组件生成 staging',\n )\n .option(\n '--apply',\n `(守卫提示)保留但拒绝执行:CLI 不写 ${meta.installDirHint},请通过 teamix-evo-upgrade skill 应用 staging`,\n )\n .action(async (ids: string[], opts: { apply?: boolean }) => {\n if (opts.apply) {\n logger.error(\n `CLI 不会自动写入 ${meta.installDirHint}(ADR 0019 frozen 边界)。`,\n );\n logger.error(\n `请运行 \\`teamix-evo ${category} upgrade\\` 生成 staging,再让 AI 调用 teamix-evo-upgrade skill 逐文件应用。`,\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const result = await runUiUpgrade({\n projectRoot,\n category: meta.category,\n ids,\n trigger: meta.trigger,\n });\n\n switch (result.status) {\n case 'not-initialized':\n logger.error(\n 'Project not initialized. Run `npx teamix-evo init` first.',\n );\n process.exitCode = 1;\n return;\n case 'not-installed':\n logger.error(`${category} not installed: ${result.detail}`);\n logger.error(`Run \\`${meta.notInstalledHint}\\` first.`);\n process.exitCode = 1;\n return;\n case 'skipped':\n logger.info(\n `Nothing to stage (lineage=${result.lineage}): ${result.detail}`,\n );\n return;\n case 'staged': {\n const { manifest, stagingDir } = result;\n logger.success(\n `${category} staging written: ${manifest.summary.total} entries → ${stagingDir}`,\n );\n const byRisk = manifest.summary.byRisk;\n const parts = Object.entries(byRisk)\n .filter(([, n]) => (n ?? 0) > 0)\n .map(([k, n]) => `${k}=${n}`);\n if (parts.length > 0) {\n logger.info(` risk: ${parts.join(', ')}`);\n }\n logger.info('');\n logger.info(\n 'Next: 让 AI 调用 teamix-evo-upgrade skill,按 risk 分批 review & apply。',\n );\n return;\n }\n }\n } catch (err) {\n logger.error(\n `Failed to build ${category} staging: ${getErrorMessage(err)}`,\n );\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Programmatic core for `teamix-evo ui upgrade` / `teamix-evo biz-ui upgrade`\n * ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D5).\n *\n * The CLI command delegates here; the project-update orchestrator also reuses\n * `buildComponentSourceStaging` so the same staging shape is produced by both\n * paths. Frozen boundary preserved: this module **never writes** into\n * `src/components/{ui,business}/**`. The skill consumes the staging.\n */\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport {\n loadUiPackageManifest,\n loadVariantUiPackageManifest,\n} from '@teamix-evo/registry';\nimport type {\n UiAliases,\n UiEntry,\n UiPackageManifest,\n UpgradeStagingManifest,\n UpgradeStagingTrigger,\n} from '@teamix-evo/registry';\nimport { readProjectConfig, readInstalledManifest } from './state.js';\nimport {\n detectComponentLineage,\n type ComponentCategory,\n type ComponentLineageReport,\n} from './ui-upgrade-detector.js';\nimport {\n buildUiUpgradeStaging,\n type BuildUiUpgradeStagingResult,\n} from './ui-upgrade-staging.js';\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = nodeRequire.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\nexport interface RunUiUpgradeOptions {\n /** Absolute project root. */\n projectRoot: string;\n /** Which package category to stage. */\n category: ComponentCategory;\n /**\n * Restrict to a subset of entry ids. Empty / undefined → all registered ids\n * (plus foreign ids in `mixed` lineage).\n */\n ids?: string[];\n /** Trigger label written into the staging manifest. */\n trigger: UpgradeStagingTrigger;\n /** Override package roots (test hook). */\n uiPackageRoot?: string;\n bizUiPackageRoot?: string;\n}\n\nexport type RunUiUpgradeResult =\n | {\n status: 'not-initialized';\n }\n | {\n status: 'not-installed';\n detail: string;\n }\n | {\n status: 'skipped';\n detail: string;\n lineage: ComponentLineageReport['lineage'];\n }\n | {\n status: 'staged';\n stagingDir: string;\n manifest: UpgradeStagingManifest;\n };\n\n/**\n * High-level orchestration:\n *\n * 1. Read project config (must be teamix-evo-installed)\n * 2. Detect lineage for the requested category\n * 3. Resolve upstream manifest (variant-aware for biz-ui)\n * 4. Delegate to `buildUiUpgradeStaging`\n *\n * Throws only on programming errors; expected user-facing failures (no\n * config, package not installed, unknown id) are surfaced via the discriminated\n * return type so the CLI / orchestrator can render them consistently.\n */\nexport async function runUiUpgrade(\n options: RunUiUpgradeOptions,\n): Promise<RunUiUpgradeResult> {\n const { projectRoot, category, ids = [], trigger } = options;\n\n const config = await readProjectConfig(projectRoot);\n if (!config) return { status: 'not-initialized' };\n\n const cfgKey = category === 'blocks' ? 'blocks' : category === 'ui' ? 'ui' : 'biz-ui';\n if (!config.packages?.[cfgKey]) {\n return { status: 'not-installed', detail: `${category} not installed` };\n }\n\n // ui aliases live under packages.ui per ADR 0014; biz-ui shares the map.\n const aliases =\n config.packages.ui?.aliases ??\n (config.packages['biz-ui']?.aliases as UiAliases | undefined);\n if (!aliases) {\n return {\n status: 'not-installed',\n detail: `${category} aliases not configured (run \\`teamix-evo ui init\\` first)`,\n };\n }\n\n const installed = await readInstalledManifest(projectRoot);\n const lineageReport = await detectComponentLineage({\n projectRoot,\n category,\n config,\n installed,\n });\n\n if (\n lineageReport.lineage !== 'teamix-evo' &&\n lineageReport.lineage !== 'mixed'\n ) {\n return {\n status: 'skipped',\n detail: `lineage=${lineageReport.lineage}; nothing to stage`,\n lineage: lineageReport.lineage,\n };\n }\n\n // Validate that explicit ids are recognised — surface a clear error rather\n // than silently producing an empty staging dir.\n if (ids.length > 0) {\n const knownIds = new Set([\n ...lineageReport.registeredIds,\n ...lineageReport.unregisteredIds,\n ]);\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown ${category} component id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(\n ', ',\n )}. Hint: \\`teamix-evo ${category} list\\` shows available ids.`,\n );\n }\n }\n\n const built = await buildStaging({\n category,\n projectRoot,\n aliases,\n lineageReport,\n trigger,\n onlyIds: ids,\n uiPackageRoot: options.uiPackageRoot,\n bizUiPackageRoot: options.bizUiPackageRoot,\n });\n\n if (built === null) {\n return {\n status: 'skipped',\n detail: 'no entries to stage',\n lineage: lineageReport.lineage,\n };\n }\n\n return {\n status: 'staged',\n stagingDir: built.stagingDir,\n manifest: built.manifest,\n };\n}\n\ninterface BuildStagingArgs {\n category: ComponentCategory;\n projectRoot: string;\n aliases: UiAliases;\n lineageReport: ComponentLineageReport;\n trigger: UpgradeStagingTrigger;\n onlyIds: string[];\n uiPackageRoot?: string;\n bizUiPackageRoot?: string;\n blocksPackageRoot?: string;\n}\n\n/**\n * Resolve upstream manifest + (for biz-ui) merge cross-package deps from\n * `@teamix-evo/ui`, then delegate to `buildUiUpgradeStaging`. Exposed so the\n * project-update orchestrator can reuse the exact same code path.\n */\nexport async function buildStaging(\n args: BuildStagingArgs,\n): Promise<BuildUiUpgradeStagingResult | null> {\n const { category, projectRoot, aliases, lineageReport, trigger, onlyIds } =\n args;\n if (category === 'blocks') {\n const root =\n args.blocksPackageRoot ?? resolvePackageRoot('@teamix-evo/blocks');\n const manifest = await loadUiPackageManifest(root);\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest,\n packageRoot: root,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n }\n\n if (category === 'ui') {\n const root = args.uiPackageRoot ?? resolvePackageRoot('@teamix-evo/ui');\n const manifest = await loadUiPackageManifest(root);\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest,\n packageRoot: root,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n }\n\n // biz-ui — merge variant entries with @teamix-evo/ui entries (for transitive\n // ui deps that may have landed under biz-ui's installed record). Mirrors\n // `runVariantUiAdd` so the same dep graph applies.\n const bizRoot =\n args.bizUiPackageRoot ?? resolvePackageRoot('@teamix-evo/biz-ui');\n const variant = lineageReport.installedVariant ?? '_flat';\n const variantDir = path.join(bizRoot, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n const uiRoot = args.uiPackageRoot ?? resolvePackageRoot('@teamix-evo/ui');\n const uiManifest = await loadUiPackageManifest(uiRoot);\n\n const entryPackageRoot = new Map<string, string>();\n const merged: UiEntry[] = [];\n for (const e of variantManifest.entries) {\n entryPackageRoot.set(e.id, variantDir);\n merged.push(e);\n }\n for (const e of uiManifest.entries) {\n if (entryPackageRoot.has(e.id)) continue;\n entryPackageRoot.set(e.id, uiRoot);\n merged.push(e);\n }\n\n const synthetic: UiPackageManifest = {\n schemaVersion: 1,\n package: 'ui',\n version: variantManifest.version,\n engines: variantManifest.engines,\n entries: merged,\n };\n\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest: synthetic,\n packageRoot: variantDir,\n entryPackageRoot,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n}\n","/**\n * Component-source upgrade lineage detector ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D1).\n *\n * Classifies the consumer project's `ui` / `biz-ui` directory into one of four\n * lineage buckets so the upgrade pipeline (and downstream skill) can choose\n * the right opening line + bucket strategy:\n *\n * | lineage | criterion |\n * | --------------- | --------------------------------------------------------------------------- |\n * | `teamix-evo` | manifest has the package, every on-disk file is registered |\n * | `mixed` | manifest has the package, but extra unregistered files exist on disk |\n * | `shadcn-native` | manifest lacks the package, `components.json` exists, on-disk files exist |\n * | `custom-only` | manifest lacks the package, no `components.json`, on-disk files exist |\n * | `absent` | none of the above — nothing to upgrade |\n *\n * Pure read-only — never mutates the filesystem.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ComponentLineage,\n InstalledManifest,\n InstalledPackage,\n ProjectConfig,\n UiAliases,\n} from '@teamix-evo/registry';\nimport { fileExists } from '../utils/fs.js';\nimport {\n findInstalledPackage,\n readInstalledManifest,\n readProjectConfig,\n} from './state.js';\nimport { DEFAULT_UI_ALIASES } from './ui-init.js';\n\n/** Which package category to detect lineage for. */\nexport type ComponentCategory = 'ui' | 'biz-ui' | 'blocks';\n\n/** Lineage classification including the special `absent` bucket. */\nexport type ComponentLineageWithAbsent = ComponentLineage | 'absent';\n\nconst PACKAGE_NAME: Record<ComponentCategory, string> = {\n ui: '@teamix-evo/ui',\n 'biz-ui': '@teamix-evo/biz-ui',\n blocks: '@teamix-evo/blocks',\n};\n\nconst ALIAS_KEY: Record<ComponentCategory, keyof UiAliases> = {\n ui: 'components',\n 'biz-ui': 'business',\n blocks: 'blocks',\n};\n\n/** Files matching this regex inside the install dir are considered components. */\nconst COMPONENT_FILE_RE = /\\.(tsx|ts)$/;\n\n/** Filenames that are conventional helpers and should NOT be counted as components. */\nconst SKIP_FILENAMES = new Set(['index.ts', 'index.tsx']);\n\nexport interface ComponentLineageReport {\n /** Which package category this report describes. */\n category: ComponentCategory;\n /** Bucket assignment per the table above. */\n lineage: ComponentLineageWithAbsent;\n /** Resolved install dir (project-relative, e.g. `src/components/ui`). */\n installDir: string;\n /** Whether the install dir exists on disk. */\n installDirExists: boolean;\n /** Whether `components.json` exists at project root. */\n hasComponentsJson: boolean;\n /** Component ids registered in `.teamix-evo/manifest.json` (e.g. `[\"button\", \"input\"]`). */\n registeredIds: string[];\n /** Component ids found on disk but absent from the installed manifest. */\n unregisteredIds: string[];\n /** Installed package version, or null if the package is not in the manifest. */\n installedVersion: string | null;\n /** Variant: `'_flat'` for ui; concrete variant id (e.g. `'opentrek'`) for biz-ui; null when not installed. */\n installedVariant: string | null;\n}\n\nexport interface DetectComponentLineageOptions {\n projectRoot: string;\n category: ComponentCategory;\n /**\n * Optional pre-loaded project config. When omitted the detector reads it\n * from `.teamix-evo/config.json` itself; supplying it avoids redundant I/O\n * when the caller already holds one (e.g. `runProjectUpdate`).\n */\n config?: ProjectConfig | null;\n /**\n * Optional pre-loaded installed manifest. Same rationale as `config`.\n */\n installed?: InstalledManifest | null;\n}\n\n/**\n * Detect component-source lineage for the given project + category.\n *\n * Always returns a report — `lineage: 'absent'` when nothing to do, never\n * throws on an empty directory.\n */\nexport async function detectComponentLineage(\n options: DetectComponentLineageOptions,\n): Promise<ComponentLineageReport> {\n const { projectRoot, category } = options;\n const config = options.config ?? (await readProjectConfig(projectRoot));\n const installed =\n options.installed ?? (await readInstalledManifest(projectRoot));\n\n const installDir = resolveInstallDir(category, config);\n const installDirAbs = path.join(projectRoot, installDir);\n const installDirExists = await directoryExists(installDirAbs);\n const hasComponentsJson = await fileExists(\n path.join(projectRoot, 'components.json'),\n );\n\n const installedPkg = findInstalledPackage(installed, PACKAGE_NAME[category]);\n const registeredIds = installedPkg ? extractIds(installedPkg).sort() : [];\n\n const layout = category === 'blocks' ? 'directory' : 'flat';\n const onDiskIds = installDirExists\n ? await listComponentIds(installDirAbs, layout)\n : [];\n const registeredSet = new Set(registeredIds);\n const unregisteredIds = onDiskIds\n .filter((id) => !registeredSet.has(id))\n .sort();\n\n const lineage = classifyLineage({\n hasInstalled: installedPkg !== null,\n hasComponentsJson,\n onDiskIds,\n unregisteredIds,\n });\n\n return {\n category,\n lineage,\n installDir,\n installDirExists,\n hasComponentsJson,\n registeredIds,\n unregisteredIds,\n installedVersion: installedPkg?.version ?? null,\n installedVariant: installedPkg?.variant ?? null,\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveInstallDir(\n category: ComponentCategory,\n config: ProjectConfig | null,\n): string {\n // ui aliases live under packages.ui (per ui-init); biz-ui shares the same\n // alias map (UiAliasesSchema includes the `business` field).\n const aliasMap =\n config?.packages?.ui?.aliases ??\n (config?.packages?.['biz-ui']?.aliases as UiAliases | undefined) ??\n DEFAULT_UI_ALIASES;\n const key = ALIAS_KEY[category];\n return aliasMap[key] ?? DEFAULT_UI_ALIASES[key];\n}\n\n/**\n * Extract distinct component ids from an installed package's resources.\n * `InstalledResource.id` is shaped `\"<entryId>:<filename>\"` (see\n * `ui-installer.ts` L111). We collapse on the entryId portion so a multi-file\n * entry (rare) only shows up once.\n */\nfunction extractIds(pkg: InstalledPackage): string[] {\n const ids = new Set<string>();\n for (const r of pkg.resources) {\n const colon = r.id.indexOf(':');\n ids.add(colon >= 0 ? r.id.slice(0, colon) : r.id);\n }\n return [...ids];\n}\n\nasync function directoryExists(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\n/**\n * List component ids on disk.\n *\n * For flat layouts (ui/biz-ui): strips file extension; skips `index.{ts,tsx}`\n * and nested directories (entry sources are flattened by ui-installer).\n *\n * For directory layouts (blocks): each subdirectory name is an id.\n */\nasync function listComponentIds(\n installDirAbs: string,\n layout: 'flat' | 'directory' = 'flat',\n): Promise<string[]> {\n const entries = await fs.readdir(installDirAbs, { withFileTypes: true });\n const ids: string[] = [];\n if (layout === 'directory') {\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (e.name.startsWith('.')) continue;\n ids.push(e.name);\n }\n } else {\n for (const e of entries) {\n if (!e.isFile()) continue;\n if (SKIP_FILENAMES.has(e.name)) continue;\n if (!COMPONENT_FILE_RE.test(e.name)) continue;\n ids.push(e.name.replace(COMPONENT_FILE_RE, ''));\n }\n }\n return ids.sort();\n}\n\ninterface ClassifyArgs {\n hasInstalled: boolean;\n hasComponentsJson: boolean;\n onDiskIds: string[];\n unregisteredIds: string[];\n}\n\nfunction classifyLineage(args: ClassifyArgs): ComponentLineageWithAbsent {\n const { hasInstalled, hasComponentsJson, onDiskIds, unregisteredIds } = args;\n if (hasInstalled) {\n return unregisteredIds.length === 0 ? 'teamix-evo' : 'mixed';\n }\n // Not installed via teamix-evo.\n if (onDiskIds.length === 0) return 'absent';\n return hasComponentsJson ? 'shadcn-native' : 'custom-only';\n}\n","/**\n * Component-source upgrade staging builder ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D2-D4).\n *\n * Given a lineage report (from `ui-upgrade-detector`) and the upstream package\n * manifest + root, produces a `.teamix-evo/.upgrade-staging/<category>-<ts>/`\n * directory containing:\n *\n * - `meta.json` — {@link UpgradeStagingManifest} payload (the truth source)\n * - `<id>/current.{tsx,ts}` — copy of the consumer's installed file\n * - `<id>/incoming.{tsx,ts}`— upstream source after applying the consumer's import-rewrite aliases\n *\n * Pure produce-only — never writes into `src/components/{ui,business}/**`\n * (frozen boundary preserved). The staging dir is consumed by the\n * `teamix-evo-upgrade` skill, which decides per-file apply with user consent.\n *\n * Risk classification uses regex-level heuristics (no AST) — the skill is\n * expected to refine the level after reading the staged sources.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n InstalledManifest,\n InstalledPackage,\n InstalledResource,\n PromoteFeatureVector,\n PromoteFileType,\n PromoteMode,\n UiAliases,\n UiEntry,\n UiPackageManifest,\n UpgradeRiskLevel,\n UpgradeStagingDiff,\n UpgradeStagingEntry,\n UpgradeStagingManifest,\n UpgradeStagingPromotion,\n UpgradeStagingTrigger,\n} from '@teamix-evo/registry';\nimport {\n writeFileSafe,\n ensureDir,\n readFileOrNull,\n fileExists,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport { findInstalledPackage, readInstalledManifest } from './state.js';\nimport type {\n ComponentCategory,\n ComponentLineageReport,\n} from './ui-upgrade-detector.js';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst STAGING_DIR = '.upgrade-staging';\n\nconst PACKAGE_NAME: Record<ComponentCategory, string> = {\n ui: '@teamix-evo/ui',\n 'biz-ui': '@teamix-evo/biz-ui',\n blocks: '@teamix-evo/blocks',\n};\n\n/** Match `iso-to-fs-safe` used by `upgrade-hints.ts` so dirs sort chronologically. */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\nexport interface BuildUiUpgradeStagingOptions {\n /** Absolute project root. */\n projectRoot: string;\n /** Which category this run targets. */\n category: ComponentCategory;\n /**\n * Upstream package manifest (already loaded by the caller — avoids forcing\n * this module to know about variant resolution; the caller adapts variant\n * manifests via `loadVariantUiPackageManifest` and synthesizes a\n * `UiPackageManifest` shape per `variant-ui-add.ts`).\n */\n manifest: UiPackageManifest;\n /** Absolute upstream package root (where `entry.files[].source` resolves). */\n packageRoot: string;\n /**\n * Optional per-entry root override — used by biz-ui where some entries come\n * from the variant dir and cross-package deps come from `@teamix-evo/ui`.\n */\n entryPackageRoot?: Map<string, string>;\n /** Consumer-side alias map (from `config.packages.ui.aliases`). */\n aliases: UiAliases;\n /** Pre-computed lineage report for this category. */\n lineageReport: ComponentLineageReport;\n /** Which command produced the staging. */\n trigger: UpgradeStagingTrigger;\n /** Restrict processing to a subset of entry ids (single-component path). */\n onlyIds?: string[];\n /** Pre-loaded installed manifest (to avoid double I/O when caller has it). */\n installed?: InstalledManifest | null;\n /** Testing hook — fixed iso ts so the staging dir name is deterministic. */\n isoTs?: string;\n}\n\nexport interface BuildUiUpgradeStagingResult {\n /** Absolute staging dir path (`.teamix-evo/.upgrade-staging/<category>-<ts>/`). */\n stagingDir: string;\n /** The manifest payload that was written to `meta.json`. */\n manifest: UpgradeStagingManifest;\n}\n\n/**\n * Build a staging dir + manifest. Returns `null` when there is nothing to\n * stage (no installed package for this category, or all entries filtered out).\n */\nexport async function buildUiUpgradeStaging(\n options: BuildUiUpgradeStagingOptions,\n): Promise<BuildUiUpgradeStagingResult | null> {\n const { lineageReport, category } = options;\n\n // Lineages without an installed teamix-evo package have nothing to compare\n // against. shadcn-native / custom-only / absent are no-ops here — they are\n // handled by the skill (migration suggestions), not by staging.\n if (\n lineageReport.lineage !== 'teamix-evo' &&\n lineageReport.lineage !== 'mixed'\n ) {\n return null;\n }\n\n const installed =\n options.installed ?? (await readInstalledManifest(options.projectRoot));\n const installedPkg = findInstalledPackage(installed, PACKAGE_NAME[category]);\n if (!installedPkg) return null;\n\n const isoTs = options.isoTs ?? new Date().toISOString();\n const fsTs = isoToFsSafe(isoTs);\n const stagingDir = path.join(\n options.projectRoot,\n TEAMIX_DIR,\n STAGING_DIR,\n `${category}-${fsTs}`,\n );\n\n const entryMap = new Map<string, UiEntry>(\n options.manifest.entries.map((e) => [e.id, e]),\n );\n\n // First installed resource per entry id (multi-file entries are rare; we\n // stage the primary file and emit a hint when extras exist).\n const resByEntryId = collectResourcesByEntry(installedPkg.resources);\n\n const onlyIds =\n options.onlyIds && options.onlyIds.length > 0\n ? new Set(options.onlyIds)\n : null;\n\n const entries: UpgradeStagingEntry[] = [];\n\n // ─── Registered ids (have installed records) ─────────────────────────────\n for (const id of lineageReport.registeredIds) {\n if (onlyIds && !onlyIds.has(id)) continue;\n const built = await processRegistered({\n id,\n entry: entryMap.get(id),\n resource: resByEntryId.get(id),\n packageRoot: options.packageRoot,\n entryPackageRoot: options.entryPackageRoot,\n aliases: options.aliases,\n stagingDir,\n projectRoot: options.projectRoot,\n category,\n sourceVersion: options.manifest.version,\n });\n if (built) entries.push(built);\n }\n\n // ─── Foreign ids (mixed lineage extras) ──────────────────────────────────\n for (const id of lineageReport.unregisteredIds) {\n if (onlyIds && !onlyIds.has(id)) continue;\n const built = await processForeign({\n id,\n installDirAbs: path.join(options.projectRoot, lineageReport.installDir),\n stagingDir,\n projectRoot: options.projectRoot,\n category,\n });\n if (built) entries.push(built);\n }\n\n if (entries.length === 0) return null;\n\n const byRisk = aggregateByRisk(entries);\n const manifestOut: UpgradeStagingManifest = {\n schemaVersion: 1,\n ts: isoTs,\n package: category,\n trigger: options.trigger,\n variant: lineageReport.installedVariant ?? '_flat',\n fromVersion: lineageReport.installedVersion ?? '',\n toVersion: options.manifest.version,\n lineage: lineageReport.lineage,\n summary: { total: entries.length, byRisk },\n entries,\n };\n\n await ensureDir(stagingDir);\n await writeFileSafe(\n path.join(stagingDir, 'meta.json'),\n JSON.stringify(manifestOut, null, 2) + '\\n',\n );\n\n return { stagingDir, manifest: manifestOut };\n}\n\n// ─── Per-entry processors ────────────────────────────────────────────────────\n\ninterface ProcessRegisteredArgs {\n id: string;\n entry: UiEntry | undefined;\n resource: InstalledResource | undefined;\n packageRoot: string;\n entryPackageRoot?: Map<string, string>;\n aliases: UiAliases;\n stagingDir: string;\n projectRoot: string;\n category: ComponentCategory;\n sourceVersion: string;\n}\n\nasync function processRegistered(\n args: ProcessRegisteredArgs,\n): Promise<UpgradeStagingEntry | null> {\n const { id, entry, resource, stagingDir, projectRoot, category } = args;\n if (!resource) return null;\n\n const currentSource = await readFileOrNull(resource.target);\n // File present in installed manifest but missing on disk — surface as\n // breaking so the AI can reconcile (likely user deleted the file).\n if (currentSource === null) {\n return buildBreakingEntry({\n id,\n category,\n resource,\n projectRoot,\n stagingDir,\n currentSource: '',\n hint: 'installed file missing on disk',\n });\n }\n\n // Upstream removed this entry — breaking, emit current.tsx only.\n if (!entry) {\n return buildBreakingEntry({\n id,\n category,\n resource,\n projectRoot,\n stagingDir,\n currentSource,\n hint: 'entry removed in upstream package',\n });\n }\n\n const file = entry.files[0];\n if (!file) return null;\n\n const rootForEntry = args.entryPackageRoot?.get(id) ?? args.packageRoot;\n const sourceAbs = path.resolve(rootForEntry, file.source);\n const raw = await readFileOrNull(sourceAbs);\n if (raw === null) {\n // Upstream manifest references a missing file — degenerate; skip rather\n // than fail the whole pipeline.\n return null;\n }\n const incomingTransformed = rewriteImports(raw, args.aliases);\n const incomingHash = computeHash(incomingTransformed);\n\n const currentExt = path.extname(resource.target) || '.tsx';\n const incomingExt = path.extname(file.targetName) || currentExt;\n const currentRel = `${id}/current${currentExt}`;\n const incomingRel = `${id}/incoming${incomingExt}`;\n await writeFileSafe(path.join(stagingDir, currentRel), currentSource);\n await writeFileSafe(path.join(stagingDir, incomingRel), incomingTransformed);\n\n const diff = classifyRisk({\n currentHash: resource.hash,\n incomingHash,\n currentSource,\n incomingSource: incomingTransformed,\n multiFile: entry.files.length > 1,\n });\n\n const promotion = derivePromotion({\n currentSource,\n incomingSource: incomingTransformed,\n targetName: entry.files[0]?.targetName ?? `${id}.tsx`,\n });\n\n return {\n id,\n category,\n current: {\n target: path.relative(projectRoot, resource.target),\n hash: resource.hash,\n sourceLineage: 'teamix-evo',\n },\n incoming: {\n sourceVersion: args.sourceVersion,\n hash: incomingHash,\n relPath: incomingRel,\n },\n diff,\n promotion,\n };\n}\n\ninterface ProcessForeignArgs {\n id: string;\n installDirAbs: string;\n stagingDir: string;\n projectRoot: string;\n category: ComponentCategory;\n}\n\nasync function processForeign(\n args: ProcessForeignArgs,\n): Promise<UpgradeStagingEntry | null> {\n const { id, installDirAbs, stagingDir, projectRoot, category } = args;\n const tsx = path.join(installDirAbs, `${id}.tsx`);\n const ts = path.join(installDirAbs, `${id}.ts`);\n const target = (await fileExists(tsx))\n ? tsx\n : (await fileExists(ts))\n ? ts\n : null;\n if (!target) return null;\n\n const raw = await readFileOrNull(target);\n if (raw === null) return null;\n\n const ext = path.extname(target);\n const currentRel = `${id}/current${ext}`;\n await writeFileSafe(path.join(stagingDir, currentRel), raw);\n\n return {\n id,\n category,\n current: {\n target: path.relative(projectRoot, target),\n hash: computeHash(raw),\n sourceLineage: 'custom',\n },\n diff: {\n riskLevel: 'foreign',\n hints: [\n 'component is on disk but not registered in .teamix-evo/manifest.json',\n 'AI should propose: (a) ignore, (b) re-register via teamix-evo ui add, or (c) remove',\n ],\n filesChangedCount: 0,\n },\n };\n}\n\ninterface BuildBreakingArgs {\n id: string;\n category: ComponentCategory;\n resource: InstalledResource;\n projectRoot: string;\n stagingDir: string;\n currentSource: string;\n hint: string;\n}\n\nasync function buildBreakingEntry(\n args: BuildBreakingArgs,\n): Promise<UpgradeStagingEntry> {\n const ext = path.extname(args.resource.target) || '.tsx';\n const currentRel = `${args.id}/current${ext}`;\n // Always materialize the current snapshot so the AI can reason even when\n // the source disappeared from disk (zero-byte file is still informative).\n await writeFileSafe(\n path.join(args.stagingDir, currentRel),\n args.currentSource,\n );\n return {\n id: args.id,\n category: args.category,\n current: {\n target: path.relative(args.projectRoot, args.resource.target),\n hash: args.resource.hash,\n sourceLineage: 'teamix-evo',\n },\n diff: {\n riskLevel: 'breaking',\n hints: [args.hint],\n filesChangedCount: 0,\n },\n };\n}\n\n// ─── Risk classifier ─────────────────────────────────────────────────────────\n\ninterface ClassifyRiskArgs {\n currentHash: string;\n incomingHash: string;\n currentSource: string;\n incomingSource: string;\n multiFile: boolean;\n}\n\n/**\n * Lightweight risk classifier — regex-level only (per ADR 0040 §D3). The\n * skill is expected to refine after reading the staged sources, but the\n * default level lets the AI summarize \"X risky / Y medium / Z low\" without\n * reading any source code.\n */\nfunction classifyRisk(args: ClassifyRiskArgs): UpgradeStagingDiff {\n if (args.currentHash === args.incomingHash) {\n return { riskLevel: 'unchanged', hints: [], filesChangedCount: 0 };\n }\n\n const curExports = extractExportNames(args.currentSource);\n const newExports = extractExportNames(args.incomingSource);\n // Risk-classification perspective: \"removed\" = upstream dropped an export\n // the user still relied on; \"added\" = upstream introduced a new symbol.\n // (Compare to buildFeatureVector below which uses the user's perspective.)\n const removedExports = setDiff(curExports, newExports);\n const addedExports = setDiff(newExports, curExports);\n\n const curVariants = extractCvaVariantValues(args.currentSource);\n const newVariants = extractCvaVariantValues(args.incomingSource);\n const removedVariants = setDiff(curVariants, newVariants);\n const addedVariants = setDiff(newVariants, curVariants);\n\n const hints: string[] = [];\n for (const e of removedExports) hints.push(`removed export: ${e}`);\n for (const e of addedExports) hints.push(`new export: ${e}`);\n for (const v of removedVariants) hints.push(`removed cva variant: ${v}`);\n for (const v of addedVariants) hints.push(`new cva variant: ${v}`);\n if (args.multiFile) hints.push('multi-file entry; only first file staged');\n\n let riskLevel: UpgradeRiskLevel;\n if (removedExports.length > 0 || removedVariants.length > 0) {\n riskLevel = 'risky';\n } else if (\n addedExports.length > 0 ||\n addedVariants.length > 0 ||\n args.multiFile\n ) {\n riskLevel = 'upgradable-medium';\n } else {\n riskLevel = 'upgradable-low';\n }\n\n return { riskLevel, hints, filesChangedCount: 1 };\n}\n\n/**\n * Best-effort export-name extractor (regex). Catches `export const Foo`,\n * `export function Foo`, `export class Foo`, `export interface Foo`,\n * `export type Foo`, `export enum Foo`, and `export default <Identifier>`.\n * Misses re-exports (`export { X } from`) — those are rare for ui entries\n * and would require AST-level analysis to do correctly.\n */\nfunction extractExportNames(src: string): string[] {\n const names = new Set<string>();\n const re =\n /^\\s*export\\s+(?:default\\s+)?(?:async\\s+)?(?:const|let|var|function|class|interface|type|enum)\\s+(\\w+)/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(src)) !== null) {\n if (m[1]) names.add(m[1]);\n }\n // `export default Foo` (referenced identifier, not a declaration)\n for (const dm of src.matchAll(/^\\s*export\\s+default\\s+(\\w+)\\s*;/gm)) {\n if (dm[1]) names.add(dm[1]);\n }\n return [...names];\n}\n\n/**\n * Extract value-level cva variant keys (e.g. `default`, `ghost`, `destructive`).\n * Looks for a `variants: { ... }` object literal and harvests the second-level\n * keys inside each named group (`variant: { default: ..., ghost: ... }`).\n *\n * Naive, two-step regex:\n * 1. Locate the outermost `variants: { ... }` block via balanced-brace scan.\n * 2. For each top-level group `<name>: { ... }`, harvest its inner keys.\n *\n * Returns the union of inner keys across all groups (a single name like\n * `ghost` showing up in two groups still counts as one).\n */\nfunction extractCvaVariantValues(src: string): string[] {\n const block = extractVariantsBlock(src);\n if (block === null) return [];\n const names = new Set<string>();\n for (const groupBody of extractGroupBodies(block)) {\n for (const km of groupBody.matchAll(/^\\s*(?:['\"]?)(\\w+)(?:['\"]?)\\s*:/gm)) {\n if (km[1]) names.add(km[1]);\n }\n }\n return [...names];\n}\n\n/** Brace-balanced extraction of the body inside `variants: { ... }`. */\nfunction extractVariantsBlock(src: string): string | null {\n const idx = src.search(/\\bvariants\\s*:\\s*\\{/);\n if (idx < 0) return null;\n const open = src.indexOf('{', idx);\n if (open < 0) return null;\n let depth = 0;\n for (let i = open; i < src.length; i++) {\n const c = src[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) return src.slice(open + 1, i);\n }\n }\n return null;\n}\n\n/** Yield each `<name>: { ... }` group body inside a `variants` block. */\nfunction* extractGroupBodies(block: string): Generator<string> {\n const re = /(\\w+)\\s*:\\s*\\{/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(block)) !== null) {\n const open = block.indexOf('{', m.index);\n if (open < 0) continue;\n let depth = 0;\n for (let i = open; i < block.length; i++) {\n const c = block[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) {\n yield block.slice(open + 1, i);\n re.lastIndex = i + 1;\n break;\n }\n }\n }\n }\n}\n\nfunction setDiff(a: string[], b: string[]): string[] {\n const bset = new Set(b);\n return a.filter((x) => !bset.has(x)).sort();\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction collectResourcesByEntry(\n resources: InstalledResource[],\n): Map<string, InstalledResource> {\n const out = new Map<string, InstalledResource>();\n for (const r of resources) {\n const colon = r.id.indexOf(':');\n const eid = colon >= 0 ? r.id.slice(0, colon) : r.id;\n if (!out.has(eid)) out.set(eid, r);\n }\n return out;\n}\n\nfunction aggregateByRisk(\n entries: UpgradeStagingEntry[],\n): Partial<Record<UpgradeRiskLevel, number>> {\n const out: Partial<Record<UpgradeRiskLevel, number>> = {};\n for (const e of entries) {\n const k = e.diff.riskLevel;\n out[k] = (out[k] ?? 0) + 1;\n }\n return out;\n}\n\n// ─── Promotion-vector heuristics (Init landing plan Phase 2.C.2) ────────────\n\ninterface DerivePromotionArgs {\n currentSource: string;\n incomingSource: string;\n targetName: string;\n}\n\n/**\n * Build the optional promotion-planning payload for a registered staging entry.\n *\n * The CLI emits this best-effort vector so the `promote-to-biz` skill can\n * recommend a default mode without re-deriving every axis. All axes use\n * regex-level heuristics — the skill is expected to refine via AST when the\n * confidence is below the threshold.\n */\nfunction derivePromotion(args: DerivePromotionArgs): UpgradeStagingPromotion {\n const fileType = classifyPromoteFileType(args.targetName, args.currentSource);\n const featureVector = buildFeatureVector(\n args.currentSource,\n args.incomingSource,\n );\n const { recommendedModes, confidence, reasons } = scorePromotionModes(\n fileType,\n featureVector,\n );\n return { fileType, featureVector, recommendedModes, confidence, reasons };\n}\n\n/**\n * Heuristic file-type classifier for the user's installed file. Mirrors\n * `ui-adopt.ts#classifyFile` but lighter — the staging emitter operates on\n * registered entries that already passed `ui add`, so the bias is towards\n * `component`.\n */\nfunction classifyPromoteFileType(\n targetName: string,\n src: string,\n): PromoteFileType {\n if (targetName.endsWith('.d.ts')) return 'type';\n if (/^use-[a-z0-9-]+\\.tsx?$/i.test(targetName)) return 'hook';\n const hasJsx = /<[A-Za-z][^>]*?>/.test(src);\n const hasReactImport = /from ['\"]react['\"]/.test(src);\n const hasProvider =\n /\\.Provider\\b/.test(src) || /createContext\\s*[<(]/.test(src);\n if (hasProvider && (hasJsx || hasReactImport)) return 'provider';\n if (hasJsx || /forwardRef\\s*[<(]/.test(src)) return 'component';\n if (!hasJsx && !hasReactImport) return 'util';\n return 'component';\n}\n\nfunction buildFeatureVector(\n current: string,\n incoming: string,\n): PromoteFeatureVector {\n const curExports = extractExportNames(current);\n const newExports = extractExportNames(incoming);\n // Promotion-vector perspective: \"added\" = user-side has it, upstream\n // does not (i.e. user added on top of upstream); \"removed\" = upstream\n // brings it but user has dropped it. Mirror inverse of classifyRisk above.\n const apiAdded = setDiff(curExports, newExports);\n const apiRemoved = setDiff(newExports, curExports);\n\n const curVariants = extractCvaVariantValues(current);\n const newVariants = extractCvaVariantValues(incoming);\n const cvaAdded = setDiff(curVariants, newVariants);\n const cvaModified: string[] = [];\n // \"modified\" — same key on both sides but body changed; we do a regex-level\n // proxy: a variant whose group body differs between current and incoming.\n const sharedVariants = curVariants.filter((v) => newVariants.includes(v));\n for (const v of sharedVariants) {\n if (extractVariantBody(current, v) !== extractVariantBody(incoming, v)) {\n cvaModified.push(v);\n }\n }\n\n // Style delta: heuristic on className literals & token references in current\n // (the user's file) compared to incoming.\n const curClass = extractClassNameLiterals(current);\n const newClass = extractClassNameLiterals(incoming);\n const classNameDiff = curClass !== newClass;\n const curTokens = extractTokenRefs(current);\n const newTokens = extractTokenRefs(incoming);\n const tokenUsageDiff =\n curTokens.size !== newTokens.size ||\n [...curTokens].some((t) => !newTokens.has(t));\n\n // Logic delta is read off the *current* (user) side — these signals decide\n // whether the user added stateful behaviour on top of the upstream import.\n const hasState = /\\buseState\\s*[<(]/.test(current);\n const hasEffect =\n /\\b(useEffect|useLayoutEffect|useMemo|useCallback)\\s*[<(]/.test(current);\n const curImports = extractImportSources(current);\n const newImports = extractImportSources(incoming);\n const hasExtraImports = [...curImports].some((src) => !newImports.has(src));\n\n // Structure delta — detect a composition pattern (multiple atomic children\n // rendered side-by-side) on the user side. Best effort: count distinct\n // capitalised JSX tag names; >2 distinct upstream-looking tags hints at a\n // compose pattern.\n const tagSet = new Set<string>();\n for (const m of current.matchAll(/<([A-Z]\\w+)[\\s/>]/g)) {\n if (m[1]) tagSet.add(m[1]);\n }\n const atomicChildren = [...tagSet];\n const isComposition = atomicChildren.length > 2;\n\n // Signature change — heuristic on default-export function parameter list.\n const signatureChanged =\n extractDefaultParamList(current) !== extractDefaultParamList(incoming);\n\n return {\n apiDelta: { added: apiAdded, removed: apiRemoved, signatureChanged },\n styleDelta: { classNameDiff, tokenUsageDiff },\n logicDelta: { hasState, hasEffect, hasExtraImports },\n cvaDelta: { addedVariants: cvaAdded, modifiedVariants: cvaModified },\n structureDelta: { isComposition, atomicChildren },\n };\n}\n\n/**\n * Score every mode independently, then return the recommended subset per the\n * Init landing plan §1.3 §5 (mode synthesis). Mutually exclusive terminals\n * (Coexist / Fork / TokenOnly) win when they fire; otherwise we return the\n * union of {Preset, Wrapper, Variant} above the 0.6 threshold.\n */\nfunction scorePromotionModes(\n fileType: PromoteFileType,\n fv: PromoteFeatureVector,\n): { recommendedModes: PromoteMode[]; confidence: number; reasons: string[] } {\n const reasons: string[] = [];\n if (fileType === 'hook' || fileType === 'util' || fileType === 'type') {\n reasons.push(\n `fileType=${fileType} — not a component, deferred to ManualReview`,\n );\n return { recommendedModes: ['ManualReview'], confidence: 0.5, reasons };\n }\n\n const apiNoChange =\n fv.apiDelta.added.length === 0 &&\n fv.apiDelta.removed.length === 0 &&\n !fv.apiDelta.signatureChanged;\n const logicMinimal =\n !fv.logicDelta.hasState &&\n !fv.logicDelta.hasEffect &&\n !fv.logicDelta.hasExtraImports;\n\n // Terminal modes (mutually exclusive)\n if (fv.apiDelta.removed.length > 0 || fv.apiDelta.signatureChanged) {\n reasons.push(\n 'signature changed or props removed — Coexist preserves user version',\n );\n return { recommendedModes: ['Coexist'], confidence: 0.85, reasons };\n }\n if (\n apiNoChange &&\n logicMinimal &&\n (fv.styleDelta.classNameDiff || fv.styleDelta.tokenUsageDiff) &&\n fv.cvaDelta.addedVariants.length === 0 &&\n fv.cvaDelta.modifiedVariants.length === 0\n ) {\n reasons.push(\n 'only style / token differences — push to tokens.overrides.css',\n );\n return { recommendedModes: ['TokenOnly'], confidence: 0.8, reasons };\n }\n\n const modes: PromoteMode[] = [];\n let score = 0;\n if (\n fv.cvaDelta.addedVariants.length > 0 ||\n fv.cvaDelta.modifiedVariants.length > 0\n ) {\n modes.push('Variant');\n reasons.push(\n `cva variants delta: +${fv.cvaDelta.addedVariants.length} ~${fv.cvaDelta.modifiedVariants.length}`,\n );\n score = Math.max(score, 0.7);\n }\n if (\n fv.logicDelta.hasState ||\n fv.logicDelta.hasEffect ||\n fv.logicDelta.hasExtraImports ||\n fv.apiDelta.added.length > 0\n ) {\n modes.push('Wrapper');\n reasons.push('user added state / effect / imports / props');\n score = Math.max(score, 0.75);\n }\n if (\n apiNoChange &&\n logicMinimal &&\n !fv.styleDelta.classNameDiff &&\n !fv.styleDelta.tokenUsageDiff &&\n fv.cvaDelta.addedVariants.length === 0 &&\n fv.cvaDelta.modifiedVariants.length === 0\n ) {\n // No detectable delta beyond defaults — Preset is the safe choice.\n modes.push('Preset');\n reasons.push('no API/logic delta — Preset captures default-prop tweaks');\n score = Math.max(score, 0.6);\n }\n if (fv.structureDelta.isComposition) {\n modes.push('Compose');\n reasons.push(\n `composition of ${fv.structureDelta.atomicChildren.length} atomic children`,\n );\n score = Math.max(score, 0.65);\n }\n\n if (modes.length === 0) {\n reasons.push('no axis crossed the 0.6 threshold');\n return { recommendedModes: ['ManualReview'], confidence: 0.4, reasons };\n }\n return { recommendedModes: modes, confidence: score, reasons };\n}\n\nfunction extractVariantBody(src: string, key: string): string {\n const block = extractVariantsBlock(src);\n if (block === null) return '';\n const re = new RegExp(`(?:[\"\\']?${key}[\"\\']?)\\\\s*:\\\\s*\\\\{`);\n const idx = block.search(re);\n if (idx < 0) return '';\n const open = block.indexOf('{', idx);\n if (open < 0) return '';\n let depth = 0;\n for (let i = open; i < block.length; i++) {\n const c = block[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) return block.slice(open + 1, i);\n }\n }\n return '';\n}\n\nfunction extractClassNameLiterals(src: string): string {\n const out: string[] = [];\n // 1) Static `className=\"...\"` / `className='...'` / `className={`...`}`.\n for (const m of src.matchAll(/className\\s*=\\s*[\"'`]([^\"'`]*)[\"'`]/g)) {\n if (m[1]) out.push(m[1]);\n }\n // 2) Dynamic `cn(...)` / `clsx(...)` / `cva(...)` calls — extract any\n // string literal arguments. shadcn-style components use these heavily,\n // so missing them under-counted classNameDiff signal (Concern-7).\n // We use a conservative approach: capture the call arglist, then pluck\n // out top-level string literals.\n for (const m of src.matchAll(/\\b(?:cn|clsx|cva)\\s*\\(/g)) {\n const open = (m.index ?? 0) + m[0].length - 1;\n let depth = 1;\n let i = open + 1;\n for (; i < src.length && depth > 0; i++) {\n const c = src[i];\n if (c === '(') depth++;\n else if (c === ')') depth--;\n }\n const body = src.slice(open + 1, i - 1);\n for (const lit of body.matchAll(/[\"'`]([^\"'`]*)[\"'`]/g)) {\n if (lit[1]) out.push(lit[1]);\n }\n }\n return out.sort().join('|');\n}\n\nfunction extractTokenRefs(src: string): Set<string> {\n const out = new Set<string>();\n for (const m of src.matchAll(/var\\(--([a-z0-9-]+)\\)/g)) {\n if (m[1]) out.add(m[1]);\n }\n for (const m of src.matchAll(/--([a-z][a-z0-9-]*)\\s*:/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction extractImportSources(src: string): Set<string> {\n const out = new Set<string>();\n for (const m of src.matchAll(/^\\s*import\\b[^'\"]*['\"]([^'\"]+)['\"]/gm)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction extractDefaultParamList(src: string): string {\n const m =\n /export\\s+default\\s+(?:async\\s+)?function\\s+\\w*\\s*\\(([^)]*)\\)/.exec(src) ??\n /export\\s+default\\s+(?:\\([^)]*\\)|\\w+)\\s*=>/.exec(src) ??\n /(?:const|function)\\s+\\w+\\s*=?\\s*(?:\\(([^)]*)\\)|\\w+)\\s*(?:=>|\\{)/.exec(src);\n return m?.[1]?.replace(/\\s+/g, ' ').trim() ?? '';\n}\n","/**\n * `teamix-evo ui upgrade [id...]` — produce a staging dir for ui source-layer\n * upgrades. Frozen boundary preserved per [ADR 0040](../../../../../docs/adr/0040-component-source-layer-upgrade-flow.md):\n * this command **never writes** into `src/components/ui/**`. The staging is\n * applied via the `teamix-evo-upgrade` skill.\n *\n * Implementation is shared with `biz-ui upgrade` via {@link makeUpgradeCommand}.\n */\nimport { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('ui');\n","import { Command } from 'commander';\nimport type { PromoteMode } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport {\n runUiPromote,\n type RunUiPromoteResult,\n} from '../../core/ui-promote.js';\nimport { formatFileChangeSummary } from '../../core/file-changes.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nconst VALID_MODES: PromoteMode[] = [\n 'Coexist',\n 'Preset',\n 'Wrapper',\n 'Compose',\n 'Variant',\n 'Fork',\n 'TokenOnly',\n 'ManualReview',\n];\n\ninterface PromoteOptions {\n modes?: string;\n migrateImports?: boolean;\n keepOriginalNames?: boolean;\n dryRun?: boolean;\n stagingDir?: string;\n}\n\nexport const promoteCommand = new Command('promote-to-biz')\n .description(\n '将 staging 中的组件按 8 模式 promote 到 src/components/business/(Init 落地计划 §C.3)',\n )\n .argument('[ids...]', '可选 entry id 列表;省略时处理 staging 中全部条目')\n .option(\n '--modes <list>',\n '逗号分隔的模式列表(覆盖 staging 推荐),如 \"Wrapper,Preset\"',\n )\n .option(\n '--migrate-imports',\n 'Coexist 模式时同步重写 src/** 中 ui/<id> import 为 legacy-<id>',\n )\n .option(\n '--keep-original-names',\n 'Coexist 模式跳过 Foo → LegacyFoo 重命名(默认会重命名)',\n )\n .option('--dry-run', '只输出变更计划,不写入任何文件')\n .option(\n '--staging-dir <path>',\n '指定 staging 目录(默认使用 .teamix-evo/.upgrade-staging/ui-* 中最新的)',\n )\n .action(async (ids: string[], opts: PromoteOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const modesOverride = parseModes(opts.modes);\n\n const result = await runUiPromote({\n projectRoot,\n ids: ids ?? [],\n modesOverride,\n migrateImports: opts.migrateImports ?? false,\n keepOriginalNames: opts.keepOriginalNames ?? false,\n dryRun: opts.dryRun ?? false,\n stagingDir: opts.stagingDir,\n });\n\n renderResult(result, opts.dryRun ?? false);\n } catch (err) {\n logger.error(`promote-to-biz failed: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nfunction parseModes(raw: string | undefined): PromoteMode[] | undefined {\n if (!raw || raw.trim().length === 0) return undefined;\n const parts = raw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const out: PromoteMode[] = [];\n for (const p of parts) {\n const match = VALID_MODES.find((m) => m.toLowerCase() === p.toLowerCase());\n if (!match) {\n throw new Error(`Unknown mode \"${p}\". Valid: ${VALID_MODES.join(', ')}`);\n }\n out.push(match);\n }\n return out;\n}\n\nfunction renderResult(result: RunUiPromoteResult, dryRun: boolean): void {\n switch (result.status) {\n case 'not-initialized':\n logger.error('UI not initialized. Run `npx teamix-evo ui init` first.');\n process.exitCode = 1;\n return;\n case 'no-staging':\n logger.error(\n 'No `ui-*` staging dir found under `.teamix-evo/.upgrade-staging/`. Run `teamix-evo ui upgrade` first.',\n );\n process.exitCode = 1;\n return;\n case 'no-entries':\n logger.warn(`Staging dir is empty: ${result.stagingDir}`);\n return;\n case 'promoted':\n break;\n }\n\n const promoted = result.promotions.filter((p) => p.status === 'promoted');\n const manual = result.promotions.filter((p) => p.status === 'manual-review');\n const tokenOnly = result.promotions.filter((p) => p.status === 'token-only');\n const failed = result.promotions.filter((p) => p.status === 'skipped');\n\n logger.success(\n `${dryRun ? '[dry-run] ' : ''}promote-to-biz complete: ${\n promoted.length\n } promoted, ${manual.length} manual-review, ${\n tokenOnly.length\n } token-only, ${failed.length} skipped.`,\n );\n logger.info('');\n\n if (promoted.length > 0) {\n logger.info('Promoted:');\n for (const p of promoted) {\n logger.info(` • ${p.id} [${p.modes.join('+')}]`);\n for (const out of p.outputs) logger.info(` → ${out}`);\n if (p.reason) logger.info(` ${p.reason}`);\n }\n logger.info('');\n }\n\n if (manual.length > 0) {\n logger.info('Manual review needed (no file written):');\n for (const p of manual) logger.info(` • ${p.id} — ${p.reason ?? ''}`);\n logger.info('');\n }\n if (tokenOnly.length > 0) {\n logger.info('Token-only (edit tokens.overrides.css instead):');\n for (const p of tokenOnly) logger.info(` • ${p.id}`);\n logger.info('');\n }\n if (failed.length > 0) {\n logger.warn('Failed:');\n for (const p of failed) logger.warn(` • ${p.id} — ${p.reason ?? ''}`);\n logger.info('');\n }\n\n // Import-rewrite output (Coexist + --migrate-imports)\n if (result.importRewrite.rewritten.length > 0) {\n logger.info(\n `Import rewrite: ${result.importRewrite.rewritten.length} file(s) updated under src/**.`,\n );\n }\n if (result.importRewrite.skipped.length > 0) {\n logger.warn('Manual import fix needed (could not be rewritten safely):');\n for (const s of result.importRewrite.skipped) {\n logger.warn(` • ${s.file}:${s.line} [${s.reason}] — ${s.snippet}`);\n }\n logger.info('');\n }\n\n // Four-bucket file-change summary.\n if (result.fileChanges.length > 0) {\n logger.info('文件变更:');\n for (const line of formatFileChangeSummary(result.fileChanges)) {\n logger.info(` ${line}`);\n }\n }\n}\n","/**\n * `teamix-evo ui promote-to-biz` core (Init landing plan Task 1 + §5.1).\n *\n * Reads a `.teamix-evo/.upgrade-staging/ui-<ts>/meta.json` (the staging\n * already produced by `ui upgrade`), and for each requested entry executes\n * the chosen promotion {@link PromoteMode} — generating files under\n * `src/components/business/` (and, for Coexist, also rewriting the\n * `src/components/ui/` slot back to upstream).\n *\n * Frozen-boundary discipline:\n * - The CLI is allowed to write `src/components/business/**` (frozen on\n * re-add but free during promotion since this *is* user-initiated).\n * - `src/components/ui/<id>.tsx` is rewritten **only** when Coexist mode\n * fires (we restore the upstream snapshot and move the user's previous\n * version to `business/legacy-<id>.tsx`).\n * - All overwrites are preceded by `backupFile()` so `.teamix-evo/.backups/`\n * captures the pre-promote state — see Phase 1.A2.\n *\n * Mode catalogue (8 modes from the plan §1.2):\n * - **Coexist** — keep user version as `LegacyXxx` in business/, restore\n * upstream into `ui/<id>.tsx`. Optional callsite\n * migration via `--migrate-imports`.\n * - **Preset** — wrapper file that pins default props on upstream.\n * - **Wrapper** — wrapper file that adds state/effect/extra props.\n * - **Variant** — extends upstream cva variants.\n * - **Compose** — composition of upstream atomic children.\n * - **Fork** — copy current source verbatim into business/.\n * - **TokenOnly** — emits a hint pointing at `tokens/tokens.overrides.css`,\n * no file written.\n * - **ManualReview** — emits a hint, no file written.\n *\n * Modes can stack per the plan §1.5. The composed file picks the highest\n * applicable layer order: `Variant` (cva) ▸ `Wrapper` (state) ▸ `Preset`\n * (destructured defaults). Terminal modes (`Coexist` / `Fork` / `TokenOnly` /\n * `ManualReview`) fire alone.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n InstalledManifest,\n InstalledPackage,\n InstalledResource,\n PromoteMode,\n UpgradeStagingEntry,\n UpgradeStagingManifest,\n} from '@teamix-evo/registry';\nimport {\n backupFile,\n ensureDir,\n fileExists,\n readFileOrNull,\n writeFileSafe,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport {\n findInstalledPackage,\n readInstalledManifest,\n readProjectConfig,\n writeInstalledManifest,\n} from './state.js';\nimport type { FileChange } from './file-changes.js';\nimport {\n rewriteProjectImports,\n type ImportRewriteSpec,\n type RewriteImportsResult,\n type SkippedImport,\n} from './ui-promote-imports.js';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst STAGING_DIR = '.upgrade-staging';\nconst UI_PACKAGE = '@teamix-evo/ui';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport type PromotionStatus =\n | 'promoted'\n | 'skipped'\n | 'manual-review'\n | 'token-only';\n\nexport interface PromotedEntry {\n id: string;\n modes: PromoteMode[];\n status: PromotionStatus;\n /** Project-rel posix paths actually written / affected. */\n outputs: string[];\n /** Reason for non-`promoted` statuses, or notes for `promoted`. */\n reason?: string;\n}\n\nexport interface RunUiPromoteOptions {\n /** Absolute project root. */\n projectRoot: string;\n /**\n * Specific staging dir to read. When omitted, the latest `ui-<ts>/` under\n * `.teamix-evo/.upgrade-staging/` is selected.\n */\n stagingDir?: string;\n /** Subset of entry ids. Empty/undefined → every entry in the staging meta. */\n ids?: string[];\n /**\n * Override modes for *every* requested id. Useful for explicit invocation\n * (`--modes wrapper,preset`); when omitted we fall back to\n * `entry.promotion.recommendedModes`, then to `['ManualReview']`.\n */\n modesOverride?: PromoteMode[];\n /** When true, also rewrite `src/**` callsites that still reference `ui/<id>` (Coexist only). */\n migrateImports?: boolean;\n /**\n * When true, skip the `Foo` → `LegacyFoo` rename in Coexist mode. Default\n * false (rename for safety per the plan §306 open question).\n */\n keepOriginalNames?: boolean;\n /** Dry-run — no files written, but the result still reflects what would change. */\n dryRun?: boolean;\n}\n\nexport interface RunUiPromoteResult {\n status: 'promoted' | 'no-staging' | 'no-entries' | 'not-initialized';\n /** Absolute staging dir that was used (when status === 'promoted'). */\n stagingDir?: string;\n /** Per-entry outcomes. */\n promotions: PromotedEntry[];\n /** Aggregated file-change ledger for the four-bucket summary. */\n fileChanges: FileChange[];\n /** Import rewrite output (Coexist + --migrate-imports). */\n importRewrite: RewriteImportsResult;\n}\n\n// ─── Orchestration ───────────────────────────────────────────────────────────\n\nexport async function runUiPromote(\n options: RunUiPromoteOptions,\n): Promise<RunUiPromoteResult> {\n const { projectRoot } = options;\n const dryRun = options.dryRun ?? false;\n const promotions: PromotedEntry[] = [];\n const fileChanges: FileChange[] = [];\n const skipped: SkippedImport[] = [];\n const rewritten: string[] = [];\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.ui?.aliases) {\n return {\n status: 'not-initialized',\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n const aliases = config.packages.ui.aliases;\n\n // 1. Resolve staging dir.\n const stagingDir =\n options.stagingDir ?? (await findLatestUiStagingDir(projectRoot));\n if (!stagingDir) {\n return {\n status: 'no-staging',\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n\n const meta = await readStagingMeta(stagingDir);\n if (!meta || meta.entries.length === 0) {\n return {\n status: 'no-entries',\n stagingDir,\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n\n // 2. Filter to requested ids.\n const onlyIds =\n options.ids && options.ids.length > 0 ? new Set(options.ids) : null;\n const targetEntries = onlyIds\n ? meta.entries.filter((e) => onlyIds.has(e.id))\n : meta.entries;\n\n // 3. Per-entry promotion.\n const newResources: InstalledResource[] = [];\n for (const entry of targetEntries) {\n const decision = decideModes(entry, options.modesOverride);\n try {\n const outcome = await promoteEntry({\n projectRoot,\n stagingDir,\n entry,\n modes: decision,\n aliases,\n keepOriginalNames: options.keepOriginalNames ?? false,\n dryRun,\n });\n promotions.push(outcome.promotion);\n fileChanges.push(...outcome.fileChanges);\n newResources.push(...outcome.newResources);\n\n // Coexist + --migrate-imports: rewrite ui/<id> references project-wide\n // to legacy-<id> so old callsites continue to render the user's prior\n // implementation (rather than the freshly restored upstream).\n if (\n decision.includes('Coexist') &&\n options.migrateImports &&\n outcome.coexistRewriteSpec\n ) {\n const r = await rewriteProjectImports(\n projectRoot,\n [outcome.coexistRewriteSpec],\n { dryRun, backup: true },\n );\n rewritten.push(...r.rewritten);\n skipped.push(...r.skipped);\n for (const rel of r.rewritten) {\n fileChanges.push({\n kind: 'modified',\n path: rel,\n step: 'ui-promote-imports',\n });\n }\n }\n } catch (err) {\n logger.error(`Promotion failed for ${entry.id}: ${getErrorMessage(err)}`);\n promotions.push({\n id: entry.id,\n modes: decision,\n status: 'skipped',\n outputs: [],\n reason: getErrorMessage(err),\n });\n }\n }\n\n // 4. Update installed manifest with new business resources (frozen-on-add).\n if (!dryRun && newResources.length > 0) {\n await mergeIntoInstalledManifest(projectRoot, newResources);\n }\n\n return {\n status: 'promoted',\n stagingDir,\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n}\n\n// ─── Per-entry promotion ─────────────────────────────────────────────────────\n\ninterface PromoteEntryArgs {\n projectRoot: string;\n stagingDir: string;\n entry: UpgradeStagingEntry;\n modes: PromoteMode[];\n aliases: import('@teamix-evo/registry').UiAliases;\n keepOriginalNames: boolean;\n dryRun: boolean;\n}\n\ninterface PromoteEntryOutcome {\n promotion: PromotedEntry;\n fileChanges: FileChange[];\n newResources: InstalledResource[];\n /** Set when Coexist fires, used by `--migrate-imports`. */\n coexistRewriteSpec?: ImportRewriteSpec;\n}\n\nasync function promoteEntry(\n args: PromoteEntryArgs,\n): Promise<PromoteEntryOutcome> {\n const { entry, modes, projectRoot, stagingDir, aliases, dryRun } = args;\n const fileChanges: FileChange[] = [];\n const newResources: InstalledResource[] = [];\n let coexistRewriteSpec: ImportRewriteSpec | undefined;\n\n // Terminal: ManualReview.\n if (modes.includes('ManualReview')) {\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'manual-review',\n outputs: [],\n reason:\n 'Confidence below threshold or fileType non-component — see staging meta.json',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Terminal: TokenOnly.\n if (modes.includes('TokenOnly')) {\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'token-only',\n outputs: [],\n reason:\n '差异仅限 className/token — 编辑 tokens/tokens.overrides.css 而非创建 biz-ui 文件',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Read staged sources up-front; not all modes need both.\n const currentSrc = await readStagedFile(stagingDir, entry, 'current');\n const incomingSrc = await readStagedFile(stagingDir, entry, 'incoming');\n\n const businessDir = path.join(projectRoot, aliases.business);\n const uiDir = path.join(projectRoot, aliases.components);\n const businessRel = aliases.business;\n const uiRel = aliases.components;\n\n // Terminal: Coexist.\n if (modes.includes('Coexist')) {\n if (!currentSrc) {\n throw new Error('Coexist requires a current.tsx in staging');\n }\n if (!incomingSrc) {\n throw new Error('Coexist requires an incoming.tsx in staging');\n }\n\n const legacyId = `legacy-${entry.id}`;\n const legacyAbs = path.join(businessDir, `${legacyId}.tsx`);\n const uiAbs = path.join(uiDir, `${entry.id}.tsx`);\n\n // 1) Back up the user's existing ui/<id>.tsx (it will be replaced by upstream).\n if (await fileExists(uiAbs)) {\n if (!dryRun) await backupFile(uiAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, uiAbs)),\n step: 'ui-promote',\n detail: 'pre-coexist user version',\n });\n }\n\n // 2) Write the renamed user version into business/legacy-<id>.tsx.\n const renamed = args.keepOriginalNames\n ? currentSrc\n : prefixExportsLegacy(currentSrc, entry.id);\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(legacyAbs, renamed);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${legacyId}.tsx`)),\n step: 'ui-promote',\n detail: 'Coexist legacy snapshot',\n });\n newResources.push({\n id: `${legacyId}:${legacyId}.tsx`,\n target: legacyAbs,\n hash: computeHash(renamed),\n strategy: 'frozen',\n });\n\n // 3) Restore upstream into ui/<id>.tsx.\n if (!dryRun) await writeFileSafe(uiAbs, incomingSrc);\n fileChanges.push({\n kind: 'modified',\n path: posix(path.join(uiRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: 'Coexist upstream restore',\n });\n\n coexistRewriteSpec = {\n oldPath: importPathFor(uiRel, entry.id),\n newPath: importPathFor(businessRel, legacyId),\n };\n\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [\n posix(path.join(businessRel, `${legacyId}.tsx`)),\n posix(path.join(uiRel, `${entry.id}.tsx`)),\n ],\n reason: '双轨:upstream 装回 ui/、用户版改名进 business/legacy-',\n },\n fileChanges,\n newResources,\n coexistRewriteSpec,\n };\n }\n\n // Terminal: Fork (the user's source moves verbatim to business/).\n if (modes.includes('Fork')) {\n if (!currentSrc) throw new Error('Fork requires a current.tsx in staging');\n const forkAbs = path.join(businessDir, `${entry.id}.tsx`);\n if (await fileExists(forkAbs)) {\n if (!dryRun) await backupFile(forkAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, forkAbs)),\n step: 'ui-promote',\n detail: 'pre-fork existing business file',\n });\n }\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(forkAbs, currentSrc);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: 'Fork — full custom copy',\n });\n newResources.push({\n id: `${entry.id}:${entry.id}.tsx`,\n target: forkAbs,\n hash: computeHash(currentSrc),\n strategy: 'frozen',\n });\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [posix(path.join(businessRel, `${entry.id}.tsx`))],\n reason: 'Fork:完整保留用户实现',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Composable modes: Preset / Wrapper / Variant / Compose. Stack into one\n // business/<id>.tsx file.\n const businessAbs = path.join(businessDir, `${entry.id}.tsx`);\n const composedSource = composeBusinessFile({\n id: entry.id,\n modes,\n aliases,\n entry,\n incomingSource: incomingSrc,\n });\n\n if (await fileExists(businessAbs)) {\n if (!dryRun) await backupFile(businessAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, businessAbs)),\n step: 'ui-promote',\n detail: 'pre-promote business file',\n });\n }\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(businessAbs, composedSource);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: `modes: ${modes.join('+')}`,\n });\n newResources.push({\n id: `${entry.id}:${entry.id}.tsx`,\n target: businessAbs,\n hash: computeHash(composedSource),\n strategy: 'frozen',\n });\n\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [posix(path.join(businessRel, `${entry.id}.tsx`))],\n reason: `modes: ${modes.join('+')} 已生成 business/${entry.id}.tsx`,\n },\n fileChanges,\n newResources,\n };\n}\n\n// ─── Mode synthesis ──────────────────────────────────────────────────────────\n\ninterface ComposeArgs {\n id: string;\n modes: PromoteMode[];\n aliases: import('@teamix-evo/registry').UiAliases;\n entry: UpgradeStagingEntry;\n incomingSource: string | null;\n}\n\n/**\n * Generate the wrapping business component file when one or more of\n * Preset / Wrapper / Variant / Compose fires. We deliberately emit a\n * scaffolded file with `TODO` markers so the AI / user can fill in the\n * specifics — the goal is to land the import topology correctly, not to\n * synthesise final logic from heuristics.\n */\nfunction composeBusinessFile(args: ComposeArgs): string {\n const { id, modes, aliases, entry } = args;\n const componentName = pascalCase(id);\n const upstreamImport = importPathFor(aliases.components, id);\n const hasVariant = modes.includes('Variant');\n const hasWrapper = modes.includes('Wrapper');\n const hasPreset = modes.includes('Preset');\n const hasCompose = modes.includes('Compose');\n\n const banner = renderBanner({ id, modes, entry });\n\n const importLines: string[] = [\n `import * as React from 'react';`,\n `import { ${componentName} as Base${componentName}, type ${componentName}Props as Base${componentName}Props } from '${upstreamImport}';`,\n ];\n if (\n hasCompose &&\n entry.promotion?.featureVector?.structureDelta?.atomicChildren\n ) {\n const children = entry.promotion.featureVector.structureDelta.atomicChildren\n .filter((c) => c !== componentName)\n .slice(0, 4);\n for (const child of children) {\n importLines.push(\n `// TODO: confirm import path for atomic child <${child} />`,\n );\n }\n }\n\n const body: string[] = [];\n body.push(\n `export interface ${componentName}Props extends Base${componentName}Props {`,\n );\n if (hasWrapper) {\n body.push(\n ` // TODO(Wrapper): add business-only props (e.g. loading?: boolean, confirm?: () => void)`,\n );\n }\n body.push(`}`);\n body.push('');\n\n if (hasVariant) {\n body.push(\n `// TODO(Variant): extend cva variants from upstream — when upstream`,\n );\n body.push(\n `// exports \\`${id}Variants\\`, import + spread it here; when not, copy the`,\n );\n body.push(\n `// configuration into this file and annotate \\`SOURCE_OF_TRUTH\\`.`,\n );\n body.push('');\n }\n\n if (hasPreset) {\n // Preset: encode defaults as destructured parameters (React 18+ deprecates\n // SFC.defaultProps; see ADR pattern in plan §C.3).\n body.push(\n `export const ${componentName}: React.FC<${componentName}Props> = ({`,\n );\n body.push(\n ` // TODO(Preset): fill defaults migrated from your previous user version,`,\n );\n body.push(\n ` // e.g. \\`size = 'md'\\`, \\`variant = 'primary'\\`.`,\n );\n body.push(` ...props`);\n body.push(`}) => {`);\n } else {\n body.push(\n `export const ${componentName}: React.FC<${componentName}Props> = (props) => {`,\n );\n }\n if (hasWrapper) {\n body.push(\n ` // TODO(Wrapper): pull business state / effects out of props before rendering.`,\n );\n }\n if (hasCompose) {\n body.push(\n ` // TODO(Compose): assemble atomic children — ${\n entry.promotion?.featureVector?.structureDelta?.atomicChildren?.join(\n ', ',\n ) ?? '...'\n }`,\n );\n }\n body.push(` return <Base${componentName} {...props} />;`);\n body.push(`};`);\n\n return [banner, '', importLines.join('\\n'), '', body.join('\\n'), ''].join(\n '\\n',\n );\n}\n\nfunction renderBanner(args: {\n id: string;\n modes: PromoteMode[];\n entry: UpgradeStagingEntry;\n}): string {\n const reasons = args.entry.promotion?.reasons ?? [];\n const lines = [\n `/**`,\n ` * Generated by \\`teamix-evo ui promote-to-biz\\` (Init landing plan §C.3).`,\n ` *`,\n ` * id : ${args.id}`,\n ` * modes : ${args.modes.join(' + ')}`,\n ` * note : 业务定制层;上游 ui/${args.id}.tsx 仍是 SOURCE_OF_TRUTH,请避免在此再次复制其内部细节。`,\n ];\n if (reasons.length > 0) {\n lines.push(' *');\n lines.push(' * 推荐理由:');\n for (const r of reasons) lines.push(` * • ${r}`);\n }\n lines.push(' */');\n return lines.join('\\n');\n}\n\n// ─── Helpers: staging IO ─────────────────────────────────────────────────────\n\nasync function findLatestUiStagingDir(\n projectRoot: string,\n): Promise<string | null> {\n const base = path.join(projectRoot, TEAMIX_DIR, STAGING_DIR);\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(base, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n const candidates = entries\n .filter((e) => e.isDirectory() && e.name.startsWith('ui-'))\n .map((e) => e.name)\n .sort();\n const last = candidates[candidates.length - 1];\n return last ? path.join(base, last) : null;\n}\n\nasync function readStagingMeta(\n stagingDir: string,\n): Promise<UpgradeStagingManifest | null> {\n const raw = await readFileOrNull(path.join(stagingDir, 'meta.json'));\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as UpgradeStagingManifest;\n } catch {\n return null;\n }\n}\n\nasync function readStagedFile(\n stagingDir: string,\n entry: UpgradeStagingEntry,\n kind: 'current' | 'incoming',\n): Promise<string | null> {\n const ext = path.extname(entry.current.target) || '.tsx';\n // Try the canonical name first, then fall back to the explicit relPath\n // recorded on the entry (incoming may have a different ext).\n const direct = path.join(stagingDir, entry.id, `${kind}${ext}`);\n const directRead = await readFileOrNull(direct);\n if (directRead !== null) return directRead;\n if (kind === 'incoming' && entry.incoming?.relPath) {\n return readFileOrNull(path.join(stagingDir, entry.incoming.relPath));\n }\n return null;\n}\n\n// ─── Helpers: mode decision + manifest merge ────────────────────────────────\n\nfunction decideModes(\n entry: UpgradeStagingEntry,\n override?: PromoteMode[],\n): PromoteMode[] {\n if (override && override.length > 0) return override;\n const recommended = entry.promotion?.recommendedModes;\n if (recommended && recommended.length > 0) return recommended;\n return ['ManualReview'];\n}\n\nasync function mergeIntoInstalledManifest(\n projectRoot: string,\n newResources: InstalledResource[],\n): Promise<void> {\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n const idx = installed.installed.findIndex(\n (p) => p.package === '@teamix-evo/biz-ui-promoted',\n );\n const prior: InstalledPackage | undefined =\n idx >= 0 ? installed.installed[idx] : undefined;\n const merged = new Map<string, InstalledResource>();\n for (const r of prior?.resources ?? []) merged.set(r.id, r);\n for (const r of newResources) merged.set(r.id, r);\n const next: InstalledPackage = {\n package: '@teamix-evo/biz-ui-promoted',\n variant: '_promoted',\n version: '0.0.0',\n installedAt: new Date().toISOString(),\n resources: Array.from(merged.values()),\n };\n if (idx >= 0) installed.installed[idx] = next;\n else installed.installed.push(next);\n await writeInstalledManifest(projectRoot, installed);\n}\n\n// ─── Helpers: name + path tweaks ─────────────────────────────────────────────\n\n/**\n * Best-effort `Foo` → `LegacyFoo` rename for Coexist mode. Targets:\n * - `export const Foo` → `export const LegacyFoo`\n * - `export function Foo` → `export function LegacyFoo`\n * - `export class Foo` → `export class LegacyFoo`\n * - `export interface Foo` → `export interface LegacyFoo`\n * - `export { Foo, FooHeader }` → `export { LegacyFoo, LegacyFooHeader }`\n * - `export default function Foo` (named) → `export default function LegacyFoo`\n * - `export default Foo;` → `export default LegacyFoo;`\n *\n * Identifier match is best-effort regex: starts with a capital letter and\n * shares the {entryId} stem so we only rename the component-family symbols.\n * Anything ambiguous is left alone — the user can finish the rename in a\n * follow-up when they review the file.\n */\nfunction prefixExportsLegacy(source: string, id: string): string {\n const stem = pascalCase(id);\n const stemRe = new RegExp(`\\\\b${stem}([A-Z]\\\\w*)?\\\\b`, 'g');\n\n let out = source;\n\n // 1. Direct named exports (declaration form).\n out = out.replace(\n new RegExp(\n `(\\\\bexport\\\\s+(?:const|let|var|function|class|interface|type|enum)\\\\s+)(${stem}[A-Z]?\\\\w*)\\\\b`,\n 'g',\n ),\n (_full, prefix: string, name: string) => `${prefix}Legacy${name}`,\n );\n\n // 2. Re-export specifier list `export { Foo, FooHeader }`.\n out = out.replace(/export\\s*\\{([^}]+)\\}/g, (full, body: string) => {\n const replacedBody = body.replace(stemRe, (m: string) => `Legacy${m}`);\n return `export {${replacedBody}}`;\n });\n\n // 3. `export default Foo;` (referenced identifier form).\n out = out.replace(\n new RegExp(`(\\\\bexport\\\\s+default\\\\s+)(${stem}[A-Z]?\\\\w*)(\\\\s*;)`, 'g'),\n (_full, prefix: string, name: string, suffix: string) =>\n `${prefix}Legacy${name}${suffix}`,\n );\n\n // 4. `export default function Foo(...)` / `class Foo`.\n out = out.replace(\n new RegExp(\n `(\\\\bexport\\\\s+default\\\\s+(?:function|class)\\\\s+)(${stem}[A-Z]?\\\\w*)\\\\b`,\n 'g',\n ),\n (_full, prefix: string, name: string) => `${prefix}Legacy${name}`,\n );\n\n return out;\n}\n\nfunction pascalCase(id: string): string {\n return id\n .split(/[-_]/g)\n .filter(Boolean)\n .map((p) => p[0]!.toUpperCase() + p.slice(1))\n .join('');\n}\n\nfunction importPathFor(aliasDir: string, id: string): string {\n // Mirror `transform-imports.ts#aliasToImportPath` — strip leading `src/`.\n const trimmed = aliasDir.replace(/^\\.\\//, '').replace(/\\/$/, '');\n const root = trimmed.startsWith('src/')\n ? `@/${trimmed.slice('src/'.length)}`\n : `@/${trimmed}`;\n return `${root}/${id}`;\n}\n\nfunction posix(p: string): string {\n return p.split(path.sep).join('/');\n}\n","/**\n * Project-wide static import rewriter for `ui promote-to-biz`\n * (Init landing plan §1.7).\n *\n * Goal: when promotion moves a component from `src/components/ui/<id>.tsx` to\n * `src/components/business/<id>.tsx` (or renames it to `legacy-<id>` in\n * Coexist mode), every callsite under `src/**` referencing the old import\n * specifier needs to be updated to the new location.\n *\n * Scope (intentionally narrow):\n * - Only static `import` statements with **string-literal** specifiers are\n * rewritten. Dynamic `import('...')`, template-string specifiers and\n * re-exports (`export { X } from '...';`) are detected and surfaced as\n * {@link SkippedImport} entries so the user can fix them by hand.\n * - Only files under `<projectRoot>/src/**` are scanned. Other roots\n * (`tests/`, `scripts/`, generated `dist/`) are out of scope.\n *\n * Why no AST: the rewriter is a deliberate regex pass, not a refactor. We\n * rely on the line-by-line shape of `import ... from '<spec>';` and surface\n * every ambiguity to the user. Adding ts-morph would 4x the dependency\n * footprint with no win for the cases we actually rewrite.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { backupFile, writeFileSafe, readFileOrNull } from '../utils/fs.js';\n\nexport interface ImportRewriteSpec {\n /** Source specifier prefix, e.g. `@/components/ui/button`. */\n oldPath: string;\n /** Replacement specifier prefix, e.g. `@/components/business/legacy-button`. */\n newPath: string;\n}\n\nexport type SkippedImportReason =\n | 'dynamic-import'\n | 'aliased-export'\n | 'string-template';\n\nexport interface SkippedImport {\n /** Project-root-relative posix path. */\n file: string;\n /** 1-based line number. */\n line: number;\n reason: SkippedImportReason;\n /** Original line (trimmed) — useful for the user to locate the spot. */\n snippet: string;\n}\n\nexport interface RewriteImportsResult {\n /** Project-rel posix paths of files modified (or that would be modified in dry-run). */\n rewritten: string[];\n /** Locations that need manual fix. */\n skipped: SkippedImport[];\n}\n\nexport interface RewriteImportsOptions {\n dryRun?: boolean;\n /** When true, back up each modified file under `.teamix-evo/.backups/`. Defaults to true. */\n backup?: boolean;\n /** Override scan root (defaults to `<projectRoot>/src`). */\n scanRoot?: string;\n}\n\nconst SOURCE_FILE_EXT = /\\.(tsx?|jsx?|mts|cts)$/;\nconst STATIC_IMPORT_FROM =\n /^(\\s*(?:import|export)\\s[\\s\\S]*?from\\s+['\"])([^'\"\\n]+)(['\"])/;\nconst SIDE_EFFECT_IMPORT = /^(\\s*import\\s+['\"])([^'\"\\n]+)(['\"])/;\nconst DYNAMIC_IMPORT_STR = /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\nconst DYNAMIC_IMPORT_TPL = /\\bimport\\s*\\(\\s*`/g;\n\n/**\n * Walk `src/**` and rewrite import specifiers per `specs`. Static line-level\n * matches are rewritten in place; everything else is surfaced via the\n * returned `skipped` array.\n */\nexport async function rewriteProjectImports(\n projectRoot: string,\n specs: ImportRewriteSpec[],\n options: RewriteImportsOptions = {},\n): Promise<RewriteImportsResult> {\n if (specs.length === 0) return { rewritten: [], skipped: [] };\n\n const scanRoot = options.scanRoot ?? path.join(projectRoot, 'src');\n const dryRun = options.dryRun ?? false;\n const backup = options.backup ?? true;\n\n const files = await collectTsFiles(scanRoot);\n const rewritten: string[] = [];\n const skipped: SkippedImport[] = [];\n\n for (const file of files) {\n const raw = await readFileOrNull(file);\n if (raw === null) continue;\n\n const rel = toRel(projectRoot, file);\n const lines = raw.split('\\n');\n let changed = false;\n\n for (let i = 0; i < lines.length; i++) {\n const orig = lines[i] ?? '';\n\n // (1) Static `import ... from '<spec>'` (and `export ... from '<spec>'`)\n const staticMatch = orig.match(STATIC_IMPORT_FROM);\n if (staticMatch) {\n const whole = staticMatch[0];\n const prefix = staticMatch[1] ?? '';\n const spec = staticMatch[2] ?? '';\n const quote = staticMatch[3] ?? '';\n const replaced = applySpecs(spec, specs);\n if (replaced !== null) {\n // Surface re-export aliasing as ambiguous — `export X as Y from`\n // can change observable surface; we touch only `import ... from`.\n if (/^\\s*export\\s/.test(orig)) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'aliased-export',\n snippet: orig.trim(),\n });\n continue;\n }\n lines[i] = `${prefix}${replaced}${quote}${orig.slice(whole.length)}`;\n changed = true;\n }\n continue;\n }\n\n // (2) Side-effect import: `import '<spec>';`\n const sideMatch = orig.match(SIDE_EFFECT_IMPORT);\n if (sideMatch) {\n const whole = sideMatch[0];\n const prefix = sideMatch[1] ?? '';\n const spec = sideMatch[2] ?? '';\n const quote = sideMatch[3] ?? '';\n const replaced = applySpecs(spec, specs);\n if (replaced !== null) {\n lines[i] = `${prefix}${replaced}${quote}${orig.slice(whole.length)}`;\n changed = true;\n }\n continue;\n }\n\n // (3) Dynamic `import('<spec>')` — string literal we *could* rewrite,\n // but doing so silently changes an async boundary; report instead.\n for (const m of orig.matchAll(DYNAMIC_IMPORT_STR)) {\n const target = m[1] ?? '';\n if (specs.some((s) => isAffected(target, s.oldPath))) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'dynamic-import',\n snippet: orig.trim(),\n });\n }\n }\n\n // (4) Template-string dynamic import — cannot reason about content.\n if (DYNAMIC_IMPORT_TPL.test(orig)) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'string-template',\n snippet: orig.trim(),\n });\n DYNAMIC_IMPORT_TPL.lastIndex = 0;\n }\n }\n\n if (changed) {\n const updated = lines.join('\\n');\n if (!dryRun) {\n if (backup) await backupFile(file, projectRoot);\n await writeFileSafe(file, updated);\n }\n rewritten.push(rel);\n }\n }\n\n return { rewritten, skipped };\n}\n\nfunction applySpecs(target: string, specs: ImportRewriteSpec[]): string | null {\n for (const s of specs) {\n if (target === s.oldPath) return s.newPath;\n if (target.startsWith(s.oldPath + '/')) {\n return s.newPath + target.slice(s.oldPath.length);\n }\n }\n return null;\n}\n\nfunction isAffected(target: string, oldPath: string): boolean {\n return target === oldPath || target.startsWith(oldPath + '/');\n}\n\nasync function collectTsFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string): Promise<void> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw err;\n }\n for (const e of entries) {\n // Skip hidden + node_modules + common build outputs.\n if (\n e.name.startsWith('.') ||\n e.name === 'node_modules' ||\n e.name === 'dist'\n ) {\n continue;\n }\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await walk(full);\n } else if (e.isFile() && SOURCE_FILE_EXT.test(e.name)) {\n out.push(full);\n }\n }\n }\n await walk(root);\n return out;\n}\n\nfunction toRel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs).split(path.sep).join('/');\n}\n","/**\n * File-change ledger for the init / update pipelines.\n *\n * Phase 1.A1 (init 落地改进): every orchestrator step records what it touched\n * so the CLI can print a single \"新建 / 修改 / 备份 / 删除\" summary at the end.\n * Today's pipeline only piggybacks on side-effectful sub-commands' result\n * objects (`resources`, `wroteEslint`, …) — without an explicit ledger the\n * user has no way to see, in one glance, which user-owned files moved.\n *\n * Design constraints:\n * - Pure data type — no I/O, no global mutable state. The orchestrator passes\n * a single mutable array down to each helper; sub-step adapters return\n * `FileChange[]` they can derive from their own return values.\n * - \"modified\" vs \"created\" is decided by checking whether a fresh backup\n * exists under `.teamix-evo/.backups/<rel>.*.bak` for that path — see\n * {@link diffBackupSet}. Any path that gained a backup during the pipeline\n * is classified `modified`; everything else surfaced by the steps is\n * `created`. This keeps the classification truthful even when a sub-step\n * has no idea whether the file pre-existed.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport type FileChangeKind = 'created' | 'modified' | 'backed-up' | 'deleted';\n\nexport interface FileChange {\n kind: FileChangeKind;\n /** Project-root-relative path, posix style (forward slashes). */\n path: string;\n /** Originating pipeline step (free-form to avoid coupling on `ProjectInitStepName`). */\n step: string;\n /** Optional human-readable note (e.g. `frozen` / `regenerable` / `managed`). */\n detail?: string;\n}\n\n/**\n * Convert any abs/rel path to a project-root-relative posix path.\n * Returns the input unchanged if it cannot be relativised.\n */\nexport function toRelativePosix(p: string, projectRoot: string): string {\n let rel = p;\n if (path.isAbsolute(p)) {\n rel = path.relative(projectRoot, p);\n }\n return rel.split(path.sep).join('/');\n}\n\n/**\n * Recursively enumerate `.teamix-evo/.backups/` and return the set of\n * original (project-root-relative) paths that have at least one `.bak` copy.\n *\n * Backup file names follow `<rel>.<isoTsSafe>.bak` where `<isoTsSafe>` is the\n * output of `new Date().toISOString().replace(/[:.]/g, '-')` — a fixed-shape\n * `YYYY-MM-DDTHH-MM-SS-mmmZ` token. We strip that suffix to recover `<rel>`.\n *\n * Returns an empty set when the backups directory does not exist.\n */\nexport async function listBackupOriginals(\n projectRoot: string,\n): Promise<Set<string>> {\n const backupsDir = path.join(projectRoot, '.teamix-evo', '.backups');\n const out = new Set<string>();\n const stack: string[] = [backupsDir];\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw err;\n }\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n stack.push(full);\n } else if (e.isFile() && e.name.endsWith('.bak')) {\n const rel = path.relative(backupsDir, full);\n const original = stripBackupSuffix(rel);\n if (original) out.add(original.split(path.sep).join('/'));\n }\n }\n }\n return out;\n}\n\n/**\n * Strip the `.<isoTsSafe>.bak` tail from a backup-relative path. Returns null\n * when the suffix doesn't match (file isn't one of ours — leave untouched).\n */\nexport function stripBackupSuffix(rel: string): string | null {\n const m = rel.match(\n /^(.+)\\.\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z\\.bak$/,\n );\n return m?.[1] ?? null;\n}\n\n/**\n * Compute the relative-path set that gained a fresh backup between `before`\n * and `after` (i.e. paths the pipeline modified in-place).\n */\nexport function diffBackupSet(\n before: ReadonlySet<string>,\n after: ReadonlySet<string>,\n): Set<string> {\n const out = new Set<string>();\n for (const p of after) {\n if (!before.has(p)) out.add(p);\n }\n return out;\n}\n\n/**\n * Format a flat list of `FileChange` rows into a markdown-ish summary.\n * Returns an array of lines suitable for the CLI logger.\n *\n * Empty buckets are omitted from the output. Order: created → modified →\n * backed-up → deleted. Each bucket lists paths sorted lexicographically with\n * de-duplication on `(kind, path)`.\n */\nexport function formatFileChangeSummary(changes: FileChange[]): string[] {\n if (changes.length === 0) return [];\n const buckets: Record<FileChangeKind, Map<string, FileChange>> = {\n created: new Map(),\n modified: new Map(),\n 'backed-up': new Map(),\n deleted: new Map(),\n };\n for (const c of changes) {\n const existing = buckets[c.kind].get(c.path);\n if (!existing) buckets[c.kind].set(c.path, c);\n }\n const order: Array<[FileChangeKind, string]> = [\n ['created', '🆕 新建'],\n ['modified', '✏️ 修改'],\n ['backed-up', '💾 已备份'],\n ['deleted', '🗑 删除'],\n ];\n const lines: string[] = [];\n for (const [kind, label] of order) {\n const bucket = buckets[kind];\n if (bucket.size === 0) continue;\n lines.push(`${label}(${bucket.size}):`);\n const sorted = [...bucket.values()].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n for (const c of sorted) {\n const detail = c.detail ? ` — ${c.detail}` : '';\n lines.push(` • ${c.path} [${c.step}]${detail}`);\n }\n }\n return lines;\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';\nimport { upgradeCommand } from './upgrade.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);\nbizUiCommand.addCommand(upgradeCommand);\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';\nimport { getErrorMessage } from '../../utils/error.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 (ids: string[], opts: { variant?: string; overwrite?: boolean }) => {\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 );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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: npx teamix-evo@latest biz-ui add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install from a variant: npx teamix-evo@latest biz-ui add <id> --variant <name>',\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo biz-ui upgrade [id...]` — variant-aware staging for business UI\n * source upgrades. Frozen boundary preserved per [ADR 0040](../../../../../docs/adr/0040-component-source-layer-upgrade-flow.md):\n * the command **never writes** into `src/components/business/**`. The staging\n * is applied via the `teamix-evo-upgrade` skill.\n *\n * Implementation is shared with `ui upgrade` via {@link makeUpgradeCommand}.\n */\nimport { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('biz-ui');\n","import { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { upgradeCommand } from './upgrade.js';\n\nexport const blocksCommand = new Command('blocks').description(\n '管理 marketing blocks(源码注入式安装,token 驱动换肤)',\n);\n\nblocksCommand.addCommand(addCommand);\nblocksCommand.addCommand(listCommand);\nblocksCommand.addCommand(upgradeCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runBlocksAdd } from '../../core/blocks-add.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const addCommand = new Command('add')\n .description('安装一个或多个 block(按 id,自动解析 registryDependencies)')\n .argument('<ids...>', 'block id 列表,如 \"hero-gradient\" \"features-grid\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .action(\n async (\n ids: string[],\n opts: { overwrite?: boolean },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Installing blocks: ${ids.join(', ')}`);\n\n const result = await runBlocksAdd({\n projectRoot,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `Blocks 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 = getErrorMessage(err);\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 blocks: ${message}`);\n }\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\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_BLOCKS_PACKAGE = '@teamix-evo/blocks';\n\nexport interface RunBlocksAddOptions {\n projectRoot: string;\n ids: string[];\n overwrite?: boolean;\n packageName?: string;\n}\n\nexport interface RunBlocksAddResult {\n packageName: string;\n orderedIds: string[];\n written: number;\n skipped: number;\n npmDependencies: Record<string, string>;\n resources: InstalledResource[];\n}\n\nexport async function runBlocksAdd(\n options: RunBlocksAddOptions,\n): Promise<RunBlocksAddResult> {\n const { projectRoot, ids, overwrite } = options;\n const packageName = options.packageName ?? DEFAULT_BLOCKS_PACKAGE;\n\n if (ids.length === 0) {\n throw new Error('At least one block 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.',\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 block id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo blocks 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 flatten: false,\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 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';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const listCommand = new Command('list')\n .description('列出 @teamix-evo/blocks 的所有 block 及已安装状态')\n .option('--installed', '仅展示已安装的 block')\n .option('--json', 'JSON 格式输出')\n .action(\n async (opts: { installed?: boolean; json?: 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 packageName: '@teamix-evo/blocks',\n });\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ entries, total, installedCount }, null, 2) + '\\n');\n return;\n }\n\n if (entries.length === 0) {\n logger.info(\n opts.installed\n ? 'No blocks installed.'\n : 'No blocks 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(typeWidth)} STATUS DESCRIPTION`,\n );\n logger.info(\n `${'─'.repeat(idWidth)} ${'─'.repeat(typeWidth)} ────────── ───────────`,\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(typeWidth)} ${status.padEnd(10)} ${e.description}`,\n );\n }\n\n logger.info('');\n logger.info(\n `Total: ${total} block${total === 1 ? '' : 's'}, ${installedCount} installed.`,\n );\n } catch (err) {\n logger.error(`Failed to list blocks: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('blocks');\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 '[废弃] 管理页面模板 — 请改用 teamix-evo blocks',\n);\n\ntemplatesCommand.hook('preAction', () => {\n console.warn(\n '\\x1b[33m⚠️ templates 命令已废弃,请使用 teamix-evo blocks。\\x1b[0m',\n );\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';\nimport { getErrorMessage } from '../../utils/error.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 (ids: string[], opts: { variant?: string; overwrite?: boolean }) => {\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 );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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: npx teamix-evo@latest templates add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install from a variant: npx teamix-evo@latest templates add <id> --variant <name>',\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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 输出 (.teamix-evo/logs/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 { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport { readRecords, parseIntOrUndef } from './_io.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\nexport const logsAnalyzeCommand = new Command('analyze')\n .description(\n '汇总 vibe-logger 输出 (.teamix-evo/logs/ai/**/*.jsonl) — 工具 / 包标签 / MCP 调用频率,辅助生态优化',\n )\n .option('--dir <path>', 'log 目录 (默认 <project>/.teamix-evo/logs/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(\n opts.dir ?? join(process.cwd(), '.teamix-evo', 'logs', 'ai'),\n );\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(默认路径 .teamix-evo/logs/ai)',\n );\n return;\n }\n const dayLimit = parseIntOrUndef(opts.days);\n const top = parseIntOrUndef(opts.top) ?? 10;\n\n const records = readRecords(baseDir, dayLimit);\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, dayLimit, report);\n });\n\nexport function buildReport(records: LogRecord[], top: number): 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 dayLimit: number | undefined,\n r: AnalyzeReport,\n): void {\n logger.info(`vibe-logger 分析报告`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 天数: ${dayLimit ?? 'all'}`);\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=${\n e.file ?? '-'\n }`,\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\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { LogRecord } from './analyze.js';\n\nexport const DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function 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\nexport function 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 =\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 return records;\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 { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport type { LogRecord } from './analyze.js';\nimport { readRecords, parseIntOrUndef } from './_io.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\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>/.teamix-evo/logs/ai)')\n .option('--json', '以 JSON 输出 (CI/工具友好)')\n .action((opts: TraceOptions) => {\n const baseDir = resolve(\n opts.dir ?? join(process.cwd(), '.teamix-evo', 'logs', 'ai'),\n );\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(默认路径 .teamix-evo/logs/ai)',\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\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(\n truncate(c.prompt, 200),\n )}`,\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\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\n\nexport const lintCommand = new Command('lint').description(\n '管理工程规范(ESLint + Stylelint token-discipline 规则集)',\n);\n\nlintCommand.addCommand(initCommand);\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport { detectIde } from '../../ide/index.js';\nimport { runLintInit } from '../../core/lint-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '初始化 ESLint + Stylelint 工程规范(安装依赖 + 生成配置文件 + 注入 scripts)',\n )\n .option('-y, --yes', '跳过确认,直接执行')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\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.exitCode = 1;\n return;\n }\n\n // Confirm unless -y. Non-TTY (CI / AI agent / piped stdin) is treated\n // as implicit yes so @clack/prompts does not crash with `uv_tty_init\n // EINVAL` when there is no controlling terminal to read confirmation\n // from.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n const shouldContinue = await prompts.confirm({\n message:\n '即将安装 ESLint + Stylelint token-discipline 规则集并生成配置文件,是否继续?',\n });\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n const result = await runLintInit({ projectRoot });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n 'Lint already initialized. eslint.config.js and stylelint.config.cjs both exist.',\n );\n return;\n }\n\n logger.success('Lint initialized.');\n if (result.eslint) {\n logger.info(' + eslint.config.js');\n }\n if (result.stylelint) {\n logger.info(' + stylelint.config.cjs');\n }\n logger.info('');\n logger.info('Run \"npm run lint\" to check JSX/TSX token discipline.');\n logger.info('Run \"npm run lint:css\" to check CSS token discipline.');\n } catch (err) {\n logger.error(`Failed to initialize lint: ${getErrorMessage(err)}`);\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';\nimport { execa } from 'execa';\nimport {\n backupFile,\n fileExists,\n readFileOrNull,\n writeFileSafe,\n} from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\n// ─── Config file content ─────────────────────────────────────────────────────\n\nconst ESLINT_CONFIG_CONTENT = `/**\n * teamix-evo consumer ESLint preset — 9 token-discipline rules.\n * - Repo-wide: no-color-literal / no-arbitrary-tw-value / no-raw-color-scale /\n * no-large-radius / prefer-gap-over-space / no-manual-dark-classnames /\n * dialog-must-have-title (all error)\n * - src/components/ui/** only: no-relative-ui-import / icon-from-lucide (error)\n *\n * See ADR 0008 / docs/principles.md §P4.\n */\nimport consumerPreset from '@teamix-evo/eslint-config/presets/consumer';\n\nexport default [...consumerPreset];\n`;\n\nconst STYLELINT_CONFIG_CONTENT = `/** @type {import('stylelint').Config} */\nmodule.exports = {\n extends: ['@teamix-evo/stylelint-config/presets/consumer'],\n};\n`;\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Phase 3.E lint conflict strategies (mirrors `init-conflicts.ts`).\n *\n * `merge` and `backup-overwrite` both back up the existing user file before\n * writing the teamix-evo template; `merge` additionally surfaces an AI-assist\n * hint so the manage / code skill can guide the user through merging custom\n * rules. `skip` keeps the user's file as-is and emits no template.\n */\nexport type LintConflictStrategy =\n | 'merge'\n | 'backup-overwrite'\n | 'skip'\n | 'overwrite';\n\nexport interface RunLintInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Skip npm dependency installation. Used by the create scaffold where\n * dependencies are already declared in the template package.json and\n * installed in a later batch step.\n */\n skipInstall?: boolean;\n /**\n * Phase 3.E: strategy for handling existing ESLint config files.\n * Defaults to `'overwrite'` (legacy behaviour); the `init` orchestrator\n * passes the wizard-resolved value when consumer files are detected.\n */\n eslintStrategy?: LintConflictStrategy;\n /**\n * Phase 3.E: strategy for handling existing Stylelint config files.\n */\n stylelintStrategy?: LintConflictStrategy;\n /**\n * Phase 3.E: paths of existing ESLint configs (relative to projectRoot)\n * to back up. Empty when no consumer config was detected.\n */\n eslintExistingPaths?: string[];\n /**\n * Phase 3.E: paths of existing Stylelint configs (relative to projectRoot).\n */\n stylelintExistingPaths?: string[];\n}\n\nexport type RunLintInitResult =\n | {\n status: 'installed';\n eslint: boolean;\n stylelint: boolean;\n /** True when the user had a custom config and asked for AI-assisted merge. */\n eslintMergeRequested?: boolean;\n stylelintMergeRequested?: boolean;\n /** True when the strategy asked us to keep the user file untouched. */\n eslintSkipped?: boolean;\n stylelintSkipped?: boolean;\n /**\n * True when `package.json` was actually patched (lint / lint:css\n * scripts inserted). Powers the project-init change ledger so the\n * CLI does not report a phantom write when both scripts already\n * existed.\n */\n packageJsonPatched?: boolean;\n /**\n * True when the consumer's existing stylelint config was kept (skip /\n * merge) and does not extend a teamix-evo preset — token definition\n * files may trigger false-positive lint errors without `ignoreFiles`.\n */\n stylelintIgnoreFilesWarning?: boolean;\n }\n | {\n status: 'already-initialized';\n };\n\n// ─── Lint dependencies ───────────────────────────────────────────────────────\n\nconst ESLINT_DEPS = [\n '@teamix-evo/eslint-config',\n 'eslint',\n '@typescript-eslint/parser',\n];\n\nconst STYLELINT_DEPS = ['@teamix-evo/stylelint-config', 'stylelint'];\n\n// ─── Implementation ──────────────────────────────────────────────────────────\n\n/**\n * Programmatic equivalent of `teamix-evo lint init`.\n *\n * Writes lint configuration files and optionally installs dependencies.\n * Idempotent: if both config files already exist, returns `already-initialized`.\n */\nexport async function runLintInit(\n options: RunLintInitOptions,\n): Promise<RunLintInitResult> {\n const {\n projectRoot,\n skipInstall,\n eslintStrategy = 'overwrite',\n stylelintStrategy = 'overwrite',\n eslintExistingPaths = [],\n stylelintExistingPaths = [],\n } = options;\n\n const eslintConfigPath = path.join(projectRoot, 'eslint.config.js');\n const stylelintConfigPath = path.join(projectRoot, 'stylelint.config.cjs');\n\n const eslintTemplateExists = await fileExists(eslintConfigPath);\n const stylelintTemplateExists = await fileExists(stylelintConfigPath);\n\n // Phase 3.E: a `skip` strategy only short-circuits when the *consumer*\n // already has a config. Without it we still need to write our template.\n const eslintSkipRequested =\n eslintStrategy === 'skip' && eslintExistingPaths.length > 0;\n const stylelintSkipRequested =\n stylelintStrategy === 'skip' && stylelintExistingPaths.length > 0;\n\n const eslintNeedsWrite = !eslintTemplateExists && !eslintSkipRequested;\n const stylelintNeedsWrite =\n !stylelintTemplateExists && !stylelintSkipRequested;\n\n if (!eslintNeedsWrite && !stylelintNeedsWrite) {\n return { status: 'already-initialized' };\n }\n\n // ─── Install dependencies ──────────────────────────────────────────────\n if (!skipInstall) {\n const depsToInstall = [\n ...(eslintNeedsWrite ? ESLINT_DEPS : []),\n ...(stylelintNeedsWrite ? STYLELINT_DEPS : []),\n ];\n\n if (depsToInstall.length > 0) {\n const pm = detectPm(projectRoot);\n const args =\n pm === 'yarn'\n ? ['add', '--dev', ...depsToInstall]\n : pm === 'pnpm'\n ? ['add', '-D', ...depsToInstall]\n : ['install', '--save-dev', ...depsToInstall];\n\n logger.info(`Installing lint deps via ${pm}...`);\n await execa(pm, args, { cwd: projectRoot, stdio: 'inherit' });\n }\n }\n\n // ─── Phase 3.E: back up consumer configs before writing template ───────\n // Phase 1.A2 — `overwrite` strategy still demands a `.bak` so the user\n // can recover the original file. Only `eslintNeedsWrite` /\n // `stylelintNeedsWrite` gates the operation (a `skip`d file is left\n // untouched, so no backup is needed).\n if (eslintNeedsWrite && eslintExistingPaths.length > 0) {\n for (const rel of eslintExistingPaths) {\n await backupFile(path.join(projectRoot, rel), projectRoot);\n }\n }\n if (stylelintNeedsWrite && stylelintExistingPaths.length > 0) {\n for (const rel of stylelintExistingPaths) {\n await backupFile(path.join(projectRoot, rel), projectRoot);\n }\n }\n\n // ─── Write config files ────────────────────────────────────────────────\n let wroteEslint = false;\n let wroteStylelint = false;\n\n if (eslintNeedsWrite) {\n await writeFileSafe(eslintConfigPath, ESLINT_CONFIG_CONTENT);\n logger.debug(`Wrote eslint.config.js → ${eslintConfigPath}`);\n wroteEslint = true;\n }\n\n if (stylelintNeedsWrite) {\n await writeFileSafe(stylelintConfigPath, STYLELINT_CONFIG_CONTENT);\n logger.debug(`Wrote stylelint.config.cjs → ${stylelintConfigPath}`);\n wroteStylelint = true;\n }\n\n // ─── Patch package.json scripts ────────────────────────────────────────\n // Phase 1.A2: package.json is a high-value user file — back it up before\n // we mutate `scripts.lint` / `scripts['lint:css']` so the user can revert\n // the patch without git if needed.\n const packageJsonPatched = await patchPackageJsonScripts(projectRoot);\n\n // ─── Phase 2.3: detect missing ignoreFiles for token files ────────────\n // When the consumer keeps their own stylelint config (skip / merge), check\n // whether it extends a teamix-evo preset. If not, token definition files\n // (tokens.theme.css, tokens.overrides.css) will trigger false-positive\n // no-color-literal / no-hardcoded-dimension errors. Print a non-invasive\n // warning with the recommended fix (review safety-net: never auto-modify).\n let stylelintIgnoreFilesWarning = false;\n if (!stylelintNeedsWrite && stylelintTemplateExists) {\n try {\n const existingContent = fs.readFileSync(stylelintConfigPath, 'utf-8');\n const usesTeamixPreset =\n existingContent.includes('@teamix-evo/stylelint-config/presets/') ||\n existingContent.includes('@teamix-evo/stylelint-config/preset/');\n const hasTokenIgnore =\n existingContent.includes('tokens.theme.css') &&\n existingContent.includes('tokens.overrides.css');\n if (!usesTeamixPreset && !hasTokenIgnore) {\n stylelintIgnoreFilesWarning = true;\n logger.warn(\n [\n '检测到现有 stylelint 配置未排除 token 定义文件。',\n '建议在 stylelint.config.cjs 中添加 ignoreFiles:',\n '',\n ' ignoreFiles: [',\n \" '**/tokens.theme.css',\",\n \" '**/tokens.overrides.css',\",\n ' ]',\n '',\n '或切换到 teamix-evo 预设以自动获得排除规则:',\n '',\n \" extends: ['@teamix-evo/stylelint-config/presets/consumer']\",\n ].join('\\n'),\n );\n }\n } catch {\n // best-effort — config may not be a readable text file\n }\n }\n\n return {\n status: 'installed',\n eslint: wroteEslint,\n stylelint: wroteStylelint,\n eslintMergeRequested:\n wroteEslint &&\n eslintStrategy === 'merge' &&\n eslintExistingPaths.length > 0,\n stylelintMergeRequested:\n wroteStylelint &&\n stylelintStrategy === 'merge' &&\n stylelintExistingPaths.length > 0,\n eslintSkipped: eslintSkipRequested,\n stylelintSkipped: stylelintSkipRequested,\n packageJsonPatched,\n stylelintIgnoreFilesWarning,\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Detect package manager from lockfile presence.\n */\nfunction detectPm(projectRoot: string): 'pnpm' | 'yarn' | 'npm' {\n if (fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fs.existsSync(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\n/**\n * Add lint scripts to package.json if they don't already exist.\n *\n * Returns `true` when at least one of `scripts.lint` / `scripts['lint:css']`\n * was inserted (so the caller can decide whether to surface a `package.json`\n * change in the project-init ledger). Returns `false` when both scripts\n * already existed or when `package.json` is missing/unparseable.\n */\nasync function patchPackageJsonScripts(projectRoot: string): Promise<boolean> {\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) return false;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw);\n } catch {\n return false;\n }\n\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n let changed = false;\n\n if (!scripts.lint) {\n scripts.lint = 'eslint src/';\n changed = true;\n }\n if (!scripts['lint:css']) {\n scripts['lint:css'] = \"stylelint 'src/**/*.css'\";\n changed = true;\n }\n\n if (changed) {\n // Backup user package.json before patching scripts (Phase 1.A2).\n await backupFile(pkgPath, projectRoot);\n pkg.scripts = scripts;\n await writeFileSafe(pkgPath, JSON.stringify(pkg, null, 2) + '\\n');\n logger.debug('Patched package.json scripts with lint / lint:css');\n }\n return changed;\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { detectProjectState } from '../../core/init-detect.js';\nimport { detectConflicts } from '../../core/init-conflicts.js';\nimport { runProjectInit } from '../../core/project-init.js';\nimport { formatFileChangeSummary } from '../../core/file-changes.js';\nimport { runInitWizard } from './wizard.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\n\n/**\n * Detect whether the project is a fresh skeleton generated by `create-teamix-evo`.\n * Heuristic: has package.json with `@teamix-evo/ui` in dependencies or devDependencies,\n * but no `.teamix-evo/` directory yet (which means init hasn't run).\n */\nasync function isCreateTeamixSkeleton(cwd: string): Promise<boolean> {\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf-8');\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return '@teamix-evo/ui' in allDeps;\n } catch {\n return false;\n }\n}\nimport { STEP_ICON } from '../_shared/step-icon.js';\n\ninterface InitCmdOptions {\n cwd?: string;\n yes?: boolean;\n dryRun?: boolean;\n variant?: string;\n force?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '把 teamix-evo AI 套件接入已有工程(8 步流水线:tokens → skills → agents-md → ui → biz-ui → lint → gitignore)',\n )\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('-y, --yes', '跳过交互,全部使用推荐默认值(需搭配 --variant)')\n .option('--dry-run', '只输出执行计划,不写任何文件')\n .option('--variant <name>', 'tokens variant(覆盖 wizard 询问)')\n .option('--force', '跳过冲突检测,全量覆盖已有文件')\n .action(async (opts: InitCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n\n try {\n // ─── 1. detect project state ───────────────────────────────────────\n const state = await detectProjectState(cwd);\n if (state.state === 'empty') {\n logger.warn('当前目录是空目录或仅含可忽略文件。');\n logger.info('');\n logger.info(\n '推荐使用脚手架:`npm create teamix-evo@latest`(生成 Vite + React + TS + Tailwind v4 骨架)。',\n );\n logger.info(\n '如确需在空目录上跑 init,请先 `npm init -y` 生成 package.json。',\n );\n return;\n }\n if (state.state === 'teamix-evo-installed') {\n logger.warn(\n '当前目录已检测到 .teamix-evo/ — 该工程已经接入过 teamix-evo。',\n );\n logger.info('');\n logger.info('再次运行 init 会自动跳过已完成步骤(每步幂等)。');\n logger.info('如需强制全量覆盖,请使用 --force。');\n // Don't block — allow re-run for idempotent resume\n }\n if (!state.hasPackageJson && state.state !== 'teamix-evo-installed') {\n logger.error(\n '当前目录无 package.json — 请在工程根目录执行,或先 `npm init -y`。',\n );\n process.exitCode = 1;\n return;\n }\n\n // ─── 2. conflict detection (thin: detect → terminate) ──────────────\n // 幂等重跑:已装入过的工程(state === 'teamix-evo-installed')会被\n // detectConflicts 识别为冲突(AGENTS.md / tokens / …),这里跳过检测让\n // 子步骤自身的幂等逻辑生效(与 “再次运行 init 会自动跳过已完成步骤” 提示一致)。\n //\n // Fresh skeleton: create-teamix-evo 产出的骨架已包含 tailwind.config.ts /\n // src/index.css 等文件,但还没有 .teamix-evo/ 目录。通过检测 package.json\n // 中是否包含 @teamix-evo/ui 依赖来识别,跳过冲突检测。\n const isReentry = state.state === 'teamix-evo-installed';\n const isFreshSkeleton = await isCreateTeamixSkeleton(cwd);\n if (!opts.force && !isReentry && !isFreshSkeleton) {\n const conflicts = await detectConflicts(cwd);\n if (conflicts.hasAnyConflict) {\n // Structured output for AI consumption\n const conflictItems = conflicts.items\n .filter((i) => i.exists)\n .map((i) => ({ category: i.key, paths: i.paths }));\n\n logger.error('检测到冲突文件,init 终止。');\n logger.info('');\n logger.info('冲突清单:');\n for (const item of conflictItems) {\n logger.info(` • [${item.category}] ${item.paths.join(', ')}`);\n }\n logger.info('');\n logger.info('处理方式:');\n logger.info(' • --force 全量覆盖(跳过冲突检测)');\n logger.info(' • 让 AI 助手逐项决策(推荐)');\n logger.info('');\n // JSON output for programmatic consumption\n logger.debug(JSON.stringify({ conflicts: conflictItems }, null, 2));\n process.exitCode = 1;\n return;\n }\n }\n\n // ─── 3. run wizard ─────────────────────────────────────────────────\n const isInteractive = Boolean(process.stdin.isTTY);\n const answers = await runInitWizard({\n cwd,\n variant: opts.variant,\n acceptDefaults: opts.yes ?? false,\n nonInteractive: !isInteractive,\n });\n\n // ─── 4. run orchestrator ───────────────────────────────────────────\n const dryRun = opts.dryRun ?? false;\n if (dryRun) {\n logger.info('');\n logger.info('📋 dry-run 模式:以下计划不会写入任何文件');\n }\n\n const result = await runProjectInit({\n projectRoot: cwd,\n variant: answers.variant,\n ides: answers.ides,\n force: opts.force,\n skipInstall: false,\n dryRun,\n onStep: (step) => {\n const icon = STEP_ICON[step.status];\n const detail = step.detail ? ` — ${step.detail}` : '';\n logger.info(` ${icon} ${step.name}${detail}`);\n },\n });\n\n // ─── 5. summary ────────────────────────────────────────────────────\n logger.info('');\n if (result.status === 'dry-run') {\n logger.success('dry-run 完成。移除 --dry-run 即可实际执行。');\n } else if (result.status === 'partial') {\n logger.warn('init 部分完成(含失败步骤)。详见上方步骤明细。');\n if (result.resumeHint) {\n const { failedAt, completed, error, resumeCommand } =\n result.resumeHint;\n logger.info('');\n logger.info('恢复指引:');\n logger.info(` • 失败步骤:${failedAt}`);\n logger.info(` • 错误信息:${error}`);\n if (completed.length > 0) {\n logger.info(\n ` • 已完成步骤(再次运行会自动跳过):${completed.join(', ')}`,\n );\n }\n logger.info(\n ` • 修复后重跑:\\`${resumeCommand}\\`(幂等,从断点续接)`,\n );\n }\n process.exitCode = 1;\n } else {\n logger.success(`teamix-evo 已接入 ${cwd}`);\n }\n\n // File change ledger\n if (result.status !== 'dry-run' && result.changes.length > 0) {\n logger.info('');\n logger.info('本次 init 文件变更清单:');\n for (const line of formatFileChangeSummary(result.changes)) {\n logger.info(line);\n }\n }\n\n // Post-init guidance (simplified)\n if (result.status === 'installed') {\n logger.info('');\n logger.info('Next steps:');\n logger.info(' • 启动 dev server 验证:`npm run dev`');\n logger.info(' • lint 检查:`npm run lint` / `npm run lint:css`');\n logger.info(\n ' • 让 AI 接力:在 IDE 中对话触发 `teamix-evo-manage` 继续配置',\n );\n }\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('init 已取消。');\n return;\n }\n const message = getErrorMessage(err);\n logger.error(`init 失败:${message}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileExists } from '../utils/fs.js';\nimport { getTeamixDir } from './state.js';\n\n/**\n * Three branches of `teamix-evo init` decision tree (ADR 0019 D1).\n *\n * - `empty` : 空目录或仅含可忽略文件 → 推荐用户走 `npm create teamix-evo`(完整版)\n * - `teamix-evo-installed`: 已存在 `.teamix-evo/` → 推荐 `teamix-evo update` / 卸载流程\n * - `non-teamix-evo` : 已有非 teamix-evo 工程 → 走 `teamix-evo init` 普通版接入\n */\nexport type ProjectState = 'empty' | 'teamix-evo-installed' | 'non-teamix-evo';\n\nexport interface ProjectStateReport {\n /** Decision-tree branch the caller should take. */\n state: ProjectState;\n /** Absolute path that was inspected. */\n cwd: string;\n /** Whether `.teamix-evo/` exists at `cwd`. */\n hasTeamixDir: boolean;\n /** Whether `package.json` exists at `cwd`. */\n hasPackageJson: boolean;\n /**\n * Up to 20 entries (relative to `cwd`) that caused us to consider the\n * directory non-empty. Useful for explaining the decision to humans.\n */\n significantEntries: string[];\n}\n\n/**\n * Filenames that should NOT cause us to flip out of the `empty` branch.\n *\n * Mirrors the convention shared by `create-next-app`, `nx init`, and\n * `npm init` — these are typical files added by `git init`, an editor,\n * or the OS, not project content.\n */\nconst IGNORED_TOP_LEVEL = new Set<string>([\n '.git',\n '.gitignore',\n '.gitattributes',\n '.gitkeep',\n '.DS_Store',\n 'Thumbs.db',\n '.idea',\n '.vscode',\n '.qoder',\n '.claude',\n 'README.md',\n 'README',\n 'README.txt',\n 'LICENSE',\n 'LICENSE.md',\n 'LICENSE.txt',\n]);\n\n/**\n * Inspect `cwd` and decide which branch of the `teamix-evo init` decision\n * tree applies. Pure read-only — never mutates the filesystem.\n *\n * Resolution order (first match wins):\n * 1. `.teamix-evo/` exists → `teamix-evo-installed`\n * 2. cwd missing OR all entries are in the IGNORED_TOP_LEVEL set\n * → `empty`\n * 3. otherwise → `non-teamix-evo`\n */\nexport async function detectProjectState(\n cwd: string,\n): Promise<ProjectStateReport> {\n const absCwd = path.resolve(cwd);\n\n const teamixDir = getTeamixDir(absCwd);\n const hasTeamixDir = await fileExists(teamixDir);\n if (hasTeamixDir) {\n return {\n state: 'teamix-evo-installed',\n cwd: absCwd,\n hasTeamixDir: true,\n hasPackageJson: await fileExists(path.join(absCwd, 'package.json')),\n significantEntries: [],\n };\n }\n\n let entries: string[];\n try {\n entries = await fs.readdir(absCwd);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n // Caller pointed us at a directory that doesn't exist yet — treat as\n // empty so `init` can create it (mirrors `npm create` behavior).\n return {\n state: 'empty',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson: false,\n significantEntries: [],\n };\n }\n throw err;\n }\n\n const significant = entries.filter((e) => !IGNORED_TOP_LEVEL.has(e));\n const hasPackageJson = entries.includes('package.json');\n\n if (significant.length === 0) {\n return {\n state: 'empty',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson: false,\n significantEntries: [],\n };\n }\n\n return {\n state: 'non-teamix-evo',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson,\n significantEntries: significant.slice(0, 20).sort(),\n };\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileExists, readFileOrNull } from '../utils/fs.js';\n\n/**\n * The 8 categories of consumer-side files that `teamix-evo init` may\n * conflict with when running against a non-teamix-evo project.\n *\n * See ADR 0019 D1 task #5 — these are the only files we mutate at\n * `init` time, so they're the only ones we ask the user about.\n */\nexport type ConflictKey =\n | 'agents-md'\n | 'components-json'\n | 'tailwind-config'\n | 'tokens'\n | 'index-css'\n | 'shadcn-source'\n | 'eslint-config'\n | 'stylelint-config';\n\n/** Strategy options per conflict category. */\nexport type ConflictStrategy =\n // agents-md\n | 'overwrite'\n | 'merge-managed'\n | 'skip'\n // components-json\n | 'diff-prompt'\n // tailwind-config\n | 'backup-overwrite'\n // tokens\n | 'migrate'\n | 'coexist'\n // index-css\n | 'append'\n // shadcn-source\n | 'skip-existing'\n | 'per-file-prompt'\n // eslint-config / stylelint-config (Phase 3.E)\n | 'merge';\n\nexport interface ConflictItem {\n /** Stable id for the category. */\n key: ConflictKey;\n /** True if at least one path in `paths` matched on disk. */\n exists: boolean;\n /**\n * Project-relative paths that matched. Empty when `exists === false`.\n * For `shadcn-source`, may contain a directory path (with trailing `/`).\n */\n paths: string[];\n /** sha256 fingerprint of (sorted) matched contents. Omitted for directories or when nothing matched. */\n fingerprint?: string;\n /** Default strategy presented to the user. */\n recommendedStrategy: ConflictStrategy;\n /** All allowed strategies for this category, in display order. */\n availableStrategies: ConflictStrategy[];\n /** Category-specific metadata (e.g. detected tailwind major version). */\n meta?: Record<string, unknown>;\n}\n\nexport interface ConflictReport {\n cwd: string;\n /** Always 8 items, ordered by ConflictKey enumeration above. */\n items: ConflictItem[];\n /** True if any item has `exists === true`. */\n hasAnyConflict: boolean;\n}\n\n// ─── Path candidates per category ────────────────────────────────────────────\n\nconst TAILWIND_CONFIG_CANDIDATES = [\n 'tailwind.config.ts',\n 'tailwind.config.js',\n 'tailwind.config.cjs',\n 'tailwind.config.mjs',\n];\n\nconst TOKENS_FILE_CANDIDATES = [\n 'src/design-tokens.css',\n 'src/styles/design-tokens.css',\n 'src/styles/tokens.css',\n];\n\nconst TOKENS_DIR_CANDIDATES = ['tokens'];\n\nconst INDEX_CSS_CANDIDATES = [\n 'src/index.css',\n 'src/main.css',\n 'src/app.css',\n 'src/styles/index.css',\n 'src/styles/globals.css',\n];\n\nconst SHADCN_FILE_CANDIDATES = ['src/lib/utils.ts'];\nconst SHADCN_DIR_CANDIDATES = ['src/components/ui'];\n\n// Phase 3.E: 8 ESLint candidates (legacy `.eslintrc.*` + flat `eslint.config.*`)\nconst ESLINT_CONFIG_CANDIDATES = [\n '.eslintrc.cjs',\n '.eslintrc.js',\n '.eslintrc.json',\n '.eslintrc.yml',\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.mjs',\n 'eslint.config.ts',\n];\n\n// Phase 3.E: 8 Stylelint candidates (legacy `.stylelintrc.*` + flat `stylelint.config.*`)\nconst STYLELINT_CONFIG_CANDIDATES = [\n '.stylelintrc.cjs',\n '.stylelintrc.js',\n '.stylelintrc.json',\n '.stylelintrc.yml',\n 'stylelint.config.cjs',\n 'stylelint.config.js',\n 'stylelint.config.mjs',\n 'stylelint.config.ts',\n];\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nasync function isDir(target: string): Promise<boolean> {\n try {\n const stat = await fs.stat(target);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function dirHasContent(target: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(target);\n return entries.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Hash of UTF-8 string content; truncate to 16 chars for log readability. */\nfunction fingerprint(parts: string[]): string {\n const hash = crypto.createHash('sha256');\n for (const p of [...parts].sort()) hash.update(p);\n return `sha256:${hash.digest('hex').slice(0, 16)}`;\n}\n\ninterface PackageJsonShape {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJsonShape | null> {\n const raw = await readFileOrNull(path.join(cwd, 'package.json'));\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as PackageJsonShape;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect tailwind major version from package.json.\n * Returns 4 / 3 / null. We trust dependencies + devDependencies.\n */\nfunction detectTailwindMajor(pkg: PackageJsonShape | null): 3 | 4 | null {\n if (!pkg) return null;\n const v =\n pkg.dependencies?.tailwindcss ?? pkg.devDependencies?.tailwindcss ?? null;\n if (!v) return null;\n // Accept \"^4.0.0\" / \"~4.2.2\" / \"4.x\" / \"next\" → conservative: parse leading digit\n const m = /(\\d+)/.exec(v);\n if (!m) return null;\n const major = Number.parseInt(m[1]!, 10);\n if (major === 3) return 3;\n if (major === 4) return 4;\n return null;\n}\n\n// ─── Per-category detectors ──────────────────────────────────────────────────\n\nasync function detectAgentsMd(cwd: string): Promise<ConflictItem> {\n const target = path.join(cwd, 'AGENTS.md');\n const content = await readFileOrNull(target);\n const exists = content !== null;\n return {\n key: 'agents-md',\n exists,\n paths: exists ? ['AGENTS.md'] : [],\n fingerprint: exists ? fingerprint([content!]) : undefined,\n recommendedStrategy: exists ? 'merge-managed' : 'overwrite',\n availableStrategies: ['merge-managed', 'overwrite', 'skip'],\n };\n}\n\nasync function detectComponentsJson(cwd: string): Promise<ConflictItem> {\n const target = path.join(cwd, 'components.json');\n const content = await readFileOrNull(target);\n const exists = content !== null;\n return {\n key: 'components-json',\n exists,\n paths: exists ? ['components.json'] : [],\n fingerprint: exists ? fingerprint([content!]) : undefined,\n recommendedStrategy: exists ? 'diff-prompt' : 'overwrite',\n availableStrategies: ['diff-prompt', 'overwrite', 'skip'],\n };\n}\n\nasync function detectTailwindConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of TAILWIND_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const pkg = await readPackageJson(cwd);\n const tailwindMajor = detectTailwindMajor(pkg);\n const exists = matched.length > 0;\n return {\n key: 'tailwind-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'backup-overwrite' : 'overwrite',\n availableStrategies: ['backup-overwrite', 'overwrite', 'skip'],\n meta: { tailwindMajor },\n };\n}\n\nasync function detectTokens(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of TOKENS_FILE_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n for (const rel of TOKENS_DIR_CANDIDATES) {\n const abs = path.join(cwd, rel);\n if ((await isDir(abs)) && (await dirHasContent(abs))) {\n matched.push(`${rel}/`);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'tokens',\n exists,\n paths: matched,\n fingerprint: contents.length > 0 ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'migrate' : 'overwrite',\n availableStrategies: ['migrate', 'coexist', 'overwrite', 'skip'],\n };\n}\n\nasync function detectIndexCss(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of INDEX_CSS_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'index-css',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'append' : 'overwrite',\n availableStrategies: ['append', 'diff-prompt', 'overwrite', 'skip'],\n };\n}\n\nasync function detectShadcnSource(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n for (const rel of SHADCN_FILE_CANDIDATES) {\n if (await fileExists(path.join(cwd, rel))) matched.push(rel);\n }\n for (const rel of SHADCN_DIR_CANDIDATES) {\n const abs = path.join(cwd, rel);\n if ((await isDir(abs)) && (await dirHasContent(abs))) {\n matched.push(`${rel}/`);\n }\n }\n // For shadcn dir, count component files for meta.\n let componentCount = 0;\n try {\n const uiDir = path.join(cwd, 'src/components/ui');\n if (await isDir(uiDir)) {\n const entries = await fs.readdir(uiDir);\n componentCount = entries.filter(\n (e) => e.endsWith('.tsx') || e.endsWith('.ts'),\n ).length;\n }\n } catch {\n // ignore\n }\n const exists = matched.length > 0;\n return {\n key: 'shadcn-source',\n exists,\n paths: matched,\n recommendedStrategy: exists ? 'skip-existing' : 'overwrite',\n availableStrategies: ['skip-existing', 'per-file-prompt', 'overwrite'],\n meta: { componentCount },\n };\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Inspect `cwd` for the 8 categories of files that `teamix-evo init` may\n * touch. Pure read-only — never mutates the filesystem. Returns one\n * `ConflictItem` per category in stable order so callers can render a\n * deterministic wizard.\n */\nexport async function detectConflicts(cwd: string): Promise<ConflictReport> {\n const absCwd = path.resolve(cwd);\n const items: ConflictItem[] = await Promise.all([\n detectAgentsMd(absCwd),\n detectComponentsJson(absCwd),\n detectTailwindConfig(absCwd),\n detectTokens(absCwd),\n detectIndexCss(absCwd),\n detectShadcnSource(absCwd),\n detectEslintConfig(absCwd),\n detectStylelintConfig(absCwd),\n ]);\n return {\n cwd: absCwd,\n items,\n hasAnyConflict: items.some((i) => i.exists),\n };\n}\n\nasync function detectEslintConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of ESLINT_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'eslint-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'merge' : 'overwrite',\n availableStrategies: ['merge', 'backup-overwrite', 'overwrite', 'skip'],\n };\n}\n\nasync function detectStylelintConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of STYLELINT_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'stylelint-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'merge' : 'overwrite',\n availableStrategies: ['merge', 'backup-overwrite', 'overwrite', 'skip'],\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { hasManagedRegion, replaceManagedRegion } from '@teamix-evo/registry';\nimport { backupFile, fileExists, readFileOrNull } from '../utils/fs.js';\nimport { getSkillsSourceDir } from './state.js';\n\n/**\n * Generate `<projectRoot>/AGENTS.md` as a skill-trigger fallback (ADR 0038).\n *\n * The file is **regenerable**: it consolidates TRIGGER / SKIP excerpts from\n * each installed SKILL.md frontmatter description into one terse index, so\n * AGENTS.md-aware IDEs (Codex / Cursor / Claude Code / Qoder) preheat the\n * skill activation conditions even when the user prompt does not directly\n * hit the description-based trigger.\n *\n * Out of scope (per ADR 0038):\n * - Does NOT copy skill body / rules / patterns — those stay in the skill.\n * - Does NOT include `teamix-evo-manage` (entry skill, global scope, ADR 0033).\n *\n * Lifted from `create-teamix-evo` (v0.5) into `teamix-evo/core` so both\n * `npm create teamix-evo` (scaffold path) and `teamix-evo init` (existing-\n * project path, ADR 0019 task #5) emit identical AGENTS.md output.\n *\n * @module teamix-evo/core/agents-md\n */\n\nexport interface RunGenerateAgentsMdOptions {\n /** Absolute path to the consumer project root. */\n projectRoot: string;\n /** Tokens / skills variant (e.g. \"opentrek\"). Used for header context. */\n variant: string;\n /**\n * Skill ids whose `<projectRoot>/.teamix-evo/skills/<id>/SKILL.md` should be\n * indexed. Caller is responsible for filtering out global-only skills\n * (e.g. `teamix-evo-manage`).\n */\n skillIds: string[];\n /**\n * Reconciliation mode (Phase 2.B):\n * - `'overwrite'` (default): always rewrite the full file. Pre-existing\n * content is backed up and discarded.\n * - `'merge-managed'`: rewrite only the `teamix-evo-skills` managed\n * region. When the consumer file lacks the region, prepend a fresh\n * managed block ahead of the user's content (auto-adopt). The user's\n * non-managed sections are preserved.\n *\n * In both modes, an existing file is backed up under\n * `.teamix-evo/.backups/AGENTS.md.<isoTs>.bak` before any mutation.\n */\n mode?: 'overwrite' | 'merge-managed';\n}\n\nexport interface RunGenerateAgentsMdResult {\n /** Absolute path of the written `AGENTS.md`. */\n path: string;\n /** Number of skill sections rendered (missing SKILL.md degradations are still counted). */\n skillCount: number;\n /** Skill ids whose SKILL.md could not be read (rendered as degraded section). */\n missingSkillIds: string[];\n /**\n * True when an existing AGENTS.md was backed up under\n * `.teamix-evo/.backups/AGENTS.md.<isoTs>.bak` before being overwritten\n * (Phase 1.A2 — full backup strategy).\n */\n backedUp: boolean;\n /**\n * Outcome of the merge step (Phase 2.B):\n * - `'created'`: no AGENTS.md existed; wrote a fresh full template.\n * - `'overwritten'`: existed but mode='overwrite' — full rewrite.\n * - `'managed-replaced'`: mode='merge-managed' and the consumer file\n * already had the `teamix-evo-skills` managed region; only that region\n * was rewritten. User content outside is preserved.\n * - `'managed-prepended'`: mode='merge-managed' but the consumer file\n * did not yet have the managed region; a fresh block was inserted at\n * the top, with the existing user content kept below.\n */\n merge: 'created' | 'overwritten' | 'managed-replaced' | 'managed-prepended';\n}\n\n/** Region id wrapping the auto-generated skill index. */\nexport const AGENTS_MD_MANAGED_ID = 'teamix-evo-skills';\n\ninterface SkillDescriptionParts {\n /** First non-empty line(s) of `description` (the capability statement). */\n capability: string;\n trigger: string | null;\n skip: string | null;\n coordinates: string | null;\n}\n\n/**\n * Generate and write the `AGENTS.md` file.\n *\n * Phase 2.B — reconciliation modes:\n * - `'overwrite'` (default): regenerable behaviour, full rewrite.\n * - `'merge-managed'`: rewrite only the `teamix-evo-skills` managed region\n * so user-authored sections (project-specific guidance, design tokens,\n * prompts) are never clobbered.\n *\n * Existing files are always backed up under `.teamix-evo/.backups/` before\n * mutation (ADR 0019 §2, Phase 1.A2).\n */\nexport async function runGenerateAgentsMd(\n options: RunGenerateAgentsMdOptions,\n): Promise<RunGenerateAgentsMdResult> {\n const { projectRoot, variant, skillIds } = options;\n const mode = options.mode ?? 'overwrite';\n\n // Stable order: design → code → others (alphabetical within each bucket).\n const ordered = [...skillIds].sort(\n (a, b) => bucketRank(a) - bucketRank(b) || a.localeCompare(b),\n );\n\n const sections: string[] = [];\n const missingSkillIds: string[] = [];\n for (const id of ordered) {\n const { section, missing } = await renderSkillSection(projectRoot, id);\n sections.push(section);\n if (missing) missingSkillIds.push(id);\n }\n\n const target = path.join(projectRoot, 'AGENTS.md');\n const targetExists = await fileExists(target);\n const fullTemplate = renderAgentsMd({ variant, sections });\n const managedBody = renderManagedBlockBody({ variant, sections });\n\n let outputContent: string;\n let merge: RunGenerateAgentsMdResult['merge'];\n\n if (!targetExists) {\n outputContent = fullTemplate;\n merge = 'created';\n } else {\n // Backup before any mutation — truthful even if downstream throws.\n await backupFile(target, projectRoot);\n if (mode === 'merge-managed') {\n const existing = (await readFileOrNull(target)) ?? '';\n if (hasManagedRegion(existing, AGENTS_MD_MANAGED_ID)) {\n outputContent = replaceManagedRegion(\n existing,\n AGENTS_MD_MANAGED_ID,\n managedBody,\n );\n merge = 'managed-replaced';\n } else {\n // Auto-adopt: place the managed block at the top so AGENTS.md-aware\n // IDEs preheat skill triggers first, then keep the user's prior\n // content as a non-managed tail. A trailing precedence notice goes\n // immediately after the managed block.\n const wrapped = wrapManagedBlock(managedBody);\n outputContent = `${wrapped}\\n\\n${PRECEDENCE_NOTICE}\\n\\n${existing.trimStart()}`;\n merge = 'managed-prepended';\n }\n } else {\n // overwrite — historical default.\n outputContent = fullTemplate;\n merge = 'overwritten';\n }\n }\n\n await fs.writeFile(target, outputContent, 'utf8');\n return {\n path: target,\n skillCount: ordered.length,\n missingSkillIds,\n backedUp: targetExists,\n merge,\n };\n}\n\nfunction bucketRank(id: string): number {\n if (id.startsWith('teamix-evo-design-')) return 0;\n if (id.startsWith('teamix-evo-code-')) return 1;\n return 2;\n}\n\nasync function renderSkillSection(\n projectRoot: string,\n skillId: string,\n): Promise<{ section: string; missing: boolean }> {\n const skillPath = path.join(\n getSkillsSourceDir(projectRoot, skillId),\n 'SKILL.md',\n );\n const lines: string[] = [];\n lines.push(`### ${skillId}`);\n let parts: SkillDescriptionParts | null = null;\n let missing = false;\n try {\n const raw = await fs.readFile(skillPath, 'utf8');\n parts = extractDescriptionParts(raw);\n } catch {\n // SKILL.md missing — degrade gracefully, AI still gets the location hint.\n missing = true;\n }\n\n if (parts?.capability) {\n lines.push(`- ${parts.capability}`);\n }\n lines.push(\n `- **TRIGGER**: ${\n parts?.trigger ?? '未配置触发条件,需手动激活该 skill。'\n }`,\n );\n lines.push(\n `- **SKIP**: ${parts?.skip ?? '未配置跳过条件,按 TRIGGER 兜底判定。'}`,\n );\n if (parts?.coordinates) {\n lines.push(`- **Coordinates with**: ${parts.coordinates}`);\n }\n lines.push(`- **位置**: \\`.teamix-evo/skills-source/${skillId}/SKILL.md\\``);\n return { section: lines.join('\\n'), missing };\n}\n\nfunction renderAgentsMd(args: { variant: string; sections: string[] }): string {\n const { variant, sections } = args;\n const managedBody = renderManagedBlockBody({ variant, sections });\n const wrapped = wrapManagedBlock(managedBody);\n return `${wrapped}\\n\\n${PRECEDENCE_NOTICE}\\n`;\n}\n\n/**\n * Body of the `teamix-evo-skills` managed region (no enclosing markers).\n * Phase 2.B — isolated so {@link runGenerateAgentsMd} can substitute it via\n * `replaceManagedRegion` when reconciling against a user-edited AGENTS.md.\n *\n * Exported so external tools (e.g. the `teamix-evo-manage` skill) can render\n * a preview without depending on the file write path.\n */\nexport function renderManagedBlockBody(args: {\n variant: string;\n sections: string[];\n}): string {\n const { variant, sections } = args;\n const skillBlock =\n sections.length > 0\n ? sections.join('\\n\\n')\n : '_(本工程未装配工程级 skill。)_';\n return `# AGENTS.md\n\n> 本工程已装配 Teamix Evo AI skills。AI 助手在以下场景下**必须先读对应 skill** 再动手。\n> 本文件由 \\`teamix-evo init\\` / \\`create-teamix-evo\\` 自动生成(regenerable,遵循 ADR 0038),刷新方式见底部。\n\n## 已装 Skills(variant: ${variant})\n\n${skillBlock}\n\n## 触发兜底规则\n\n- 写新 \\`.tsx\\` / \\`.ts\\` 前,对照上述 TRIGGER 判定是否命中\n- 命中则先读对应 \\`SKILL.md\\`,再动手;二者同时命中则两个都读\n- 模糊场景:先按 SKIP 反向排除,剩余唯一 skill 即为入口\n- 生命周期命令(\\`init\\` / \\`update\\` / \\`add\\`)走 \\`teamix-evo-manage\\`(全局 skill,本文件不列)\n\n## UI 组件领地(init 后约束)\n\n- \\`src/components/ui/\\` 由 teamix-evo 接管,禁止手工或通过 shadcn CLI 添加新组件\n- 如需新增 UI 组件,使用 \\`npx teamix-evo ui add <id>\\`\n- \\`src/components/shadcn-ui/\\` 是 init 前 legacy 组件归档,只读;新代码不应再 import\n- 升级 legacy 组件:触发 teamix-evo-upgrade skill\n\n> 刷新本文件:\\`npx teamix-evo skills add\\` 或重跑 \\`npm create teamix-evo\\` / \\`teamix-evo init\\`。`;\n}\n\nfunction wrapManagedBlock(body: string): string {\n return `<!-- teamix-evo:managed:start id=\"${AGENTS_MD_MANAGED_ID}\" -->\\n${body}\\n<!-- teamix-evo:managed:end id=\"${AGENTS_MD_MANAGED_ID}\" -->`;\n}\n\n/**\n * Footer notice (Phase 2.B): when AGENTS.md hosts both managed and\n * user-authored sections, the managed Skills index wins on conflict.\n */\nconst PRECEDENCE_NOTICE = `<!-- teamix-evo:precedence -->\n> 冲突以上方的 **Skills** 索引为准(上游路径与 TRIGGER/SKIP 契约);项目特有的人工细则请写在本处以下、不要覆盖上方 managed 区域。`;\n\n// ─── frontmatter parsing ──────────────────────────────────────────────────────\n\n/**\n * Parse a SKILL.md frontmatter description into capability / TRIGGER / SKIP /\n * Coordinates parts.\n *\n * Why hand-rolled (no gray-matter): we only need the `description: |` block.\n * The full YAML grammar is overkill and adds a runtime dep to a CLI / scaffold\n * tool that should stay zero-cost. ADR 0015 keeps frontmatter shape stable.\n */\nexport function extractDescriptionParts(\n fileContent: string,\n): SkillDescriptionParts | null {\n const description = extractDescriptionBlock(fileContent);\n if (description == null) return null;\n\n // Capability = first line that is not a TRIGGER/SKIP/Coordinates marker.\n const allLines = description\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n let capability = '';\n for (const line of allLines) {\n if (/^(TRIGGER when:|SKIP:|Coordinates with:)/i.test(line)) break;\n capability = capability ? `${capability} ${line}` : line;\n }\n\n return {\n capability: capability.trim(),\n trigger: extractSection(description, 'TRIGGER when:'),\n skip: extractSection(description, 'SKIP:'),\n coordinates: extractSection(description, 'Coordinates with:'),\n };\n}\n\n/**\n * Extract the `description: |` (or `description: >`) block body. Returns null\n * if the field is missing or not a literal/folded block.\n */\nfunction extractDescriptionBlock(fileContent: string): string | null {\n const lines = fileContent.split('\\n');\n\n // Find frontmatter range: first `---`, then matching `---`.\n if (lines[0]?.trim() !== '---') return null;\n let endIdx = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i]?.trim() === '---') {\n endIdx = i;\n break;\n }\n }\n if (endIdx === -1) return null;\n const fmLines = lines.slice(1, endIdx);\n\n // Locate `description:` key.\n let startIdx = -1;\n let inlineValue: string | null = null;\n let blockMode: 'literal' | 'folded' | 'inline' = 'inline';\n for (let i = 0; i < fmLines.length; i++) {\n const m = fmLines[i]?.match(/^description:\\s*(\\|[+-]?|>[+-]?)?\\s*(.*)$/);\n if (m) {\n startIdx = i;\n const indicator = (m[1] ?? '').trim();\n const rest = m[2] ?? '';\n if (indicator.startsWith('|')) blockMode = 'literal';\n else if (indicator.startsWith('>')) blockMode = 'folded';\n else {\n blockMode = 'inline';\n inlineValue = rest;\n }\n break;\n }\n }\n if (startIdx === -1) return null;\n\n if (blockMode === 'inline') {\n return inlineValue ?? '';\n }\n\n // Block mode: collect indented continuation lines.\n const body: string[] = [];\n // Detect the block indent from the first non-empty continuation line.\n let blockIndent = -1;\n for (let i = startIdx + 1; i < fmLines.length; i++) {\n const line = fmLines[i] ?? '';\n if (line.trim() === '') {\n body.push('');\n continue;\n }\n const indentMatch = line.match(/^(\\s+)/);\n const indent = indentMatch ? indentMatch[1]!.length : 0;\n if (indent === 0) break; // back to top-level key\n if (blockIndent === -1) blockIndent = indent;\n if (indent < blockIndent) break;\n body.push(line.slice(blockIndent));\n }\n // Trim trailing empty lines.\n while (body.length > 0 && body[body.length - 1] === '') body.pop();\n return body.join('\\n');\n}\n\n/**\n * Extract the body of a description sub-section starting with the given\n * marker (e.g. \"TRIGGER when:\"). Stops at the next known marker or end of\n * description. Returns the stripped one-line summary (sub-section text with\n * internal newlines collapsed to spaces).\n */\nfunction extractSection(description: string, marker: string): string | null {\n const markers = ['TRIGGER when:', 'SKIP:', 'Coordinates with:'];\n const lines = description.split('\\n');\n let inSection = false;\n const collected: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n const startsWithMarker = trimmed\n .toLowerCase()\n .startsWith(marker.toLowerCase());\n if (!inSection && startsWithMarker) {\n inSection = true;\n collected.push(trimmed.slice(marker.length).trim());\n continue;\n }\n if (inSection) {\n const hitNextMarker = markers.some(\n (m) =>\n m !== marker && trimmed.toLowerCase().startsWith(m.toLowerCase()),\n );\n if (hitNextMarker) break;\n if (trimmed === '') {\n // Allow blank line within section but stop on second consecutive blank.\n if (collected[collected.length - 1] === '') break;\n collected.push('');\n continue;\n }\n collected.push(trimmed);\n }\n }\n if (!inSection) return null;\n const joined = collected\n .filter((l) => l !== '')\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return joined || null;\n}\n","/**\n * npm dependency auto-installer for `teamix-evo init`.\n *\n * After `runUiAdd` completes, this module:\n * 1. Collects `npmDependencies` from the install result\n * 2. Reads the project's `package.json`\n * 3. Writes missing deps into `dependencies`\n * 4. Detects the package manager and runs install\n *\n * See PLAN Task 3.8 (P0).\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { fileExists, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface DepsInstallOptions {\n /** Absolute project root */\n projectRoot: string;\n /** npm dependencies to install (name → semver range) */\n npmDependencies: Record<string, string>;\n /** Skip the actual install command (just patch package.json) */\n skipInstall?: boolean;\n}\n\nexport interface DepsInstallResult {\n /** Deps newly written to package.json */\n added: Record<string, string>;\n /** Deps that already existed (skipped) */\n existed: Record<string, string>;\n /** Whether install command was executed */\n installed: boolean;\n /** Detected package manager */\n packageManager: PackageManager;\n}\n\n// ─── Package manager detection ───────────────────────────────────────────────\n\ntype PackageManager = 'pnpm' | 'yarn' | 'bun' | 'npm';\n\nasync function detectPackageManager(\n projectRoot: string,\n): Promise<PackageManager> {\n if (await fileExists(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await fileExists(path.join(projectRoot, 'pnpm-workspace.yaml')))\n return 'pnpm';\n if (await fileExists(path.join(projectRoot, 'bun.lockb'))) return 'bun';\n if (await fileExists(path.join(projectRoot, 'bun.lock'))) return 'bun';\n if (await fileExists(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn install';\n case 'bun':\n return 'bun install';\n case 'npm':\n return 'npm install';\n }\n}\n\n// ─── Core installer ──────────────────────────────────────────────────────────\n\n/**\n * Patch project `package.json` with missing npm dependencies and optionally\n * run the package manager's install command.\n */\nexport async function installProjectDeps(\n options: DepsInstallOptions,\n): Promise<DepsInstallResult> {\n const { projectRoot, npmDependencies, skipInstall = false } = options;\n\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) {\n throw new Error(\n `package.json not found at ${projectRoot}. Cannot install dependencies.`,\n );\n }\n\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const existingDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n const added: Record<string, string> = {};\n const existed: Record<string, string> = {};\n\n for (const [name, range] of Object.entries(npmDependencies)) {\n if (existingDeps[name]) {\n existed[name] = existingDeps[name]!;\n } else {\n added[name] = range;\n }\n }\n\n // Patch package.json if there are new deps\n if (Object.keys(added).length > 0) {\n if (!pkg.dependencies) pkg.dependencies = {};\n for (const [name, range] of Object.entries(added)) {\n pkg.dependencies[name] = range;\n }\n // Sort dependencies alphabetically\n pkg.dependencies = Object.fromEntries(\n Object.entries(pkg.dependencies).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.info(\n ` patched package.json: +${Object.keys(added).length} dependencies`,\n );\n }\n\n // Detect package manager and run install\n const packageManager = await detectPackageManager(projectRoot);\n let installed = false;\n\n if (!skipInstall && Object.keys(added).length > 0) {\n const cmd = getInstallCommand(packageManager);\n logger.info(` running ${cmd}...`);\n try {\n await execAsync(cmd, { cwd: projectRoot, timeout: 120_000 });\n installed = true;\n logger.info(' install complete');\n } catch (err) {\n logger.warn(\n ` install failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n logger.warn(' please run install manually');\n }\n }\n\n return { added, existed, installed, packageManager };\n}\n","/**\n * Generates the `.teamix-evo/init-checklist.md` content after `teamix-evo init`.\n *\n * Simplified for ADR 0043: only records the 8-step pipeline results.\n * No Phase B — post-init guidance is handled by AI skills at runtime.\n */\n\nimport type { ProjectInitStep } from './project-init.js';\n\n/** Step display metadata. */\nconst STEP_LABELS: Record<string, string> = {\n tokens: 'tokens — design tokens 安装',\n skills: 'skills — AI skills 批量自举',\n 'agents-md': 'agents-md — AGENTS.md 生成',\n 'ui-init': 'ui-init — UI 配置初始化',\n 'ui-add': 'ui-add — UI 组件全量安装',\n 'biz-ui-add': 'biz-ui-add — 业务组件全量安装',\n lint: 'lint — ESLint + Stylelint 配置',\n gitignore: 'gitignore — .gitignore 追加',\n};\n\nexport function renderInitChecklist(args: {\n variant: string;\n status: string;\n steps: ProjectInitStep[];\n timestamp?: string;\n}): string {\n const { variant, status, steps } = args;\n const ts =\n args.timestamp ?? new Date().toISOString().replace('T', ' ').slice(0, 19);\n\n const stepLines = steps\n .map((s) => {\n const label = STEP_LABELS[s.name] ?? s.name;\n const checked = s.status === 'ok' ? 'x' : ' ';\n const suffix =\n s.status === 'ok'\n ? ''\n : s.status === 'skip'\n ? `(跳过${s.detail ? ':' + s.detail : ''})`\n : s.status === 'fail'\n ? `(失败:${s.detail ?? 'unknown'})`\n : '(计划中)';\n return `- [${checked}] ${label}${suffix}`;\n })\n .join('\\n');\n\n return `# teamix-evo init 安装摘要\n\n> 由 \\`teamix-evo init\\` 自动生成 · ${ts}\n> variant: ${variant} · status: ${status}\n\n## 安装步骤\n\n${stepLines}\n\n## 备注\n\n- 失败或跳过的步骤不影响后续步骤独立执行\n- 修复后重跑 \\`teamix-evo init\\`(每步幂等,自动跳过已完成项)\n- 如需全量覆盖:\\`teamix-evo init --force\\`\n`;\n}\n","/**\n * Programmatic orchestrator for `teamix-evo init` (ADR 0043).\n *\n * Drives the 8-step pipeline that installs the full teamix-evo suite into an\n * existing project. Each step is idempotent — re-running `init` picks up from\n * where it left off.\n *\n * Conflict handling is intentionally thin (ADR 0043 §3): detect → terminate →\n * structured output → AI decides. The orchestrator only checks `force` — when\n * true, it skips conflict detection entirely.\n */\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { runTokensInit } from './tokens-init.js';\nimport { runSkillsInit } from './skills-add.js';\nimport { runGenerateAgentsMd } from './agents-md.js';\nimport { runUiInit } from './ui-init.js';\nimport { runUiAdd } from './ui-add.js';\nimport { runBizUiAdd, listBizUiEntries } from './variant-ui-add.js';\nimport { runLintInit } from './lint-init.js';\nimport { installProjectDeps } from './deps-install.js';\nimport { loadUiData } from './ui-client.js';\nimport { renderInitChecklist } from './init-checklist-template.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport { logger } from '../utils/logger.js';\nimport { type FileChange, toRelativePosix } from './file-changes.js';\nimport * as fsNode from 'node:fs/promises';\nimport * as path from 'node:path';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type ProjectInitStepName =\n | 'tokens'\n | 'skills'\n | 'agents-md'\n | 'ui-init'\n | 'ui-add'\n | 'biz-ui-add'\n | 'lint'\n | 'gitignore';\n\nexport type ProjectInitStepStatus = 'ok' | 'skip' | 'fail' | 'planned';\n\nexport interface ProjectInitStep {\n name: ProjectInitStepName;\n status: ProjectInitStepStatus;\n detail?: string;\n /** Files this step touched. */\n changes?: FileChange[];\n}\n\nexport interface ResumeHint {\n failedAt: ProjectInitStepName;\n completed: ProjectInitStepName[];\n failed: ProjectInitStepName[];\n error: string;\n resumeCommand: string;\n}\n\nexport interface RunProjectInitOptions {\n /** Absolute project root (existing repo to adopt teamix-evo into). */\n projectRoot: string;\n /** Tokens variant (e.g. \"opentrek\" / \"uni-manager\"). */\n variant: string;\n /** Target IDEs (at least one). */\n ides: SkillIde[];\n /** Skill install scope. Defaults to 'project'. */\n scope?: SkillScope;\n /**\n * When true, skip conflict detection and overwrite everything.\n * Distinction: init --force = skip conflict check; create --force = overwrite directory.\n */\n force?: boolean;\n /** Skip `npm install` for lint deps. */\n skipInstall?: boolean;\n /** Step-level progress hook. */\n onStep?: (step: ProjectInitStep) => void;\n /** Plan-only mode: compute steps without running sub-commands. */\n dryRun?: boolean;\n}\n\nexport interface RunProjectInitResult {\n status: 'installed' | 'partial' | 'dry-run';\n steps: ProjectInitStep[];\n changes: FileChange[];\n resumeHint?: ResumeHint;\n}\n\n// ─── Constants ──────────────────────────────────────────────────────────────────\n\n/**\n * Steps whose failure aborts subsequent critical steps. Non-critical leaves\n * (agents-md / ui-add / biz-ui-add / lint / gitignore) continue independently.\n */\nconst CRITICAL_STEPS: ReadonlySet<ProjectInitStepName> = new Set([\n 'tokens',\n 'skills',\n 'ui-init',\n]);\n\nconst GITIGNORE_MARKER_START = '# >>> teamix-evo:managed >>>';\nconst GITIGNORE_MARKER_END = '# <<< teamix-evo:managed <<<';\nconst GITIGNORE_RULES = [\n '# IDE skill mirrors (regenerable via `teamix-evo skills sync`; ADR 0013)',\n '.qoder/skills/',\n '.claude/skills/',\n '',\n '# Runtime artifacts (regenerable / archives)',\n '.teamix-evo/.snapshots/',\n '.teamix-evo/logs/',\n '.teamix-evo/.backups/',\n '.teamix-evo/.upgrade-staging/',\n '.teamix-evo/.upgrade-hints/',\n];\n\n// ─── Orchestrator ───────────────────────────────────────────────────────────────\n\nexport async function runProjectInit(\n options: RunProjectInitOptions,\n): Promise<RunProjectInitResult> {\n const {\n projectRoot,\n variant,\n ides,\n scope = 'project',\n dryRun = false,\n onStep,\n } = options;\n const ide = ides[0] ?? 'qoder';\n const steps: ProjectInitStep[] = [];\n const allChanges: FileChange[] = [];\n\n let aborted = false;\n const firstFailure: {\n value: { step: ProjectInitStepName; error: string } | null;\n } = { value: null };\n\n function record(step: ProjectInitStep): void {\n steps.push(step);\n onStep?.(step);\n if (step.changes && step.changes.length > 0) {\n allChanges.push(...step.changes);\n }\n }\n\n function recordFailure(name: ProjectInitStepName, err: unknown): void {\n const message = getErrorMessage(err);\n record({ name, status: 'fail', detail: message });\n if (!firstFailure.value)\n firstFailure.value = { step: name, error: message };\n if (CRITICAL_STEPS.has(name)) aborted = true;\n }\n\n // ─── 1. tokens ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'tokens',\n status: 'planned',\n detail: `runTokensInit(variant=${variant})`,\n });\n } else {\n try {\n const result = await runTokensInit({ projectRoot, variant, ide });\n const detail =\n result.status === 'installed'\n ? `${result.packageName}@${result.version} (${result.count} files)`\n : result.status;\n record({\n name: 'tokens',\n status: 'ok',\n detail,\n changes:\n result.status === 'installed'\n ? result.resources.map((r) => ({\n kind: 'created' as const,\n path: toRelativePosix(r.target, projectRoot),\n step: 'tokens',\n detail: r.strategy,\n }))\n : [],\n });\n } catch (err) {\n recordFailure('tokens', err);\n }\n }\n\n // ─── 2. skills init (batch bootstrap) ────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'skills',\n status: 'planned',\n detail: `runSkillsInit(scope=${scope})`,\n });\n } else if (aborted) {\n record({\n name: 'skills',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const result = await runSkillsInit({ projectRoot, ides, scope, ide });\n if (result.status === 'already-initialized') {\n record({ name: 'skills', status: 'ok', detail: 'already-initialized' });\n } else {\n record({\n name: 'skills',\n status: 'ok',\n detail: `${result.skillCount} skills, ${\n result.fileCount\n } files (added: ${result.addedSkillIds.join(', ') || 'none'})`,\n changes: result.addedSkillIds.map((id) => ({\n kind: 'created' as const,\n path: `.teamix-evo/skills/${id}/SKILL.md`,\n step: 'skills',\n detail: 'skill installed',\n })),\n });\n }\n } catch (err) {\n recordFailure('skills', err);\n }\n }\n\n // ─── 3. AGENTS.md ─────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'agents-md',\n status: 'planned',\n detail: 'runGenerateAgentsMd()',\n });\n } else {\n try {\n const result = await runGenerateAgentsMd({\n projectRoot,\n variant,\n skillIds: [\n `teamix-evo-design-${variant}`,\n `teamix-evo-code-${variant}`,\n ],\n mode: 'merge-managed',\n });\n record({\n name: 'agents-md',\n status: 'ok',\n detail: `${result.skillCount} skill index`,\n changes: [\n {\n kind: result.backedUp ? 'modified' : 'created',\n path: toRelativePosix(result.path, projectRoot),\n step: 'agents-md',\n detail: 'skill-trigger fallback (ADR 0038)',\n },\n ],\n });\n } catch (err) {\n recordFailure('agents-md', err);\n }\n }\n\n // ─── 4. ui-init (.teamix-evo/config.json) ──────────────────────────────────────\n if (dryRun) {\n record({ name: 'ui-init', status: 'planned', detail: 'runUiInit()' });\n } else if (aborted) {\n record({\n name: 'ui-init',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const initResult = await runUiInit({ projectRoot, ide });\n record({\n name: 'ui-init',\n status: 'ok',\n detail:\n initResult.status === 'installed'\n ? 'config.json packages.ui written'\n : initResult.status,\n });\n } catch (err) {\n recordFailure('ui-init', err);\n }\n }\n\n // ─── 5. ui add --all (全量 UI 组件源码) ────────────────────────────────────────\n // 收集 ui-add + biz-ui-add 的 npm 依赖,统一在两步之后调用 installProjectDeps。\n const collectedNpmDeps: Record<string, string> = {};\n if (dryRun) {\n const { manifest } = await loadUiData('@teamix-evo/ui').catch(() => ({\n manifest: { entries: [] as Array<{ id: string }> },\n }));\n record({\n name: 'ui-add',\n status: 'planned',\n detail: `runUiAdd(${manifest.entries.length} entries, --all)`,\n });\n } else if (aborted) {\n record({\n name: 'ui-add',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const { manifest } = await loadUiData('@teamix-evo/ui');\n const allIds = manifest.entries.map((e) => e.id);\n const addResult = await runUiAdd({\n projectRoot,\n ids: allIds,\n overwrite: true,\n });\n // slice(-0) === slice(0) 返回全量;written === 0 时显式返回空数组\n const writtenResources =\n addResult.written > 0\n ? addResult.resources.slice(-addResult.written)\n : [];\n record({\n name: 'ui-add',\n status: 'ok',\n detail: `${addResult.orderedIds.length} entries (${addResult.written} written, ${addResult.skipped} skipped)`,\n changes: writtenResources.map((r) => ({\n kind: 'created' as const,\n path: toRelativePosix(r.target, projectRoot),\n step: 'ui-add',\n detail: r.strategy,\n })),\n });\n Object.assign(collectedNpmDeps, addResult.npmDependencies);\n } catch (err) {\n recordFailure('ui-add', err);\n }\n }\n\n // ─── 6. biz-ui add --all (variant 全量业务组件) ─────────────────────────────────\n if (dryRun) {\n try {\n const listing = await listBizUiEntries(variant);\n record({\n name: 'biz-ui-add',\n status: 'planned',\n detail: `runBizUiAdd(variant=${variant}, ${listing.entries.length} entries)`,\n });\n } catch {\n record({\n name: 'biz-ui-add',\n status: 'planned',\n detail: `runBizUiAdd(variant=${variant})`,\n });\n }\n } else if (aborted) {\n record({\n name: 'biz-ui-add',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const listing = await listBizUiEntries(variant);\n if (listing.entries.length === 0) {\n record({\n name: 'biz-ui-add',\n status: 'skip',\n detail: `no biz-ui entries for variant \"${variant}\"`,\n });\n } else {\n const allIds = listing.entries.map((e) => e.id);\n const result = await runBizUiAdd({\n projectRoot,\n variant,\n ids: allIds,\n overwrite: true,\n });\n record({\n name: 'biz-ui-add',\n status: 'ok',\n detail: `${result.orderedIds.length} entries (${result.written} written, ${result.skipped} skipped)`,\n });\n if (result.npmDependencies) {\n Object.assign(collectedNpmDeps, result.npmDependencies);\n }\n }\n } catch (err) {\n recordFailure('biz-ui-add', err);\n }\n }\n\n // ─── 6.5 install ui / biz-ui transitive npm dependencies ─────────────────────\n // ui-add / biz-ui-add 复制源码后,需要把它们引用的 npm 依赖(@radix-ui/* / cmdk /\n // recharts 等)写入 package.json 并安装,否则 `npm run dev` 会报模块缺失。\n if (!dryRun && !aborted && Object.keys(collectedNpmDeps).length > 0) {\n try {\n await installProjectDeps({\n projectRoot,\n npmDependencies: collectedNpmDeps,\n skipInstall: options.skipInstall ?? false,\n });\n } catch (err) {\n // Non-critical: 失败不应阻断 lint / gitignore;记录但不计入 critical abort。\n logger.warn(\n `安装 ui/biz-ui 传递依赖失败:${getErrorMessage(\n err,\n )}(可手动运行 \\`npm install\\` 重试)`,\n );\n }\n }\n\n // ─── 7. lint init ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({ name: 'lint', status: 'planned', detail: 'runLintInit()' });\n } else {\n try {\n const result = await runLintInit({\n projectRoot,\n skipInstall: options.skipInstall ?? false,\n eslintStrategy: 'overwrite',\n stylelintStrategy: 'overwrite',\n eslintExistingPaths: [],\n stylelintExistingPaths: [],\n });\n const detailParts: string[] = [];\n if (result.status === 'installed') {\n detailParts.push(\n `eslint=${result.eslint}, stylelint=${result.stylelint}`,\n );\n if (result.packageJsonPatched) detailParts.push('package.json patched');\n } else {\n detailParts.push(result.status);\n }\n record({\n name: 'lint',\n status: 'ok',\n detail: detailParts.join(' / '),\n changes: deriveLintChanges(result),\n });\n } catch (err) {\n recordFailure('lint', err);\n }\n }\n\n // ─── 8. gitignore ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'gitignore',\n status: 'planned',\n detail: 'append teamix-evo runtime rules',\n });\n } else {\n try {\n let projectRootExists = true;\n try {\n await fsNode.access(projectRoot);\n } catch {\n projectRootExists = false;\n }\n if (!projectRootExists) {\n record({\n name: 'gitignore',\n status: 'skip',\n detail: 'projectRoot does not exist',\n });\n } else {\n const giPath = path.join(projectRoot, '.gitignore');\n let giContent = '';\n try {\n giContent = await fsNode.readFile(giPath, 'utf-8');\n } catch {\n // .gitignore doesn't exist yet — we'll create it\n }\n if (giContent.includes(GITIGNORE_MARKER_START)) {\n record({\n name: 'gitignore',\n status: 'skip',\n detail: 'teamix-evo markers already present',\n });\n } else {\n const block = [\n '',\n GITIGNORE_MARKER_START,\n ...GITIGNORE_RULES,\n GITIGNORE_MARKER_END,\n '',\n ].join('\\n');\n const separator =\n giContent.length > 0 && !giContent.endsWith('\\n') ? '\\n' : '';\n await fsNode.writeFile(\n giPath,\n giContent + separator + block,\n 'utf-8',\n );\n record({\n name: 'gitignore',\n status: 'ok',\n detail: `${GITIGNORE_RULES.filter((r) => r && !r.startsWith('#')).length} rules appended`,\n changes: [\n {\n kind: 'modified',\n path: '.gitignore',\n step: 'gitignore',\n detail: 'teamix-evo runtime artifact rules',\n },\n ],\n });\n }\n }\n } catch (err) {\n recordFailure('gitignore', err);\n }\n }\n\n // ─── Result assembly ──────────────────────────────────────────────────────────\n const status: RunProjectInitResult['status'] = dryRun\n ? 'dry-run'\n : steps.some((s) => s.status === 'fail')\n ? 'partial'\n : 'installed';\n\n const out: RunProjectInitResult = { status, steps, changes: allChanges };\n\n if (firstFailure.value) {\n out.resumeHint = {\n failedAt: firstFailure.value.step,\n completed: steps.filter((s) => s.status === 'ok').map((s) => s.name),\n failed: steps.filter((s) => s.status === 'fail').map((s) => s.name),\n error: firstFailure.value.error,\n resumeCommand: 'teamix-evo init',\n };\n }\n\n // Write install summary (.teamix-evo/init-checklist.md)\n if (!dryRun) {\n try {\n const checklistContent = renderInitChecklist({ variant, status, steps });\n const checklistPath = path.join(\n projectRoot,\n '.teamix-evo',\n 'init-checklist.md',\n );\n await fsNode.mkdir(path.dirname(checklistPath), { recursive: true });\n await fsNode.writeFile(checklistPath, checklistContent, 'utf-8');\n logger.info(' wrote .teamix-evo/init-checklist.md');\n } catch {\n logger.warn(' failed to write init-checklist.md (non-fatal)');\n }\n }\n\n return out;\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────────\n\ntype LintInitResult = Awaited<ReturnType<typeof runLintInit>>;\n\nfunction deriveLintChanges(result: LintInitResult): FileChange[] {\n if (result.status !== 'installed') return [];\n const out: FileChange[] = [];\n if (result.eslint) {\n out.push({\n kind: 'created',\n path: 'eslint.config.js',\n step: 'lint',\n detail: '@teamix-evo/eslint-config',\n });\n }\n if (result.stylelint) {\n out.push({\n kind: 'created',\n path: 'stylelint.config.cjs',\n step: 'lint',\n detail: '@teamix-evo/stylelint-config',\n });\n }\n if (result.packageJsonPatched) {\n out.push({\n kind: 'created',\n path: 'package.json',\n step: 'lint',\n detail: 'scripts.lint / scripts[\"lint:css\"]',\n });\n }\n return out;\n}\n","import * as p from '@clack/prompts';\nimport type { SkillIde } from '@teamix-evo/registry';\nimport { ALL_IDE_KINDS } from '../../ide/index.js';\nimport { listTokenVariants } from '../../core/tokens-init.js';\nimport { CancelledError } from '../../utils/cancelled.js';\n\n/**\n * Simplified wizard answers for the new 8-step init pipeline (ADR 0043).\n * Only variant and IDE selection are interactive — everything else is\n * all-in by default (skill-first: CLI does deterministic execution,\n * decisions happen at the AI layer).\n */\nexport interface InitWizardAnswers {\n variant: string;\n ides: SkillIde[];\n}\n\nexport interface RunInitWizardOptions {\n cwd: string;\n /**\n * Pre-populated variant from `--variant` flag. Skips the variant prompt.\n */\n variant?: string;\n /**\n * If true, accept all defaults without prompting (the user passed `-y`).\n * In -y mode, `variant` MUST be provided (no default fallback).\n */\n acceptDefaults?: boolean;\n /**\n * Force non-interactive mode regardless of TTY detection.\n */\n nonInteractive?: boolean;\n}\n\nfunction ensureNotCancelled<T>(value: T | symbol): T {\n if (p.isCancel(value)) {\n throw new CancelledError();\n }\n return value as T;\n}\n\nasync function listVariantOptions(): Promise<\n Array<{ value: string; label: string; hint?: string }>\n> {\n try {\n const catalog = await listTokenVariants();\n return catalog.variants.map((v) => ({\n value: v.name,\n label: `${v.displayName} (${v.name})`,\n hint: v.description,\n }));\n } catch {\n return [\n { value: 'opentrek', label: 'OpenTrek (opentrek)' },\n { value: 'uni-manager', label: 'Uni-Manager (uni-manager)' },\n ];\n }\n}\n\n/**\n * Run the simplified `teamix-evo init` wizard (ADR 0043).\n *\n * - Interactive: prompts for variant + IDE selection.\n * - Non-interactive (`-y`): requires `--variant`; IDEs default to all.\n */\nexport async function runInitWizard(\n options: RunInitWizardOptions,\n): Promise<InitWizardAnswers> {\n const { cwd } = options;\n const interactive =\n !options.nonInteractive &&\n Boolean(process.stdin.isTTY) &&\n !options.acceptDefaults;\n\n // ─── variant ──────────────────────────────────────────────────────────────\n let variant = options.variant;\n if (!variant) {\n if (!interactive) {\n // 非交互(CI / -y / 非 TTY)下未带 --variant → 报错(不猜测默认值)\n throw new Error(\n '非交互模式(-y / 非 TTY)下必须指定 --variant(例如 --variant opentrek)。',\n );\n }\n const variantOptions = await listVariantOptions();\n p.intro('teamix-evo init');\n p.note(`📦 接入目录:${cwd}`);\n const choice = await p.select<string>({\n message: 'Tokens variant',\n options: variantOptions,\n initialValue: variantOptions[0]?.value ?? 'opentrek',\n });\n variant = ensureNotCancelled(choice);\n }\n\n // ─── ides ─────────────────────────────────────────────────────────────────\n let ides: SkillIde[];\n if (!interactive) {\n ides = [...ALL_IDE_KINDS] as SkillIde[];\n } else {\n const choice = await p.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 ides = ensureNotCancelled(choice) as SkillIde[];\n }\n\n if (interactive) {\n p.outro('准备就绪,开始装机…');\n }\n\n return { variant, ides };\n}\n","/**\n * Shared `step.status → icon` mapping for `teamix-evo init` orchestrator\n * output. The exhaustive `Record<StepStatus, string>` typing fails compilation\n * if the status union changes upstream without updating the icon map.\n *\n * Intentionally lives under `commands/_shared/` (vs `utils/`) because it is\n * a CLI-presentation concern — core orchestrators stay free of icon coupling.\n */\nimport type { ProjectInitStep } from '../../core/project-init.js';\n\nexport type StepStatus = ProjectInitStep['status'];\n\nexport const STEP_ICON = {\n ok: '✔',\n skip: '⊘',\n fail: '✖',\n planned: '·',\n} satisfies Record<StepStatus, string>;\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport {\n listSnapshots,\n restoreSnapshot,\n type SnapshotEntry,\n} from '../../core/snapshot.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface RestoreCmdOptions {\n cwd?: string;\n list?: boolean;\n yes?: boolean;\n}\n\n/**\n * `teamix-evo restore [ts]` — roll back `.teamix-evo/` from a previously\n * captured snapshot ([ADR 0019](../../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n *\n * Modes:\n * - `restore --list` — print the available snapshots (newest first).\n * - `restore <ts>` — restore the named snapshot. Prompts for confirmation\n * unless `-y` (or stdin is non-interactive — CI / AI agent invocation).\n * A pre-restore safety snapshot is captured automatically by\n * `restoreSnapshot` so the operation itself is reversible.\n * - `restore` (no args) — print a short usage hint pointing at `--list`.\n */\n/**\n * Build a fresh `restore` Command instance.\n *\n * commander v12 retains parsed option values across successive\n * `parseAsync` calls on the same instance, which causes state to leak\n * between tests (e.g. `--list` from one test bleeds into the next). The\n * production CLI calls this factory once at startup; tests call it per\n * case.\n */\nexport function createRestoreCommand(): Command {\n return new Command('restore')\n .description(\n '回滚 .teamix-evo/ 到指定 snapshot(init/update 失败时使用 — ADR 0019 §2)',\n )\n .argument('[ts]', '目标 snapshot 时间戳(如 2026-06-11T20-59-03-000Z)')\n .option('--list', '列出可用 snapshot(不做实际回滚)')\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('-y, --yes', '跳过二次确认(destructive,请确认无误)')\n .action(async (ts: string | undefined, opts: RestoreCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n\n try {\n const snapshots = await listSnapshots(cwd);\n\n // ── --list mode ──────────────────────────────────────────────────\n if (opts.list) {\n printSnapshotTable(snapshots);\n return;\n }\n\n // ── No ts and no --list → usage hint ─────────────────────────────\n if (!ts) {\n logger.info('用法:');\n logger.info(\n ' teamix-evo restore --list 列出可用 snapshot',\n );\n logger.info(\n ' teamix-evo restore <ts> [-y] 回滚到指定 snapshot',\n );\n logger.info('');\n if (snapshots.length === 0) {\n logger.warn(\n '当前 .teamix-evo/.snapshots/ 为空(或工程未接入 teamix-evo)。',\n );\n } else {\n logger.info(`当前共 ${snapshots.length} 个可用 snapshot。`);\n }\n process.exitCode = 1;\n return;\n }\n\n // ── Restore mode ─────────────────────────────────────────────────\n const target = snapshots.find((s) => s.ts === ts);\n if (!target) {\n logger.error(`未找到 snapshot:${ts}`);\n logger.info('');\n logger.info(\n '运行 `teamix-evo restore --list` 查看可用 snapshot 列表。',\n );\n process.exitCode = 1;\n return;\n }\n\n // Confirm unless -y / non-TTY (CI / AI agent / piped stdin) — same\n // pattern as init / update / lint init to avoid uv_tty_init crashes.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n logger.info('');\n logger.info(`即将回滚到 snapshot:${target.ts}`);\n if (target.reason) logger.info(` • 原因:${target.reason}`);\n if (target.isoTs) logger.info(` • 时间:${target.isoTs}`);\n logger.info(\n '该操作会覆盖当前 .teamix-evo/ 内容(除 .snapshots/ 与 logs/ 外)。',\n );\n logger.info(\n '回滚前会自动再做一次 reason=\"restore\" 的安全 snapshot,可二次回滚。',\n );\n const confirmed = await prompts.confirm({\n message: '继续回滚?',\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n logger.info('已取消。');\n return;\n }\n }\n\n await restoreSnapshot(cwd, ts);\n logger.success(`已回滚到 snapshot:${ts}`);\n logger.info(\n '提示:本次操作前的状态已保存为新的 reason=\"restore\" snapshot,如需再次回滚可执行 `teamix-evo restore --list` 查看。',\n );\n } catch (err) {\n const message = getErrorMessage(err);\n logger.error(`restore 失败:${message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n\n/** Module-level singleton consumed by the CLI entry (`src/index.ts`). */\nexport const restoreCommand = createRestoreCommand();\n\n/**\n * Pretty-print the snapshot list. Each row shows ts / reason / iso so the\n * user can copy a ts directly into `teamix-evo restore <ts>`.\n */\nfunction printSnapshotTable(snapshots: SnapshotEntry[]): void {\n if (snapshots.length === 0) {\n logger.warn('未找到可用 snapshot。');\n logger.info('');\n logger.info(\n '提示:snapshot 由 `teamix-evo init` / `teamix-evo update` 在执行前自动生成;',\n );\n logger.info(\n '若工程刚接入或从未运行过这些命令,目录会是空的(这是正常状态)。',\n );\n return;\n }\n\n logger.info(`共 ${snapshots.length} 个 snapshot(最新在前):`);\n logger.info('');\n for (let i = 0; i < snapshots.length; i++) {\n const s = snapshots[i]!;\n const reason = s.reason ?? '(unknown)';\n const iso = s.isoTs ?? '(meta missing)';\n logger.info(` [${i + 1}] ${s.ts}`);\n logger.info(` reason=${reason} iso=${iso}`);\n }\n logger.info('');\n logger.info('回滚命令:teamix-evo restore <ts>');\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { logger } from '../utils/logger.js';\n\n/**\n * `.teamix-evo/` snapshot module — captures the project state directory before\n * any mutating command runs (`init` / `update` / `variant switch`) so that\n * `teamix-evo restore <ts>` can roll back failed migrations\n * ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n *\n * **Storage layout**\n * ```\n * .teamix-evo/\n * └── .snapshots/\n * ├── 2026-06-11T20-59-03-000Z/\n * │ ├── _meta.json # { ts, reason }\n * │ ├── config.json\n * │ ├── manifest.json\n * │ └── … # everything except .snapshots/ and logs/\n * └── …\n * ```\n *\n * **Exclusions**: `.snapshots/` itself (avoid recursive snapshotting) and\n * `logs/` (high-churn telemetry; not part of the recoverable state surface).\n */\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst SNAPSHOTS_DIR = '.snapshots';\nconst LOGS_DIR = 'logs';\nconst META_FILE = '_meta.json';\n/** Default snapshot retention — older snapshots beyond this count are pruned. */\nconst DEFAULT_KEEP = 5;\n\n/** Reason why a snapshot was taken — surfaces in `restore` listing. */\nexport type SnapshotReason =\n | 'init'\n | 'update'\n | 'switch'\n | 'restore'\n | 'manual';\n\n/** Result of `createSnapshot` when a snapshot was actually taken. */\nexport interface SnapshotResult {\n /** Filesystem-safe UTC timestamp identifier (e.g. `2026-06-11T20-59-03-000Z`). */\n ts: string;\n /** Absolute path to the snapshot directory. */\n path: string;\n}\n\nexport interface CreateSnapshotOptions {\n /** Why the snapshot is being taken — recorded in `_meta.json`. */\n reason?: SnapshotReason;\n /** Retention count (default 5). Older snapshots beyond this are pruned. */\n keep?: number;\n /**\n * Snapshot ts that MUST NOT be pruned even if it falls outside the `keep`\n * window. Used by {@link restoreSnapshot} to prevent the snapshot it is\n * about to read from being pruned by the pre-restore safety snapshot's\n * own retention pass — see ADR 0019 §2.\n */\n protectedTs?: string;\n}\n\n/** A listed snapshot entry returned by `listSnapshots`. */\nexport interface SnapshotEntry {\n /** Filesystem-safe ts identifier (the snapshot directory name). */\n ts: string;\n /** Original ISO ts as recorded in `_meta.json` (or null if meta missing). */\n isoTs: string | null;\n /** Reason recorded in `_meta.json` (or null if meta missing). */\n reason: SnapshotReason | null;\n /** Absolute path to the snapshot directory. */\n path: string;\n}\n\n/**\n * Convert an ISO-8601 timestamp into a filesystem-safe directory name by\n * replacing `:` and `.` with `-`. Order-preserving (lexicographic sort still\n * matches chronological order).\n */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\n/**\n * Inverse of {@link isoToFsSafe} — best-effort reconstruction of the original\n * ISO string. Used when `_meta.json` is missing so `listSnapshots` can still\n * surface a reasonable timestamp.\n */\nfunction fsSafeToIso(safe: string): string {\n // 2026-06-11T20-59-03-000Z → 2026-06-11T20:59:03.000Z\n return safe.replace(\n /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})(Z)$/,\n '$1T$2:$3:$4.$5$6',\n );\n}\n\n/**\n * Capture a point-in-time copy of `.teamix-evo/` (excluding `.snapshots/`\n * and `logs/`). Returns `null` when there is nothing to snapshot\n * (`.teamix-evo/` does not yet exist — typical on the very first `init` run).\n *\n * Subsequent calls automatically prune old snapshots beyond `opts.keep`\n * (default 5) so the directory does not grow unbounded.\n */\nexport async function createSnapshot(\n projectRoot: string,\n opts: CreateSnapshotOptions = {},\n): Promise<SnapshotResult | null> {\n const teamixDir = path.join(projectRoot, TEAMIX_DIR);\n try {\n const stat = await fs.stat(teamixDir);\n if (!stat.isDirectory()) return null;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n\n const isoTs = new Date().toISOString();\n const ts = isoToFsSafe(isoTs);\n const snapshotRoot = path.join(teamixDir, SNAPSHOTS_DIR);\n const target = path.join(snapshotRoot, ts);\n await fs.mkdir(target, { recursive: true });\n\n const entries = await fs.readdir(teamixDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === SNAPSHOTS_DIR) continue;\n if (entry.name === LOGS_DIR) continue;\n const src = path.join(teamixDir, entry.name);\n const dst = path.join(target, entry.name);\n await fs.cp(src, dst, { recursive: true });\n }\n\n const meta = {\n ts: isoTs,\n reason: opts.reason ?? 'manual',\n };\n await fs.writeFile(\n path.join(target, META_FILE),\n JSON.stringify(meta, null, 2) + '\\n',\n 'utf-8',\n );\n\n logger.debug(\n `Snapshot created → ${path.relative(projectRoot, target)} (${meta.reason})`,\n );\n\n const keep = opts.keep ?? DEFAULT_KEEP;\n await pruneSnapshots(projectRoot, keep, { protectedTs: opts.protectedTs });\n\n return { ts, path: target };\n}\n\n/**\n * List existing snapshots ordered newest-first. Returns an empty array when\n * `.teamix-evo/.snapshots/` does not exist.\n */\nexport async function listSnapshots(\n projectRoot: string,\n): Promise<SnapshotEntry[]> {\n const snapshotRoot = path.join(projectRoot, TEAMIX_DIR, SNAPSHOTS_DIR);\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(snapshotRoot, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n\n const result: SnapshotEntry[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const dir = path.join(snapshotRoot, entry.name);\n let isoTs: string | null = null;\n let reason: SnapshotReason | null = null;\n try {\n const raw = await fs.readFile(path.join(dir, META_FILE), 'utf-8');\n const parsed = JSON.parse(raw) as {\n ts?: unknown;\n reason?: unknown;\n };\n if (typeof parsed.ts === 'string') isoTs = parsed.ts;\n if (\n typeof parsed.reason === 'string' &&\n ['init', 'update', 'switch', 'restore', 'manual'].includes(\n parsed.reason,\n )\n ) {\n reason = parsed.reason as SnapshotReason;\n }\n } catch {\n // _meta.json missing or unparseable → reconstruct ts from directory name\n isoTs = fsSafeToIso(entry.name);\n }\n result.push({ ts: entry.name, isoTs, reason, path: dir });\n }\n\n // Directory names embed UTC ISO timestamps; lexicographic sort = chronological.\n result.sort((a, b) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0));\n return result;\n}\n\nexport interface PruneSnapshotsOptions {\n /**\n * Snapshot ts that MUST NOT be pruned even if it falls outside the `keep`\n * window. Lets callers (notably `restoreSnapshot`) protect a snapshot they\n * are about to read from concurrent retention.\n */\n protectedTs?: string;\n}\n\n/**\n * Delete snapshots older than the most recent `keep` entries. Returns the\n * list of pruned ts identifiers (oldest first).\n *\n * When `opts.protectedTs` is set, that snapshot is preserved regardless of\n * its position — used to defuse the restore-prune race (ADR 0019 §2).\n */\nexport async function pruneSnapshots(\n projectRoot: string,\n keep: number = DEFAULT_KEEP,\n opts: PruneSnapshotsOptions = {},\n): Promise<string[]> {\n if (keep < 0)\n throw new Error(`pruneSnapshots: keep must be >= 0, got ${keep}`);\n const snapshots = await listSnapshots(projectRoot);\n if (snapshots.length <= keep) return [];\n\n const tail = snapshots.slice(keep); // newest-first → tail is oldest\n const toRemove = opts.protectedTs\n ? tail.filter((s) => s.ts !== opts.protectedTs)\n : tail;\n const removed: string[] = [];\n for (const snap of toRemove) {\n await fs.rm(snap.path, { recursive: true, force: true });\n removed.push(snap.ts);\n logger.debug(`Pruned snapshot ${snap.ts}`);\n }\n // Return oldest-first for ergonomic caller logging.\n return removed.reverse();\n}\n\n/**\n * Restore `.teamix-evo/` from a previously captured snapshot.\n *\n * Behaviour:\n * 1. Verify the requested snapshot exists (throws otherwise).\n * 2. Take a \"pre-restore\" snapshot of the current state so the restore itself\n * is reversible (recorded with `reason: 'restore'`).\n * 3. Delete every entry under `.teamix-evo/` *except* `.snapshots/` and\n * `logs/`.\n * 4. Copy the snapshot's contents (excluding its `_meta.json`) back into\n * `.teamix-evo/`.\n *\n * Throws when the snapshot ts cannot be located so callers can surface a\n * clear message (\"snapshot not found, run `teamix-evo restore --list` to see\n * available timestamps\").\n */\nexport async function restoreSnapshot(\n projectRoot: string,\n ts: string,\n): Promise<void> {\n const snapshotRoot = path.join(projectRoot, TEAMIX_DIR, SNAPSHOTS_DIR);\n const target = path.join(snapshotRoot, ts);\n try {\n const stat = await fs.stat(target);\n if (!stat.isDirectory()) {\n throw new Error(`Snapshot path is not a directory: ${target}`);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Snapshot not found: \"${ts}\". Run \\`teamix-evo restore --list\\` to see available timestamps.`,\n );\n }\n throw err;\n }\n\n // 1. Pre-restore safety snapshot. Pass `protectedTs: ts` so the snapshot we\n // are about to read from is NOT pruned out of the retention window if it\n // happens to fall beyond `keep` (ADR 0019 §2 — restore-prune race).\n await createSnapshot(projectRoot, { reason: 'restore', protectedTs: ts });\n\n // 2. Wipe `.teamix-evo/` (except .snapshots/ and logs/) so leftover files\n // from a half-applied update don't bleed into the restored state.\n const teamixDir = path.join(projectRoot, TEAMIX_DIR);\n const live = await fs.readdir(teamixDir, { withFileTypes: true });\n for (const entry of live) {\n if (entry.name === SNAPSHOTS_DIR) continue;\n if (entry.name === LOGS_DIR) continue;\n await fs.rm(path.join(teamixDir, entry.name), {\n recursive: true,\n force: true,\n });\n }\n\n // 3. Copy snapshot contents back (skip _meta.json — it's snapshot metadata,\n // not part of the recoverable state).\n const snapshotEntries = await fs.readdir(target, { withFileTypes: true });\n for (const entry of snapshotEntries) {\n if (entry.name === META_FILE) continue;\n const src = path.join(target, entry.name);\n const dst = path.join(teamixDir, entry.name);\n await fs.cp(src, dst, { recursive: true });\n }\n\n logger.debug(`Restored .teamix-evo/ from snapshot ${ts}`);\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport {\n runVariantSwitch,\n type VariantSwitchChange,\n} from '../../core/variant-switch.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface SwitchCmdOptions {\n cwd?: string;\n apply?: boolean;\n yes?: boolean;\n}\n\nconst KIND_ICON: Record<VariantSwitchChange['kind'], string> = {\n rewrite: '✎',\n 'managed-update': '⊕',\n preserve: '⊘',\n unchanged: '=',\n};\n\nconst KIND_LABEL: Record<VariantSwitchChange['kind'], string> = {\n rewrite: 'rewrite',\n 'managed-update': 'managed-update',\n preserve: 'preserve',\n unchanged: 'unchanged',\n};\n\n/**\n * Build a fresh `switch` Command. Factory pattern mirrors `restore` so test\n * runs don't leak commander state between invocations (commander v12 keeps\n * parsed options alive across `parseAsync` calls on the same instance).\n *\n * `teamix-evo switch <new-variant>` — variant migration command per\n * [ADR 0019 §D3](../../../../../docs/adr/0019-project-upgrade-flow.md).\n *\n * Defaults to **dry-run**: prints the file-level change plan without writing.\n * Pass `--apply` (and confirm, unless `-y` / non-TTY) to actually mutate the\n * project.\n */\nexport function createSwitchCommand(): Command {\n return new Command('switch')\n .description(\n 'variant 切换:先展示 file-level diff,--apply 才真写(ADR 0019 §D3)',\n )\n .argument('<new-variant>', '目标 variant id(如 opentrek / uni-manager)')\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('--apply', '真正执行切换(默认 dry-run,仅展示计划)')\n .option('-y, --yes', '跳过 --apply 二次确认(destructive,请确认无误)')\n .action(async (newVariant: string, opts: SwitchCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const apply = opts.apply ?? false;\n\n try {\n // First pass — always run as dry-run to surface the plan.\n const plan = await runVariantSwitch({\n projectRoot: cwd,\n newVariant,\n apply: false,\n });\n\n if (plan.status === 'not-initialized') {\n logger.warn(\n '当前目录未检测到 .teamix-evo/ — 该工程尚未接入 teamix-evo。',\n );\n logger.info('请先运行 `npx teamix-evo@latest init` 接入。');\n process.exitCode = 1;\n return;\n }\n\n if (plan.status === 'already-on-variant') {\n logger.success(`当前 variant 已是 \"${plan.variant}\",无需切换。`);\n return;\n }\n\n if (plan.status === 'variant-not-found') {\n logger.error(`未知 variant:\"${plan.requested}\"`);\n logger.info(`可用 variant:${plan.available.join(', ') || '(none)'}`);\n logger.info(\n '运行 `teamix-evo tokens list-variants` 可查看完整列表。',\n );\n process.exitCode = 1;\n return;\n }\n\n // status === 'dry-run'\n printChangePlan(plan.from, plan.to, plan.toVersion, plan.changes);\n\n if (!apply) {\n logger.info('');\n logger.info(\n '以上为 dry-run 计划。如需真正切换,请加 --apply(建议先 commit 当前改动)。',\n );\n return;\n }\n\n // ─── Apply path ─────────────────────────────────────────────────────\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n logger.info('');\n logger.info(\n 'switch --apply 会重写 regenerable 文件并更新 .teamix-evo/ 状态。',\n );\n logger.info(\n '执行前会自动捕获 reason=\"switch\" snapshot,可通过 `teamix-evo restore <ts>` 回滚。',\n );\n const confirmed = await prompts.confirm({\n message: `继续切换至 \"${newVariant}\"?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n logger.info('已取消。');\n return;\n }\n }\n\n const applied = await runVariantSwitch({\n projectRoot: cwd,\n newVariant,\n apply: true,\n });\n\n if (applied.status !== 'switched') {\n // Should not happen — the dry-run pre-check above would have caught\n // not-initialized / already-on-variant / variant-not-found. Surface\n // any unexpected status defensively.\n logger.error(`switch 异常:状态 ${applied.status}`);\n process.exitCode = 1;\n return;\n }\n\n logger.success(\n `已切换至 variant \"${applied.to}\" (v${applied.toVersion})。`,\n );\n if (applied.snapshot) {\n logger.info(\n `💾 snapshot:${applied.snapshot.ts}(回滚:\\`teamix-evo restore ${applied.snapshot.ts}\\`)`,\n );\n } else if (applied.snapshotError) {\n logger.debug(`snapshot 捕获失败:${applied.snapshotError}`);\n }\n if (applied.hintPath) {\n logger.info('');\n logger.info(`💡 token rename hint: ${applied.hintPath}`);\n logger.info(\n ` 检测到 ${applied.renames.length} 个 token rename,建议调用 \\`teamix-evo-upgrade\\` skill 扫 src/** 给 codemod 建议(ADR 0019 §D4)。`,\n );\n } else {\n logger.info(\n '提示:本次切换未检测到 token rename(新 variant 未声明 renames 或 sinceVersion 均在范围外)。',\n );\n }\n } catch (err) {\n const message = getErrorMessage(err);\n logger.error(`switch 失败:${message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n\nexport const switchCommand = createSwitchCommand();\n\nfunction printChangePlan(\n from: string,\n to: string,\n toVersion: string,\n changes: ReadonlyArray<VariantSwitchChange>,\n): void {\n logger.info('');\n logger.info(`variant 切换计划:${from} → ${to} (v${toVersion})`);\n logger.info('');\n if (changes.length === 0) {\n logger.warn(\n '没有可处理的资源(installed manifest 为空)。请先运行 `teamix-evo init`。',\n );\n return;\n }\n for (const change of changes) {\n const icon = KIND_ICON[change.kind];\n const label = KIND_LABEL[change.kind];\n logger.info(\n ` ${icon} [${label}] ${change.target} (${change.strategy}) — ${change.reason}`,\n );\n }\n}\n","/**\n * `teamix-evo switch <new-variant>` programmatic core.\n *\n * Per [ADR 0019 §D3](../../../../docs/adr/0019-project-upgrade-flow.md):\n *\n * 1. Plan: walk every consumer-installed tokens resource → diff against\n * the new variant's upstream payload → produce a file-level change\n * list.\n * 2. By default (no `--apply`) we **only** report the change list —\n * consumer files are not touched. This is the dry-run gate that ADR\n * 0019 §D3 requires (no silent variant migrations).\n * 3. With `apply: true` we capture a `reason: 'switch'` snapshot, rewrite\n * regenerable files, replay managed regions onto consumer files, then\n * bump `config.json` (`packages.tokens.variant` + `priorVariant`),\n * `tokens-lock.json`, and the installed manifest.\n *\n * The switch logic deliberately leaves the **frozen** tier untouched —\n * users own those files (e.g. `tokens/tokens.overrides.css`). Drift hints\n * are surfaced as part of the change list so the user can manually inspect\n * the new upstream values.\n *\n * Token rename hint emission (`.teamix-evo/.upgrade-hints/tokens-<ts>.json`)\n * is the responsibility of batch 5.2 — this module only records the tuple\n * `(fromVariant, toVariant, ts)` into `config.tokenRenameHistory` with an\n * empty `renames: {}` placeholder so consumers can iterate the history.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledResource,\n type TokensPackLock,\n type TokenRenameEntry,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { mergeManagedRegions } from './managed-merge.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport { computeHash } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { createSnapshot, type SnapshotResult } from './snapshot.js';\nimport {\n selectApplicableRenames,\n writeTokensUpgradeHint,\n} from './upgrade-hints.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_BASENAME_BY_UPSTREAM: Record<string, string> = {\n 'theme.css': 'tokens.theme.css',\n 'overrides.css': 'tokens.overrides.css',\n};\n\n/**\n * One diff entry surfaced by the planner. The kinds are intentionally narrow\n * to make the dry-run output glanceable; richer metadata (hash before/after)\n * is omitted today and can be added when `doctor` consumes this.\n */\nexport interface VariantSwitchChange {\n /** Consumer-relative path of the affected file. */\n target: string;\n /** What would happen to the file on `--apply`. */\n kind:\n | 'rewrite' // regenerable resource — content swap\n | 'managed-update' // managed regions replayed; user content outside preserved\n | 'preserve' // frozen / no upstream counterpart — left alone\n | 'unchanged'; // bytes identical between old and new variants\n /** Strategy recorded at install time. */\n strategy: InstalledResource['strategy'];\n /** Short human-readable reason — appears in CLI dry-run table. */\n reason: string;\n}\n\nexport interface RunVariantSwitchOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Variant id to switch to. Validated against the upstream catalog. */\n newVariant: string;\n /**\n * When true, capture a snapshot then mutate consumer files + state. When\n * false (default) the function is read-only and returns a `dry-run` result.\n */\n apply?: boolean;\n /** Override the tokens package name (defaults to `\"@teamix-evo/tokens\"`). */\n packageName?: string;\n /** Override resolution of the upstream tokens package root (testing hook). */\n packageRoot?: string;\n}\n\nexport type RunVariantSwitchResult =\n | { status: 'not-initialized' }\n | { status: 'already-on-variant'; variant: string }\n | {\n status: 'variant-not-found';\n requested: string;\n available: string[];\n }\n | {\n status: 'dry-run';\n from: string;\n to: string;\n toVersion: string;\n changes: VariantSwitchChange[];\n }\n | {\n status: 'switched';\n from: string;\n to: string;\n toVersion: string;\n changes: VariantSwitchChange[];\n snapshot: SnapshotResult | null;\n snapshotError?: string;\n /** Token renames recorded by the new variant up to `toVersion`. */\n renames: TokenRenameEntry[];\n /** Absolute path of the `.teamix-evo/.upgrade-hints/tokens-<ts>.json` file written when `renames` is non-empty. */\n hintPath?: string;\n };\n\nexport async function runVariantSwitch(\n options: RunVariantSwitchOptions,\n): Promise<RunVariantSwitchResult> {\n const { projectRoot, newVariant, apply = false } = 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 if (currentVariant === newVariant) {\n return { status: 'already-on-variant', variant: currentVariant };\n }\n\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, newVariant);\n if (!variantEntry) {\n return {\n status: 'variant-not-found',\n requested: newVariant,\n available: catalog.variants.map((v) => v.name),\n };\n }\n\n // Index upstream files by basename for strategy-driven dispatch.\n const upstreamByBasename = new Map<string, string>();\n for (const fileRel of variantEntry.files) {\n upstreamByBasename.set(\n path.basename(fileRel),\n path.join(packageRoot, fileRel),\n );\n }\n\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const installedIdx = prior.installed.findIndex(\n (p) => p.package === packageName,\n );\n const priorResources: InstalledResource[] =\n installedIdx >= 0 ? prior.installed[installedIdx]!.resources : [];\n // Capture pre-mutation version for the upgrade-hint payload (the\n // installed manifest is rewritten further below).\n const priorVersion =\n installedIdx >= 0 ? prior.installed[installedIdx]!.version : '0.0.0';\n\n // ─── 1. Plan ──────────────────────────────────────────────────────────────\n const changes: VariantSwitchChange[] = [];\n for (const resource of priorResources) {\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'frozen') {\n changes.push({\n target: resource.target,\n kind: 'preserve',\n strategy: 'frozen',\n reason: 'frozen — user-owned, never auto-overwritten',\n });\n continue;\n }\n\n if (!upstreamAbs) {\n changes.push({\n target: resource.target,\n kind: 'preserve',\n strategy: resource.strategy,\n reason: `no upstream counterpart in variant \"${newVariant}\"`,\n });\n continue;\n }\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n\n if (resource.strategy === 'regenerable') {\n const newHash = computeHash(upstreamContent);\n if (newHash === resource.hash) {\n changes.push({\n target: resource.target,\n kind: 'unchanged',\n strategy: 'regenerable',\n reason: 'identical bytes between old and new variant',\n });\n } else {\n changes.push({\n target: resource.target,\n kind: 'rewrite',\n strategy: 'regenerable',\n reason: `regenerable swap (${currentVariant} → ${newVariant})`,\n });\n }\n continue;\n }\n\n // strategy === 'managed'\n changes.push({\n target: resource.target,\n kind: 'managed-update',\n strategy: 'managed',\n reason: 'managed regions replayed; outside content preserved',\n });\n }\n\n // ─── 2. Dry-run gate ──────────────────────────────────────────────────────\n if (!apply) {\n return {\n status: 'dry-run',\n from: currentVariant,\n to: newVariant,\n toVersion: variantEntry.version,\n changes,\n };\n }\n\n // ─── 3. Apply ─────────────────────────────────────────────────────────────\n // Capture a single timestamp for all records written during this apply phase\n // so that lock, config, and manifest entries share the exact same instant.\n const now = new Date().toISOString();\n\n // Best-effort snapshot: never abort the switch on capture failure (mirrors\n // init / update — ADR 0019 §2 best-effort policy).\n let snapshot: SnapshotResult | null = null;\n let snapshotError: string | undefined;\n try {\n logger.debug(\n `[variant-switch] capturing snapshot (reason=switch, from=${currentVariant}, to=${newVariant})`,\n );\n snapshot = await createSnapshot(projectRoot, { reason: 'switch' });\n logger.debug(\n `[variant-switch] snapshot captured: ${snapshot?.ts ?? '(none)'}`,\n );\n } catch (err) {\n snapshotError = getErrorMessage(err);\n logger.debug(`[variant-switch] snapshot capture failed: ${snapshotError}`);\n }\n\n const refreshedResources: InstalledResource[] = [];\n for (const resource of priorResources) {\n const consumerAbs = path.isAbsolute(resource.target)\n ? resource.target\n : path.join(projectRoot, resource.target);\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'regenerable' && upstreamAbs) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n await writeFileSafe(consumerAbs, upstreamContent);\n logger.debug(`[variant-switch] rewrite regenerable: ${resource.target}`);\n refreshedResources.push({\n ...resource,\n hash: computeHash(upstreamContent),\n });\n continue;\n }\n\n if (\n resource.strategy === 'managed' &&\n upstreamAbs &&\n (await fileExists(consumerAbs))\n ) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const consumerContent = await fs.readFile(consumerAbs, 'utf-8');\n const merged = mergeManagedRegions(upstreamContent, consumerContent);\n if (merged !== consumerContent) {\n await writeFileSafe(consumerAbs, merged);\n logger.debug(`[variant-switch] managed-update: ${resource.target}`);\n } else {\n logger.debug(\n `[variant-switch] managed-update no-op (bytes unchanged): ${resource.target}`,\n );\n }\n refreshedResources.push({\n ...resource,\n hash: computeHash(merged),\n });\n continue;\n }\n\n // frozen / stale — keep prior resource record verbatim.\n refreshedResources.push(resource);\n }\n\n // Persist new lock.\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: now,\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n logger.debug(\n `[variant-switch] tokens-lock.json updated (variant=${newVariant}, version=${variantEntry.version})`,\n );\n\n // Persist new config — record priorVariant + append to tokenRenameHistory.\n // The applicable rename set is computed from the new variant's full rename\n // log (ADR 0019 §D4) and stored both in the in-config history (machine-\n // readable map) and in the on-disk hint file (machine + AI consumer).\n const renames = selectApplicableRenames(\n variantEntry.renames ?? [],\n '0.0.0',\n variantEntry.version,\n );\n const renamesMap: Record<string, string> = {};\n for (const r of renames) renamesMap[r.from] = r.to;\n\n const switchTs = now;\n config.priorVariant = currentVariant;\n config.packages.tokens.variant = newVariant;\n config.packages.tokens.version = variantEntry.version;\n const history = config.tokenRenameHistory ?? [];\n history.push({\n ts: switchTs,\n fromVariant: currentVariant,\n toVariant: newVariant,\n renames: renamesMap,\n });\n config.tokenRenameHistory = history;\n await writeProjectConfig(projectRoot, config);\n logger.debug(\n `[variant-switch] config.json updated (priorVariant=${currentVariant}, variant=${newVariant}, renames=${renames.length})`,\n );\n\n // Persist new installed manifest entry.\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n variant: newVariant,\n version: variantEntry.version,\n installedAt: now,\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n logger.debug(\n `[variant-switch] installed manifest updated (resources=${refreshedResources.length})`,\n );\n }\n\n // Emit `.teamix-evo/.upgrade-hints/tokens-<ts>.json` when the new variant\n // ships any token renames — mirrors the tokens-update pathway. AI / human\n // can scan src/** and propose codemods using the hint payload.\n let hintPath: string | undefined;\n if (renames.length > 0) {\n const hint = await writeTokensUpgradeHint({\n projectRoot,\n trigger: 'switch',\n fromVariant: currentVariant,\n toVariant: newVariant,\n fromVersion: priorVersion,\n toVersion: variantEntry.version,\n renames,\n isoTs: switchTs,\n });\n if (hint) hintPath = hint.path;\n }\n if (hintPath) {\n logger.debug(`[variant-switch] upgrade hint written: ${hintPath}`);\n }\n logger.debug(\n `[variant-switch] apply complete (from=${currentVariant}, to=${newVariant}, toVersion=${variantEntry.version})`,\n );\n\n return {\n status: 'switched',\n from: currentVariant,\n to: newVariant,\n toVersion: variantEntry.version,\n changes,\n snapshot,\n ...(snapshotError ? { snapshotError } : {}),\n renames,\n ...(hintPath ? { hintPath } : {}),\n };\n}\n\nfunction lookupUpstreamBasename(consumerBasename: string): string | undefined {\n for (const [upstream, consumer] of Object.entries(\n CONSUMER_BASENAME_BY_UPSTREAM,\n )) {\n if (consumer === consumerBasename) return upstream;\n }\n return consumerBasename;\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAiBM,YAEO;AAnBb;AAAA;AAAA;AAiBA,IAAM,aAAa;AAEZ,IAAM,UAA6B;AAAA,MACxC,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY,CAAC,OAAO,OAAO,IAAI;AAAA,MAE/B,UAAU,SAAS,UAAoC;AACrD,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,UAA0B,CAAC;AACjC,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI;AACJ,gBAAM,KAAK,IAAI,OAAO,WAAW,QAAQ,WAAW,KAAK;AACzD,kBAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM;AACnC,kBAAM,UAAU,EAAE,CAAC;AACnB,kBAAM,WAAW,EAAE,CAAC;AACpB,kBAAM,cAAc,eAAe,OAAO;AAC1C,oBAAQ,KAAK;AAAA,cACX,MAAM,IAAI;AAAA,cACV;AAAA,cACA;AAAA,cACA,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,oBAAY,QAAQ,QAAQ,YAAY,CAAC,QAAQ,YAAoB;AACnE,iBAAO,eAAe,OAAO;AAAA,QAC/B,CAAC;AAED,eAAO,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA;;;AC1CA,SAAS,aAAa,KAAqB;AACzC,QAAM,MAAM,IAAI,MAAM,CAAC,EAAE,YAAY;AACrC,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpF,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpF,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;AAChD,SAAO,IAAI,GAAG;AAChB;AArBA,IAYM,cAWO;AAvBb;AAAA;AAAA;AAYA,IAAM,eAAe;AAWd,IAAM,aAAgC;AAAA,MAC3C,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY,CAAC,OAAO,OAAO,IAAI;AAAA,MAE/B,UAAU,SAAS,UAAU,UAAoC;AAC/D,YAAI,CAAC,YAAY,SAAS,SAAS,EAAG,QAAO;AAE7C,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,UAA0B,CAAC;AACjC,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI;AACJ,gBAAM,KAAK,IAAI,OAAO,aAAa,QAAQ,aAAa,KAAK;AAC7D,kBAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM;AACnC,kBAAM,OAAO,aAAa,EAAE,CAAC,CAAC;AAC9B,kBAAM,QAAQ,SAAS,IAAI,IAAI;AAC/B,gBAAI,OAAO;AACT,sBAAQ,KAAK;AAAA,gBACX,MAAM,IAAI;AAAA,gBACV,UAAU,EAAE,CAAC;AAAA,gBACb,aAAa,SAAS,KAAK;AAAA,gBAC3B,QAAQ,OAAO,EAAE,CAAC,CAAC,6BAA6B,KAAK;AAAA,cACvD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,oBAAY,QAAQ,QAAQ,cAAc,CAAC,UAAU;AACnD,gBAAM,OAAO,aAAa,KAAK;AAC/B,gBAAM,QAAQ,SAAS,IAAI,IAAI;AAC/B,iBAAO,QAAQ,SAAS,KAAK,MAAM;AAAA,QACrC,CAAC;AAED,eAAO,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA;;;AClEA,IAkBM,aAGO;AArBb;AAAA;AAAA;AAkBA,IAAM,cACJ;AAEK,IAAM,oBAAuC;AAAA,MAClD,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY,CAAC,OAAO,MAAM,KAAK;AAAA,MAE/B,UAAU,SAAS,UAAU,UAAoC;AAC/D,YAAI,CAAC,YAAY,SAAS,SAAS,EAAG,QAAO;AAE7C,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,UAA0B,CAAC;AACjC,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI;AACJ,gBAAM,KAAK,IAAI,OAAO,YAAY,QAAQ,YAAY,KAAK;AAC3D,kBAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM;AACnC,kBAAM,SAAS,EAAE,CAAC;AAClB,kBAAM,YAAY,EAAE,CAAC;AACrB,kBAAM,MAAM,GAAG,MAAM,IAAI,SAAS;AAClC,kBAAM,WAAW,SAAS,IAAI,GAAG;AACjC,gBAAI,UAAU;AACZ,sBAAQ,KAAK;AAAA,gBACX,MAAM,IAAI;AAAA,gBACV,UAAU,EAAE,CAAC;AAAA,gBACb,aAAa;AAAA,gBACb,QAAQ,kBAAkB,GAAG,oBAAe,QAAQ;AAAA,cACtD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,oBAAY,QAAQ;AAAA,UAClB;AAAA,UACA,CAAC,OAAO,QAAgB,cAAsB;AAC5C,kBAAM,MAAM,GAAG,MAAM,IAAI,SAAS;AAClC,kBAAM,WAAW,UAAU,IAAI,GAAG;AAClC,mBAAO,YAAY;AAAA,UACrB;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA;;;ACrEA,IAiBM,UAEO;AAnBb;AAAA;AAAA;AAiBA,IAAM,WAAW;AAEV,IAAM,aAAgC;AAAA,MAC3C,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY,CAAC,OAAO,MAAM,KAAK;AAAA,MAE/B,UAAU,SAAS,UAAoC;AACrD,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,UAA0B,CAAC;AACjC,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI;AACJ,gBAAM,KAAK,IAAI,OAAO,SAAS,QAAQ,SAAS,KAAK;AACrD,kBAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM;AACnC,gBAAI,EAAE,CAAC,MAAM,UAAW;AACxB,kBAAM,OAAO,EAAE,CAAC;AAChB,kBAAM,QAAQ,EAAE,CAAC;AACjB,kBAAM,cAAc,OAAO,IAAI,IAAI,KAAK;AACxC,oBAAQ,KAAK;AAAA,cACX,MAAM,IAAI;AAAA,cACV,UAAU,EAAE,CAAC;AAAA,cACb;AAAA,cACA,QAAQ,SAAS,IAAI,8BAAyB,IAAI;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,oBAAY,QAAQ,QAAQ,UAAU,CAAC,OAAO,MAAc,UAAkB;AAC5E,cAAI,UAAU,UAAW,QAAO;AAChC,iBAAO,OAAO,IAAI,IAAI,KAAK;AAAA,QAC7B,CAAC;AAED,eAAO,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA;;;AC3DA,IAgBM,cAEO;AAlBb;AAAA;AAAA;AAgBA,IAAM,eAAe;AAEd,IAAM,mBAAsC;AAAA,MACjD,IAAI;AAAA,MACJ,aACE;AAAA,MACF,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY,CAAC,OAAO,MAAM,KAAK;AAAA,MAE/B,UAAU,SAAS,UAAoC;AACrD,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,UAA0B,CAAC;AAEjC,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI;AACJ,gBAAM,KAAK,IAAI,OAAO,aAAa,QAAQ,aAAa,KAAK;AAC7D,kBAAQ,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM;AACnC,kBAAM,UAAU,EAAE,CAAC;AACnB,kBAAM,QAAQ,EAAE,CAAC;AACjB,oBAAQ,KAAK;AAAA,cACX,MAAM,IAAI;AAAA,cACV,UAAU,EAAE,CAAC;AAAA;AAAA,cAEb,aAAa;AAAA,cACb,QAAQ,mBAAmB,OAAO,KAAK,KAAK;AAAA,YAC9C,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,eAAO,EAAE,MAAM,UAAU,SAAS,WAAW,KAAK;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;;;ACrDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBO,SAAS,WAAW,IAA2C;AACpE,SAAO,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7C;AAGO,SAAS,iBAA2B;AACzC,SAAO,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AACrC;AA9BA,IAca;AAdb;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA;AAGO,IAAM,eAA6C;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACpBA,SAAS,WAAAA,iBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACD9B,SAAS,WAAAC,iBAAe;;;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;AAAA,EACE;AAAA,EACA;AAAA,OAMK;;;AC7BP,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;AAQtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACNA,SAAS,gBAAgB,KAAsB;AACpD,MAAI,eAAe,MAAO,QAAO,IAAI;AACrC,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI;AACF,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B,QAAQ;AACN,WAAO,OAAO,GAAG;AAAA,EACnB;AACF;;;ADGA,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AAQzB,IAAM,aAAa;AAEZ,IAAM,oBAAoB;AACjC,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,0BAA0B,gBAAgB,GAAG,CAAC;AAAA,IAEhD;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,4BAA4B,gBAAgB,GAAG,CAAC;AAAA,IAElD;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,KAAK,qCAAqC,gBAAgB,GAAG,CAAC,EAAE;AACvE,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,kBACpB,aACwB;AACxB,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,SAAO,MAAM,QAAQ,QAAQ;AAC/B;AAOO,SAAS,mBACd,aACA,WACQ;AACR,QAAM,OAAY,WAAK,aAAa,YAAY,UAAU;AAC1D,SAAO,YAAiB,WAAK,MAAM,SAAS,IAAI;AAClD;AAMO,SAAS,yBAAyB,aAA6B;AACpE,SAAY,WAAK,aAAa,YAAY,iBAAiB;AAC7D;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,8CAA8C,gBAAgB,GAAG,CAAC;AAAA,IACpE;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;AAaO,SAAS,qBACd,WACA,aACyB;AACzB,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,UAAU,UAAU,UAAU,OAAO,CAACC,OAAMA,GAAE,YAAY,WAAW;AAC3E,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,QAAQ,QAAQ,SAAS,CAAC,KAAK;AACxC;;;AElQA,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,EACA;AAAA,EACA;AAAA,OACK;;;ACdP,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;AACpB,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,WAAUD,eAAc,YAAY,GAAG;AAmBtC,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAQD,eAAsB,QACpB,KACA,UACmB;AACnB,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,UAAI,YAAY,SAAS,IAAI,MAAM,IAAI,EAAG;AAC1C,YAAM,KAAK,GAAI,MAAM,QAAQ,UAAU,QAAQ,CAAE;AAAA,IACnD,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,yBAAyB,aAA6B;AACpE,QAAM,UAAUE,SAAQ,QAAQ,GAAG,WAAW,eAAe;AAC7D,SAAY,cAAQ,OAAO;AAC7B;;;AFgBA,eAAsB,cACpB,SAC6B;AAK7B,QAAM,6BAA6B,QAAQ,WAAW;AAEtD,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;AAKb,QAAM,aAAa,mBAAmB,aAAa;AACnD,MAAI,YAAY;AACd,aAAS,mBAAmB,QAAQ,UAAU;AAAA,EAChD;AACA,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;AAoCA,eAAsB,aACpB,SAC4B;AAC5B,QAAM,EAAE,UAAU,MAAM,OAAO,YAAY,IAAI;AAC/C,QAAM,WAAW,QAAQ,UAAU,IAAI,IAAI,QAAQ,OAAO,IAAI;AAC9D,QAAM,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE;AACrE,QAAM,UAA+B,CAAC;AAEtC,aAAW,SAAS,SAAS,QAAQ;AACnC,QAAI,YAAY,CAAC,SAAS,IAAI,MAAM,EAAE,EAAG;AACzC,UAAM,YAAY,MAAM,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC3D,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAM,gBAAgB,MAAM,mBAAmB,OAAO,SAAS,OAAO;AACtE,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;AAClB,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,YAAMC,cACJ,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,WAAWF,WAAU;AAE1C,YAAMG,WAAU,MAAM,kBAAkB;AAAA,QACtC,YAAAH;AAAA,QACA,YAAAC;AAAA,QACA,QAAAC;AAAA,QACA,gBAAgB,MAAM;AAAA,QACtB,gBAAgB,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,aAAkB,eAAS,WAAWF,WAAU;AACtD,cAAQ,KAAK,iBAAiB,OAAOA,aAAYG,UAAS,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,QAAM,UAAU,MAAM,kBAAkB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,MAAM;AAAA,IACtB,gBAAgB,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,CAAC,iBAAiB,OAAO,YAAY,OAAO,CAAC;AACtD;AAQA,eAAe,kBAAkB,MAQb;AAClB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,mBAAmB,UAAU;AAC/B,QAAI,QAAQ;AACV,cAAQ;AACR,aAAQ,MAAM,eAAe,UAAU,KAAM;AAAA,IAC/C;AACA,UAAM,cAAc,YAAY,UAAU;AAC1C,YAAQ;AACR,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,iBAAiB,CAAC,QAAQ;AAC/C,QAAI,QAAQ;AACV,YAAM,WAAW,YAAY,WAAW;AACxC,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ;AAAA,IACV;AACA,UAAM,cAAc,YAAY,UAAU;AAC1C,WAAO;AAAA,EACT;AAQA,QAAM,UAAU,MAAM,eAAe,UAAU;AAC/C,MAAI,SAAS,WAAW;AACxB,QAAM,aAAa,mBAAmB,UAAU;AAChD,MAAI,YAAY;AACd,aAAS,mBAAmB,QAAQ,UAAU;AAAA,EAChD;AACA,aAAW,YAAY,kBAAkB,CAAC,GAAG;AAC3C,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,MAAI,WAAW,SAAS;AACtB,UAAM,WAAW,YAAY,WAAW;AACxC,UAAM,cAAc,YAAY,MAAM;AAAA,EACxC;AACA,UAAQ;AACR,SAAO;AACT;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAoCA,eAAsB,iBACpB,SAC0B;AAG1B,QAAM,6BAA6B,QAAQ,WAAW;AAEtD,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,cAAMJ,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;AAqBA,eAAsB,6BACpB,aACe;AACf,QAAM,YAAY,yBAAyB,WAAW;AACtD,QAAM,SAAS,mBAAmB,WAAW;AAE7C,MAAI,eAAe;AACnB,MAAI,YAAY;AAChB,MAAI;AACF,oBAAgB,MAAS,SAAK,SAAS,GAAG,YAAY;AAAA,EACxD,QAAQ;AACN,mBAAe;AAAA,EACjB;AACA,MAAI;AACF,iBAAa,MAAS,SAAK,MAAM,GAAG,YAAY;AAAA,EAClD,QAAQ;AACN,gBAAY;AAAA,EACd;AAEA,MAAI,CAAC,aAAc;AACnB,MAAI,WAAW;AACb,WAAO;AAAA,MACL,8CAA8C,SAAS,cAAc,MAAM;AAAA,IAE7E;AACA;AAAA,EACF;AAEA,MAAI;AACF,UAAS,WAAO,WAAW,MAAM;AACjC,WAAO;AAAA,MACL,6CAA6C,iBAAiB;AAAA,IAChE;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,8CAA8C;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAKA,MAAI;AACF,UAAM,WAAW,MAAM,sBAAsB,WAAW;AACxD,QAAI,CAAC,SAAU;AACf,UAAM,sBAAsB,gBAAgB,iBAAiB;AAC7D,UAAM,mBAAmB;AACzB,UAAM,uBAAuB,GAAQ,SAAG,cAAmB,SAAG,GAAG,iBAAiB,GAAQ,SAAG;AAC7F,UAAM,oBAAoB,GAAQ,SAAG,cAAmB,SAAG,gBAAqB,SAAG;AACnF,QAAI,UAAU;AACd,eAAW,OAAO,SAAS,WAAW;AACpC,iBAAW,KAAK,IAAI,WAAW;AAC7B,YAAI,OAAO,EAAE,WAAW,SAAU;AAClC,cAAM,SAAS,EAAE;AACjB,YAAI,QAAQ,OAAO,QAAQ,qBAAqB,gBAAgB;AAChE,gBAAQ,MAAM,QAAQ,sBAAsB,iBAAiB;AAC7D,YAAI,UAAU,QAAQ;AACpB,YAAE,SAAS;AACX,qBAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,GAAG;AACf,YAAM,uBAAuB,aAAa,QAAQ;AAClD,aAAO;AAAA,QACL,WAAW,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,mEAAmE;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAoBA,eAAsB,uBAAuB,MAIvB;AACpB,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,KAAK,MAAM;AAC3B,UAAM,UAAU,WAAW,GAAG;AAG9B,UAAM,iBAAiB,QAAQ;AAAA,MAC7B;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,UAAM,aAAkB,cAAQ,cAAc;AAC9C,QAAI;AACJ,QAAI;AACF,gBAAU,MAAS,YAAQ,UAAU;AAAA,IACvC,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,SAAS;AAC1B,YAAM,MAAW,WAAK,YAAY,IAAI;AACtC,UAAID;AACJ,UAAI;AACF,QAAAA,QAAO,MAAS,SAAK,GAAG;AAAA,MAC1B,QAAQ;AACN;AAAA,MACF;AACA,UAAI,CAACA,MAAK,YAAY,EAAG;AACzB,UAAI;AACJ,UAAI;AACF,mBAAW,MAAS,YAAQ,GAAG;AAAA,MACjC,QAAQ;AACN;AAAA,MACF;AAEA,UAAI,SAAS,KAAK,CAAC,MAAM,MAAM,UAAU,EAAG;AAG5C,UAAI,SAAS,WAAW,EAAG;AAC3B,UAAI;AACF,cAAS,UAAM,GAAG;AAClB,gBAAQ,KAAK,GAAG;AAChB,eAAO,MAAM,+BAA+B,GAAG,EAAE;AAAA,MACnD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;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,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,MACrE;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;;;AG10BA,YAAYM,WAAU;AAWtB,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;AAAA,MACJ;AAAA,MACA,KAAK,UAAU,kBAAkB,MAAM,CAAC,IAAI;AAAA,IAC9C;AACA,WAAO,MAAM,0BAAqB,OAAO,EAAE;AAC3C,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAO,KAAK,8BAA8B,gBAAgB,GAAG,CAAC,EAAE;AAChE,WAAO;AAAA,EACT;AACF;;;ACnBA,IAAM,yBAAyB;AAC/B,IAAM,eAAe;AAuDrB,eAAsB,cACpB,SAC8B;AAC9B,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,OAAO,CAAC,GAAG,QAAQ,IAAI;AAC7B,QAAM,QAAQ,QAAQ;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,gBAAgB,WAAW;AACjC,QAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,QAAM,oBAAoB,gBAAgB,UAAU;AAEpD,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM,eAAe,WAAW;AACxE,QAAM,uBAAuB,MAAM,kBAAkB,WAAW;AAEhE,QAAM,WAAW,MAAM,kBAAkB,aAAa,WAAW;AAIjE,QAAM,eAAe,SAAS,OAC3B,OAAO,CAAC,MAAM;AACb,UAAM,iBAAiB,EAAE,SAAS;AAClC,QAAI,mBAAmB,OAAO;AAC5B,aAAO;AAAA,QACL,mBAAmB,EAAE,EAAE,YAAY,cAAc,gCAAgC,KAAK,uBAAuB,EAAE,EAAE,YAAY,cAAc;AAAA,MAC7I;AACA,aAAO;AAAA,IACT;AACA,QAAI,CAAC,EAAE,QAAS,QAAO;AACvB,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,QACL,iCAAiC,EAAE,EAAE,cAAc,EAAE,OAAO;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AACA,QAAI,EAAE,YAAY,sBAAsB;AACtC,aAAO;AAAA,QACL,iCAAiC,EAAE,EAAE,cAAc,EAAE,OAAO,iCAAiC,oBAAoB;AAAA,MACnH;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC,EACA,IAAI,CAAC,MAAM,EAAE,EAAE;AAMlB,QAAM,EAAE,SAAS,iBAAiB,eAAe,IAAI;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAOA,MACE,qBACA,QAAQ,WAAW,KACnB,eAAe,WAAW,GAC1B;AACA,WAAO,EAAE,QAAQ,sBAAsB;AAAA,EACzC;AAIA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,sBAAgC,CAAC;AACrC,QAAI,eAAe,SAAS,GAAG;AAC7B,4BAAsB,MAAM,0BAA0B;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,eAAe,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,MACA,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,sBAAsB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AA6EA,eAAsB,aACpB,SAC6B;AAC7B,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,GAAG;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,aAAa,OAAO,eAAe,IAAI;AAC/C,QAAM,cAAc,QAAQ,eAAe;AAE3C,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;AAGxE,QAAM,QAAQ,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACtD,QAAM,UAAU,eAAe,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC1D,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,YAAY,CAAC,GAAG,KAAK,EAAE,KAAK,IAAI;AACtC,UAAM,IAAI;AAAA,MACR,wBAAwB,QAAQ,KAAK,IAAI,CAAC,gBACxC,aAAa,QACf;AAAA,IACF;AAAA,EACF;AAKA,aAAW,KAAK,SAAS,QAAQ;AAC/B,QAAI,eAAe,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,OAAO;AACjE,aAAO;AAAA,QACL,IAAI,EAAE,EAAE,kBAAQ,EAAE,KAAK,+CAAiB,KAAK,kJAAmD,EAAE,EAAE,YAAY,EAAE,KAAK;AAAA,MACzH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,kBAAkB,aAAa,WAAW;AAKjE,QAAM,EAAE,SAAS,iBAAiB,eAAe,IAAI;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAIA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,sBAAgC,CAAC;AACrC,QAAI,eAAe,SAAS,GAAG;AAC7B,4BAAsB,MAAM,0BAA0B;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,eAAe,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,MACA,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,sBAAsB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AASA,SAAS,mBACP,KACA,UACA,UAKA;AACA,QAAM,eAAe,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClE,QAAM,UAAoB,CAAC;AAC3B,QAAM,kBAA4B,CAAC;AACnC,QAAM,iBAAsC,CAAC;AAC7C,aAAW,QAAQ,KAAK;AACtB,QAAI,CAAC,SAAS,SAAS,IAAI,IAAI,GAAG;AAChC,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,UAAM,eAAe,SAAS,MAAM,SAAS,IAAI,GAAG;AACpD,UAAM,YAAY,aAAa,IAAI,IAAI,GAAG;AAC1C,QACE,gBACA,aACA,cAAc,cAAc,SAAS,IAAI,GACzC;AACA,qBAAe,KAAK;AAAA,QAClB,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,sBAAgB,KAAK,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,SAAS,iBAAiB,eAAe;AACpD;AASA,SAAS,kBAAkB,GAA4C;AACrE,QAAM,IAAI,uBAAuB,KAAK,CAAC;AACvC,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AAClD;AAGA,SAAS,cAAc,GAAW,GAAmB;AACnD,QAAM,KAAK,kBAAkB,CAAC;AAC9B,QAAM,KAAK,kBAAkB,CAAC;AAC9B,MAAI,CAAC,MAAM,CAAC,IAAI;AACd,QAAI,MAAM,EAAG,QAAO;AACpB,WAAO,IAAI,IAAI,KAAK;AAAA,EACtB;AACA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,GAAG,CAAC,MAAO,GAAG,CAAC,EAAI,QAAO,GAAG,CAAC,IAAK,GAAG,CAAC,IAAK,KAAK;AAAA,EACvD;AACA,SAAO;AACT;AAgBA,eAAe,kBACb,aACA,aACwB;AACxB,QAAM,YAAY,MAAM,sBAAsB,WAAW;AACzD,QAAM,MAAM,WAAW,UAAU,KAAK,CAACC,OAAMA,GAAE,YAAY,WAAW;AACtE,QAAM,OAAO,MAAM,eAAe,WAAW;AAC7C,QAAM,WAAW,oBAAI,IAAY;AAAA,IAC/B,GAAG,OAAO,KAAK,MAAM,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA,IAGjC,IAAI,KAAK,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;AAAA,EACjE,CAAC;AACD,SAAO,EAAE,WAAW,KAAK,MAAM,SAAS;AAC1C;AAmBA,eAAe,sBAAsB,MAalC;AACD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,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,SAAS,aAAa;AAAA,IACjE,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,MAAM,kBAAkB,UAAU;AAAA,IACtC,CAACA,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,QAAM,kBAAkB;AAAA,IACtB,SAAS,KAAK,aAAa,CAAC;AAAA,IAC5B,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,SAAS,QAAQ;AAAA,IACxC,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;AAI/B,MAAI;AACF,UAAM,uBAAuB,EAAE,aAAa,MAAM,MAAM,CAAC;AAAA,EAC3D,QAAQ;AAAA,EAER;AAGA,MAAI,sBAAgC,CAAC;AACrC,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,0BAAsB,MAAM,0BAA0B;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,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,IACA;AAAA,IACA,gBAAgB,CAAC;AAAA,EACnB;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;AAqBA,eAAe,0BACb,MACmB;AACnB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,YAAY,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE;AAGhD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,OAAmB,SAAS,QAAQ;AAAA,IACxC,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,EACX;AACA,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,eAAe,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClE,aAAW,MAAM,WAAW;AAC1B,UAAM,WAAW,aAAa,IAAI,EAAE;AACpC,QAAI,CAAC,SAAU;AACf,UAAM,aAAa,SAAS,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC/D,SAAK,OAAO,EAAE,IAAI;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,aAAa,IAAI;AAGvC,QAAM,oBAAqB,MAAM,sBAAsB,WAAW,KAAM;AAAA,IACtE,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,MAAM,kBAAkB,UAAU;AAAA,IACtC,CAACA,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,MAAI,OAAO,GAAG;AACZ,sBAAkB,UAAU,GAAG,EAAG,UAAU,SAAS;AACrD,sBAAkB,UAAU,GAAG,EAAG,cAAc;AAAA,EAClD;AACA,QAAM,uBAAuB,aAAa,iBAAiB;AAE3D,SAAO;AAAA,IACL,iBAAiB,UAAU,MAAM,uBAAuB,UAAU;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AX7sBA,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;AAoEjC,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;AAGA,QAAM,cAAc,UAAU,uBAAuB;AACrD,MAAI,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,GAAG;AAChD,UAAM,mBAAmB,MAAS,aAAS,cAAc,OAAO;AAChE,cAAU,KAAK;AAAA,MACb,IAAI;AAAA,MACJ,QAAa,YAAM,KAAK,qBAAqB,uBAAuB;AAAA,MACpE,MAAM,YAAY,gBAAgB;AAAA,MAClC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,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,CAACC,OAAMA,GAAE,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;AAM/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,eAAeD,uBAAsB;AAChE,uBAAmB,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,iEAAiE;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;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,4CAA4C,gBAAgB,GAAG,CAAC;AAAA,IAClE;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,KAAK,qBAAqB,mBAAmB;AAC1E,UAAM,YAAiB,WAAK,aAAa,SAAS;AAClD,UAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AAIpD,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,WAAW,WAAW,WAAW;AAAA,IACzC;AACA,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;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;;;AYpdA,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;AAgBO,SAAS,6BAA6B,KAAqB;AAChE,MAAI,mBAAmB,GAAG,EAAG,QAAO;AACpC,QAAM,aAAa,kBAAkB;AACrC,MAAI,mBAAmB,UAAU,EAAG,QAAO;AAC3C,SAAO;AACT;;;AhBhDO,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,WAAW;AACnB;AAAA,IACF;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,mDAAmD;AAC/D,aAAO;AAAA,QACL,0CAA0C,OAAO,gBAAgB;AAAA,MACnE;AACA,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,KAAK,8BAA8B,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,MACtE;AACA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,eAAO;AAAA,UACL,2CAA2C,gBAAgB;AAAA,YACzD;AAAA,UACF,CAAC;AAAA,QACH;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;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,yBAAyB,gBAAgB,GAAG,CAAC,EAAE;AAC5D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AiB5FH,SAAS,WAAAC,gBAAe;;;ACgBxB,YAAYC,YAAU;AACtB,YAAYC,SAAQ;AACpB;AAAA,EACE,6BAAAC;AAAA,EACA,mBAAAC;AAAA,OAIK;;;ACXP,YAAYC,YAAU;AAItB,IAAMC,cAAa;AACnB,IAAM,YAAY;AAkClB,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,SAAS,GAAG;AACjC;AAkCA,eAAsB,uBACpB,SACyC;AACzC,MAAI,QAAQ,QAAQ,WAAW,EAAG,QAAO;AAEzC,QAAM,QAAQ,QAAQ,UAAS,oBAAI,KAAK,GAAE,YAAY;AACtD,QAAM,OAAO,YAAY,KAAK;AAC9B,QAAM,WAAW,UAAU,IAAI;AAC/B,QAAM,SAAc;AAAA,IAClB,QAAQ;AAAA,IACRA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAA6B;AAAA,IACjC,eAAe;AAAA,IACf,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,cAAc,QAAQ,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,IAAI;AAEnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,aAAa,QAAQ,QAAQ;AAAA,EAC/B;AACF;AAaO,SAAS,wBACd,SACA,aACA,WACoB;AACpB,SAAO,QACJ;AAAA,IACC,CAAC,MACCC,eAAc,EAAE,cAAc,WAAW,IAAI,KAC7CA,eAAc,EAAE,cAAc,SAAS,KAAK;AAAA,EAChD,EACC,KAAK,CAAC,GAAG,MAAMA,eAAc,EAAE,cAAc,EAAE,YAAY,CAAC;AACjE;AAMA,SAASA,eAAc,GAAW,GAAmB;AACnD,QAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC/C,QAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC/C,QAAM,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AACjE,QAAM,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AACjE,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,OAAO,MAAM,GAAG,KAAK;AAC/D,UAAM,KAAK,OAAO,CAAC,KAAK;AACxB,UAAM,KAAK,OAAO,CAAC,KAAK;AACxB,QAAI,OAAO,GAAI,QAAO,KAAK;AAAA,EAC7B;AAGA,MAAI,UAAU,MAAM,UAAU,GAAI,QAAO;AACzC,MAAI,UAAU,MAAM,UAAU,GAAI,QAAO;AACzC,SAAO,MAAM,cAAc,OAAO,QAAW,EAAE,SAAS,KAAK,CAAC;AAChE;;;AC/KA,SAAS,oBAAAC,mBAAkB,wBAAAC,6BAA4B;AAQhD,SAAS,oBACd,iBACA,iBACQ;AACR,MAAI,UAAU;AACd,QAAM,KACJ;AACF,MAAI;AACJ,UAAQ,QAAQ,GAAG,KAAK,eAAe,OAAO,MAAM;AAClD,UAAM,KAAK,MAAM,CAAC;AAClB,UAAM,OAAO,MAAM,CAAC,EAAG,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC3D,QAAI,CAACD,kBAAiB,SAAS,EAAE,GAAG;AAClC,YAAM,IAAI;AAAA,QACR,mBAAmB,EAAE;AAAA,MACvB;AAAA,IACF;AACA,cAAUC,sBAAqB,SAAS,IAAI,IAAI;AAAA,EAClD;AACA,SAAO;AACT;;;AFoBA,IAAMC,0BAAyB;AAG/B,IAAM,gCAAwD;AAAA,EAC5D,aAAa;AAAA,EACb,iBAAiB;AACnB;AAsDA,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,cAAc,QAAQ,eAAeC;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,eAAe,yBAAyB,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;AAGA,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,aAAW,WAAW,aAAa,OAAO;AACxC,uBAAmB;AAAA,MACZ,gBAAS,OAAO;AAAA,MAChB,YAAK,aAAa,OAAO;AAAA,IAChC;AAAA,EACF;AAIA,QAAM,QAAS,MAAM,sBAAsB,WAAW,KAAM;AAAA,IAC1D,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,eAAe,MAAM,UAAU;AAAA,IACnC,CAACC,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,QAAM,iBACJ,gBAAgB,IAAI,MAAM,UAAU,YAAY,EAAG,YAAY,CAAC;AAElE,QAAM,YAAsB,CAAC;AAC7B,QAAM,kBAA4B,CAAC;AACnC,QAAM,YAAsB,CAAC;AAC7B,QAAM,cAA6B,CAAC;AACpC,QAAM,qBAA0C,CAAC;AAEjD,aAAW,YAAY,gBAAgB;AACrC,UAAM,cAAmB,kBAAW,SAAS,MAAM,IAC/C,SAAS,SACJ,YAAK,aAAa,SAAS,MAAM;AAC1C,UAAM,mBAAwB,gBAAS,SAAS,MAAM;AACtD,UAAM,mBAAmB,uBAAuB,gBAAgB;AAChE,UAAM,cAAc,mBAChB,mBAAmB,IAAI,gBAAgB,IACvC;AAEJ,QAAI,SAAS,aAAa,eAAe;AACvC,UAAI,CAAC,aAAa;AAGhB,2BAAmB,KAAK,QAAQ;AAChC;AAAA,MACF;AACA,YAAM,UAAU,MAAS,aAAS,aAAa,OAAO;AACtD,YAAM,cAAc,aAAa,OAAO;AACxC,gBAAU,KAAK,SAAS,MAAM;AAC9B,yBAAmB,KAAK;AAAA,QACtB,GAAG;AAAA,QACH,MAAM,YAAY,OAAO;AAAA,MAC3B,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,aAAa,WAAW;AACnC,UAAI,CAAC,eAAe,CAAE,MAAM,WAAW,WAAW,GAAI;AACpD,2BAAmB,KAAK,QAAQ;AAChC;AAAA,MACF;AACA,YAAM,kBAAkB,MAAS,aAAS,aAAa,OAAO;AAC9D,YAAM,kBAAkB,MAAS,aAAS,aAAa,OAAO;AAC9D,YAAM,SAAS,oBAAoB,iBAAiB,eAAe;AACnE,UAAI,WAAW,iBAAiB;AAC9B,cAAM,cAAc,aAAa,MAAM;AACvC,wBAAgB,KAAK,SAAS,MAAM;AAAA,MACtC;AACA,yBAAmB,KAAK;AAAA,QACtB,GAAG;AAAA,QACH,MAAM,YAAY,MAAM;AAAA,MAC1B,CAAC;AACD;AAAA,IACF;AAIA,QAAI,MAAM,WAAW,WAAW,EAAG,WAAU,KAAK,SAAS,MAAM;AACjE,QAAI,aAAa;AACf,YAAM,kBAAkB,MAAS,aAAS,aAAa,OAAO;AAC9D,YAAM,eAAe,YAAY,eAAe;AAChD,UAAI,SAAS,QAAQ,iBAAiB,SAAS,MAAM;AACnD,oBAAY,KAAK;AAAA,UACf,QAAQ,SAAS;AAAA,UACjB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,uBAAmB,KAAK,QAAQ;AAAA,EAClC;AAIA,MAAI,aAAa,YAAY,gBAAgB;AAC3C,QAAI,gBAAgB,GAAG;AACrB,YAAM,UAAU,YAAY,IAAI;AAAA,QAC9B,GAAG,MAAM,UAAU,YAAY;AAAA,QAC/B,WAAW;AAAA,MACb;AACA,YAAM,uBAAuB,aAAa,KAAK;AAAA,IACjD;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,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;AAEA,SAAO,SAAS,OAAO,UAAU,aAAa;AAC9C,QAAM,mBAAmB,aAAa,MAAM;AAE5C,MAAI,gBAAgB,GAAG;AACrB,UAAM,UAAU,YAAY,IAAI;AAAA,MAC9B,GAAG,MAAM,UAAU,YAAY;AAAA,MAC/B,SAAS,aAAa;AAAA,MACtB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,WAAW;AAAA,IACb;AACA,UAAM,uBAAuB,aAAa,KAAK;AAAA,EACjD;AAKA,QAAM,UAAU;AAAA,IACd,aAAa,WAAW,CAAC;AAAA,IACzB;AAAA,IACA,aAAa;AAAA,EACf;AACA,MAAI;AACJ,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,OAAO,MAAM,uBAAuB;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW,aAAa;AAAA,MACxB;AAAA,IACF,CAAC;AACD,QAAI,KAAM,YAAW,KAAK;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,IAAI,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;AAEA,SAAS,uBAAuB,kBAA8C;AAC5E,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO;AAAA,IACxC;AAAA,EACF,GAAG;AACD,QAAI,aAAa,iBAAkB,QAAO;AAAA,EAC5C;AAEA,SAAO;AACT;;;ADhTO,IAAM,gBAAgB,IAAIC,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,KAAK,wDAAwD;AACpE,uBAAiB,OAAO,WAAW;AACnC;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,gBAAgB,SAAS,GAAG;AACrC,aAAO;AAAA,QACL,8BAA8B,OAAO,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACjE;AAAA,IACF;AACA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,aAAO;AAAA,QACL,gBAAgB,OAAO,UAAU;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,qBAAiB,OAAO,WAAW;AACnC,QAAI,OAAO,UAAU;AACnB,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,gCAAyB,OAAO,QAAQ,EAAE;AACtD,aAAO;AAAA,QACL,yBAAU,OAAO,QAAQ,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA4B,gBAAgB,GAAG,CAAC,EAAE;AAC/D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,SAAS,iBACP,OACM;AACN,MAAI,MAAM,WAAW,EAAG;AACxB,SAAO;AAAA,IACL,uKAAsD,MACnD,IAAI,CAAC,MAAM,EAAE,MAAM,EACnB,KAAK,IAAI,CAAC;AAAA,EACf;AACA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AItFA,SAAS,WAAAC,gBAAe;AAMjB,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;AAAA,QACL;AAAA,MACF;AACA;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,CAACC,OAAMA,GAAE,YAAY,wBAAwBA,GAAE,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,mBAAmB,gBAAgB,GAAG,CAAC,EAAE;AACtD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ACxCH,SAAS,WAAAC,gBAAe;AAKjB,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;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA4B,gBAAgB,GAAG,CAAC,EAAE;AAC/D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ACjDH,SAAS,WAAAC,gBAAe;AACxB,YAAYC,SAAQ;AACpB,YAAYC,YAAU;AACtB,YAAY,aAAa;AAWzB,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,CAACC,OAAMA,GAAE,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,KAAK,oBAAoB,MAAM,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAGA,QAAI,mBAAmB;AACrB,wBAAkB,YAAY,kBAAkB,UAAU;AAAA,QACxD,CAACD,OAAMA,GAAE,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,sCAAsC,gBAAgB,GAAG,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,eAAe,cAAc,EAAE;AAC9C,WAAO,KAAK,cAAc,OAAO,QAAQ;AACzC,QAAI,OAAO,GAAG;AACZ,YAAME,QAAO,KAAK,QACd,sCACA;AACJ,aAAO,KAAK,cAAc,IAAI,iBAAYA,KAAI,EAAE;AAAA,IAClD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,gBAAgB,GAAG,CAAC,EAAE;AAC3D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ACtIH,SAAS,WAAAC,gBAAe;;;ACkBxB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAEtB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAgEtB,eAAsB,eACpB,SAC+B;AAC/B,QAAM,YAAiB,YAAK,QAAQ,aAAa,SAAS;AAC1D,QAAM,gBAAqB,YAAK,QAAQ,aAAa,aAAa;AAElE,QAAM,WAAW,MAAM,SAAS,SAAS;AACzC,MAAI,aAAa,MAAM;AACrB,WAAO,EAAE,QAAQ,YAAY,WAAW,cAAc;AAAA,EACxD;AACA,QAAM,eAAe,MAAM,SAAS,aAAa;AACjD,MAAI,iBAAiB,MAAM;AACzB,WAAO,EAAE,QAAQ,gBAAgB,WAAW,cAAc;AAAA,EAC5D;AAEA,QAAM,cAAc,kBAAkB,QAAQ;AAC9C,QAAM,iBAAiB,kBAAkB,YAAY;AAErD,QAAM,aAAa,oBAAI,IAAyB;AAChD,aAAW,OAAO,YAAa,YAAW,IAAI,IAAI,MAAM,GAAG;AAE3D,QAAM,UAA6B,CAAC;AACpC,aAAW,OAAO,gBAAgB;AAChC,YAAQ,KAAK,iBAAiB,KAAK,UAAU,CAAC;AAAA,EAChD;AAEA,QAAM,UAAyC;AAAA,IAC7C,WAAW;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACA,aAAW,SAAS,QAAS,SAAQ,MAAM,QAAQ,KAAK;AAExD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,SAAS,UAA0C;AAChE,MAAI;AACF,WAAO,MAAS,cAAS,UAAU,OAAO;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYO,SAAS,kBAAkB,QAA+B;AAE/D,QAAM,WAAW,OAAO;AAAA,IAAQ;AAAA,IAAqB,CAAC,MACpD,EAAE,QAAQ,UAAU,GAAG;AAAA,EACzB;AACA,QAAM,MAAqB,CAAC;AAC5B,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,UAAU,MAAM,CAAC,KAAK;AAC5B,UAAM,QAAQ,4CAA4C,KAAK,OAAO;AACtE,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,QAAI,KAAK,EAAE,MAAM,OAAO,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAmBA,SAAS,iBACP,UACA,YACiB;AAEjB,QAAM,SAAS,WAAW,IAAI,SAAS,IAAI;AAC3C,MAAI,QAAQ;AACV,UAAM,QAAQ,2BAA2B,SAAS,OAAO,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,UAAU,QAAQ,cAAc;AAAA,MAChC,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO;AAAA,MACnB,QAAQ,QACJ,0BAA0B,OAAO,IAAI,oDACrC;AAAA,IACN;AAAA,EACF;AAQA,MAAI,CAAC,SAAS,KAAK,WAAW,UAAU,GAAG;AACzC,UAAM,SAAS,WAAW,SAAS,KAAK,MAAM,CAAC,CAAC;AAChD,UAAM,UAAU,WAAW,IAAI,MAAM;AACrC,QAAI,SAAS;AACX,YAAM,UAAU,gBAAgB,SAAS,KAAK;AAC9C,YAAM,QAAQ,2BAA2B,SAAS,QAAQ,KAAK;AAC/D,aAAO;AAAA,QACL,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,MAAM,SAAS;AAAA,QACf,UAAU;AAAA,QACV,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,iBAAiB,QAAQ,cAAc;AAAA,QACvC,QAAQ,QACJ,8BAA8B,QAAQ,IAAI,4DAC1C,oCAAoC,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,OAAO,SAAS;AAAA,IAChB,MAAM,SAAS;AAAA,IACf,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AASO,SAAS,2BAA2B,GAAW,GAAoB;AACxE,SAAO,kBAAkB,CAAC,MAAM,kBAAkB,CAAC;AACrD;AAEA,SAAS,kBAAkB,OAAuB;AAChD,MAAI,IAAI,MAAM,KAAK,EAAE,YAAY;AAEjC,MAAI,EAAE,QAAQ,QAAQ,GAAG;AAEzB,MAAI,EAAE,QAAQ,mBAAmB,IAAI;AAErC,MAAI,EACD,QAAQ,8BAA8B,IAAI,EAC1C,QAAQ,mBAAmB,EAAE;AAChC,SAAO;AACT;AAaO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,iBAAiB,KAAK,OAAO,EAAG,QAAO;AAE3C,QAAM,UACJ;AACF,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,WAAO,OAAO,OAAO;AAAA,EACvB;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,OAAgC;AAC/D,QAAM,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK;AAC5C,UAAQ,MAAM,UAAU;AAAA,IACtB,KAAK;AACH,aAAO,GAAG,IAAI;AAAA,8BAAuB,MAAM,MAAM;AAAA,IACnD,KAAK;AACH,aAAO,GAAG,IAAI;AAAA,yBAAkB,MAAM,MAAM;AAAA,IAC9C,KAAK,WAAW;AACd,YAAM,MAAM,MAAM,kBACd,eAAe,MAAM,eAAe,MACpC;AACJ,aAAO,GAAG,IAAI;AAAA,oBAAkB,GAAG,WAAM,MAAM,MAAM;AAAA,IACvD;AAAA,IACA,KAAK;AACH,aAAO,GAAG,IAAI;AAAA,2BAAoB,MAAM,MAAM;AAAA,EAClD;AACF;AAGO,SAAS,mBACd,QACQ;AACR,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,qBAAkB,OAAO,cAAc,wBAAwB;AAC1E,QAAM;AAAA,IACJ,eAAe,OAAO,QAAQ,SAAS,UAAU,OAAO,QAAQ,IAAI,aAAa,OAAO,QAAQ,OAAO,YAAY,OAAO,QAAQ,MAAM;AAAA,EAC1I;AACA,aAAW,OAAO,CAAC,aAAa,WAAW,UAAU,MAAM,GAAY;AACrE,UAAM,SAAS,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG;AAC9D,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,IAAI,IAAI,YAAY,CAAC,MAAM,OAAO,MAAM,GAAG;AACtD,eAAW,SAAS,OAAQ,OAAM,KAAK,iBAAiB,KAAK,CAAC;AAAA,EAChE;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ADtTO,IAAM,eAAe,IAAIC,SAAQ,OAAO,EAC5C;AAAA,EACC;AACF,EACC,OAAO,UAAU,6FAA4B,EAC7C;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,SAA8C;AAC3D,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AACvC,UAAM,SAAS,MAAM,eAAe,EAAE,YAAY,CAAC;AAEnD,QAAI,OAAO,WAAW,YAAY;AAChC,aAAO;AAAA,QACL,gCAAgC,OAAO,SAAS;AAAA,MAClD;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,OAAO,WAAW,gBAAgB;AACpC,aAAO;AAAA,QACL,8BAA8B,OAAO,aAAa;AAAA,MACpD;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,WAAW;AAE/B;AAAA,IACF;AAGA,UAAM,YAAY,YAAY,KAAK,MAAM;AACzC,UAAM,WAAW,YACb;AAAA,MACE,GAAG;AAAA,MACH,SAAS,OAAO,QAAQ,OAAO,CAAC,MAAM,UAAU,IAAI,EAAE,QAAQ,CAAC;AAAA,IACjE,IACA;AAEJ,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAC7D;AAAA,IACF;AAEA,WAAO,KAAK,mBAAmB,QAAQ,CAAC;AACxC,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,2BAA2B,gBAAgB,GAAG,CAAC,EAAE;AAC9D,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,SAAS,YAAY,KAAoD;AACvE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAyB,CAAC,aAAa,QAAQ,WAAW,QAAQ;AACxE,QAAM,MAAM,oBAAI,IAAmB;AACnC,aAAW,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG;AACpE,QAAI,CAAC,KAAM;AACX,QAAK,MAAmB,SAAS,IAAI,GAAG;AACtC,UAAI,IAAI,IAAqB;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,IAAI,OAAO,IAAI,MAAM;AAC9B;;;AErFA,SAAS,WAAAC,gBAAe;;;ACoBxB;;;ACbA,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAEtB;AAYA,eAAsB,WACpB,SAC2B;AAC3B,QAAM,EAAE,aAAa,WAAW,SAAS,KAAK,IAAI;AAElD,QAAM,UAAU,WAAW,SAAS;AACpC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,oBAAoB,SAAS,kBAC3B,MAAM,mEAEL,eAAe,EACf,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AAKA,QAAM,WAAgB,YAAK,aAAa,KAAK;AAE7C,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,UAAU,iBAAiB;AAAA,EACtD,QAAQ;AAEN,eAAW,CAAC;AAAA,EACd;AAGA,QAAM,QAAQ,SAAS,OAAO,CAAC,QAAQ;AACrC,UAAM,MAAW,eAAQ,GAAG,EAAE,MAAM,CAAC;AACrC,WAAO,QAAQ,WAAW,SAAS,GAAG;AAAA,EACxC,CAAC;AAED,QAAM,UAA+B,CAAC;AACtC,MAAI,UAAU;AAEd,aAAW,WAAW,OAAO;AAC3B;AACA,UAAM,UAAe,gBAAS,aAAa,OAAO;AAClD,UAAM,UAAU,MAAS,cAAS,SAAS,OAAO;AAClD,UAAM,SAAS,QAAQ,UAAU,SAAS,SAAS,QAAQ,QAAQ;AAEnE,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AAGnB,UAAI,CAAC,UAAU,OAAO,cAAc,MAAM;AACxC,cAAS,eAAU,SAAS,OAAO,WAAW,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAEzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,IACP,SAAS,CAAC,UAAU,QAAQ,eAAe;AAAA,EAC7C;AACF;;;AC1EA,YAAYC,UAAQ;AACpB,YAAYC,YAAU;;;ACVtB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAE1B,IAAM,YAAY,UAAU,IAAI;AAShC,eAAsB,2BACpB,aACiC;AACjC,QAAM,QAAgC,CAAC;AAEvC,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,EAAE,KAAK,aAAa,SAAS,KAAQ,WAAW,KAAK,OAAO,KAAK;AAAA,IACnE;AAEA,QAAI,OAAO,KAAK,GAAG;AACjB,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,MAAM;AAIjC,mBAAW,UAAU,SAAS;AAC5B,qBAAW,OAAO,OAAO,UAAU;AACjC,gBAAI,IAAI,UAAU,IAAI,OAAO,WAAW,aAAa,GAAG;AACtD,oBAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;AD9BA;AAmDA,IAAM,qBAAqB;AAAA,EACzB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAIA,eAAsB,eACpB,SACsB;AACtB,QAAM,EAAE,aAAa,eAAe,OAAO,QAAQ,MAAM,IAAI;AAG7D,QAAM,WACJ,QAAQ,YAAa,MAAM,yBAAyB,WAAW;AAGjE,SAAO,KAAK,uCAAuC;AACnD,QAAM,cAAc,MAAM,gBAAgB,WAAW;AAGrD,QAAM,iBAID,CAAC;AAEN,aAAW,aAAa,oBAAoB;AAC1C,UAAM,eAAe,eAAe;AACpC,QAAI,CAAC,aAAa,SAAS,SAAS,GAAG;AACrC,aAAO,MAAM,aAAa,SAAS,sBAAsB;AACzD;AAAA,IACF;AAEA,WAAO,KAAK,sBAAsB,SAAS,KAAK;AAChD,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,CAAC;AAAA,QACT;AAAA,MACF,CAAC;AAED,YAAM,eAAe,OAAO,MAAM;AAAA,QAChC,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ;AAAA,QAC5B;AAAA,MACF;AAEA,qBAAe,KAAK;AAAA,QAClB,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS,SAAS,eAAe;AAAA,MACnC,CAAC;AAED,UAAI,eAAe,GAAG;AACpB,eAAO;AAAA,UACL,OAAO,SAAS,KAAK,YAAY,WAC/B,QAAQ,eAAe,YACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,OAAO,SAAS,YACd,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,MACF;AACA,qBAAe,KAAK,EAAE,IAAI,WAAW,SAAS,GAAG,SAAS,MAAM,CAAC;AAAA,IACnE;AAAA,EACF;AAGA,SAAO,KAAK,wCAAwC;AACpD,QAAM,eAAe,MAAM,gBAAgB,WAAW;AAGtD,QAAM,SAA2B,CAAC;AAClC,QAAM,WAAW,oBAAI,IAAI;AAAA,IACvB,GAAG,OAAO,KAAK,YAAY,KAAK;AAAA,IAChC,GAAG,OAAO,KAAK,aAAa,KAAK;AAAA,EACnC,CAAC;AAED,aAAW,QAAQ,UAAU;AAC3B,UAAM,SAAS,YAAY,MAAM,IAAI,KAAK;AAC1C,UAAM,QAAQ,aAAa,MAAM,IAAI,KAAK;AAC1C,QAAI,WAAW,KAAK,UAAU,EAAG;AAEjC,UAAM,QAAQ,QAAQ;AACtB,UAAM,aACJ,SAAS,IACL,GAAG,SAAS,IAAI,MAAM,EAAE,GAAG,KAAK,MAAO,QAAQ,SAAU,GAAG,CAAC,MAC7D,QAAQ,IACR,YACA;AAEN,WAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,OAAO,WAAW,CAAC;AAAA,EACxD;AAEA,QAAM,iBAAiB,YAAY,QAAQ,aAAa;AAGxD,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAChB,UAAM,iBAAiB,aAAa,YAAY;AAChD,qBAAiB;AACjB,WAAO,KAAK,2DAAsD;AAAA,EACpE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIA,eAAe,gBAAgB,aAAgD;AAC7E,QAAM,QAAQ,MAAM,2BAA2B,WAAW;AAC1D,QAAM,QAAQ,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AAEhE,SAAO;AAAA,IACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAIA,eAAe,wBACb,aACA,KACA,MACA,QACA,gBACiB;AACjB,QAAM,aAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,UAAU,UAAU;AAE1B,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE;AACrE,QAAM,aAAkB,YAAK,YAAY,GAAG,EAAE,KAAK;AAEnD,MAAI,UAAU;AAAA;AAAA,8BAEN,KAAK,SAAS;AAAA,8BACd,IAAI,KAAK;AAAA,8BACT,KAAK,KAAK;AAAA,0BACT,IAAI,QAAQ,KAAK,KAAK,KAC7B,IAAI,QAAQ,IAAI,KAAK,OAAQ,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAS,GAAG,IAAI,CAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,aAAW,KAAK,QAAQ;AACtB,eAAW,OAAO,EAAE,IAAI,QAAQ,EAAE,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE,UAAU;AAAA;AAAA,EACzE;AAEA,aAAW;AAAA;AAAA;AAAA;AACX,aAAW;AAEX,aAAW,KAAK,gBAAgB;AAC9B,eAAW,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,MACrC,EAAE,UAAU,WAAM,kBACpB;AAAA;AAAA,EACF;AAEA,aAAW;AAAA;AAAA;AAAA;AAAA;AAEX,QAAS,eAAU,YAAY,SAAS,OAAO;AAC/C,SAAO;AACT;AAIA,eAAe,iBACb,aACA,UACe;AACf,QAAM,eAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAS;AAAA,IACP;AAAA,IACA,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,IACpC;AAAA,EACF;AACF;AAUA,eAAsB,yBACpB,aAC8B;AAC9B,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,aAAa;AAAA,IACZ,YAAK,aAAa,UAAU,kBAAkB;AAAA,IAC9C,YAAK,aAAa,UAAU,sBAAsB;AAAA,EACzD;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,UAAU,MAAM,eAAe,IAAI;AACzC,QAAI,CAAC,QAAS;AAGd,UAAM,SAAS;AACf,QAAI;AACJ,YAAQ,IAAI,OAAO,KAAK,OAAO,OAAO,MAAM;AAC1C,YAAM,UAAU,EAAE,CAAC;AACnB,YAAM,MAAM,mBAAmB,EAAE,CAAC,CAAE;AAEpC,UAAI,CAAC,IAAI,IAAI,GAAG,GAAG;AACjB,YAAI,IAAI,KAAK,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,mBAAmB,KAAqB;AAC/C,QAAM,MAAM,IAAI,MAAM,CAAC,EAAE,YAAY;AACrC,MAAI,IAAI,WAAW;AACjB,WAAO,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,MAAI,IAAI,WAAW;AACjB,WAAO,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;AAChD,SAAO,IAAI,GAAG;AAChB;;;AH/TO,IAAM,iBAAiB,IAAIC,SAAQ,SAAS,EAChD,YAAY,wEAAgC,EAC5C,SAAS,UAAU,mHAAmC,EACtD,OAAO,oBAAoB,8DAAY,EACvC,OAAO,WAAW,qGAA0B,EAC5C,OAAO,UAAU,8CAAgB,EACjC;AAAA,EACC,OACE,MACA,SACG;AAEH,QAAI,KAAK,QAAQ,CAAC,MAAM;AACtB,aAAO,KAAK,0BAAgB;AAC5B,iBAAW,MAAM,cAAc;AAC7B,cAAM,OACJ,GAAG,eAAe,cAAc,uBAAQ;AAC1C,eAAO,KAAK,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE;AAClE,eAAO,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,WAAW,EAAE;AAChD,eAAO,KAAK,EAAE;AAAA,MAChB;AACA;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,KAAK;AACrB,UAAM,cAAc,QAAQ,IAAI;AAEhC,QAAI;AAEF,YAAM,WAAW,MAAM,yBAAyB,WAAW;AAE3D,YAAM,SAAS,MAAM,WAAW;AAAA,QAC9B;AAAA,QACA,WAAW;AAAA,QACX,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,OAAO,SAAS,cAAc;AACpC,aAAO;AAAA,QACL;AAAA,EAAK,IAAI,IAAI,OAAO,SAAS,kBAAQ,OAAO,OAAO,wBAAS,OAAO,QAAQ,oCAAW,OAAO,YAAY;AAAA;AAAA,MAC3G;AAEA,iBAAW,QAAQ,OAAO,OAAO;AAC/B,eAAO,KAAK,eAAQ,KAAK,IAAI,KAAK,KAAK,QAAQ,MAAM,UAAK;AAC1D,mBAAW,KAAK,KAAK,QAAQ,MAAM,GAAG,CAAC,GAAG;AACxC,gBAAM,QAAQ,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK;AACtD,iBAAO,KAAK,SAAS,EAAE,IAAI,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE;AACpD,iBAAO,KAAK,cAAc,EAAE,MAAM,EAAE;AAAA,QACtC;AACA,YAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,iBAAO,KAAK,+BAAgB,KAAK,QAAQ,SAAS,CAAC,SAAI;AAAA,QACzD;AAAA,MACF;AAEA,UAAI,UAAU,OAAO,eAAe,GAAG;AACrC,eAAO,KAAK,yFAA2B;AAAA,MACzC;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AKrEF,SAAS,WAAAC,gBAAe;;;ACKxB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AACtB,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAAC,kBAAiB;AAI1B,IAAMC,aAAYC,WAAUC,KAAI;AAsChC,IAAM,iBAOF;AAAA;AAAA,EAEF,+BAA+B;AAAA,IAC7B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA;AAAA,EAEA,iCAAiC;AAAA,IAC/B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,oCAAoC;AAAA,IAClC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA;AAAA,EAEA,oCAAoC;AAAA,IAClC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA;AAAA,EAEA,8BAA8B;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,6BAA6B;AAAA,IAC3B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,wCAAwC;AAAA,IACtC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAOA,eAAsB,kBAAkB,SAEZ;AAC1B,QAAM,EAAE,YAAY,IAAI;AAGxB,QAAM,aAAa,MAAM,sBAAsB,WAAW;AAG1D,QAAM,WAAW,oBAAI,IAA6B;AAElD,aAAW,EAAE,OAAO,KAAK,YAAY;AACnC,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,eAAe,MAAM;AACrC,QAAI,CAAC,QAAS;AAEd,UAAM,WAAW,SAAS,IAAI,MAAM;AACpC,QAAI,UAAU;AACZ,eAAS;AAAA,IACX,OAAO;AACL,eAAS,IAAI,QAAQ;AAAA,QACnB;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,OAAO;AAAA,QACP,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACpD,UAAM,aAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,WAAW,QAAQ,EAAE,KAAK,IAAI,WAAW,QAAQ,EAAE,KAAK;AAAA,EACjE,CAAC;AAED,QAAM,kBAAkB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAEnE,QAAM,eAA+C;AAAA,IACnD,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,aAAW,SAAS,SAAS;AAC3B,iBAAa,MAAM,KAAK,KAAK,MAAM;AAAA,EACrC;AAGA,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,SAAS,iBAAiB,aAAa;AAC5D;AAUA,eAAe,sBACb,aAC0B;AAC1B,QAAM,aAA8B,CAAC;AAErC,MAAI;AAEF,UAAM,EAAE,OAAO,IAAI,MAAMF;AAAA,MACvB;AAAA,MACA,EAAE,KAAK,aAAa,SAAS,KAAQ,WAAW,KAAK,OAAO,KAAK;AAAA,IACnE;AAEA,QAAI,OAAO,KAAK,GAAG;AACjB,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,MAAM;AAQjC,mBAAW,UAAU,SAAS;AAC5B,qBAAW,OAAO,OAAO,UAAU;AACjC,uBAAW,KAAK;AAAA,cACd,QAAQ,IAAI;AAAA,cACZ,MAAW,gBAAS,aAAa,OAAO,QAAQ;AAAA,cAChD,MAAM,IAAI;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,QAAQ;AACN,eAAO,MAAM,oCAAoC;AAAA,MACnD;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,MAAM,8DAAyD;AAAA,EACxE;AAEA,SAAO;AACT;AAIA,eAAe,sBACb,aACA,SACA,iBACA,cACiB;AACjB,QAAM,YAAiB,YAAK,aAAa,aAAa;AACtD,QAAM,UAAU,SAAS;AACzB,QAAM,WAAgB,YAAK,WAAW,oBAAoB;AAE1D,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAElE,QAAM,SAID;AAAA,IACH;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,UAAU;AAAA;AAAA,8BAEN,GAAG;AAAA,8BACH,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvB,aAAWG,MAAK,QAAQ;AACtB,UAAM,QAAQ,aAAaA,GAAE,KAAK;AAClC,UAAM,OACJA,GAAE,UAAU,iBACR,UACAA,GAAE,UAAU,eAAeA,GAAE,UAAU,qBACvC,uBACAA,GAAE,UAAU,qBACZ,oBACAA,GAAE,UAAU,YACZ,iBACA;AACN,eAAW,KAAKA,GAAE,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA;AAAA,EAC9C;AAEA,aAAW;AAEX,aAAWA,MAAK,QAAQ;AACtB,UAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAUA,GAAE,KAAK;AAC9D,eAAW,MAAMA,GAAE,KAAK;AAAA;AAAA,EAAOA,GAAE,WAAW;AAAA;AAAA;AAE5C,QAAI,aAAa,SAAS,GAAG;AAC3B,iBAAW;AACX,iBAAW,KAAK,cAAc;AAC5B,mBAAW,OAAO,EAAE,MAAM,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM;AAAA;AAAA,MACzD;AAAA,IACF,OAAO;AACL,iBAAW;AAAA,IACb;AACA,eAAW;AAAA,EACb;AAEA,aAAW;AAAA;AAAA;AAAA;AAEX,QAAS,eAAU,UAAU,SAAS,OAAO;AAC7C,SAAO;AACT;;;AD7TO,IAAM,kBAAkB,IAAIC,SAAQ,UAAU,EAClD,YAAY,mGAAiD,EAC7D,OAAO,YAAY;AAClB,QAAM,cAAc,QAAQ,IAAI;AAChC,SAAO,KAAK,4BAA4B;AAExC,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB,EAAE,YAAY,CAAC;AAEtD,WAAO,KAAK;AAAA,oDAAoB,OAAO,QAAQ,EAAE;AACjD,WAAO,KAAK,6BAAS,OAAO,eAAe,EAAE;AAC7C,WAAO,KAAK,EAAE;AAEd,UAAM,SAAS;AAAA,MACb,EAAE,KAAK,gBAAyB,OAAO,kBAAQ;AAAA,MAC/C,EAAE,KAAK,aAAsB,OAAO,kBAAQ;AAAA,MAC5C,EAAE,KAAK,oBAA6B,OAAO,kBAAQ;AAAA,MACnD,EAAE,KAAK,oBAA6B,OAAO,wBAAS;AAAA,MACpD,EAAE,KAAK,aAAsB,OAAO,kBAAQ;AAAA,MAC5C,EAAE,KAAK,WAAoB,OAAO,eAAK;AAAA,IACzC;AAEA,eAAWC,MAAK,QAAQ;AACtB,YAAM,QAAQ,OAAO,aAAaA,GAAE,GAAG;AACvC,UAAI,QAAQ,GAAG;AACb,eAAO,KAAK,KAAKA,GAAE,KAAK,KAAK,KAAK,aAAa;AAAA,MACjD;AAAA,IACF;AAEA,WAAO,KAAK,yDAAqC;AAAA,EACnD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACtE;AACA,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AExCH,SAAS,WAAAC,gBAAe;AAIjB,IAAM,eAAe,IAAIC,SAAQ,OAAO,EAC5C,YAAY,iGAAgC,EAC5C,OAAO,mBAAmB,uEAA+B,EACzD,OAAO,WAAW,mEAA2B,EAC7C,OAAO,kBAAkB,0BAAgB,EACzC;AAAA,EACC,OAAO,SAID;AACJ,UAAM,cAAc,QAAQ,IAAI;AAChC,WAAO,KAAK,yBAAyB;AAErC,QAAI;AACF,YAAM,SAAS,MAAM,eAAe;AAAA,QAClC;AAAA,QACA,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,MACpB,CAAC;AAED,aAAO,KAAK;AAAA,4BAAW,OAAO,UAAU,EAAE;AAC1C,aAAO,KAAK,6BAAS,OAAO,YAAY,KAAK,aAAa;AAC1D,aAAO,KAAK,6BAAS,OAAO,aAAa,KAAK,aAAa;AAC3D,aAAO;AAAA,QACL,wBAAS,OAAO,cAAc,KAC5B,OAAO,YAAY,QAAQ,IACvB,KAAK;AAAA,UACF,OAAO,iBAAiB,OAAO,YAAY,QAAS;AAAA,QACvD,IACA,CACN;AAAA,MACF;AAEA,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,eAAO,KAAK,6BAAS;AACrB,mBAAW,KAAK,OAAO,QAAQ;AAC7B,iBAAO;AAAA,YACL,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,WAAM,EAAE,KAAK,KAAK,EAAE,UAAU;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,gBAAgB;AACzB,eAAO,KAAK,0EAA4C;AAAA,MAC1D;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACnE;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AC1DF,SAAS,WAAAC,iBAAe;;;ACKxB,YAAYC,YAAU;AACtB,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAAC,kBAAiB;AAI1B,IAAMC,aAAYD,WAAUD,KAAI;AAmChC,eAAsB,iBACpB,SACwB;AACxB,QAAM,EAAE,aAAa,eAAe,EAAE,IAAI;AAG1C,QAAM,WAAW,oBAAI,IAAuD;AAE5E,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAME;AAAA,MACvB;AAAA,MACA,EAAE,KAAK,aAAa,SAAS,KAAQ,WAAW,KAAK,OAAO,KAAK;AAAA,IACnE;AAEA,QAAI,OAAO,KAAK,GAAG;AACjB,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,MAAM;AAQjC,mBAAW,UAAU,SAAS;AAC5B,qBAAW,OAAO,OAAO,UAAU;AACjC,gBAAI,IAAI,WAAW,8BAA+B;AAGlD,kBAAM,aAAa,IAAI,QAAQ,MAAM,mBAAmB;AACxD,gBAAI,CAAC,WAAY;AACjB,kBAAM,QAAQC,cAAa,WAAW,CAAC,CAAC;AACxC,kBAAM,UAAe,gBAAS,aAAa,OAAO,QAAQ;AAE1D,kBAAM,QAAQ,SAAS,IAAI,KAAK,KAAK;AAAA,cACnC,WAAW;AAAA,cACX,OAAO,oBAAI,IAAY;AAAA,YACzB;AACA,kBAAM;AACN,kBAAM,MAAM,IAAI,OAAO;AACvB,qBAAS,IAAI,OAAO,KAAK;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,oBAAoB,SAAS;AACnC,QAAM,aAA+B,CAAC;AACtC,MAAI,iBAAiB;AAErB,aAAW,CAAC,OAAO,KAAK,KAAK,UAAU;AACrC,QAAI,MAAM,aAAa,cAAc;AACnC,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,OAAO,CAAC,GAAG,MAAM,KAAK;AAAA,QACtB,eAAe,iBAAiB,OAAO,MAAM,KAAK;AAAA,MACpD,CAAC;AAAA,IACH,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAEnD,SAAO,EAAE,YAAY,mBAAmB,eAAe;AACzD;AAIA,SAASA,cAAa,KAAqB;AACzC,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE,YAAY;AAC3C,MAAI,EAAE,WAAW,GAAG;AAClB,WAAO,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EACpD;AACA,SAAO,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1B;AAMA,SAAS,iBAAiB,OAAe,OAAiC;AACxE,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAE5B,UAAM,UAAU,MAAM,UAAU,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI;AAC9D,QAAI,SAAS;AACX,gBAAU,IAAI,UAAU,UAAU,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,SAAS;AACb,MAAI,WAAW;AACf,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW;AACpC,QAAI,QAAQ,UAAU;AACpB,eAAS;AACT,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,QAAM,QAAQ,OACX,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE;AACnB,SAAO,WAAW,KAAK;AACzB;;;AD5JO,IAAM,iBAAiB,IAAIC,UAAQ,SAAS,EAChD,YAAY,oHAA0B,EACtC,OAAO,uBAAuB,kEAAgB,GAAG,EACjD,OAAO,OAAO,SAAoC;AACjD,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,eAAe,SAAS,KAAK,gBAAgB,KAAK,EAAE,KAAK;AAC/D,SAAO,KAAK,2BAA2B;AAEvC,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB,EAAE,aAAa,aAAa,CAAC;AAEnE,WAAO,KAAK;AAAA,4BAAW,OAAO,iBAAiB,iCAAQ;AACvD,WAAO,KAAK,6BAAS,OAAO,cAAc,SAAI;AAC9C,WAAO,KAAK,mCAAe,OAAO,WAAW,MAAM;AAAA,CAAM;AAEzD,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,aAAO,KAAK,uCAAc;AAC1B,aAAO,KAAK,EAAE;AACd,iBAAW,KAAK,OAAO,WAAW,MAAM,GAAG,EAAE,GAAG;AAC9C,eAAO;AAAA,UACL,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,oBAAU,EAAE,aAAa;AAAA,QAClE;AACA,eAAO;AAAA,UACL,GAAG,GAAG,OAAO,EAAE,CAAC,uBAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GACzD,EAAE,MAAM,SAAS,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC,KAAK,EACnD;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,WAAW,SAAS,IAAI;AACjC,eAAO,KAAK;AAAA,2BAAe,OAAO,WAAW,SAAS,EAAE,SAAI;AAAA,MAC9D;AACA,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,KAAK,+GAA0B;AAAA,IACxC;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,mBAAmB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACrE;AACA,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AE5CH,SAAS,WAAAC,iBAAe;;;ACMxB,YAAYC,YAAU;AAiCtB,eAAsB,cACpB,aAC8B;AAE9B,QAAM,eAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,MAAM,eAAe,YAAY;AAC7C,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,QAAQ,cAAc;AAAA,EACjC;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,KAAK,MAAM,GAAG;AAAA,EAC3B,QAAQ;AACN,WAAO,KAAK,qCAAqC;AACjD,WAAO,EAAE,QAAQ,cAAc;AAAA,EACjC;AAGA,QAAM,eAAe,MAAM,2BAA2B,WAAW;AAEjE,QAAM,eAAe,OAAO,OAAO,YAAY,EAAE;AAAA,IAC/C,CAAC,KAAK,MAAM,MAAM;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,aAAgD,CAAC;AAEvD,aAAW,CAAC,MAAM,aAAa,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AAClE,UAAM,eAAe,aAAa,IAAI,KAAK;AAC3C,QAAI,eAAe,eAAe;AAChC,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU,eAAe;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC/D,QAAI,EAAE,QAAQ,SAAS,UAAU,eAAe,GAAG;AACjD,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,eAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,eAAe,SAAS;AAAA,EAC1B;AACF;;;AD1GO,IAAM,uBAAuB,IAAIC,UAAQ,gBAAgB,EAC7D,YAAY,0GAAoC,EAChD,OAAO,YAAY;AAClB,QAAM,cAAc,QAAQ,IAAI;AAEhC,MAAI;AACF,UAAM,SAAS,MAAM,cAAc,WAAW;AAE9C,QAAI,OAAO,WAAW,eAAe;AACnC,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,QAAQ;AAC5B,aAAO;AAAA,QACL,iCAA4B,OAAO,YAAY,IAAI,OAAO,aAAa;AAAA,MACzE;AACA;AAAA,IACF;AAGA,UAAM,aAAa,OAAO,cAAc,CAAC;AACzC,WAAO;AAAA,MACL,uCAA6B,WAAW,MAAM;AAAA,IAChD;AACA,eAAW,KAAK,YAAY;AAC1B,aAAO;AAAA,QACL,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAAA,MAC3D;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,WAAc,OAAO,YAAY,eAAe,OAAO,aAAa;AAAA,IACtE;AACA,YAAQ,WAAW;AAAA,EACrB,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,0BACE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,IACF;AACA,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ArC1CI,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,aAAa;AACtC,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,mBAAmB;AAC5C,cAAc,WAAW,gBAAgB;AACzC,cAAc,WAAW,YAAY;AACrC,cAAc,WAAW,cAAc;AACvC,cAAc,WAAW,eAAe;AACxC,cAAc,WAAW,YAAY;AACrC,cAAc,WAAW,cAAc;AACvC,cAAc,WAAW,oBAAoB;;;AuC3B7C,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,iBAAe;AACxB,YAAYC,cAAa;;;ACQlB,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,UAAU,sBAAsB;AAC1C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACXO,SAAS,aAAa,OAA2B;AACtD,QAAM,QAAQ,MACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACjC,OAAO,OAAO;AACjB,QAAM,SAAqB,CAAC;AAC5B,aAAWC,MAAK,OAAO;AACrB,QAAIA,OAAM,WAAWA,OAAM,UAAU;AACnC,UAAI,CAAC,OAAO,SAASA,EAAC,EAAG,QAAO,KAAKA,EAAC;AAAA,IACxC,OAAO;AACL,YAAM,IAAI;AAAA,QACR,iBAAiBA,EAAC,uBAAuB,cAAc,KAAK,IAAI,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAA4B;AACrD,QAAM,KAAK,SAAS,WAAW,YAAY;AAC3C,MAAI,MAAM,aAAa,MAAM,SAAU,QAAO;AAC9C,QAAM,IAAI,MAAM,qBAAqB,KAAK,+BAA+B;AAC3E;;;AFJO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC,OAAO,gBAAgB,4EAA+B,EACtD,OAAO,mBAAmB,kDAA8B,EACxD,OAAO,aAAa,8DAAY,EAChC,OAAO,OAAO,SAAsB;AACnC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,IAAI,eAAe;AAE/B,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,oBAAoB,EAAE,KAAK,CAAC;AAI1D,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,WAAW;AACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,qCAAqC,KAAK;AAAA,QACxC;AAAA,MACF,CAAC,aAAa,KAAK;AAAA,IACrB;AACA,WAAO,MAAM,iBAAiB,WAAW,EAAE;AAE3C,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI;AAAA,IACX,CAAC;AAED,QAAI,OAAO,WAAW,uBAAuB;AAC3C,aAAO;AAAA,QACL;AAAA,MAEF;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,uBAAuB,OAAO,UAAU,WAAW;AAClE,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,QAAI,OAAO,oBAAoB,SAAS,GAAG;AACzC,aAAO;AAAA,QACL,oBAAoB,OAAO,oBAAoB,KAAK,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,KAAK,cAAc,OAAO,SAAS,EAAE;AAC5C,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,gBAAgB;AACjC,aAAO,KAAK,sCAAkB;AAC9B;AAAA,IACF;AACA,WAAO,MAAM,0BAA0B,gBAAgB,GAAG,CAAC,EAAE;AAC7D,WAAO,MAAM,eAAe,QAAQ,IAAI,SAAS,KAAK,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,eAAe,oBAAoB,MAEkB;AACnD,QAAM,EAAE,KAAK,IAAI;AAKjB,QAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AAGjD,MAAI,KAAK,OAAO,KAAK,OAAO,CAAC,eAAe;AAC1C,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,eAAe;AAAA,EAC3B;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,eAAe;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,SAAuB,OAAO,SAAuB;AACtE;;;AG3JA,SAAS,WAAAC,iBAAe;AACxB,YAAYC,cAAa;AAqBlB,IAAM,aAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,cAAc,iEAAoB,EAC3C,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;AAE/B,UAAM,EAAE,MAAM,MAAM,IAAI,MAAMC,qBAAoB;AAAA,MAChD;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAGD,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;AACrD,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,kBAAkB,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK;AAAA,QAChD;AAAA,MACF,CAAC,aAAa,KAAK;AAAA,IACrB;AACA,WAAO,MAAM,iBAAiB,WAAW,EAAE;AAE3C,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI;AAAA,MACT;AAAA,IACF,CAAC;AAED,UAAM,WAAW,OAAO,cAAc,SAAS;AAC/C,UAAM,aAAa,OAAO,gBAAgB,SAAS;AACnD,UAAM,iBAAiB,OAAO,oBAAoB,SAAS;AAG3D,QAAI,CAAC,UAAU;AACb,UAAI,gBAAgB;AAClB,eAAO;AAAA,UACL,qEAAc,OAAO,oBAAoB,KAAK,IAAI,CAAC;AAAA,QACrD;AAAA,MACF;AACA,UAAI,YAAY;AACd,YAAI,gBAAgB;AAClB,iBAAO,KAAK,6CAAU,OAAO,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,QAC3D,OAAO;AACL,iBAAO;AAAA,YACL,yDAAY,OAAO,gBAAgB;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAGA,WAAO,QAAQ,iBAAiB,OAAO,UAAU,WAAW;AAC5D,WAAO,KAAK,cAAc,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE;AAClD,WAAO,KAAK,cAAc,OAAO,KAAK,EAAE;AACxC,WAAO,KAAK,cAAc,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3D,QAAI,YAAY;AACd,aAAO;AAAA,QACL,cAAc,OAAO,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AACA,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL,oBAAoB,OAAO,oBAAoB,KAAK,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,KAAK,cAAc,OAAO,SAAS,EAAE;AAC5C,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,gBAAgB;AACjC,aAAO,KAAK,qCAAiB;AAC7B;AAAA,IACF;AACA,WAAO,MAAM,yBAAyB,gBAAgB,GAAG,CAAC,EAAE;AAC5D,WAAO,MAAM,eAAe,QAAQ,IAAI,SAAS,KAAK,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,eAAeA,qBAAoB,MAGkB;AACnD,QAAM,EAAE,MAAM,YAAY,IAAI;AAG9B,MAAI,CAAC,KAAK,OAAO,CAAC,KAAK,SAAS,CAAC,KAAK,KAAK;AACzC,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,eAAe;AAAA,EAC3B;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,eAAe;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,SAAuB,OAAO,SAAuB;AACtE;;;AC7LA,SAAS,WAAAC,iBAAe;AAYxB,IAAM,iBAAiB;AAMhB,IAAMC,eAAc,IAAIC,UAAQ,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,CAACC,OAAMA,GAAE,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;AAAA,UACL;AAAA,QACF;AACA;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,+DAA0D,EAAE,EAAE;AAClE,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,mBAAmB,gBAAgB,GAAG,CAAC,EAAE;AACtD,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;;;ACvIA,SAAS,WAAAC,iBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACiB9B,IAAMC,0BAAyB;AAC/B,IAAMC,gBAAe;AAyErB,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,aAAa,OAAO,gBAAgB,OAAO,IAAI;AACvD,QAAM,cAAc,QAAQ,eAAeD;AAE3C,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAM,YAAY,QAAQ,UAAU;AACpC,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC/B;AAEA,QAAM,OAAQ,UAAU,QAAQ,CAAC,SAAS,QAAQ;AAClD,QAAM,QAAS,UAAU,SAAS;AAElC,QAAM,eAAe,MAAM,eAAe,WAAW;AACrD,MAAI,CAAC,gBAAgB,OAAO,KAAK,aAAa,MAAM,EAAE,WAAW,GAAG;AAClE,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC/B;AAEA,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM,eAAe,WAAW;AACxE,QAAM,eAAe,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAGlE,QAAM,UAAU,OAAO,KAAK,aAAa,MAAM;AAC/C,QAAM,eAAe,iBAAiB,IAAI,IAAI,cAAc,IAAI;AAChE,MAAI,cAAc;AAChB,UAAM,UAAU,eAAgB;AAAA,MAC9B,CAAC,MAAM,CAAC,QAAQ,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC;AAAA,IACpD;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI;AAAA,QACR,wBAAwB,QAAQ;AAAA,UAC9B;AAAA,QACF,CAAC,4BAA4B,QAAQ,KAAK,IAAI,KAAK,QAAQ;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,kBAA4B,CAAC;AACnC,aAAW,MAAM,SAAS;AACxB,QAAI,gBAAgB,CAAC,aAAa,IAAI,EAAE,EAAG;AAC3C,UAAME,SAAQ,aAAa,IAAI,EAAE;AACjC,QAAI,CAACA,QAAO;AAGV,aAAO;AAAA,QACL,aAAa,EAAE,6DAA6D,EAAE;AAAA,MAChF;AACA,sBAAgB,KAAK,EAAE;AACvB;AAAA,IACF;AACA,UAAM,iBAAiBA,OAAM,SAAS;AACtC,QAAI,mBAAmB,OAAO;AAC5B,aAAO;AAAA,QACL,aAAa,EAAE,YAAY,cAAc,gCAAgC,KAAK;AAAA,MAChF;AACA,sBAAgB,KAAK,EAAE;AACvB;AAAA,IACF;AACA,cAAU,KAAK,EAAE;AAAA,EACnB;AAGA,QAAM,UAAU,UAAU,MAAM,CAAC,OAAO;AACtC,UAAM,UAAU,aAAa,OAAO,EAAE,EAAG;AACzC,UAAM,SAAS,aAAa,IAAI,EAAE,EAAG;AACrC,WAAO,YAAY;AAAA,EACrB,CAAC;AACD,MAAI,UAAU,SAAS,KAAK,WAAW,CAAC,QAAQ;AAC9C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,UAAM,OAAyB,UAAU,IAAI,CAAC,OAAO;AACnD,YAAM,UAAU,aAAa,OAAO,EAAE,EAAG;AACzC,YAAMA,SAAQ,aAAa,IAAI,EAAE;AACjC,YAAM,cAAc,YAAYA,OAAM;AACtC,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,MAAMA,OAAM;AAAA,QACZ,UAAUA,OAAM,kBAAkB;AAAA,QAClC,QAAQ,cAAc,eAAe;AAAA,MACvC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,gBAAgB,UAAU;AAAA,MAC1B,kBAAkB,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,MACA,iBAAiB,CAAC;AAAA,MAClB;AAAA,MACA,SAAS,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE;AAAA,MAC9D,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAGD,SAAQ,SAAS,SAAS;AAAA,IACxB,GAAG;AAAA,IACH,SAAS,SAAS;AAAA,EACpB;AACA,QAAM,mBAAmB,aAAa,MAAO;AAG7C,QAAM,oBAAqB,MAAM,sBAAsB,WAAW,KAAM;AAAA,IACtE,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,MAAM,kBAAkB,UAAU;AAAA,IACtC,CAACC,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAG3C,QAAM,QAAQ,OAAO,IAAI,kBAAkB,UAAU,GAAG,EAAG,YAAY,CAAC;AACxE,QAAM,YAAY,IAAI,IAAI,SAAS;AACnC,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM;AACpC,UAAM,UAAU,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;AACjC,WAAO,UAAU,CAAC,UAAU,IAAI,OAAO,IAAI;AAAA,EAC7C,CAAC;AACD,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT,SAASF;AAAA,IACT,SAAS,SAAS;AAAA,IAClB;AAAA,IACA,WAAW,CAAC,GAAG,WAAW,GAAG,OAAO,SAAS;AAAA,EAC/C;AACA,MAAI,OAAO,EAAG,mBAAkB,UAAU,GAAG,IAAI;AAAA,MAC5C,mBAAkB,UAAU,KAAK,KAAK;AAC3C,QAAM,uBAAuB,aAAa,iBAAiB;AAG3D,QAAM,OAAmB;AAAA,IACvB,eAAe;AAAA,IACf,QAAQ,EAAE,GAAG,aAAa,OAAO;AAAA,EACnC;AACA,aAAW,MAAM,WAAW;AAC1B,UAAM,WAAW,aAAa,IAAI,EAAE;AACpC,QAAI,CAAC,SAAU;AACf,UAAM,aAAa,SAAS,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC/D,SAAK,OAAO,EAAE,IAAI;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,aAAa,IAAI;AAEvC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAAS,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,EACpB;AACF;;;ADzQA,IAAMG,WAAUC,eAAc,YAAY,GAAG;AAC7C,IAAMC,kBAAiB;AAOhB,IAAMC,iBAAgB,IAAIC,UAAQ,QAAQ,EAC9C;AAAA,EACC;AACF,EACC,SAAS,cAAc,uHAA6B,EACpD,OAAO,aAAa,kDAAU,EAC9B;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,OAAiB,SAAwB;AACtD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,IAAI,eAAe;AAC/B,UAAM,cAAc,kBAAkB,KAAK,KAAK,KAAK;AACrD,QAAI,gBAAgB,KAAK;AACvB,aAAO,KAAK,kCAAkC,WAAW,EAAE;AAAA,IAC7D;AAGA,UAAM,mBAAmB;AAEzB,UAAM,SAAS,MAAM,gBAAgB;AAAA,MACnC;AAAA,MACA,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,MAClC,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AACH,eAAO;AAAA,UACL;AAAA,QACF;AACA,gBAAQ,WAAW;AACnB;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,uCAAuC,OAAO,OAAO;AAAA,QACvD;AACA,eAAO;AAAA,UACL,cAAc,OAAO,gBAAgB,KAAK,IAAI,KAAK,QAAQ;AAAA,QAC7D;AACA;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,SAAS,OAAO,cAAc,WAAM,OAAO,gBAAgB;AAAA,QAC7D;AACA,YAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,iBAAO,KAAK,yBAAyB;AAAA,QACvC,OAAO;AACL,qBAAW,QAAQ,OAAO,MAAM;AAC9B,mBAAO,KAAK,eAAe,IAAI,CAAC;AAAA,UAClC;AAAA,QACF;AACA,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,oCAAoC;AAChD;AAAA,MAEF,KAAK,WAAW;AACd,cAAM,EAAE,QAAQ,IAAI;AACpB,eAAO;AAAA,UACL,sBAAsB,OAAO,OAAO,KAAK,OAAO,gBAAgB,MAAM;AAAA,QACxE;AACA,YAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,iBAAO,KAAK,cAAc,OAAO,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/D;AACA,YAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,iBAAO;AAAA,YACL,cAAc,OAAO,gBAAgB;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,eAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,eAAO,KAAK,kBAAkB,QAAQ,WAAW,EAAE;AACnD,eAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,eAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA4B,gBAAgB,GAAG,CAAC,EAAE;AAC/D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAWI,SAAS,kBACd,KACA,WACQ;AACR,MAAI,cAAc,QAAW;AAC3B,WAAO,6BAA6B,GAAG;AAAA,EACzC;AACA,QAAM,QAAQ,WAAW,SAAS;AAClC,MAAI,UAAU,UAAU;AACtB,UAAM,aAAa,kBAAkB;AACrC,QAAI,CAAC,mBAAmB,UAAU,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,iCAAiC,UAAU;AAAA,MAE7C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,mBAAmB,GAAG,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAA8B;AACpD,QAAM,MACJ,KAAK,WAAW,eACZ,QACA,KAAK,aAAa,WAClB,cACA,KAAK,aAAa,YAClB,cACA;AACN,QAAM,MACJ,KAAK,WAAW,eACZ,IAAI,KAAK,OAAO,iBAChB,IAAI,KAAK,OAAO,YAAO,KAAK,IAAI,KAAK,KAAK,QAAQ;AACxD,SAAO,GAAG,GAAG,GAAG,KAAK,EAAE,KAAK,GAAG;AACjC;AAEA,eAAe,qBAAoC;AACjD,MAAI;AAIJ,MAAI;AACF,UAAM,MAAMJ,SAAQ,iBAAiB;AACrC,iBAAa,IAAI;AAAA,EACnB,QAAQ;AAAA,EAER;AACA,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,eAAeE,eAAc;AACxD,QAAI,YAAY;AACd,aAAO;AAAA,QACL,mBAAmB,UAAU,yBAAsB,SAAS,OAAO;AAAA,MACrE;AAAA,IACF,OAAO;AACL,aAAO,KAAK,mBAAmB,SAAS,OAAO,EAAE;AAAA,IACnD;AAAA,EACF,QAAQ;AAAA,EAER;AACF;;;AE9LA,SAAS,WAAAG,iBAAe;AACxB,YAAYC,cAAa;AACzB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AAqBpB,IAAMC,kBAAiB;AAMhB,IAAMC,oBAAmB,IAAIC,UAAQ,WAAW,EACpD;AAAA,EACC;AACF,EACC,SAAS,YAAY,yHAAoC,EACzD,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,CAACC,OAAMA,GAAE,YAAYH;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,wBAAwB,gBAAgB,GAAG,CAAC,EAAE;AAC3D,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,UAAMI,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,KAAK,oBAAoB,UAAU,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,EACvE;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,CAACD,OAAMA,GAAE,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,UAAMI,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,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,IAChE;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,QAAQ,WAAW,QAAQ,MAAM,cAAc,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC1E,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,IAClB,KAAK,OAAO,CAAC,MAAqB,MAAM,WAAW,MAAM,QAAQ,IACjE,CAAC,GAAG,aAAa;AAEvB,QAAM,cAA0B,UAAU,WAAW,WAAW;AAEhE,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,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,MAChE;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;;;ACvXA,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,UAAUC,IAA6B;AACpD,MAAI;AACF,UAAMC,QAAO,MAAS,UAAKD,EAAC;AAC5B,WAAOC,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,CAACD,OAAMA,GAAE,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;;;ADlLO,IAAM,cAAc,IAAIE,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,mBAAmB,8EAAsC,EAChE,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,MAAM,aAAa,KAAK,GAAG,IAAI;AACjD,UAAM,QAAQ,KAAK,QAAQ,WAAW,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,0BAA0B,gBAAgB,GAAG,CAAC,EAAE;AAC7D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AEvEH,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,WAAUE,IAA6B;AACpD,MAAI;AACF,UAAMC,QAAO,MAAS,UAAKD,EAAC;AAC5B,WAAOC,MAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADjIO,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,yBAAyB,gBAAgB,GAAG,CAAC,EAAE;AAC5D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AXxCI,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAWC,YAAW;AACpC,cAAc,WAAW,UAAU;AACnC,cAAc,WAAWC,YAAW;AACpC,cAAc,WAAWC,cAAa;AACtC,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,aAAa;AACtC,cAAc,WAAWC,iBAAgB;;;AanBzC,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,QAAQ;AAAA,EACR,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,QAAQ,QAAQ,SAAS,UAAU,mBAAmB;AAAA,IACtD,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,WAAW;AACnB;AAAA,IACF;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,6CAA6C;AAAA,EAC3D,SAAS,KAAK;AACZ,QAAI,eAAe,gBAAgB;AACjC,aAAO,KAAK,kCAAc;AAC1B;AAAA,IACF;AACA,WAAO,MAAM,4BAA4B,gBAAgB,GAAG,CAAC,EAAE;AAC/D,WAAO,MAAM,eAAe,QAAQ,IAAI,SAAS,KAAK,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AASH,eAAe,cAAc,MAA4C;AAIvE,QAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AACjD,MAAI,KAAK,OAAO,CAAC,eAAe;AAC9B,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,QAAQ,mBAAmB;AAAA,QAC3B,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,eAAe;AAE3D,QAAM,QAAQ,MAAc,cAAK;AAAA,IAC/B,SAAS;AAAA,IACT,cAAc,KAAK,SAAS,mBAAmB;AAAA,EACjD,CAAC;AACD,MAAY,kBAAS,KAAK,EAAG,OAAM,IAAI,eAAe;AAEtD,QAAM,QAAQ,MAAc,cAAK;AAAA,IAC/B,SAAS;AAAA,IACT,cAAc,KAAK,SAAS,mBAAmB;AAAA,EACjD,CAAC;AACD,MAAY,kBAAS,KAAK,EAAG,OAAM,IAAI,eAAe;AAEtD,QAAM,MAAM,MAAc,cAAK;AAAA,IAC7B,SAAS;AAAA,IACT,cAAc,KAAK,OAAO,mBAAmB;AAAA,EAC/C,CAAC;AACD,MAAY,kBAAS,GAAG,EAAG,OAAM,IAAI,eAAe;AAEpD,QAAM,cAAc,MAAc,cAAK;AAAA,IACrC,SAAS;AAAA,IACT,cAAc,KAAK,eAAe;AAAA,EACpC,CAAC;AACD,MAAY,kBAAS,WAAW,EAAG,OAAM,IAAI,eAAe;AAE5D,QAAM,SAAS,MAAc,iBAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAY,kBAAS,MAAM,EAAG,OAAM,IAAI,eAAe;AAEvD,QAAM,SAAS,MAAc,iBAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAY,kBAAS,MAAM,EAAG,OAAM,IAAI,eAAe;AAEvD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,mBAAmB;AAAA,MAC7B,QAAQ,mBAAmB;AAAA,MAC3B,WAAW,mBAAmB;AAAA,IAChC;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;;;AE/KA,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;AAAA,EACL,QAAQ;AACV;AAcO,SAAS,eACd,QACA,SACA,MACQ;AACR,QAAM,gBAAgB,MAAM,YAAY;AACxC,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;AAC1C,YAAM,eAAe,gBAAgB,gBAAgB,IAAI,IAAK,QAAQ;AACtE,aAAO,GAAGA,MAAK,GAAG,UAAU,GAAG,YAAY,GAAGA,MAAK;AAAA,IACrD;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;;;AD3BA,eAAsB,iBACpB,SAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,UAAU;AAAA,EACZ,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,SAAS,EAAE,QAAQ,CAAC;AAM5D,UAAI,QAAQ;AACV,cAAM,WAAW,WAAW,WAAW;AAAA,MACzC;AACA,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,EACF;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;;;AE9IA,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,CAACC,OAAMA,GAAE,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;;;AChKA,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AAkBpB,IAAMC,sBAAqB;AA4F3B,eAAsB,WACpB,SAC2B;AAC3B,QAAM,EAAE,aAAa,SAAS,MAAM,IAAI;AACxC,QAAM,cAAc,QAAQ,eAAeA;AAE3C,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;AAC9D,QAAM,UAAU,MAAM;AAEtB,QAAM,UAA2B,CAAC;AAClC,QAAM,UAA2B,CAAC;AAClC,QAAM,QAAyB,CAAC;AAChC,QAAM,QAAyB,CAAC;AAChC,QAAM,QAAyB,CAAC;AAKhC,QAAM,YAAY,oBAAI,IAAqB;AAC3C,aAAW,KAAK,SAAS,qBAAqB,CAAC,EAAG,WAAU,IAAI,EAAE,IAAI,CAAC;AACvE,aAAW,KAAK,SAAS,QAAS,WAAU,IAAI,EAAE,IAAI,CAAC;AAGvD,QAAM,aAGD;AAAA,IACH,EAAE,KAAU,YAAK,aAAa,QAAQ,UAAU,GAAG,QAAQ,aAAa;AAAA,IACxE,EAAE,KAAU,YAAK,aAAa,QAAQ,KAAK,GAAG,QAAQ,QAAQ;AAAA,IAC9D,EAAE,KAAU,YAAK,aAAa,QAAQ,KAAK,GAAG,QAAQ,QAAQ;AAAA,IAC9D,EAAE,KAAU,YAAK,aAAa,QAAQ,QAAQ,GAAG,QAAQ,aAAa;AAAA,EACxE;AAEA,MAAI,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAChD,eAAW,KAAK;AAAA,MACd,KAAU,YAAK,aAAa,QAAQ,GAAG;AAAA,MACvC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,MAAM,gBAAgB,KAAK,GAAG;AAC5C,eAAW,OAAO,OAAO;AACvB,YAAMC,OAAM,WAAW,aAAa,GAAG;AACvC,YAAM,UAAU,MAAS,cAAS,KAAK,OAAO;AAC9C,YAAM,WAAW,aAAa,KAAK,OAAO;AAC1C,YAAM,KAAK,aAAa,GAAG;AAM3B,UAAI,aAAa,QAAQ;AACvB,cAAM,KAAK,EAAE,KAAAA,MAAK,UAAU,QAAQ,KAAK,QAAQ,oBAAoB,CAAC;AACtE;AAAA,MACF;AACA,UAAI,aAAa,UAAU,KAAK,WAAW,SAAS;AAClD,cAAM,KAAK;AAAA,UACT,KAAAA;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AACA,UAAI,aAAa,UAAU,KAAK,WAAW,SAAS;AAClD,cAAM,KAAK;AAAA,UACT,KAAAA;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,UAAU,IAAI,EAAE,IAAI;AACvC,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK;AAAA,UACX,KAAAA;AAAA,UACA,UAAU,aAAa,YAAY,cAAc;AAAA,UACjD,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAKA,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,MAAM,CAAC,QAAQ;AACf,eAAO;AAAA,UACL,+BAA+B,MAAM,EAAE,KAAM,IAAc,OAAO;AAAA,QACpE;AACA,eAAO;AAAA,MACT,CAAC;AACD,YAAM,UACJ,aAAa,OACT,aACA,UAAU,QAAQ,MAAM,UAAU,OAAO,IACzC,eACA;AAEN,cAAQ,KAAK;AAAA,QACX,IAAI,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,KAAAA;AAAA,QACA,UAAU,aAAa,YAAY,cAAc;AAAA,QACjD,eAAe;AAAA,QACf,MAAM,YAAY,OAAO;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,QAAQ,SAAS,GAAG;AACjC,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,eAAe,gBAAgB,KAAgC;AAC7D,QAAM,MAAgB,CAAC;AACvB,QAAM,QAAkB,CAAC,GAAG;AAC5B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI;AACJ,QAAI;AACF,gBAAU,MAAS,aAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU;AACtD,YAAM;AAAA,IACR;AACA,eAAW,KAAK,SAAS;AACvB,YAAM,MAAW,YAAK,SAAS,EAAE,IAAI;AACrC,UAAI,EAAE,YAAY,GAAG;AACnB,YAAI,EAAE,SAAS,kBAAkB,EAAE,KAAK,WAAW,GAAG,EAAG;AACzD,cAAM,KAAK,GAAG;AACd;AAAA,MACF;AACA,UAAI,CAAC,EAAE,OAAO,EAAG;AACjB,UAAI,cAAc,KAAK,EAAE,IAAI,EAAG,KAAI,KAAK,GAAG;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,aAAa,KAAa,SAAgC;AACxE,QAAM,OAAY,gBAAS,GAAG;AAC9B,MAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AACnC,MAAI,0BAA0B,KAAK,IAAI,EAAG,QAAO;AAEjD,QAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,QAAM,iBAAiB,qBAAqB,KAAK,OAAO;AACxD,QAAM,gBAAgB,oBAAoB,KAAK,OAAO;AACtD,QAAM,cACJ,eAAe,KAAK,OAAO,KAAK,uBAAuB,KAAK,OAAO;AAErE,MAAI,gBAAgB,UAAU,gBAAiB,QAAO;AACtD,MAAI,UAAU,cAAe,QAAO;AACpC,MAAI,kBAAkB,oCAAoC,KAAK,OAAO;AACpE,WAAO;AAIT,QAAM,eAAe,oDAAoD;AAAA,IACvE;AAAA,EACF;AACA,QAAM,cACJ,8BAA8B,KAAK,OAAO,KAAK,eAAe,KAAK,OAAO;AAC5E,MAAI,CAAC,gBAAgB,YAAa,QAAO;AAEzC,MAAI,KAAK,WAAW,MAAM,EAAG,QAAO;AACpC,MAAI,uBAAuB,KAAK,OAAO,KAAK,CAAC,QAAQ;AAEnD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,CAAC,eAAgB,QAAO;AAEvC,SAAO;AACT;AAMA,SAAS,aAAa,KAA4B;AAChD,QAAM,OAAY,gBAAS,GAAG,EAAE,QAAQ,oBAAoB,EAAE;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,uBAAuB,KAAK,IAAI,EAAG,QAAO;AAE/C,MAAI,KAAK,WAAW,MAAM,EAAG,QAAO;AACpC,SAAO;AACT;AAEA,eAAe,oBACb,aACA,OACA,SACwB;AACxB,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,YAAiB,eAAQ,aAAa,KAAK,MAAM;AACvD,MAAI;AACJ,MAAI;AACF,UAAM,MAAS,cAAS,WAAW,OAAO;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO,eAAe,KAAK,OAAO;AACpC;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,SAAS,IAAI,EAAE,KAAK;AACvC;AAEA,SAAS,WAAW,aAAqB,KAAqB;AAC5D,SAAY,gBAAS,aAAa,GAAG,EAAE,MAAW,UAAG,EAAE,KAAK,GAAG;AACjE;AASA,eAAe,2BAA2B,MAAgC;AACxE,QAAM,EAAE,aAAa,aAAa,UAAU,QAAQ,IAAI;AACxD,QAAM,YAAgC,MAAM;AAAA,IAC1C;AAAA,EACF,KAAM,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE;AAExC,QAAM,MAAM,UAAU,UAAU,UAAU,CAACC,OAAMA,GAAE,YAAY,WAAW;AAC1E,QAAM,QAAQ,OAAO,IAAI,UAAU,UAAU,GAAG,IAAI;AAEpD,QAAM,eAAoC,QAAQ,IAAI,CAAC,MAAM;AAG3D,UAAM,aAAkB,gBAAS,EAAE,MAAM;AACzC,WAAO;AAAA,MACL,IAAI,GAAG,EAAE,EAAE,IAAI,UAAU;AAAA,MACzB,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,UAAU;AAAA,MACV,eAAe,EAAE;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,SAASC,gBAAe,OAAO,aAAa,CAAC,GAAG,YAAY;AAClE,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;AAEnC,QAAM,uBAAuB,aAAa,SAAS;AACrD;AAEA,SAASA,gBACP,OACA,MACqB;AACrB,QAAM,SAAS,oBAAI,IAA+B;AAClD,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;;;ALzZO,IAAMC,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EAEC,SAAS,YAAY,qDAAiC,EACtD,OAAO,eAAe,sHAA4B,EAClD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,WAAW,6IAAoC,EACtD;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC,OACE,KACA,SAMG;AACH,QAAI;AACF,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAEvC,UAAI,KAAK,OAAO;AACd,cAAM,YAAY,aAAa,KAAK,UAAU,KAAK;AACnD;AAAA,MACF;AAEA,UAAI,KAAK,QAAQ;AACf,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,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,UAAU,gBAAgB,GAAG;AAGnC,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;AAEF,eAAe,YACb,aACA,QACe;AACf,SAAO;AAAA,IACL,SACI,qEACA;AAAA,EACN;AACA,QAAM,SAAS,MAAM,WAAW,EAAE,aAAa,OAAO,CAAC;AAEvD,SAAO;AAAA,IACL,sBAAsB,OAAO,QAAQ,MAAM,aAAa,OAAO,QAAQ,MAAM,aAAa,OAAO,MAAM,MAAM,WAAW,OAAO,MAAM,MAAM,WAAW,OAAO,MAAM,MAAM;AAAA,EAC3K;AAEA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,gCAAgC;AAC5C,eAAW,KAAK,OAAO,SAAS;AAC9B,aAAO,KAAK,YAAO,EAAE,EAAE,WAAM,EAAE,GAAG,KAAK,EAAE,aAAa,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,gDAA2C;AACvD,eAAW,KAAK,OAAO,QAAS,QAAO,KAAK,YAAO,EAAE,GAAG,EAAE;AAAA,EAC5D;AACA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,QAAQ;AACpB,eAAW,KAAK,OAAO,MAAO,QAAO,KAAK,YAAO,EAAE,GAAG,EAAE;AAAA,EAC1D;AACA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,QAAQ;AACpB,eAAW,KAAK,OAAO,MAAO,QAAO,KAAK,YAAO,EAAE,GAAG,EAAE;AAAA,EAC1D;AACA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,oBAAoB;AAChC,eAAW,KAAK,OAAO,MAAO,QAAO,KAAK,YAAO,EAAE,GAAG,EAAE;AAAA,EAC1D;AACF;;;AM1IA,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,CAACC,OAAMA,GAAE,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;;;ADhFO,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,8BAA8B,gBAAgB,GAAG,CAAC,EAAE;AACjE,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AE/DF,SAAS,WAAAC,iBAAe;;;ACJxB,YAAYC,YAAU;AACtB,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE,yBAAAC;AAAA,EACA;AAAA,OACK;;;ACGP,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAsBtB,IAAM,eAAkD;AAAA,EACtD,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,IAAM,YAAwD;AAAA,EAC5D,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,QAAQ;AACV;AAGA,IAAM,oBAAoB;AAG1B,IAAM,iBAAiB,oBAAI,IAAI,CAAC,YAAY,WAAW,CAAC;AA4CxD,eAAsB,uBACpB,SACiC;AACjC,QAAM,EAAE,aAAa,SAAS,IAAI;AAClC,QAAM,SAAS,QAAQ,UAAW,MAAM,kBAAkB,WAAW;AACrE,QAAM,YACJ,QAAQ,aAAc,MAAM,sBAAsB,WAAW;AAE/D,QAAM,aAAa,kBAAkB,UAAU,MAAM;AACrD,QAAM,gBAAqB,YAAK,aAAa,UAAU;AACvD,QAAM,mBAAmB,MAAM,gBAAgB,aAAa;AAC5D,QAAM,oBAAoB,MAAM;AAAA,IACzB,YAAK,aAAa,iBAAiB;AAAA,EAC1C;AAEA,QAAM,eAAe,qBAAqB,WAAW,aAAa,QAAQ,CAAC;AAC3E,QAAM,gBAAgB,eAAe,WAAW,YAAY,EAAE,KAAK,IAAI,CAAC;AAExE,QAAM,SAAS,aAAa,WAAW,cAAc;AACrD,QAAM,YAAY,mBACd,MAAM,iBAAiB,eAAe,MAAM,IAC5C,CAAC;AACL,QAAM,gBAAgB,IAAI,IAAI,aAAa;AAC3C,QAAM,kBAAkB,UACrB,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,EACrC,KAAK;AAER,QAAM,UAAU,gBAAgB;AAAA,IAC9B,cAAc,iBAAiB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,cAAc,WAAW;AAAA,IAC3C,kBAAkB,cAAc,WAAW;AAAA,EAC7C;AACF;AAIA,SAAS,kBACP,UACA,QACQ;AAGR,QAAM,WACJ,QAAQ,UAAU,IAAI,WACrB,QAAQ,WAAW,QAAQ,GAAG,WAC/B;AACF,QAAM,MAAM,UAAU,QAAQ;AAC9B,SAAO,SAAS,GAAG,KAAK,mBAAmB,GAAG;AAChD;AAQA,SAAS,WAAW,KAAiC;AACnD,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,KAAK,IAAI,WAAW;AAC7B,UAAM,QAAQ,EAAE,GAAG,QAAQ,GAAG;AAC9B,QAAI,IAAI,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE,EAAE;AAAA,EAClD;AACA,SAAO,CAAC,GAAG,GAAG;AAChB;AAEA,eAAe,gBAAgBC,IAA6B;AAC1D,MAAI;AACF,UAAMC,QAAO,MAAS,UAAKD,EAAC;AAC5B,WAAOC,MAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUA,eAAe,iBACb,eACA,SAA+B,QACZ;AACnB,QAAM,UAAU,MAAS,aAAQ,eAAe,EAAE,eAAe,KAAK,CAAC;AACvE,QAAM,MAAgB,CAAC;AACvB,MAAI,WAAW,aAAa;AAC1B,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,EAAE,YAAY,EAAG;AACtB,UAAI,EAAE,KAAK,WAAW,GAAG,EAAG;AAC5B,UAAI,KAAK,EAAE,IAAI;AAAA,IACjB;AAAA,EACF,OAAO;AACL,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,EAAE,OAAO,EAAG;AACjB,UAAI,eAAe,IAAI,EAAE,IAAI,EAAG;AAChC,UAAI,CAAC,kBAAkB,KAAK,EAAE,IAAI,EAAG;AACrC,UAAI,KAAK,EAAE,KAAK,QAAQ,mBAAmB,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AACA,SAAO,IAAI,KAAK;AAClB;AASA,SAAS,gBAAgB,MAAgD;AACvE,QAAM,EAAE,cAAc,mBAAmB,WAAW,gBAAgB,IAAI;AACxE,MAAI,cAAc;AAChB,WAAO,gBAAgB,WAAW,IAAI,eAAe;AAAA,EACvD;AAEA,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,SAAO,oBAAoB,kBAAkB;AAC/C;;;ACtNA,YAAYC,YAAU;AAgCtB,IAAMC,cAAa;AACnB,IAAM,cAAc;AAEpB,IAAMC,gBAAkD;AAAA,EACtD,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,QAAQ;AACV;AAGA,SAASC,aAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,SAAS,GAAG;AACjC;AA8CA,eAAsB,sBACpB,SAC6C;AAC7C,QAAM,EAAE,eAAe,SAAS,IAAI;AAKpC,MACE,cAAc,YAAY,gBAC1B,cAAc,YAAY,SAC1B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YACJ,QAAQ,aAAc,MAAM,sBAAsB,QAAQ,WAAW;AACvE,QAAM,eAAe,qBAAqB,WAAWD,cAAa,QAAQ,CAAC;AAC3E,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,QAAQ,QAAQ,UAAS,oBAAI,KAAK,GAAE,YAAY;AACtD,QAAM,OAAOC,aAAY,KAAK;AAC9B,QAAM,aAAkB;AAAA,IACtB,QAAQ;AAAA,IACRF;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,IAAI,IAAI;AAAA,EACrB;AAEA,QAAM,WAAW,IAAI;AAAA,IACnB,QAAQ,SAAS,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EAC/C;AAIA,QAAM,eAAe,wBAAwB,aAAa,SAAS;AAEnE,QAAM,UACJ,QAAQ,WAAW,QAAQ,QAAQ,SAAS,IACxC,IAAI,IAAI,QAAQ,OAAO,IACvB;AAEN,QAAM,UAAiC,CAAC;AAGxC,aAAW,MAAM,cAAc,eAAe;AAC5C,QAAI,WAAW,CAAC,QAAQ,IAAI,EAAE,EAAG;AACjC,UAAM,QAAQ,MAAM,kBAAkB;AAAA,MACpC;AAAA,MACA,OAAO,SAAS,IAAI,EAAE;AAAA,MACtB,UAAU,aAAa,IAAI,EAAE;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,kBAAkB,QAAQ;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,eAAe,QAAQ,SAAS;AAAA,IAClC,CAAC;AACD,QAAI,MAAO,SAAQ,KAAK,KAAK;AAAA,EAC/B;AAGA,aAAW,MAAM,cAAc,iBAAiB;AAC9C,QAAI,WAAW,CAAC,QAAQ,IAAI,EAAE,EAAG;AACjC,UAAM,QAAQ,MAAM,eAAe;AAAA,MACjC;AAAA,MACA,eAAoB,YAAK,QAAQ,aAAa,cAAc,UAAU;AAAA,MACtE;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,MAAO,SAAQ,KAAK,KAAK;AAAA,EAC/B;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,SAAS,gBAAgB,OAAO;AACtC,QAAM,cAAsC;AAAA,IAC1C,eAAe;AAAA,IACf,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,QAAQ;AAAA,IACjB,SAAS,cAAc,oBAAoB;AAAA,IAC3C,aAAa,cAAc,oBAAoB;AAAA,IAC/C,WAAW,QAAQ,SAAS;AAAA,IAC5B,SAAS,cAAc;AAAA,IACvB,SAAS,EAAE,OAAO,QAAQ,QAAQ,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,UAAU,UAAU;AAC1B,QAAM;AAAA,IACC,YAAK,YAAY,WAAW;AAAA,IACjC,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI;AAAA,EACzC;AAEA,SAAO,EAAE,YAAY,UAAU,YAAY;AAC7C;AAiBA,eAAe,kBACb,MACqC;AACrC,QAAM,EAAE,IAAI,OAAO,UAAU,YAAY,aAAa,SAAS,IAAI;AACnE,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,gBAAgB,MAAM,eAAe,SAAS,MAAM;AAG1D,MAAI,kBAAkB,MAAM;AAC1B,WAAO,mBAAmB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,OAAO;AACV,WAAO,mBAAmB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eAAe,KAAK,kBAAkB,IAAI,EAAE,KAAK,KAAK;AAC5D,QAAM,YAAiB,eAAQ,cAAc,KAAK,MAAM;AACxD,QAAM,MAAM,MAAM,eAAe,SAAS;AAC1C,MAAI,QAAQ,MAAM;AAGhB,WAAO;AAAA,EACT;AACA,QAAM,sBAAsB,eAAe,KAAK,KAAK,OAAO;AAC5D,QAAM,eAAe,YAAY,mBAAmB;AAEpD,QAAM,aAAkB,eAAQ,SAAS,MAAM,KAAK;AACpD,QAAM,cAAmB,eAAQ,KAAK,UAAU,KAAK;AACrD,QAAM,aAAa,GAAG,EAAE,WAAW,UAAU;AAC7C,QAAM,cAAc,GAAG,EAAE,YAAY,WAAW;AAChD,QAAM,cAAmB,YAAK,YAAY,UAAU,GAAG,aAAa;AACpE,QAAM,cAAmB,YAAK,YAAY,WAAW,GAAG,mBAAmB;AAE3E,QAAM,OAAO,aAAa;AAAA,IACxB,aAAa,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,WAAW,MAAM,MAAM,SAAS;AAAA,EAClC,CAAC;AAED,QAAM,YAAY,gBAAgB;AAAA,IAChC;AAAA,IACA,gBAAgB;AAAA,IAChB,YAAY,MAAM,MAAM,CAAC,GAAG,cAAc,GAAG,EAAE;AAAA,EACjD,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,QAAa,gBAAS,aAAa,SAAS,MAAM;AAAA,MAClD,MAAM,SAAS;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,UAAU;AAAA,MACR,eAAe,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAe,eACb,MACqC;AACrC,QAAM,EAAE,IAAI,eAAe,YAAY,aAAa,SAAS,IAAI;AACjE,QAAM,MAAW,YAAK,eAAe,GAAG,EAAE,MAAM;AAChD,QAAM,KAAU,YAAK,eAAe,GAAG,EAAE,KAAK;AAC9C,QAAM,SAAU,MAAM,WAAW,GAAG,IAChC,MACC,MAAM,WAAW,EAAE,IACpB,KACA;AACJ,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,MAAM,MAAM,eAAe,MAAM;AACvC,MAAI,QAAQ,KAAM,QAAO;AAEzB,QAAM,MAAW,eAAQ,MAAM;AAC/B,QAAM,aAAa,GAAG,EAAE,WAAW,GAAG;AACtC,QAAM,cAAmB,YAAK,YAAY,UAAU,GAAG,GAAG;AAE1D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,QAAa,gBAAS,aAAa,MAAM;AAAA,MACzC,MAAM,YAAY,GAAG;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACA,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;AAYA,eAAe,mBACb,MAC8B;AAC9B,QAAM,MAAW,eAAQ,KAAK,SAAS,MAAM,KAAK;AAClD,QAAM,aAAa,GAAG,KAAK,EAAE,WAAW,GAAG;AAG3C,QAAM;AAAA,IACC,YAAK,KAAK,YAAY,UAAU;AAAA,IACrC,KAAK;AAAA,EACP;AACA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,SAAS;AAAA,MACP,QAAa,gBAAS,KAAK,aAAa,KAAK,SAAS,MAAM;AAAA,MAC5D,MAAM,KAAK,SAAS;AAAA,MACpB,eAAe;AAAA,IACjB;AAAA,IACA,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,OAAO,CAAC,KAAK,IAAI;AAAA,MACjB,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;AAkBA,SAAS,aAAa,MAA4C;AAChE,MAAI,KAAK,gBAAgB,KAAK,cAAc;AAC1C,WAAO,EAAE,WAAW,aAAa,OAAO,CAAC,GAAG,mBAAmB,EAAE;AAAA,EACnE;AAEA,QAAM,aAAa,mBAAmB,KAAK,aAAa;AACxD,QAAM,aAAa,mBAAmB,KAAK,cAAc;AAIzD,QAAM,iBAAiB,QAAQ,YAAY,UAAU;AACrD,QAAM,eAAe,QAAQ,YAAY,UAAU;AAEnD,QAAM,cAAc,wBAAwB,KAAK,aAAa;AAC9D,QAAM,cAAc,wBAAwB,KAAK,cAAc;AAC/D,QAAM,kBAAkB,QAAQ,aAAa,WAAW;AACxD,QAAM,gBAAgB,QAAQ,aAAa,WAAW;AAEtD,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,eAAgB,OAAM,KAAK,mBAAmB,CAAC,EAAE;AACjE,aAAW,KAAK,aAAc,OAAM,KAAK,eAAe,CAAC,EAAE;AAC3D,aAAW,KAAK,gBAAiB,OAAM,KAAK,wBAAwB,CAAC,EAAE;AACvE,aAAW,KAAK,cAAe,OAAM,KAAK,oBAAoB,CAAC,EAAE;AACjE,MAAI,KAAK,UAAW,OAAM,KAAK,0CAA0C;AAEzE,MAAI;AACJ,MAAI,eAAe,SAAS,KAAK,gBAAgB,SAAS,GAAG;AAC3D,gBAAY;AAAA,EACd,WACE,aAAa,SAAS,KACtB,cAAc,SAAS,KACvB,KAAK,WACL;AACA,gBAAY;AAAA,EACd,OAAO;AACL,gBAAY;AAAA,EACd;AAEA,SAAO,EAAE,WAAW,OAAO,mBAAmB,EAAE;AAClD;AASA,SAAS,mBAAmB,KAAuB;AACjD,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,KACJ;AACF,MAAI;AACJ,UAAQ,IAAI,GAAG,KAAK,GAAG,OAAO,MAAM;AAClC,QAAI,EAAE,CAAC,EAAG,OAAM,IAAI,EAAE,CAAC,CAAC;AAAA,EAC1B;AAEA,aAAW,MAAM,IAAI,SAAS,oCAAoC,GAAG;AACnE,QAAI,GAAG,CAAC,EAAG,OAAM,IAAI,GAAG,CAAC,CAAC;AAAA,EAC5B;AACA,SAAO,CAAC,GAAG,KAAK;AAClB;AAcA,SAAS,wBAAwB,KAAuB;AACtD,QAAM,QAAQ,qBAAqB,GAAG;AACtC,MAAI,UAAU,KAAM,QAAO,CAAC;AAC5B,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,aAAa,mBAAmB,KAAK,GAAG;AACjD,eAAW,MAAM,UAAU,SAAS,mCAAmC,GAAG;AACxE,UAAI,GAAG,CAAC,EAAG,OAAM,IAAI,GAAG,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,CAAC,GAAG,KAAK;AAClB;AAGA,SAAS,qBAAqB,KAA4B;AACxD,QAAM,MAAM,IAAI,OAAO,qBAAqB;AAC5C,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,OAAO,IAAI,QAAQ,KAAK,GAAG;AACjC,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,QAAQ;AACZ,WAAS,IAAI,MAAM,IAAI,IAAI,QAAQ,KAAK;AACtC,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,KAAK;AAClB;AACA,UAAI,UAAU,EAAG,QAAO,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;AAGA,UAAU,mBAAmB,OAAkC;AAC7D,QAAM,KAAK;AACX,MAAI;AACJ,UAAQ,IAAI,GAAG,KAAK,KAAK,OAAO,MAAM;AACpC,UAAM,OAAO,MAAM,QAAQ,KAAK,EAAE,KAAK;AACvC,QAAI,OAAO,EAAG;AACd,QAAI,QAAQ;AACZ,aAAS,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK;AACxC,YAAM,IAAI,MAAM,CAAC;AACjB,UAAI,MAAM,IAAK;AAAA,eACN,MAAM,KAAK;AAClB;AACA,YAAI,UAAU,GAAG;AACf,gBAAM,MAAM,MAAM,OAAO,GAAG,CAAC;AAC7B,aAAG,YAAY,IAAI;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,GAAa,GAAuB;AACnD,QAAM,OAAO,IAAI,IAAI,CAAC;AACtB,SAAO,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK;AAC5C;AAIA,SAAS,wBACP,WACgC;AAChC,QAAM,MAAM,oBAAI,IAA+B;AAC/C,aAAW,KAAK,WAAW;AACzB,UAAM,QAAQ,EAAE,GAAG,QAAQ,GAAG;AAC9B,UAAM,MAAM,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE;AAClD,QAAI,CAAC,IAAI,IAAI,GAAG,EAAG,KAAI,IAAI,KAAK,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,gBACP,SAC2C;AAC3C,QAAM,MAAiD,CAAC;AACxD,aAAW,KAAK,SAAS;AACvB,UAAM,IAAI,EAAE,KAAK;AACjB,QAAI,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK;AAAA,EAC3B;AACA,SAAO;AACT;AAkBA,SAAS,gBAAgB,MAAoD;AAC3E,QAAM,WAAW,wBAAwB,KAAK,YAAY,KAAK,aAAa;AAC5E,QAAM,gBAAgB;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,QAAM,EAAE,kBAAkB,YAAY,QAAQ,IAAI;AAAA,IAChD;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,UAAU,eAAe,kBAAkB,YAAY,QAAQ;AAC1E;AAQA,SAAS,wBACP,YACA,KACiB;AACjB,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,0BAA0B,KAAK,UAAU,EAAG,QAAO;AACvD,QAAM,SAAS,mBAAmB,KAAK,GAAG;AAC1C,QAAM,iBAAiB,qBAAqB,KAAK,GAAG;AACpD,QAAM,cACJ,eAAe,KAAK,GAAG,KAAK,uBAAuB,KAAK,GAAG;AAC7D,MAAI,gBAAgB,UAAU,gBAAiB,QAAO;AACtD,MAAI,UAAU,oBAAoB,KAAK,GAAG,EAAG,QAAO;AACpD,MAAI,CAAC,UAAU,CAAC,eAAgB,QAAO;AACvC,SAAO;AACT;AAEA,SAAS,mBACP,SACA,UACsB;AACtB,QAAM,aAAa,mBAAmB,OAAO;AAC7C,QAAM,aAAa,mBAAmB,QAAQ;AAI9C,QAAM,WAAW,QAAQ,YAAY,UAAU;AAC/C,QAAM,aAAa,QAAQ,YAAY,UAAU;AAEjD,QAAM,cAAc,wBAAwB,OAAO;AACnD,QAAM,cAAc,wBAAwB,QAAQ;AACpD,QAAM,WAAW,QAAQ,aAAa,WAAW;AACjD,QAAM,cAAwB,CAAC;AAG/B,QAAM,iBAAiB,YAAY,OAAO,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC;AACxE,aAAW,KAAK,gBAAgB;AAC9B,QAAI,mBAAmB,SAAS,CAAC,MAAM,mBAAmB,UAAU,CAAC,GAAG;AACtE,kBAAY,KAAK,CAAC;AAAA,IACpB;AAAA,EACF;AAIA,QAAM,WAAW,yBAAyB,OAAO;AACjD,QAAM,WAAW,yBAAyB,QAAQ;AAClD,QAAM,gBAAgB,aAAa;AACnC,QAAM,YAAY,iBAAiB,OAAO;AAC1C,QAAM,YAAY,iBAAiB,QAAQ;AAC3C,QAAM,iBACJ,UAAU,SAAS,UAAU,QAC7B,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAI9C,QAAM,WAAW,oBAAoB,KAAK,OAAO;AACjD,QAAM,YACJ,2DAA2D,KAAK,OAAO;AACzE,QAAM,aAAa,qBAAqB,OAAO;AAC/C,QAAM,aAAa,qBAAqB,QAAQ;AAChD,QAAM,kBAAkB,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;AAM1E,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,KAAK,QAAQ,SAAS,oBAAoB,GAAG;AACtD,QAAI,EAAE,CAAC,EAAG,QAAO,IAAI,EAAE,CAAC,CAAC;AAAA,EAC3B;AACA,QAAM,iBAAiB,CAAC,GAAG,MAAM;AACjC,QAAM,gBAAgB,eAAe,SAAS;AAG9C,QAAM,mBACJ,wBAAwB,OAAO,MAAM,wBAAwB,QAAQ;AAEvE,SAAO;AAAA,IACL,UAAU,EAAE,OAAO,UAAU,SAAS,YAAY,iBAAiB;AAAA,IACnE,YAAY,EAAE,eAAe,eAAe;AAAA,IAC5C,YAAY,EAAE,UAAU,WAAW,gBAAgB;AAAA,IACnD,UAAU,EAAE,eAAe,UAAU,kBAAkB,YAAY;AAAA,IACnE,gBAAgB,EAAE,eAAe,eAAe;AAAA,EAClD;AACF;AAQA,SAAS,oBACP,UACA,IAC4E;AAC5E,QAAM,UAAoB,CAAC;AAC3B,MAAI,aAAa,UAAU,aAAa,UAAU,aAAa,QAAQ;AACrE,YAAQ;AAAA,MACN,YAAY,QAAQ;AAAA,IACtB;AACA,WAAO,EAAE,kBAAkB,CAAC,cAAc,GAAG,YAAY,KAAK,QAAQ;AAAA,EACxE;AAEA,QAAM,cACJ,GAAG,SAAS,MAAM,WAAW,KAC7B,GAAG,SAAS,QAAQ,WAAW,KAC/B,CAAC,GAAG,SAAS;AACf,QAAM,eACJ,CAAC,GAAG,WAAW,YACf,CAAC,GAAG,WAAW,aACf,CAAC,GAAG,WAAW;AAGjB,MAAI,GAAG,SAAS,QAAQ,SAAS,KAAK,GAAG,SAAS,kBAAkB;AAClE,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,EAAE,kBAAkB,CAAC,SAAS,GAAG,YAAY,MAAM,QAAQ;AAAA,EACpE;AACA,MACE,eACA,iBACC,GAAG,WAAW,iBAAiB,GAAG,WAAW,mBAC9C,GAAG,SAAS,cAAc,WAAW,KACrC,GAAG,SAAS,iBAAiB,WAAW,GACxC;AACA,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,EAAE,kBAAkB,CAAC,WAAW,GAAG,YAAY,KAAK,QAAQ;AAAA,EACrE;AAEA,QAAM,QAAuB,CAAC;AAC9B,MAAI,QAAQ;AACZ,MACE,GAAG,SAAS,cAAc,SAAS,KACnC,GAAG,SAAS,iBAAiB,SAAS,GACtC;AACA,UAAM,KAAK,SAAS;AACpB,YAAQ;AAAA,MACN,wBAAwB,GAAG,SAAS,cAAc,MAAM,KAAK,GAAG,SAAS,iBAAiB,MAAM;AAAA,IAClG;AACA,YAAQ,KAAK,IAAI,OAAO,GAAG;AAAA,EAC7B;AACA,MACE,GAAG,WAAW,YACd,GAAG,WAAW,aACd,GAAG,WAAW,mBACd,GAAG,SAAS,MAAM,SAAS,GAC3B;AACA,UAAM,KAAK,SAAS;AACpB,YAAQ,KAAK,6CAA6C;AAC1D,YAAQ,KAAK,IAAI,OAAO,IAAI;AAAA,EAC9B;AACA,MACE,eACA,gBACA,CAAC,GAAG,WAAW,iBACf,CAAC,GAAG,WAAW,kBACf,GAAG,SAAS,cAAc,WAAW,KACrC,GAAG,SAAS,iBAAiB,WAAW,GACxC;AAEA,UAAM,KAAK,QAAQ;AACnB,YAAQ,KAAK,+DAA0D;AACvE,YAAQ,KAAK,IAAI,OAAO,GAAG;AAAA,EAC7B;AACA,MAAI,GAAG,eAAe,eAAe;AACnC,UAAM,KAAK,SAAS;AACpB,YAAQ;AAAA,MACN,kBAAkB,GAAG,eAAe,eAAe,MAAM;AAAA,IAC3D;AACA,YAAQ,KAAK,IAAI,OAAO,IAAI;AAAA,EAC9B;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,KAAK,mCAAmC;AAChD,WAAO,EAAE,kBAAkB,CAAC,cAAc,GAAG,YAAY,KAAK,QAAQ;AAAA,EACxE;AACA,SAAO,EAAE,kBAAkB,OAAO,YAAY,OAAO,QAAQ;AAC/D;AAEA,SAAS,mBAAmB,KAAa,KAAqB;AAC5D,QAAM,QAAQ,qBAAqB,GAAG;AACtC,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,KAAK,IAAI,OAAO,WAAY,GAAG,oBAAqB;AAC1D,QAAM,MAAM,MAAM,OAAO,EAAE;AAC3B,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,OAAO,MAAM,QAAQ,KAAK,GAAG;AACnC,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,QAAQ;AACZ,WAAS,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK;AACxC,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,KAAK;AAClB;AACA,UAAI,UAAU,EAAG,QAAO,MAAM,MAAM,OAAO,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,KAAqB;AACrD,QAAM,MAAgB,CAAC;AAEvB,aAAW,KAAK,IAAI,SAAS,sCAAsC,GAAG;AACpE,QAAI,EAAE,CAAC,EAAG,KAAI,KAAK,EAAE,CAAC,CAAC;AAAA,EACzB;AAMA,aAAW,KAAK,IAAI,SAAS,yBAAyB,GAAG;AACvD,UAAM,QAAQ,EAAE,SAAS,KAAK,EAAE,CAAC,EAAE,SAAS;AAC5C,QAAI,QAAQ;AACZ,QAAI,IAAI,OAAO;AACf,WAAO,IAAI,IAAI,UAAU,QAAQ,GAAG,KAAK;AACvC,YAAM,IAAI,IAAI,CAAC;AACf,UAAI,MAAM,IAAK;AAAA,eACN,MAAM,IAAK;AAAA,IACtB;AACA,UAAM,OAAO,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC;AACtC,eAAW,OAAO,KAAK,SAAS,sBAAsB,GAAG;AACvD,UAAI,IAAI,CAAC,EAAG,KAAI,KAAK,IAAI,CAAC,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,SAAO,IAAI,KAAK,EAAE,KAAK,GAAG;AAC5B;AAEA,SAAS,iBAAiB,KAA0B;AAClD,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,KAAK,IAAI,SAAS,wBAAwB,GAAG;AACtD,QAAI,EAAE,CAAC,EAAG,KAAI,IAAI,EAAE,CAAC,CAAC;AAAA,EACxB;AACA,aAAW,KAAK,IAAI,SAAS,0BAA0B,GAAG;AACxD,QAAI,EAAE,CAAC,EAAG,KAAI,IAAI,EAAE,CAAC,CAAC;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAA0B;AACtD,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,KAAK,IAAI,SAAS,sCAAsC,GAAG;AACpE,QAAI,EAAE,CAAC,EAAG,KAAI,IAAI,EAAE,CAAC,CAAC;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,KAAqB;AACpD,QAAM,IACJ,+DAA+D,KAAK,GAAG,KACvE,4CAA4C,KAAK,GAAG,KACpD,kEAAkE,KAAK,GAAG;AAC5E,SAAO,IAAI,CAAC,GAAG,QAAQ,QAAQ,GAAG,EAAE,KAAK,KAAK;AAChD;;;AF1zBA,IAAM,cAAcG,eAAc,YAAY,GAAG;AAEjD,SAASC,oBAAmB,aAA6B;AACvD,QAAM,cAAc,YAAY,QAAQ,GAAG,WAAW,eAAe;AACrE,SAAY,eAAQ,WAAW;AACjC;AAkDA,eAAsB,aACpB,SAC6B;AAC7B,QAAM,EAAE,aAAa,UAAU,MAAM,CAAC,GAAG,QAAQ,IAAI;AAErD,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,MAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,kBAAkB;AAEhD,QAAM,SAAS,aAAa,WAAW,WAAW,aAAa,OAAO,OAAO;AAC7E,MAAI,CAAC,OAAO,WAAW,MAAM,GAAG;AAC9B,WAAO,EAAE,QAAQ,iBAAiB,QAAQ,GAAG,QAAQ,iBAAiB;AAAA,EACxE;AAGA,QAAM,UACJ,OAAO,SAAS,IAAI,WACnB,OAAO,SAAS,QAAQ,GAAG;AAC9B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,GAAG,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,sBAAsB,WAAW;AACzD,QAAM,gBAAgB,MAAM,uBAAuB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MACE,cAAc,YAAY,gBAC1B,cAAc,YAAY,SAC1B;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,WAAW,cAAc,OAAO;AAAA,MACxC,SAAS,cAAc;AAAA,IACzB;AAAA,EACF;AAIA,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,WAAW,oBAAI,IAAI;AAAA,MACvB,GAAG,cAAc;AAAA,MACjB,GAAG,cAAc;AAAA,IACnB,CAAC;AACD,UAAM,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AACpD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI;AAAA,QACR,WAAW,QAAQ,qBAAqB,QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB;AAAA,UACC;AAAA,QACF,CAAC,wBAAwB,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,aAAa;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,EAC5B,CAAC;AAED,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,cAAc;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,EAClB;AACF;AAmBA,eAAsB,aACpB,MAC6C;AAC7C,QAAM,EAAE,UAAU,aAAa,SAAS,eAAe,SAAS,QAAQ,IACtE;AACF,MAAI,aAAa,UAAU;AACzB,UAAM,OACJ,KAAK,qBAAqBA,oBAAmB,oBAAoB;AACnE,UAAM,WAAW,MAAMC,uBAAsB,IAAI;AACjD,WAAO,sBAAsB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,MAAM;AACrB,UAAM,OAAO,KAAK,iBAAiBD,oBAAmB,gBAAgB;AACtE,UAAM,WAAW,MAAMC,uBAAsB,IAAI;AACjD,WAAO,sBAAsB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAKA,QAAM,UACJ,KAAK,oBAAoBD,oBAAmB,oBAAoB;AAClE,QAAM,UAAU,cAAc,oBAAoB;AAClD,QAAM,aAAkB,YAAK,SAAS,YAAY,OAAO;AACzD,QAAM,kBAAkB,MAAM,6BAA6B,UAAU;AACrE,QAAM,SAAS,KAAK,iBAAiBA,oBAAmB,gBAAgB;AACxE,QAAM,aAAa,MAAMC,uBAAsB,MAAM;AAErD,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,QAAM,SAAoB,CAAC;AAC3B,aAAW,KAAK,gBAAgB,SAAS;AACvC,qBAAiB,IAAI,EAAE,IAAI,UAAU;AACrC,WAAO,KAAK,CAAC;AAAA,EACf;AACA,aAAW,KAAK,WAAW,SAAS;AAClC,QAAI,iBAAiB,IAAI,EAAE,EAAE,EAAG;AAChC,qBAAiB,IAAI,EAAE,IAAI,MAAM;AACjC,WAAO,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,YAA+B;AAAA,IACnC,eAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS,gBAAgB;AAAA,IACzB,SAAS,gBAAgB;AAAA,IACzB,SAAS;AAAA,EACX;AAEA,SAAO,sBAAsB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ADhPA,IAAM,OAAgD;AAAA,EACpD,IAAI;AAAA,IACF,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACX;AACF;AAMO,SAAS,mBAAmB,UAAsC;AACvE,QAAM,OAAO,KAAK,QAAQ;AAC1B,SAAO,IAAIC,UAAQ,SAAS,EACzB;AAAA,IACC,UAAK,QAAQ;AAAA,EACf,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA,wGAAwB,KAAK,cAAc;AAAA,EAC7C,EACC,OAAO,OAAO,KAAe,SAA8B;AAC1D,QAAI,KAAK,OAAO;AACd,aAAO;AAAA,QACL,4CAAc,KAAK,cAAc;AAAA,MACnC;AACA,aAAO;AAAA,QACL,mCAAoB,QAAQ;AAAA,MAC9B;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAEvC,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,UAAU,KAAK;AAAA,QACf;AAAA,QACA,SAAS,KAAK;AAAA,MAChB,CAAC;AAED,cAAQ,OAAO,QAAQ;AAAA,QACrB,KAAK;AACH,iBAAO;AAAA,YACL;AAAA,UACF;AACA,kBAAQ,WAAW;AACnB;AAAA,QACF,KAAK;AACH,iBAAO,MAAM,GAAG,QAAQ,mBAAmB,OAAO,MAAM,EAAE;AAC1D,iBAAO,MAAM,SAAS,KAAK,gBAAgB,WAAW;AACtD,kBAAQ,WAAW;AACnB;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,6BAA6B,OAAO,OAAO,MAAM,OAAO,MAAM;AAAA,UAChE;AACA;AAAA,QACF,KAAK,UAAU;AACb,gBAAM,EAAE,UAAU,WAAW,IAAI;AACjC,iBAAO;AAAA,YACL,GAAG,QAAQ,qBAAqB,SAAS,QAAQ,KAAK,mBAAc,UAAU;AAAA,UAChF;AACA,gBAAM,SAAS,SAAS,QAAQ;AAChC,gBAAM,QAAQ,OAAO,QAAQ,MAAM,EAChC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,EAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAC9B,cAAI,MAAM,SAAS,GAAG;AACpB,mBAAO,KAAK,WAAW,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,UAC3C;AACA,iBAAO,KAAK,EAAE;AACd,iBAAO;AAAA,YACL;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,mBAAmB,QAAQ,aAAa,gBAAgB,GAAG,CAAC;AAAA,MAC9D;AACA,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AI/HO,IAAM,iBAAiB,mBAAmB,IAAI;;;ACVrD,SAAS,WAAAC,iBAAe;;;ACoCxB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;;;ACftB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAwCtB,IAAM,kBAAkB;AACxB,IAAM,qBACJ;AACF,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAO3B,eAAsB,sBACpB,aACA,OACA,UAAiC,CAAC,GACH;AAC/B,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,EAAE;AAE5D,QAAM,WAAW,QAAQ,YAAiB,YAAK,aAAa,KAAK;AACjE,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,QAAQ,UAAU;AAEjC,QAAM,QAAQ,MAAM,eAAe,QAAQ;AAC3C,QAAM,YAAsB,CAAC;AAC7B,QAAM,UAA2B,CAAC;AAElC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,MAAM,eAAe,IAAI;AACrC,QAAI,QAAQ,KAAM;AAElB,UAAMC,OAAM,MAAM,aAAa,IAAI;AACnC,UAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,KAAK;AAGzB,YAAM,cAAc,KAAK,MAAM,kBAAkB;AACjD,UAAI,aAAa;AACf,cAAM,QAAQ,YAAY,CAAC;AAC3B,cAAM,SAAS,YAAY,CAAC,KAAK;AACjC,cAAM,OAAO,YAAY,CAAC,KAAK;AAC/B,cAAMC,SAAQ,YAAY,CAAC,KAAK;AAChC,cAAM,WAAW,WAAW,MAAM,KAAK;AACvC,YAAI,aAAa,MAAM;AAGrB,cAAI,eAAe,KAAK,IAAI,GAAG;AAC7B,oBAAQ,KAAK;AAAA,cACX,MAAMD;AAAA,cACN,MAAM,IAAI;AAAA,cACV,QAAQ;AAAA,cACR,SAAS,KAAK,KAAK;AAAA,YACrB,CAAC;AACD;AAAA,UACF;AACA,gBAAM,CAAC,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAGC,MAAK,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC;AAClE,oBAAU;AAAA,QACZ;AACA;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,MAAM,kBAAkB;AAC/C,UAAI,WAAW;AACb,cAAM,QAAQ,UAAU,CAAC;AACzB,cAAM,SAAS,UAAU,CAAC,KAAK;AAC/B,cAAM,OAAO,UAAU,CAAC,KAAK;AAC7B,cAAMA,SAAQ,UAAU,CAAC,KAAK;AAC9B,cAAM,WAAW,WAAW,MAAM,KAAK;AACvC,YAAI,aAAa,MAAM;AACrB,gBAAM,CAAC,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAGA,MAAK,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC;AAClE,oBAAU;AAAA,QACZ;AACA;AAAA,MACF;AAIA,iBAAW,KAAK,KAAK,SAAS,kBAAkB,GAAG;AACjD,cAAM,SAAS,EAAE,CAAC,KAAK;AACvB,YAAI,MAAM,KAAK,CAAC,MAAM,WAAW,QAAQ,EAAE,OAAO,CAAC,GAAG;AACpD,kBAAQ,KAAK;AAAA,YACX,MAAMD;AAAA,YACN,MAAM,IAAI;AAAA,YACV,QAAQ;AAAA,YACR,SAAS,KAAK,KAAK;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,gBAAQ,KAAK;AAAA,UACX,MAAMA;AAAA,UACN,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,UACR,SAAS,KAAK,KAAK;AAAA,QACrB,CAAC;AACD,2BAAmB,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,SAAS;AACX,YAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,UAAI,CAAC,QAAQ;AACX,YAAI,OAAQ,OAAM,WAAW,MAAM,WAAW;AAC9C,cAAM,cAAc,MAAM,OAAO;AAAA,MACnC;AACA,gBAAU,KAAKA,IAAG;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,QAAQ;AAC9B;AAEA,SAAS,WAAW,QAAgB,OAA2C;AAC7E,aAAW,KAAK,OAAO;AACrB,QAAI,WAAW,EAAE,QAAS,QAAO,EAAE;AACnC,QAAI,OAAO,WAAW,EAAE,UAAU,GAAG,GAAG;AACtC,aAAO,EAAE,UAAU,OAAO,MAAM,EAAE,QAAQ,MAAM;AAAA,IAClD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAAgB,SAA0B;AAC5D,SAAO,WAAW,WAAW,OAAO,WAAW,UAAU,GAAG;AAC9D;AAEA,eAAe,eAAe,MAAiC;AAC7D,QAAM,MAAgB,CAAC;AACvB,iBAAe,KAAK,KAA4B;AAC9C,QAAI;AACJ,QAAI;AACF,gBAAU,MAAS,aAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACzD,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU;AACtD,YAAM;AAAA,IACR;AACA,eAAW,KAAK,SAAS;AAEvB,UACE,EAAE,KAAK,WAAW,GAAG,KACrB,EAAE,SAAS,kBACX,EAAE,SAAS,QACX;AACA;AAAA,MACF;AACA,YAAM,OAAY,YAAK,KAAK,EAAE,IAAI;AAClC,UAAI,EAAE,YAAY,GAAG;AACnB,cAAM,KAAK,IAAI;AAAA,MACjB,WAAW,EAAE,OAAO,KAAK,gBAAgB,KAAK,EAAE,IAAI,GAAG;AACrD,YAAI,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AACf,SAAO;AACT;AAEA,SAAS,MAAM,aAAqB,KAAqB;AACvD,SAAY,gBAAS,aAAa,GAAG,EAAE,MAAW,UAAG,EAAE,KAAK,GAAG;AACjE;;;AD9JA,IAAME,cAAa;AACnB,IAAMC,eAAc;AA8DpB,eAAsB,aACpB,SAC6B;AAC7B,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAA8B,CAAC;AACrC,QAAM,cAA4B,CAAC;AACnC,QAAM,UAA2B,CAAC;AAClC,QAAM,YAAsB,CAAC;AAE7B,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,MAAI,CAAC,QAAQ,UAAU,IAAI,SAAS;AAClC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,eAAe,EAAE,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AACA,QAAM,UAAU,OAAO,SAAS,GAAG;AAGnC,QAAM,aACJ,QAAQ,cAAe,MAAM,uBAAuB,WAAW;AACjE,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,eAAe,EAAE,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,gBAAgB,UAAU;AAC7C,MAAI,CAAC,QAAQ,KAAK,QAAQ,WAAW,GAAG;AACtC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,EAAE,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,UACJ,QAAQ,OAAO,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,QAAQ,GAAG,IAAI;AACjE,QAAM,gBAAgB,UAClB,KAAK,QAAQ,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC,IAC5C,KAAK;AAGT,QAAM,eAAoC,CAAC;AAC3C,aAAW,SAAS,eAAe;AACjC,UAAM,WAAW,YAAY,OAAO,QAAQ,aAAa;AACzD,QAAI;AACF,YAAM,UAAU,MAAM,aAAa;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,mBAAmB,QAAQ,qBAAqB;AAAA,QAChD;AAAA,MACF,CAAC;AACD,iBAAW,KAAK,QAAQ,SAAS;AACjC,kBAAY,KAAK,GAAG,QAAQ,WAAW;AACvC,mBAAa,KAAK,GAAG,QAAQ,YAAY;AAKzC,UACE,SAAS,SAAS,SAAS,KAC3B,QAAQ,kBACR,QAAQ,oBACR;AACA,cAAM,IAAI,MAAM;AAAA,UACd;AAAA,UACA,CAAC,QAAQ,kBAAkB;AAAA,UAC3B,EAAE,QAAQ,QAAQ,KAAK;AAAA,QACzB;AACA,kBAAU,KAAK,GAAG,EAAE,SAAS;AAC7B,gBAAQ,KAAK,GAAG,EAAE,OAAO;AACzB,mBAAWC,QAAO,EAAE,WAAW;AAC7B,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,MAAMA;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,wBAAwB,MAAM,EAAE,KAAK,gBAAgB,GAAG,CAAC,EAAE;AACxE,iBAAW,KAAK;AAAA,QACd,IAAI,MAAM;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,QACV,QAAQ,gBAAgB,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,CAAC,UAAU,aAAa,SAAS,GAAG;AACtC,UAAMC,4BAA2B,aAAa,YAAY;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,EAAE,WAAW,QAAQ;AAAA,EACtC;AACF;AAsBA,eAAe,aACb,MAC8B;AAC9B,QAAM,EAAE,OAAO,OAAO,aAAa,YAAY,SAAS,OAAO,IAAI;AACnE,QAAM,cAA4B,CAAC;AACnC,QAAM,eAAoC,CAAC;AAC3C,MAAI;AAGJ,MAAI,MAAM,SAAS,cAAc,GAAG;AAClC,WAAO;AAAA,MACL,WAAW;AAAA,QACT,IAAI,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,WAAO;AAAA,MACL,WAAW;AAAA,QACT,IAAI,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,MAAM,eAAe,YAAY,OAAO,SAAS;AACpE,QAAM,cAAc,MAAM,eAAe,YAAY,OAAO,UAAU;AAEtE,QAAM,cAAmB,YAAK,aAAa,QAAQ,QAAQ;AAC3D,QAAM,QAAa,YAAK,aAAa,QAAQ,UAAU;AACvD,QAAM,cAAc,QAAQ;AAC5B,QAAM,QAAQ,QAAQ;AAGtB,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,UAAM,WAAW,UAAU,MAAM,EAAE;AACnC,UAAM,YAAiB,YAAK,aAAa,GAAG,QAAQ,MAAM;AAC1D,UAAM,QAAa,YAAK,OAAO,GAAG,MAAM,EAAE,MAAM;AAGhD,QAAI,MAAM,WAAW,KAAK,GAAG;AAC3B,UAAI,CAAC,OAAQ,OAAM,WAAW,OAAO,WAAW;AAChD,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAMC,OAAW,gBAAS,aAAa,KAAK,CAAC;AAAA,QAC7C,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,KAAK,oBACjB,aACA,oBAAoB,YAAY,MAAM,EAAE;AAC5C,QAAI,CAAC,QAAQ;AACX,YAAM,UAAU,WAAW;AAC3B,YAAM,cAAc,WAAW,OAAO;AAAA,IACxC;AACA,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAMA,OAAW,YAAK,aAAa,GAAG,QAAQ,MAAM,CAAC;AAAA,MACrD,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AACD,iBAAa,KAAK;AAAA,MAChB,IAAI,GAAG,QAAQ,IAAI,QAAQ;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,YAAY,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ,CAAC;AAGD,QAAI,CAAC,OAAQ,OAAM,cAAc,OAAO,WAAW;AACnD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAMA,OAAW,YAAK,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC;AAAA,MAC/C,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAED,yBAAqB;AAAA,MACnB,SAAS,cAAc,OAAO,MAAM,EAAE;AAAA,MACtC,SAAS,cAAc,aAAa,QAAQ;AAAA,IAC9C;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,QACT,IAAI,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA,UACPA,OAAW,YAAK,aAAa,GAAG,QAAQ,MAAM,CAAC;AAAA,UAC/CA,OAAW,YAAK,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC;AAAA,QAC3C;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,wCAAwC;AACzE,UAAM,UAAe,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM;AACxD,QAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,UAAI,CAAC,OAAQ,OAAM,WAAW,SAAS,WAAW;AAClD,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAMA,OAAW,gBAAS,aAAa,OAAO,CAAC;AAAA,QAC/C,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,UAAU,WAAW;AAC3B,YAAM,cAAc,SAAS,UAAU;AAAA,IACzC;AACA,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAMA,OAAW,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM,CAAC;AAAA,MACrD,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AACD,iBAAa,KAAK;AAAA,MAChB,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,YAAY,UAAU;AAAA,MAC5B,UAAU;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,MACL,WAAW;AAAA,QACT,IAAI,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,CAACA,OAAW,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,QAC1D,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,QAAM,cAAmB,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM;AAC5D,QAAM,iBAAiB,oBAAoB;AAAA,IACzC,IAAI,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB,CAAC;AAED,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,QAAI,CAAC,OAAQ,OAAM,WAAW,aAAa,WAAW;AACtD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAMA,OAAW,gBAAS,aAAa,WAAW,CAAC;AAAA,MACnD,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,UAAU,WAAW;AAC3B,UAAM,cAAc,aAAa,cAAc;AAAA,EACjD;AACA,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN,MAAMA,OAAW,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM,CAAC;AAAA,IACrD,MAAM;AAAA,IACN,QAAQ,UAAU,MAAM,KAAK,GAAG,CAAC;AAAA,EACnC,CAAC;AACD,eAAa,KAAK;AAAA,IAChB,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE;AAAA,IAC3B,QAAQ;AAAA,IACR,MAAM,YAAY,cAAc;AAAA,IAChC,UAAU;AAAA,EACZ,CAAC;AAED,SAAO;AAAA,IACL,WAAW;AAAA,MACT,IAAI,MAAM;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,CAACA,OAAW,YAAK,aAAa,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,MAC1D,QAAQ,UAAU,MAAM,KAAK,GAAG,CAAC,gCAAiB,MAAM,EAAE;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAmBA,SAAS,oBAAoB,MAA2B;AACtD,QAAM,EAAE,IAAI,OAAO,SAAS,MAAM,IAAI;AACtC,QAAM,gBAAgB,WAAW,EAAE;AACnC,QAAM,iBAAiB,cAAc,QAAQ,YAAY,EAAE;AAC3D,QAAM,aAAa,MAAM,SAAS,SAAS;AAC3C,QAAM,aAAa,MAAM,SAAS,SAAS;AAC3C,QAAM,YAAY,MAAM,SAAS,QAAQ;AACzC,QAAM,aAAa,MAAM,SAAS,SAAS;AAE3C,QAAM,SAAS,aAAa,EAAE,IAAI,OAAO,MAAM,CAAC;AAEhD,QAAM,cAAwB;AAAA,IAC5B;AAAA,IACA,YAAY,aAAa,WAAW,aAAa,UAAU,aAAa,gBAAgB,aAAa,iBAAiB,cAAc;AAAA,EACtI;AACA,MACE,cACA,MAAM,WAAW,eAAe,gBAAgB,gBAChD;AACA,UAAM,WAAW,MAAM,UAAU,cAAc,eAAe,eAC3D,OAAO,CAAC,MAAM,MAAM,aAAa,EACjC,MAAM,GAAG,CAAC;AACb,eAAW,SAAS,UAAU;AAC5B,kBAAY;AAAA,QACV,kDAAkD,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAiB,CAAC;AACxB,OAAK;AAAA,IACH,oBAAoB,aAAa,qBAAqB,aAAa;AAAA,EACrE;AACA,MAAI,YAAY;AACd,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,OAAK,KAAK,GAAG;AACb,OAAK,KAAK,EAAE;AAEZ,MAAI,YAAY;AACd,SAAK;AAAA,MACH;AAAA,IACF;AACA,SAAK;AAAA,MACH,gBAAgB,EAAE;AAAA,IACpB;AACA,SAAK;AAAA,MACH;AAAA,IACF;AACA,SAAK,KAAK,EAAE;AAAA,EACd;AAEA,MAAI,WAAW;AAGb,SAAK;AAAA,MACH,gBAAgB,aAAa,cAAc,aAAa;AAAA,IAC1D;AACA,SAAK;AAAA,MACH;AAAA,IACF;AACA,SAAK;AAAA,MACH;AAAA,IACF;AACA,SAAK,KAAK,YAAY;AACtB,SAAK,KAAK,SAAS;AAAA,EACrB,OAAO;AACL,SAAK;AAAA,MACH,gBAAgB,aAAa,cAAc,aAAa;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,YAAY;AACd,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY;AACd,SAAK;AAAA,MACH,uDACE,MAAM,WAAW,eAAe,gBAAgB,gBAAgB;AAAA,QAC9D;AAAA,MACF,KAAK,KACP;AAAA,IACF;AAAA,EACF;AACA,OAAK,KAAK,iBAAiB,aAAa,iBAAiB;AACzD,OAAK,KAAK,IAAI;AAEd,SAAO,CAAC,QAAQ,IAAI,YAAY,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,EAAE;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAIX;AACT,QAAM,UAAU,KAAK,MAAM,WAAW,WAAW,CAAC;AAClD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,KAAK,EAAE;AAAA,IACxB,iBAAiB,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,IACvC,qEAA6B,KAAK,EAAE;AAAA,EACtC;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,mCAAU;AACrB,eAAW,KAAK,QAAS,OAAM,KAAK,eAAU,CAAC,EAAE;AAAA,EACnD;AACA,QAAM,KAAK,KAAK;AAChB,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,eAAe,uBACb,aACwB;AACxB,QAAM,OAAY,YAAK,aAAaC,aAAYC,YAAW;AAC3D,MAAI;AACJ,MAAI;AACF,cAAU,MAAS,aAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACA,QAAM,aAAa,QAChB,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EAAE,KAAK,WAAW,KAAK,CAAC,EACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK;AACR,QAAM,OAAO,WAAW,WAAW,SAAS,CAAC;AAC7C,SAAO,OAAY,YAAK,MAAM,IAAI,IAAI;AACxC;AAEA,eAAe,gBACb,YACwC;AACxC,QAAM,MAAM,MAAM,eAAoB,YAAK,YAAY,WAAW,CAAC;AACnE,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,YACA,OACA,MACwB;AACxB,QAAM,MAAW,eAAQ,MAAM,QAAQ,MAAM,KAAK;AAGlD,QAAM,SAAc,YAAK,YAAY,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE;AAC9D,QAAM,aAAa,MAAM,eAAe,MAAM;AAC9C,MAAI,eAAe,KAAM,QAAO;AAChC,MAAI,SAAS,cAAc,MAAM,UAAU,SAAS;AAClD,WAAO,eAAoB,YAAK,YAAY,MAAM,SAAS,OAAO,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AAIA,SAAS,YACP,OACA,UACe;AACf,MAAI,YAAY,SAAS,SAAS,EAAG,QAAO;AAC5C,QAAM,cAAc,MAAM,WAAW;AACrC,MAAI,eAAe,YAAY,SAAS,EAAG,QAAO;AAClD,SAAO,CAAC,cAAc;AACxB;AAEA,eAAeH,4BACb,aACA,cACe;AACf,QAAM,YAAgC,MAAM;AAAA,IAC1C;AAAA,EACF,KAAM,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE;AACxC,QAAM,MAAM,UAAU,UAAU;AAAA,IAC9B,CAACI,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,QAAM,QACJ,OAAO,IAAI,UAAU,UAAU,GAAG,IAAI;AACxC,QAAM,SAAS,oBAAI,IAA+B;AAClD,aAAW,KAAK,OAAO,aAAa,CAAC,EAAG,QAAO,IAAI,EAAE,IAAI,CAAC;AAC1D,aAAW,KAAK,aAAc,QAAO,IAAI,EAAE,IAAI,CAAC;AAChD,QAAM,OAAyB;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,EACvC;AACA,MAAI,OAAO,EAAG,WAAU,UAAU,GAAG,IAAI;AAAA,MACpC,WAAU,UAAU,KAAK,IAAI;AAClC,QAAM,uBAAuB,aAAa,SAAS;AACrD;AAmBA,SAAS,oBAAoB,QAAgB,IAAoB;AAC/D,QAAM,OAAO,WAAW,EAAE;AAC1B,QAAM,SAAS,IAAI,OAAO,MAAM,IAAI,mBAAmB,GAAG;AAE1D,MAAI,MAAM;AAGV,QAAM,IAAI;AAAA,IACR,IAAI;AAAA,MACF,2EAA2E,IAAI;AAAA,MAC/E;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAgB,SAAiB,GAAG,MAAM,SAAS,IAAI;AAAA,EACjE;AAGA,QAAM,IAAI,QAAQ,yBAAyB,CAAC,MAAM,SAAiB;AACjE,UAAM,eAAe,KAAK,QAAQ,QAAQ,CAAC,MAAc,SAAS,CAAC,EAAE;AACrE,WAAO,WAAW,YAAY;AAAA,EAChC,CAAC;AAGD,QAAM,IAAI;AAAA,IACR,IAAI,OAAO,8BAA8B,IAAI,sBAAsB,GAAG;AAAA,IACtE,CAAC,OAAO,QAAgB,MAAc,WACpC,GAAG,MAAM,SAAS,IAAI,GAAG,MAAM;AAAA,EACnC;AAGA,QAAM,IAAI;AAAA,IACR,IAAI;AAAA,MACF,oDAAoD,IAAI;AAAA,MACxD;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAgB,SAAiB,GAAG,MAAM,SAAS,IAAI;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,IAAoB;AACtC,SAAO,GACJ,MAAM,OAAO,EACb,OAAO,OAAO,EACd,IAAI,CAACA,OAAMA,GAAE,CAAC,EAAG,YAAY,IAAIA,GAAE,MAAM,CAAC,CAAC,EAC3C,KAAK,EAAE;AACZ;AAEA,SAAS,cAAc,UAAkB,IAAoB;AAE3D,QAAM,UAAU,SAAS,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC/D,QAAM,OAAO,QAAQ,WAAW,MAAM,IAClC,KAAK,QAAQ,MAAM,OAAO,MAAM,CAAC,KACjC,KAAK,OAAO;AAChB,SAAO,GAAG,IAAI,IAAI,EAAE;AACtB;AAEA,SAASH,OAAMG,IAAmB;AAChC,SAAOA,GAAE,MAAW,UAAG,EAAE,KAAK,GAAG;AACnC;;;AEhwBA,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAkBf,SAAS,gBAAgBC,IAAW,aAA6B;AACtE,MAAIC,OAAMD;AACV,MAAS,kBAAWA,EAAC,GAAG;AACtB,IAAAC,OAAW,gBAAS,aAAaD,EAAC;AAAA,EACpC;AACA,SAAOC,KAAI,MAAW,UAAG,EAAE,KAAK,GAAG;AACrC;AA2EO,SAAS,wBAAwB,SAAiC;AACvE,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAClC,QAAM,UAA2D;AAAA,IAC/D,SAAS,oBAAI,IAAI;AAAA,IACjB,UAAU,oBAAI,IAAI;AAAA,IAClB,aAAa,oBAAI,IAAI;AAAA,IACrB,SAAS,oBAAI,IAAI;AAAA,EACnB;AACA,aAAW,KAAK,SAAS;AACvB,UAAM,WAAW,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;AAC3C,QAAI,CAAC,SAAU,SAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;AAAA,EAC9C;AACA,QAAM,QAAyC;AAAA,IAC7C,CAAC,WAAW,wBAAO;AAAA,IACnB,CAAC,YAAY,4BAAQ;AAAA,IACrB,CAAC,aAAa,8BAAQ;AAAA,IACtB,CAAC,WAAW,yBAAQ;AAAA,EACtB;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,OAAO,SAAS,EAAG;AACvB,UAAM,KAAK,GAAG,KAAK,SAAI,OAAO,IAAI,cAAI;AACtC,UAAM,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,GAAG,MAC3C,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IAC7B;AACA,eAAW,KAAK,QAAQ;AACtB,YAAM,SAAS,EAAE,SAAS,WAAM,EAAE,MAAM,KAAK;AAC7C,YAAM,KAAK,YAAO,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,EAAE;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;;;AH7IA,IAAM,cAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,IAAM,iBAAiB,IAAIC,UAAQ,gBAAgB,EACvD;AAAA,EACC;AACF,EACC,SAAS,YAAY,+GAAoC,EACzD;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,aAAa,4FAAiB,EACrC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,KAAe,SAAyB;AACrD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,gBAAgB,WAAW,KAAK,KAAK;AAE3C,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA,KAAK,OAAO,CAAC;AAAA,MACb;AAAA,MACA,gBAAgB,KAAK,kBAAkB;AAAA,MACvC,mBAAmB,KAAK,qBAAqB;AAAA,MAC7C,QAAQ,KAAK,UAAU;AAAA,MACvB,YAAY,KAAK;AAAA,IACnB,CAAC;AAED,iBAAa,QAAQ,KAAK,UAAU,KAAK;AAAA,EAC3C,SAAS,KAAK;AACZ,WAAO,MAAM,0BAA0B,gBAAgB,GAAG,CAAC,EAAE;AAC7D,WAAO,MAAM,eAAe,QAAQ,IAAI,SAAS,KAAK,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,SAAS,WAAW,KAAoD;AACtE,MAAI,CAAC,OAAO,IAAI,KAAK,EAAE,WAAW,EAAG,QAAO;AAC5C,QAAM,QAAQ,IACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAM,MAAqB,CAAC;AAC5B,aAAWC,MAAK,OAAO;AACrB,UAAM,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,MAAMA,GAAE,YAAY,CAAC;AACzE,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,iBAAiBA,EAAC,aAAa,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IACzE;AACA,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAA4B,QAAuB;AACvE,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,MAAM,yDAAyD;AACtE,cAAQ,WAAW;AACnB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF,KAAK;AACH,aAAO,KAAK,yBAAyB,OAAO,UAAU,EAAE;AACxD;AAAA,IACF,KAAK;AACH;AAAA,EACJ;AAEA,QAAM,WAAW,OAAO,WAAW,OAAO,CAACA,OAAMA,GAAE,WAAW,UAAU;AACxE,QAAM,SAAS,OAAO,WAAW,OAAO,CAACA,OAAMA,GAAE,WAAW,eAAe;AAC3E,QAAM,YAAY,OAAO,WAAW,OAAO,CAACA,OAAMA,GAAE,WAAW,YAAY;AAC3E,QAAM,SAAS,OAAO,WAAW,OAAO,CAACA,OAAMA,GAAE,WAAW,SAAS;AAErE,SAAO;AAAA,IACL,GAAG,SAAS,eAAe,EAAE,4BAC3B,SAAS,MACX,cAAc,OAAO,MAAM,mBACzB,UAAU,MACZ,gBAAgB,OAAO,MAAM;AAAA,EAC/B;AACA,SAAO,KAAK,EAAE;AAEd,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,KAAK,WAAW;AACvB,eAAWA,MAAK,UAAU;AACxB,aAAO,KAAK,YAAOA,GAAE,EAAE,KAAKA,GAAE,MAAM,KAAK,GAAG,CAAC,GAAG;AAChD,iBAAW,OAAOA,GAAE,QAAS,QAAO,KAAK,gBAAW,GAAG,EAAE;AACzD,UAAIA,GAAE,OAAQ,QAAO,KAAK,SAASA,GAAE,MAAM,EAAE;AAAA,IAC/C;AACA,WAAO,KAAK,EAAE;AAAA,EAChB;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,yCAAyC;AACrD,eAAWA,MAAK,OAAQ,QAAO,KAAK,YAAOA,GAAE,EAAE,WAAMA,GAAE,UAAU,EAAE,EAAE;AACrE,WAAO,KAAK,EAAE;AAAA,EAChB;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,KAAK,iDAAiD;AAC7D,eAAWA,MAAK,UAAW,QAAO,KAAK,YAAOA,GAAE,EAAE,EAAE;AACpD,WAAO,KAAK,EAAE;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,SAAS;AACrB,eAAWA,MAAK,OAAQ,QAAO,KAAK,YAAOA,GAAE,EAAE,WAAMA,GAAE,UAAU,EAAE,EAAE;AACrE,WAAO,KAAK,EAAE;AAAA,EAChB;AAGA,MAAI,OAAO,cAAc,UAAU,SAAS,GAAG;AAC7C,WAAO;AAAA,MACL,mBAAmB,OAAO,cAAc,UAAU,MAAM;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,OAAO,cAAc,QAAQ,SAAS,GAAG;AAC3C,WAAO,KAAK,2DAA2D;AACvE,eAAW,KAAK,OAAO,cAAc,SAAS;AAC5C,aAAO,KAAK,YAAO,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,EAAE,MAAM,YAAO,EAAE,OAAO,EAAE;AAAA,IACpE;AACA,WAAO,KAAK,EAAE;AAAA,EAChB;AAGA,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO,KAAK,gCAAO;AACnB,eAAW,QAAQ,wBAAwB,OAAO,WAAW,GAAG;AAC9D,aAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACzB;AAAA,EACF;AACF;;;AhBvKO,IAAM,YAAY,IAAIC,UAAQ,IAAI,EAAE;AAAA,EACzC;AACF;AAEA,UAAU,WAAWC,YAAW;AAChC,UAAU,WAAWC,WAAU;AAC/B,UAAU,WAAWC,YAAW;AAChC,UAAU,WAAW,cAAc;AACnC,UAAU,WAAW,cAAc;;;AoBXnC,SAAS,WAAAC,iBAAe;;;ACJxB,SAAS,WAAAC,iBAAe;;;ACiBxB,YAAYC,YAAU;AACtB,SAAS,iBAAAC,sBAAqB;AAQ9B;AAAA,EACE,yBAAAC;AAAA,EACA;AAAA,EACA,gCAAAC;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,MAAMC,8BAA6B,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,gBAAgBD,oBAAmB,gBAAgB;AACzD,QAAM,aAAa,MAAME,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,CAACC,OAAMA,GAAE,YAAY,mBAAmBA,GAAE,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,eAAeJ,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,MAAMC,8BAA6B,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;;;ADtTO,IAAMI,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,YAAY,oEAA2C,EAChE,OAAO,oBAAoB,oEAAsC,EACjE,OAAO,eAAe,0EAAc,EACpC;AAAA,EACC,OAAO,KAAe,SAAoD;AACxE,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;AAAA,UAC/D;AAAA,QACF,CAAC;AAAA,MACH;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,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AE5EF,SAAS,WAAAC,iBAAe;AAKjB,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,4DAA4D,OAAO,OAAO;AAAA,IAC5E;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AChCH,SAAS,WAAAC,iBAAe;AAKjB,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;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AClBI,IAAMC,kBAAiB,mBAAmB,QAAQ;;;ALAlD,IAAM,eAAe,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EAChD;AACF;AAEA,aAAa,WAAWC,WAAU;AAClC,aAAa,WAAWC,YAAW;AACnC,aAAa,WAAWC,oBAAmB;AAC3C,aAAa,WAAWC,eAAc;;;AMjBtC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,iBAAe;;;ACaxB,IAAM,yBAAyB;AAkB/B,eAAsB,aACpB,SAC6B;AAC7B,QAAM,EAAE,aAAa,KAAK,UAAU,IAAI;AACxC,QAAM,cAAc,QAAQ,eAAe;AAE3C,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAM,QAAQ,QAAQ,UAAU;AAChC,MAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,UAAU,YAAY,IAAI,MAAM,WAAW,WAAW;AAE9D,QAAM,WAAW,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1D,QAAM,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AACpD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,wBAAwB,QACrB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,IACX,cAAc,CAAC;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAED,QAAM,YAAgC,MAAM;AAAA,IAC1C;AAAA,EACF,KAAM,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE;AAExC,QAAM,MAAM,UAAU,UAAU,UAAU,CAACC,OAAMA,GAAE,YAAY,WAAW;AAC1E,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,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,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,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;;;ADtGO,IAAMC,cAAa,IAAIC,UAAQ,KAAK,EACxC,YAAY,0HAA+C,EAC3D,SAAS,YAAY,mEAA+C,EACpE,OAAO,eAAe,sHAA4B,EAClD;AAAA,EACC,OACE,KACA,SACG;AACH,QAAI;AACF,YAAM,MAAM,UAAU;AACtB,YAAM,cAAc,IAAI,eAAe;AAEvC,aAAO,KAAK,sBAAsB,IAAI,KAAK,IAAI,CAAC,EAAE;AAElD,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA;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,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,UAAU,gBAAgB,GAAG;AACnC,UAAI,QAAQ,WAAW,oBAAoB,GAAG;AAC5C,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,MAAM,yBAAyB,OAAO,EAAE;AAAA,MACjD;AACA,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AExDF,SAAS,WAAAC,iBAAe;AAMjB,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,+FAAwC,EACpD,OAAO,eAAe,kDAAe,EACrC,OAAO,UAAU,+BAAW,EAC5B;AAAA,EACC,OAAO,SAAkD;AACvD,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,aAAa;AAAA,MACf,CAAC;AAED,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,eAAe,GAAG,MAAM,CAAC,IAAI,IAAI;AACvF;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,UACL,KAAK,YACD,yBACA;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,OAAO,SAAS,CAAC;AAAA,MACtD;AACA,aAAO;AAAA,QACL,GAAG,SAAI,OAAO,OAAO,CAAC,KAAK,SAAI,OAAO,SAAS,CAAC;AAAA,MAClD;AAEA,iBAAW,KAAK,SAAS;AACvB,cAAM,SAAS,EAAE,YAAY,cAAc;AAC3C,eAAO;AAAA,UACL,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW;AAAA,QAC9F;AAAA,MACF;AAEA,aAAO,KAAK,EAAE;AACd,aAAO;AAAA,QACL,UAAU,KAAK,SAAS,UAAU,IAAI,KAAK,GAAG,KAAK,cAAc;AAAA,MACnE;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,0BAA0B,gBAAgB,GAAG,CAAC,EAAE;AAC7D,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;AC7DK,IAAMC,kBAAiB,mBAAmB,QAAQ;;;AJGlD,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAWC,WAAU;AACnC,cAAc,WAAWC,YAAW;AACpC,cAAc,WAAWC,eAAc;;;AKPvC,SAAS,WAAAC,iBAAe;;;ACJxB,SAAS,WAAAC,iBAAe;AAOjB,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,OAAO,KAAe,SAAoD;AACxE,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;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MACH;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,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;;;ACxEF,SAAS,WAAAC,iBAAe;AAKjB,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,+DAA+D,OAAO,OAAO;AAAA,IAC/E;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AChCH,SAAS,WAAAC,iBAAe;AAKjB,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;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,WAAW,gBAAgB,GAAG,CAAC,EAAE;AAC9C,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AHnBI,IAAM,mBAAmB,IAAIC,UAAQ,WAAW,EAAE;AAAA,EACvD;AACF;AAEA,iBAAiB,KAAK,aAAa,MAAM;AACvC,UAAQ;AAAA,IACN;AAAA,EACF;AACF,CAAC;AAED,iBAAiB,WAAWC,WAAU;AACtC,iBAAiB,WAAWC,YAAW;AACvC,iBAAiB,WAAWC,oBAAmB;;;AIrB/C,SAAS,WAAAC,iBAAe;;;ACkBxB,SAAS,WAAAC,iBAAe;AACxB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,QAAAC,cAAY;;;ACpB9B,SAAS,cAAc,aAAa,gBAAgB;AACpD,SAAS,QAAAC,cAAY;AAGd,IAAM,cAAc;AAEpB,SAAS,gBAAgB,GAA2C;AACzE,MAAI,MAAM,OAAW,QAAO;AAC5B,QAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAC/B,SAAO,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAC3C;AAEO,SAAS,YAAY,SAAiB,UAAgC;AAC3E,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,UAAUA,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,YAAMC,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;AACA,SAAO;AACT;;;ADgBO,IAAM,qBAAqB,IAAIC,UAAQ,SAAS,EACpD;AAAA,EACC;AACF,EACC,OAAO,gBAAgB,+DAA2C,EAClE;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,aAAa,yEAAuB,IAAI,EAC/C,OAAO,UAAU,wDAAqB,EACtC,OAAO,CAAC,SAAyB;AAChC,QAAM,UAAUC;AAAA,IACd,KAAK,OAAOC,OAAK,QAAQ,IAAI,GAAG,eAAe,QAAQ,IAAI;AAAA,EAC7D;AACA,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,QAAQ;AAC7C,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,UAAU,MAAM;AACvC,CAAC;AAEI,SAAS,YAAY,SAAsB,KAA4B;AAC5E,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,YAAY,KAAK,EAAE;AACzC,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,UACpD,EAAE,QAAQ,GACZ;AAAA,MACF;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;;;AEzOA,SAAS,WAAAC,iBAAe;AACxB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAuCvB,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,+DAA2C,EAClE,OAAO,UAAU,wDAAqB,EACtC,OAAO,CAAC,SAAuB;AAC9B,QAAM,UAAUC;AAAA,IACd,KAAK,OAAOC,OAAK,QAAQ,IAAI,GAAG,eAAe,QAAQ,IAAI;AAAA,EAC7D;AACA,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,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;AAEI,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;AAAA,UACxC,SAAS,EAAE,QAAQ,GAAG;AAAA,QACxB,CAAC;AAAA,MACH;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,KAC5B,EAAE,QAAQ,EAAE,SAAS;AAC3B,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;;;AHpRO,IAAM,cAAc,IAAIC,UAAQ,MAAM,EAAE;AAAA,EAC7C;AACF;AAEA,YAAY,WAAW,kBAAkB;AACzC,YAAY,WAAW,gBAAgB;;;AITvC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,iBAAe;AACxB,YAAYC,cAAa;;;ACDzB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AACpB,SAAS,aAAa;AAWtB,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc9B,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAmFjC,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,CAAC,gCAAgC,WAAW;AAUnE,eAAsB,YACpB,SAC4B;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,sBAAsB,CAAC;AAAA,IACvB,yBAAyB,CAAC;AAAA,EAC5B,IAAI;AAEJ,QAAM,mBAAwB,YAAK,aAAa,kBAAkB;AAClE,QAAM,sBAA2B,YAAK,aAAa,sBAAsB;AAEzE,QAAM,uBAAuB,MAAM,WAAW,gBAAgB;AAC9D,QAAM,0BAA0B,MAAM,WAAW,mBAAmB;AAIpE,QAAM,sBACJ,mBAAmB,UAAU,oBAAoB,SAAS;AAC5D,QAAM,yBACJ,sBAAsB,UAAU,uBAAuB,SAAS;AAElE,QAAM,mBAAmB,CAAC,wBAAwB,CAAC;AACnD,QAAM,sBACJ,CAAC,2BAA2B,CAAC;AAE/B,MAAI,CAAC,oBAAoB,CAAC,qBAAqB;AAC7C,WAAO,EAAE,QAAQ,sBAAsB;AAAA,EACzC;AAGA,MAAI,CAAC,aAAa;AAChB,UAAM,gBAAgB;AAAA,MACpB,GAAI,mBAAmB,cAAc,CAAC;AAAA,MACtC,GAAI,sBAAsB,iBAAiB,CAAC;AAAA,IAC9C;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,KAAK,SAAS,WAAW;AAC/B,YAAM,OACJ,OAAO,SACH,CAAC,OAAO,SAAS,GAAG,aAAa,IACjC,OAAO,SACP,CAAC,OAAO,MAAM,GAAG,aAAa,IAC9B,CAAC,WAAW,cAAc,GAAG,aAAa;AAEhD,aAAO,KAAK,4BAA4B,EAAE,KAAK;AAC/C,YAAM,MAAM,IAAI,MAAM,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IAC9D;AAAA,EACF;AAOA,MAAI,oBAAoB,oBAAoB,SAAS,GAAG;AACtD,eAAWC,QAAO,qBAAqB;AACrC,YAAM,WAAgB,YAAK,aAAaA,IAAG,GAAG,WAAW;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,uBAAuB,uBAAuB,SAAS,GAAG;AAC5D,eAAWA,QAAO,wBAAwB;AACxC,YAAM,WAAgB,YAAK,aAAaA,IAAG,GAAG,WAAW;AAAA,IAC3D;AAAA,EACF;AAGA,MAAI,cAAc;AAClB,MAAI,iBAAiB;AAErB,MAAI,kBAAkB;AACpB,UAAM,cAAc,kBAAkB,qBAAqB;AAC3D,WAAO,MAAM,iCAA4B,gBAAgB,EAAE;AAC3D,kBAAc;AAAA,EAChB;AAEA,MAAI,qBAAqB;AACvB,UAAM,cAAc,qBAAqB,wBAAwB;AACjE,WAAO,MAAM,qCAAgC,mBAAmB,EAAE;AAClE,qBAAiB;AAAA,EACnB;AAMA,QAAM,qBAAqB,MAAM,wBAAwB,WAAW;AAQpE,MAAI,8BAA8B;AAClC,MAAI,CAAC,uBAAuB,yBAAyB;AACnD,QAAI;AACF,YAAM,kBAAqB,kBAAa,qBAAqB,OAAO;AACpE,YAAM,mBACJ,gBAAgB,SAAS,uCAAuC,KAChE,gBAAgB,SAAS,sCAAsC;AACjE,YAAM,iBACJ,gBAAgB,SAAS,kBAAkB,KAC3C,gBAAgB,SAAS,sBAAsB;AACjD,UAAI,CAAC,oBAAoB,CAAC,gBAAgB;AACxC,sCAA8B;AAC9B,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,KAAK,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,sBACE,eACA,mBAAmB,WACnB,oBAAoB,SAAS;AAAA,IAC/B,yBACE,kBACA,sBAAsB,WACtB,uBAAuB,SAAS;AAAA,IAClC,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,SAAS,aAA8C;AAC9D,MAAO,gBAAgB,YAAK,aAAa,gBAAgB,CAAC,EAAG,QAAO;AACpE,MAAO,gBAAgB,YAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAC/D,SAAO;AACT;AAUA,eAAe,wBAAwB,aAAuC;AAC5E,QAAM,UAAe,YAAK,aAAa,cAAc;AACrD,QAAM,MAAM,MAAM,eAAe,OAAO;AACxC,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,GAAG;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,UAAW,IAAI,WAAW,CAAC;AACjC,MAAI,UAAU;AAEd,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,OAAO;AACf,cAAU;AAAA,EACZ;AACA,MAAI,CAAC,QAAQ,UAAU,GAAG;AACxB,YAAQ,UAAU,IAAI;AACtB,cAAU;AAAA,EACZ;AAEA,MAAI,SAAS;AAEX,UAAM,WAAW,SAAS,WAAW;AACrC,QAAI,UAAU;AACd,UAAM,cAAc,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AAChE,WAAO,MAAM,mDAAmD;AAAA,EAClE;AACA,SAAO;AACT;;;AD3TO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC,OAAO,aAAa,wDAAW,EAC/B,OAAO,OAAO,SAAsB;AACnC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,QAAI,CAAC,eAAe,WAAW,GAAG;AAChC,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAMA,UAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AACjD,QAAI,CAAC,KAAK,OAAO,eAAe;AAC9B,YAAM,iBAAiB,MAAc,iBAAQ;AAAA,QAC3C,SACE;AAAA,MACJ,CAAC;AACD,UAAY,kBAAS,cAAc,KAAK,CAAC,gBAAgB;AACvD,eAAO,KAAK,YAAY;AACxB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,YAAY,EAAE,YAAY,CAAC;AAEhD,QAAI,OAAO,WAAW,uBAAuB;AAC3C,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,mBAAmB;AAClC,QAAI,OAAO,QAAQ;AACjB,aAAO,KAAK,sBAAsB;AAAA,IACpC;AACA,QAAI,OAAO,WAAW;AACpB,aAAO,KAAK,0BAA0B;AAAA,IACxC;AACA,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,uDAAuD;AACnE,WAAO,KAAK,uDAAuD;AAAA,EACrE,SAAS,KAAK;AACZ,WAAO,MAAM,8BAA8B,gBAAgB,GAAG,CAAC,EAAE;AACjE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ADnEI,IAAM,cAAc,IAAIC,UAAQ,MAAM,EAAE;AAAA,EAC7C;AACF;AAEA,YAAY,WAAWC,YAAW;;;AGPlC,SAAS,WAAAC,iBAAe;AACxB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;;;ACFpB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAoCtB,IAAM,oBAAoB,oBAAI,IAAY;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAYD,eAAsB,mBACpB,KAC6B;AAC7B,QAAM,SAAc,eAAQ,GAAG;AAE/B,QAAM,YAAY,aAAa,MAAM;AACrC,QAAM,eAAe,MAAM,WAAW,SAAS;AAC/C,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,cAAc;AAAA,MACd,gBAAgB,MAAM,WAAgB,YAAK,QAAQ,cAAc,CAAC;AAAA,MAClE,oBAAoB,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAS,aAAQ,MAAM;AAAA,EACnC,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AAGpD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,QAAM,cAAc,QAAQ,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;AACnE,QAAMC,kBAAiB,QAAQ,SAAS,cAAc;AAEtD,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,oBAAoB,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK;AAAA,IACL,cAAc;AAAA,IACd,gBAAAA;AAAA,IACA,oBAAoB,YAAY,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,EACpD;AACF;;;ACzHA,YAAY,YAAY;AACxB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAuEtB,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB,CAAC,QAAQ;AAEvC,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,yBAAyB,CAAC,kBAAkB;AAClD,IAAM,wBAAwB,CAAC,mBAAmB;AAGlD,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,eAAe,MAAM,QAAkC;AACrD,MAAI;AACF,UAAMC,QAAO,MAAS,UAAK,MAAM;AACjC,WAAOA,MAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,cAAc,QAAkC;AAC7D,MAAI;AACF,UAAM,UAAU,MAAS,aAAQ,MAAM;AACvC,WAAO,QAAQ,SAAS;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,YAAY,OAAyB;AAC5C,QAAM,OAAc,kBAAW,QAAQ;AACvC,aAAWC,MAAK,CAAC,GAAG,KAAK,EAAE,KAAK,EAAG,MAAK,OAAOA,EAAC;AAChD,SAAO,UAAU,KAAK,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD;AAOA,eAAe,gBAAgB,KAA+C;AAC5E,QAAM,MAAM,MAAM,eAAoB,YAAK,KAAK,cAAc,CAAC;AAC/D,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,oBAAoB,KAA4C;AACvE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IACJ,IAAI,cAAc,eAAe,IAAI,iBAAiB,eAAe;AACvE,MAAI,CAAC,EAAG,QAAO;AAEf,QAAM,IAAI,QAAQ,KAAK,CAAC;AACxB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,OAAO,SAAS,EAAE,CAAC,GAAI,EAAE;AACvC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO;AACT;AAIA,eAAe,eAAe,KAAoC;AAChE,QAAM,SAAc,YAAK,KAAK,WAAW;AACzC,QAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,QAAM,SAAS,YAAY;AAC3B,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO,SAAS,CAAC,WAAW,IAAI,CAAC;AAAA,IACjC,aAAa,SAAS,YAAY,CAAC,OAAQ,CAAC,IAAI;AAAA,IAChD,qBAAqB,SAAS,kBAAkB;AAAA,IAChD,qBAAqB,CAAC,iBAAiB,aAAa,MAAM;AAAA,EAC5D;AACF;AAEA,eAAe,qBAAqB,KAAoC;AACtE,QAAM,SAAc,YAAK,KAAK,iBAAiB;AAC/C,QAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,QAAM,SAAS,YAAY;AAC3B,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO,SAAS,CAAC,iBAAiB,IAAI,CAAC;AAAA,IACvC,aAAa,SAAS,YAAY,CAAC,OAAQ,CAAC,IAAI;AAAA,IAChD,qBAAqB,SAAS,gBAAgB;AAAA,IAC9C,qBAAqB,CAAC,eAAe,aAAa,MAAM;AAAA,EAC1D;AACF;AAEA,eAAe,qBAAqB,KAAoC;AACtE,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,aAAWC,QAAO,4BAA4B;AAC5C,UAAM,IAAI,MAAM,eAAoB,YAAK,KAAKA,IAAG,CAAC;AAClD,QAAI,MAAM,MAAM;AACd,cAAQ,KAAKA,IAAG;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AACA,QAAM,MAAM,MAAM,gBAAgB,GAAG;AACrC,QAAM,gBAAgB,oBAAoB,GAAG;AAC7C,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC9C,qBAAqB,SAAS,qBAAqB;AAAA,IACnD,qBAAqB,CAAC,oBAAoB,aAAa,MAAM;AAAA,IAC7D,MAAM,EAAE,cAAc;AAAA,EACxB;AACF;AAEA,eAAe,aAAa,KAAoC;AAC9D,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,aAAWA,QAAO,wBAAwB;AACxC,UAAM,IAAI,MAAM,eAAoB,YAAK,KAAKA,IAAG,CAAC;AAClD,QAAI,MAAM,MAAM;AACd,cAAQ,KAAKA,IAAG;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AACA,aAAWA,QAAO,uBAAuB;AACvC,UAAM,MAAW,YAAK,KAAKA,IAAG;AAC9B,QAAK,MAAM,MAAM,GAAG,KAAO,MAAM,cAAc,GAAG,GAAI;AACpD,cAAQ,KAAK,GAAGA,IAAG,GAAG;AAAA,IACxB;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,SAAS,SAAS,IAAI,YAAY,QAAQ,IAAI;AAAA,IAC3D,qBAAqB,SAAS,YAAY;AAAA,IAC1C,qBAAqB,CAAC,WAAW,WAAW,aAAa,MAAM;AAAA,EACjE;AACF;AAEA,eAAe,eAAe,KAAoC;AAChE,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,aAAWA,QAAO,sBAAsB;AACtC,UAAM,IAAI,MAAM,eAAoB,YAAK,KAAKA,IAAG,CAAC;AAClD,QAAI,MAAM,MAAM;AACd,cAAQ,KAAKA,IAAG;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC9C,qBAAqB,SAAS,WAAW;AAAA,IACzC,qBAAqB,CAAC,UAAU,eAAe,aAAa,MAAM;AAAA,EACpE;AACF;AAEA,eAAe,mBAAmB,KAAoC;AACpE,QAAM,UAAoB,CAAC;AAC3B,aAAWA,QAAO,wBAAwB;AACxC,QAAI,MAAM,WAAgB,YAAK,KAAKA,IAAG,CAAC,EAAG,SAAQ,KAAKA,IAAG;AAAA,EAC7D;AACA,aAAWA,QAAO,uBAAuB;AACvC,UAAM,MAAW,YAAK,KAAKA,IAAG;AAC9B,QAAK,MAAM,MAAM,GAAG,KAAO,MAAM,cAAc,GAAG,GAAI;AACpD,cAAQ,KAAK,GAAGA,IAAG,GAAG;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,iBAAiB;AACrB,MAAI;AACF,UAAM,QAAa,YAAK,KAAK,mBAAmB;AAChD,QAAI,MAAM,MAAM,KAAK,GAAG;AACtB,YAAM,UAAU,MAAS,aAAQ,KAAK;AACtC,uBAAiB,QAAQ;AAAA,QACvB,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,KAAK;AAAA,MAC/C,EAAE;AAAA,IACJ;AAAA,EACF,QAAQ;AAAA,EAER;AACA,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,qBAAqB,SAAS,kBAAkB;AAAA,IAChD,qBAAqB,CAAC,iBAAiB,mBAAmB,WAAW;AAAA,IACrE,MAAM,EAAE,eAAe;AAAA,EACzB;AACF;AAUA,eAAsB,gBAAgB,KAAsC;AAC1E,QAAM,SAAc,eAAQ,GAAG;AAC/B,QAAM,QAAwB,MAAM,QAAQ,IAAI;AAAA,IAC9C,eAAe,MAAM;AAAA,IACrB,qBAAqB,MAAM;AAAA,IAC3B,qBAAqB,MAAM;AAAA,IAC3B,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,mBAAmB,MAAM;AAAA,IACzB,sBAAsB,MAAM;AAAA,EAC9B,CAAC;AACD,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,gBAAgB,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM;AAAA,EAC5C;AACF;AAEA,eAAe,mBAAmB,KAAoC;AACpE,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,aAAWA,QAAO,0BAA0B;AAC1C,UAAM,IAAI,MAAM,eAAoB,YAAK,KAAKA,IAAG,CAAC;AAClD,QAAI,MAAM,MAAM;AACd,cAAQ,KAAKA,IAAG;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC9C,qBAAqB,SAAS,UAAU;AAAA,IACxC,qBAAqB,CAAC,SAAS,oBAAoB,aAAa,MAAM;AAAA,EACxE;AACF;AAEA,eAAe,sBAAsB,KAAoC;AACvE,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,aAAWA,QAAO,6BAA6B;AAC7C,UAAM,IAAI,MAAM,eAAoB,YAAK,KAAKA,IAAG,CAAC;AAClD,QAAI,MAAM,MAAM;AACd,cAAQ,KAAKA,IAAG;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,SAAS;AAChC,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC9C,qBAAqB,SAAS,UAAU;AAAA,IACxC,qBAAqB,CAAC,SAAS,oBAAoB,aAAa,MAAM;AAAA,EACxE;AACF;;;ACnYA,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AACtB,SAAS,oBAAAC,mBAAkB,wBAAAC,6BAA4B;AA8EhD,IAAM,uBAAuB;AAsBpC,eAAsB,oBACpB,SACoC;AACpC,QAAM,EAAE,aAAa,SAAS,SAAS,IAAI;AAC3C,QAAM,OAAO,QAAQ,QAAQ;AAG7B,QAAM,UAAU,CAAC,GAAG,QAAQ,EAAE;AAAA,IAC5B,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC;AAAA,EAC9D;AAEA,QAAM,WAAqB,CAAC;AAC5B,QAAM,kBAA4B,CAAC;AACnC,aAAW,MAAM,SAAS;AACxB,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,mBAAmB,aAAa,EAAE;AACrE,aAAS,KAAK,OAAO;AACrB,QAAI,QAAS,iBAAgB,KAAK,EAAE;AAAA,EACtC;AAEA,QAAM,SAAc,YAAK,aAAa,WAAW;AACjD,QAAM,eAAe,MAAM,WAAW,MAAM;AAC5C,QAAM,eAAe,eAAe,EAAE,SAAS,SAAS,CAAC;AACzD,QAAM,cAAc,uBAAuB,EAAE,SAAS,SAAS,CAAC;AAEhE,MAAI;AACJ,MAAI;AAEJ,MAAI,CAAC,cAAc;AACjB,oBAAgB;AAChB,YAAQ;AAAA,EACV,OAAO;AAEL,UAAM,WAAW,QAAQ,WAAW;AACpC,QAAI,SAAS,iBAAiB;AAC5B,YAAM,WAAY,MAAM,eAAe,MAAM,KAAM;AACnD,UAAIC,kBAAiB,UAAU,oBAAoB,GAAG;AACpD,wBAAgBC;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ;AAAA,MACV,OAAO;AAKL,cAAM,UAAU,iBAAiB,WAAW;AAC5C,wBAAgB,GAAG,OAAO;AAAA;AAAA,EAAO,iBAAiB;AAAA;AAAA,EAAO,SAAS,UAAU,CAAC;AAC7E,gBAAQ;AAAA,MACV;AAAA,IACF,OAAO;AAEL,sBAAgB;AAChB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAS,eAAU,QAAQ,eAAe,MAAM;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,WAAW,IAAoB;AACtC,MAAI,GAAG,WAAW,oBAAoB,EAAG,QAAO;AAChD,MAAI,GAAG,WAAW,kBAAkB,EAAG,QAAO;AAC9C,SAAO;AACT;AAEA,eAAe,mBACb,aACA,SACgD;AAChD,QAAM,YAAiB;AAAA,IACrB,mBAAmB,aAAa,OAAO;AAAA,IACvC;AAAA,EACF;AACA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,OAAO,OAAO,EAAE;AAC3B,MAAI,QAAsC;AAC1C,MAAI,UAAU;AACd,MAAI;AACF,UAAM,MAAM,MAAS,cAAS,WAAW,MAAM;AAC/C,YAAQ,wBAAwB,GAAG;AAAA,EACrC,QAAQ;AAEN,cAAU;AAAA,EACZ;AAEA,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,KAAK,MAAM,UAAU,EAAE;AAAA,EACpC;AACA,QAAM;AAAA,IACJ,kBACE,OAAO,WAAW,kGACpB;AAAA,EACF;AACA,QAAM;AAAA,IACJ,eAAe,OAAO,QAAQ,+FAAyB;AAAA,EACzD;AACA,MAAI,OAAO,aAAa;AACtB,UAAM,KAAK,2BAA2B,MAAM,WAAW,EAAE;AAAA,EAC3D;AACA,QAAM,KAAK,mDAAyC,OAAO,aAAa;AACxE,SAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,QAAQ;AAC9C;AAEA,SAAS,eAAe,MAAuD;AAC7E,QAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,QAAM,cAAc,uBAAuB,EAAE,SAAS,SAAS,CAAC;AAChE,QAAM,UAAU,iBAAiB,WAAW;AAC5C,SAAO,GAAG,OAAO;AAAA;AAAA,EAAO,iBAAiB;AAAA;AAC3C;AAUO,SAAS,uBAAuB,MAG5B;AACT,QAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,QAAM,aACJ,SAAS,SAAS,IACd,SAAS,KAAK,MAAM,IACpB;AACN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKe,OAAO;AAAA;AAAA,EAE7B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBZ;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,qCAAqC,oBAAoB;AAAA,EAAU,IAAI;AAAA,kCAAqC,oBAAoB;AACzI;AAMA,IAAM,oBAAoB;AAAA;AAanB,SAAS,wBACd,aAC8B;AAC9B,QAAM,cAAc,wBAAwB,WAAW;AACvD,MAAI,eAAe,KAAM,QAAO;AAGhC,QAAM,WAAW,YACd,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,MAAI,aAAa;AACjB,aAAW,QAAQ,UAAU;AAC3B,QAAI,4CAA4C,KAAK,IAAI,EAAG;AAC5D,iBAAa,aAAa,GAAG,UAAU,IAAI,IAAI,KAAK;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,YAAY,WAAW,KAAK;AAAA,IAC5B,SAAS,eAAe,aAAa,eAAe;AAAA,IACpD,MAAM,eAAe,aAAa,OAAO;AAAA,IACzC,aAAa,eAAe,aAAa,mBAAmB;AAAA,EAC9D;AACF;AAMA,SAAS,wBAAwB,aAAoC;AACnE,QAAM,QAAQ,YAAY,MAAM,IAAI;AAGpC,MAAI,MAAM,CAAC,GAAG,KAAK,MAAM,MAAO,QAAO;AACvC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,MAAM,CAAC,GAAG,KAAK,MAAM,OAAO;AAC9B,eAAS;AACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,GAAI,QAAO;AAC1B,QAAM,UAAU,MAAM,MAAM,GAAG,MAAM;AAGrC,MAAI,WAAW;AACf,MAAI,cAA6B;AACjC,MAAI,YAA6C;AACjD,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,2CAA2C;AACvE,QAAI,GAAG;AACL,iBAAW;AACX,YAAM,aAAa,EAAE,CAAC,KAAK,IAAI,KAAK;AACpC,YAAM,OAAO,EAAE,CAAC,KAAK;AACrB,UAAI,UAAU,WAAW,GAAG,EAAG,aAAY;AAAA,eAClC,UAAU,WAAW,GAAG,EAAG,aAAY;AAAA,WAC3C;AACH,oBAAY;AACZ,sBAAc;AAAA,MAChB;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa,GAAI,QAAO;AAE5B,MAAI,cAAc,UAAU;AAC1B,WAAO,eAAe;AAAA,EACxB;AAGA,QAAM,OAAiB,CAAC;AAExB,MAAI,cAAc;AAClB,WAAS,IAAI,WAAW,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAClD,UAAM,OAAO,QAAQ,CAAC,KAAK;AAC3B,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB,WAAK,KAAK,EAAE;AACZ;AAAA,IACF;AACA,UAAM,cAAc,KAAK,MAAM,QAAQ;AACvC,UAAM,SAAS,cAAc,YAAY,CAAC,EAAG,SAAS;AACtD,QAAI,WAAW,EAAG;AAClB,QAAI,gBAAgB,GAAI,eAAc;AACtC,QAAI,SAAS,YAAa;AAC1B,SAAK,KAAK,KAAK,MAAM,WAAW,CAAC;AAAA,EACnC;AAEA,SAAO,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,MAAM,GAAI,MAAK,IAAI;AACjE,SAAO,KAAK,KAAK,IAAI;AACvB;AAQA,SAAS,eAAe,aAAqB,QAA+B;AAC1E,QAAM,UAAU,CAAC,iBAAiB,SAAS,mBAAmB;AAC9D,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,MAAI,YAAY;AAChB,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,mBAAmB,QACtB,YAAY,EACZ,WAAW,OAAO,YAAY,CAAC;AAClC,QAAI,CAAC,aAAa,kBAAkB;AAClC,kBAAY;AACZ,gBAAU,KAAK,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK,CAAC;AAClD;AAAA,IACF;AACA,QAAI,WAAW;AACb,YAAM,gBAAgB,QAAQ;AAAA,QAC5B,CAAC,MACC,MAAM,UAAU,QAAQ,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;AAAA,MACpE;AACA,UAAI,cAAe;AACnB,UAAI,YAAY,IAAI;AAElB,YAAI,UAAU,UAAU,SAAS,CAAC,MAAM,GAAI;AAC5C,kBAAU,KAAK,EAAE;AACjB;AAAA,MACF;AACA,gBAAU,KAAK,OAAO;AAAA,IACxB;AAAA,EACF;AACA,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,UACZ,OAAO,CAAC,MAAM,MAAM,EAAE,EACtB,KAAK,GAAG,EACR,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACR,SAAO,UAAU;AACnB;;;ACxZA,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AACtB,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAAC,kBAAiB;AAI1B,IAAMC,aAAYC,WAAUC,KAAI;AA4BhC,eAAe,qBACb,aACyB;AACzB,MAAI,MAAM,WAAgB,YAAK,aAAa,gBAAgB,CAAC,EAAG,QAAO;AACvE,MAAI,MAAM,WAAgB,YAAK,aAAa,qBAAqB,CAAC;AAChE,WAAO;AACT,MAAI,MAAM,WAAgB,YAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAClE,MAAI,MAAM,WAAgB,YAAK,aAAa,UAAU,CAAC,EAAG,QAAO;AACjE,MAAI,MAAM,WAAgB,YAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAClE,SAAO;AACT;AAEA,SAAS,kBAAkB,IAA4B;AACrD,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAQA,eAAsB,mBACpB,SAC4B;AAC5B,QAAM,EAAE,aAAa,iBAAiB,cAAc,MAAM,IAAI;AAE9D,QAAM,UAAe,YAAK,aAAa,cAAc;AACrD,QAAM,MAAM,MAAM,eAAe,OAAO;AACxC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR,6BAA6B,WAAW;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,MAAM,GAAG;AAK1B,QAAM,eAAe;AAAA,IACnB,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACT;AAEA,QAAM,QAAgC,CAAC;AACvC,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC3D,QAAI,aAAa,IAAI,GAAG;AACtB,cAAQ,IAAI,IAAI,aAAa,IAAI;AAAA,IACnC,OAAO;AACL,YAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,QAAI,CAAC,IAAI,aAAc,KAAI,eAAe,CAAC;AAC3C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,aAAa,IAAI,IAAI;AAAA,IAC3B;AAEA,QAAI,eAAe,OAAO;AAAA,MACxB,OAAO,QAAQ,IAAI,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,IACxE;AAEA,UAAS,eAAU,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,MAAM,OAAO;AACxE,WAAO;AAAA,MACL,4BAA4B,OAAO,KAAK,KAAK,EAAE,MAAM;AAAA,IACvD;AAAA,EACF;AAGA,QAAM,iBAAiB,MAAM,qBAAqB,WAAW;AAC7D,MAAI,YAAY;AAEhB,MAAI,CAAC,eAAe,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjD,UAAM,MAAM,kBAAkB,cAAc;AAC5C,WAAO,KAAK,aAAa,GAAG,KAAK;AACjC,QAAI;AACF,YAAMF,WAAU,KAAK,EAAE,KAAK,aAAa,SAAS,KAAQ,CAAC;AAC3D,kBAAY;AACZ,aAAO,KAAK,oBAAoB;AAAA,IAClC,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,qBAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACvE;AACA,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,WAAW,eAAe;AACrD;;;AC1IA,IAAM,cAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,MAAM;AAAA,EACN,WAAW;AACb;AAEO,SAAS,oBAAoB,MAKzB;AACT,QAAM,EAAE,SAAS,QAAQ,MAAM,IAAI;AACnC,QAAM,KACJ,KAAK,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAE1E,QAAM,YAAY,MACf,IAAI,CAAC,MAAM;AACV,UAAM,QAAQ,YAAY,EAAE,IAAI,KAAK,EAAE;AACvC,UAAM,UAAU,EAAE,WAAW,OAAO,MAAM;AAC1C,UAAM,SACJ,EAAE,WAAW,OACT,KACA,EAAE,WAAW,SACb,qBAAM,EAAE,SAAS,WAAM,EAAE,SAAS,EAAE,WACpC,EAAE,WAAW,SACb,2BAAO,EAAE,UAAU,SAAS,WAC5B;AACN,WAAO,MAAM,OAAO,KAAK,KAAK,GAAG,MAAM;AAAA,EACzC,CAAC,EACA,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA,6DAEwB,EAAE;AAAA,aACtB,OAAO,iBAAc,MAAM;AAAA;AAAA;AAAA;AAAA,EAItC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQX;;;ACrCA,YAAY,YAAY;AACxB,YAAYG,YAAU;AAmEtB,IAAM,iBAAmD,oBAAI,IAAI;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,eAAsB,eACpB,SAC+B;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,IACT;AAAA,EACF,IAAI;AACJ,QAAM,MAAM,KAAK,CAAC,KAAK;AACvB,QAAM,QAA2B,CAAC;AAClC,QAAM,aAA2B,CAAC;AAElC,MAAI,UAAU;AACd,QAAM,eAEF,EAAE,OAAO,KAAK;AAElB,WAAS,OAAO,MAA6B;AAC3C,UAAM,KAAK,IAAI;AACf,aAAS,IAAI;AACb,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,iBAAW,KAAK,GAAG,KAAK,OAAO;AAAA,IACjC;AAAA,EACF;AAEA,WAAS,cAAc,MAA2B,KAAoB;AACpE,UAAM,UAAU,gBAAgB,GAAG;AACnC,WAAO,EAAE,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAChD,QAAI,CAAC,aAAa;AAChB,mBAAa,QAAQ,EAAE,MAAM,MAAM,OAAO,QAAQ;AACpD,QAAI,eAAe,IAAI,IAAI,EAAG,WAAU;AAAA,EAC1C;AAGA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,yBAAyB,OAAO;AAAA,IAC1C,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,EAAE,aAAa,SAAS,IAAI,CAAC;AAChE,YAAM,SACJ,OAAO,WAAW,cACd,GAAG,OAAO,WAAW,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,YACxD,OAAO;AACb,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,SACE,OAAO,WAAW,cACd,OAAO,UAAU,IAAI,CAAC,OAAO;AAAA,UAC3B,MAAM;AAAA,UACN,MAAM,gBAAgB,EAAE,QAAQ,WAAW;AAAA,UAC3C,MAAM;AAAA,UACN,QAAQ,EAAE;AAAA,QACZ,EAAE,IACF,CAAC;AAAA,MACT,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,oBAAc,UAAU,GAAG;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,uBAAuB,KAAK;AAAA,IACtC,CAAC;AAAA,EACH,WAAW,SAAS;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,EAAE,aAAa,MAAM,OAAO,IAAI,CAAC;AACpE,UAAI,OAAO,WAAW,uBAAuB;AAC3C,eAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,QAAQ,sBAAsB,CAAC;AAAA,MACxE,OAAO;AACL,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,GAAG,OAAO,UAAU,YAC1B,OAAO,SACT,kBAAkB,OAAO,cAAc,KAAK,IAAI,KAAK,MAAM;AAAA,UAC3D,SAAS,OAAO,cAAc,IAAI,CAAC,QAAQ;AAAA,YACzC,MAAM;AAAA,YACN,MAAM,sBAAsB,EAAE;AAAA,YAC9B,MAAM;AAAA,YACN,QAAQ;AAAA,UACV,EAAE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc,UAAU,GAAG;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,SAAS,MAAM,oBAAoB;AAAA,QACvC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,UACR,qBAAqB,OAAO;AAAA,UAC5B,mBAAmB,OAAO;AAAA,QAC5B;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,GAAG,OAAO,UAAU;AAAA,QAC5B,SAAS;AAAA,UACP;AAAA,YACE,MAAM,OAAO,WAAW,aAAa;AAAA,YACrC,MAAM,gBAAgB,OAAO,MAAM,WAAW;AAAA,YAC9C,MAAM;AAAA,YACN,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,oBAAc,aAAa,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO,EAAE,MAAM,WAAW,QAAQ,WAAW,QAAQ,cAAc,CAAC;AAAA,EACtE,WAAW,SAAS;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,aAAa,MAAM,UAAU,EAAE,aAAa,IAAI,CAAC;AACvD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QACE,WAAW,WAAW,cAClB,oCACA,WAAW;AAAA,MACnB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,oBAAc,WAAW,GAAG;AAAA,IAC9B;AAAA,EACF;AAIA,QAAM,mBAA2C,CAAC;AAClD,MAAI,QAAQ;AACV,UAAM,EAAE,SAAS,IAAI,MAAM,WAAW,gBAAgB,EAAE,MAAM,OAAO;AAAA,MACnE,UAAU,EAAE,SAAS,CAAC,EAA2B;AAAA,IACnD,EAAE;AACF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,YAAY,SAAS,QAAQ,MAAM;AAAA,IAC7C,CAAC;AAAA,EACH,WAAW,SAAS;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,WAAW,gBAAgB;AACtD,YAAM,SAAS,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAC/C,YAAM,YAAY,MAAM,SAAS;AAAA,QAC/B;AAAA,QACA,KAAK;AAAA,QACL,WAAW;AAAA,MACb,CAAC;AAED,YAAM,mBACJ,UAAU,UAAU,IAChB,UAAU,UAAU,MAAM,CAAC,UAAU,OAAO,IAC5C,CAAC;AACP,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,GAAG,UAAU,WAAW,MAAM,aAAa,UAAU,OAAO,aAAa,UAAU,OAAO;AAAA,QAClG,SAAS,iBAAiB,IAAI,CAAC,OAAO;AAAA,UACpC,MAAM;AAAA,UACN,MAAM,gBAAgB,EAAE,QAAQ,WAAW;AAAA,UAC3C,MAAM;AAAA,UACN,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,MACJ,CAAC;AACD,aAAO,OAAO,kBAAkB,UAAU,eAAe;AAAA,IAC3D,SAAS,KAAK;AACZ,oBAAc,UAAU,GAAG;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,OAAO;AAC9C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,uBAAuB,OAAO,KAAK,QAAQ,QAAQ,MAAM;AAAA,MACnE,CAAC;AAAA,IACH,QAAQ;AACN,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,uBAAuB,OAAO;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,OAAO;AAC9C,UAAI,QAAQ,QAAQ,WAAW,GAAG;AAChC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,kCAAkC,OAAO;AAAA,QACnD,CAAC;AAAA,MACH,OAAO;AACL,cAAM,SAAS,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9C,cAAM,SAAS,MAAM,YAAY;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,WAAW;AAAA,QACb,CAAC;AACD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,GAAG,OAAO,WAAW,MAAM,aAAa,OAAO,OAAO,aAAa,OAAO,OAAO;AAAA,QAC3F,CAAC;AACD,YAAI,OAAO,iBAAiB;AAC1B,iBAAO,OAAO,kBAAkB,OAAO,eAAe;AAAA,QACxD;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc,cAAc,GAAG;AAAA,IACjC;AAAA,EACF;AAKA,MAAI,CAAC,UAAU,CAAC,WAAW,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AACnE,QAAI;AACF,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,iBAAiB;AAAA,QACjB,aAAa,QAAQ,eAAe;AAAA,MACtC,CAAC;AAAA,IACH,SAAS,KAAK;AAEZ,aAAO;AAAA,QACL,oEAAuB;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO,EAAE,MAAM,QAAQ,QAAQ,WAAW,QAAQ,gBAAgB,CAAC;AAAA,EACrE,OAAO;AACL,QAAI;AACF,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,aAAa,QAAQ,eAAe;AAAA,QACpC,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB,qBAAqB,CAAC;AAAA,QACtB,wBAAwB,CAAC;AAAA,MAC3B,CAAC;AACD,YAAM,cAAwB,CAAC;AAC/B,UAAI,OAAO,WAAW,aAAa;AACjC,oBAAY;AAAA,UACV,UAAU,OAAO,MAAM,eAAe,OAAO,SAAS;AAAA,QACxD;AACA,YAAI,OAAO,mBAAoB,aAAY,KAAK,sBAAsB;AAAA,MACxE,OAAO;AACL,oBAAY,KAAK,OAAO,MAAM;AAAA,MAChC;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,YAAY,KAAK,KAAK;AAAA,QAC9B,SAAS,kBAAkB,MAAM;AAAA,MACnC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,oBAAc,QAAQ,GAAG;AAAA,IAC3B;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AACF,UAAI,oBAAoB;AACxB,UAAI;AACF,cAAa,cAAO,WAAW;AAAA,MACjC,QAAQ;AACN,4BAAoB;AAAA,MACtB;AACA,UAAI,CAAC,mBAAmB;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,cAAM,SAAc,YAAK,aAAa,YAAY;AAClD,YAAI,YAAY;AAChB,YAAI;AACF,sBAAY,MAAa,gBAAS,QAAQ,OAAO;AAAA,QACnD,QAAQ;AAAA,QAER;AACA,YAAI,UAAU,SAAS,sBAAsB,GAAG;AAC9C,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA;AAAA,YACA,GAAG;AAAA,YACH;AAAA,YACA;AAAA,UACF,EAAE,KAAK,IAAI;AACX,gBAAM,YACJ,UAAU,SAAS,KAAK,CAAC,UAAU,SAAS,IAAI,IAAI,OAAO;AAC7D,gBAAa;AAAA,YACX;AAAA,YACA,YAAY,YAAY;AAAA,YACxB;AAAA,UACF;AACA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,QAAQ,GAAG,gBAAgB,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,MAAM;AAAA,YACxE,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc,aAAa,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,SAAyC,SAC3C,YACA,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IACrC,YACA;AAEJ,QAAM,MAA4B,EAAE,QAAQ,OAAO,SAAS,WAAW;AAEvE,MAAI,aAAa,OAAO;AACtB,QAAI,aAAa;AAAA,MACf,UAAU,aAAa,MAAM;AAAA,MAC7B,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACnE,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAClE,OAAO,aAAa,MAAM;AAAA,MAC1B,eAAe;AAAA,IACjB;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ;AACX,QAAI;AACF,YAAM,mBAAmB,oBAAoB,EAAE,SAAS,QAAQ,MAAM,CAAC;AACvE,YAAM,gBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAa,aAAW,eAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACnE,YAAa,iBAAU,eAAe,kBAAkB,OAAO;AAC/D,aAAO,KAAK,uCAAuC;AAAA,IACrD,QAAQ;AACN,aAAO,KAAK,iDAAiD;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,kBAAkB,QAAsC;AAC/D,MAAI,OAAO,WAAW,YAAa,QAAO,CAAC;AAC3C,QAAM,MAAoB,CAAC;AAC3B,MAAI,OAAO,QAAQ;AACjB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,OAAO,WAAW;AACpB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,OAAO,oBAAoB;AAC7B,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;ACpkBA,YAAY,OAAO;AAkCnB,SAAS,mBAAsB,OAAsB;AACnD,MAAM,WAAS,KAAK,GAAG;AACrB,UAAM,IAAI,eAAe;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,eAAe,qBAEb;AACA,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB;AACxC,WAAO,QAAQ,SAAS,IAAI,CAAC,OAAO;AAAA,MAClC,OAAO,EAAE;AAAA,MACT,OAAO,GAAG,EAAE,WAAW,KAAK,EAAE,IAAI;AAAA,MAClC,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,EACJ,QAAQ;AACN,WAAO;AAAA,MACL,EAAE,OAAO,YAAY,OAAO,sBAAsB;AAAA,MAClD,EAAE,OAAO,eAAe,OAAO,4BAA4B;AAAA,IAC7D;AAAA,EACF;AACF;AAQA,eAAsB,cACpB,SAC4B;AAC5B,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,cACJ,CAAC,QAAQ,kBACT,QAAQ,QAAQ,MAAM,KAAK,KAC3B,CAAC,QAAQ;AAGX,MAAI,UAAU,QAAQ;AACtB,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,aAAa;AAEhB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,iBAAiB,MAAM,mBAAmB;AAChD,IAAE,QAAM,iBAAiB;AACzB,IAAE,OAAK,2CAAW,GAAG,EAAE;AACvB,UAAM,SAAS,MAAQ,SAAe;AAAA,MACpC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,cAAc,eAAe,CAAC,GAAG,SAAS;AAAA,IAC5C,CAAC;AACD,cAAU,mBAAmB,MAAM;AAAA,EACrC;AAGA,MAAI;AACJ,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC,GAAG,aAAa;AAAA,EAC1B,OAAO;AACL,UAAM,SAAS,MAAQ,cAAsB;AAAA,MAC3C,SAAS;AAAA,MACT,SAAS,cAAc,IAAI,CAAC,OAAO;AAAA,QACjC,OAAO;AAAA,QACP,OAAO,MAAM,UAAU,UAAU;AAAA,MACnC,EAAE;AAAA,MACF,eAAe,CAAC,GAAG,aAAa;AAAA,MAChC,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,mBAAmB,MAAM;AAAA,EAClC;AAEA,MAAI,aAAa;AACf,IAAE,QAAM,8DAAY;AAAA,EACtB;AAEA,SAAO,EAAE,SAAS,KAAK;AACzB;;;ACxGO,IAAM,YAAY;AAAA,EACvB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AACX;;;ARAA,eAAe,uBAAuB,KAA+B;AACnE,MAAI;AACF,UAAM,MAAM,MAAS,cAAc,YAAK,KAAK,cAAc,GAAG,OAAO;AACrE,UAAM,MAAM,KAAK,MAAM,GAAG;AAI1B,UAAM,UAAU,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC9D,WAAO,oBAAoB;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC,OAAO,eAAe,kGAAkB,EACxC,OAAO,aAAa,8HAA+B,EACnD,OAAO,aAAa,sFAAgB,EACpC,OAAO,oBAAoB,4DAA8B,EACzD,OAAO,WAAW,4FAAiB,EACnC,OAAO,OAAO,SAAyB;AACtC,QAAM,MAAW,eAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAElD,MAAI;AAEF,UAAM,QAAQ,MAAM,mBAAmB,GAAG;AAC1C,QAAI,MAAM,UAAU,SAAS;AAC3B,aAAO,KAAK,wGAAmB;AAC/B,aAAO,KAAK,EAAE;AACd,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,MAAM,UAAU,wBAAwB;AAC1C,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,sIAA6B;AACzC,aAAO,KAAK,wFAAuB;AAAA,IAErC;AACA,QAAI,CAAC,MAAM,kBAAkB,MAAM,UAAU,wBAAwB;AACnE,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAUA,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,kBAAkB,MAAM,uBAAuB,GAAG;AACxD,QAAI,CAAC,KAAK,SAAS,CAAC,aAAa,CAAC,iBAAiB;AACjD,YAAM,YAAY,MAAM,gBAAgB,GAAG;AAC3C,UAAI,UAAU,gBAAgB;AAE5B,cAAM,gBAAgB,UAAU,MAC7B,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE;AAEnD,eAAO,MAAM,yEAAkB;AAC/B,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,gCAAO;AACnB,mBAAW,QAAQ,eAAe;AAChC,iBAAO,KAAK,aAAQ,KAAK,QAAQ,KAAK,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/D;AACA,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,gCAAO;AACnB,eAAO,KAAK,8FAA6B;AACzC,eAAO,KAAK,iFAAqB;AACjC,eAAO,KAAK,EAAE;AAEd,eAAO,MAAM,KAAK,UAAU,EAAE,WAAW,cAAc,GAAG,MAAM,CAAC,CAAC;AAClE,gBAAQ,WAAW;AACnB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AACjD,UAAM,UAAU,MAAM,cAAc;AAAA,MAClC;AAAA,MACA,SAAS,KAAK;AAAA,MACd,gBAAgB,KAAK,OAAO;AAAA,MAC5B,gBAAgB,CAAC;AAAA,IACnB,CAAC;AAGD,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,QAAQ;AACV,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,8GAA4B;AAAA,IAC1C;AAEA,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,aAAa;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,MACA,QAAQ,CAAC,SAAS;AAChB,cAAM,OAAO,UAAU,KAAK,MAAM;AAClC,cAAM,SAAS,KAAK,SAAS,WAAM,KAAK,MAAM,KAAK;AACnD,eAAO,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,EAAE;AAAA,MAC/C;AAAA,IACF,CAAC;AAGD,WAAO,KAAK,EAAE;AACd,QAAI,OAAO,WAAW,WAAW;AAC/B,aAAO,QAAQ,6FAAiC;AAAA,IAClD,WAAW,OAAO,WAAW,WAAW;AACtC,aAAO,KAAK,qIAA4B;AACxC,UAAI,OAAO,YAAY;AACrB,cAAM,EAAE,UAAU,WAAW,OAAO,cAAc,IAChD,OAAO;AACT,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,gCAAO;AACnB,eAAO,KAAK,0CAAY,QAAQ,EAAE;AAClC,eAAO,KAAK,0CAAY,KAAK,EAAE;AAC/B,YAAI,UAAU,SAAS,GAAG;AACxB,iBAAO;AAAA,YACL,kHAAwB,UAAU,KAAK,IAAI,CAAC;AAAA,UAC9C;AAAA,QACF;AACA,eAAO;AAAA,UACL,kDAAe,aAAa;AAAA,QAC9B;AAAA,MACF;AACA,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,aAAO,QAAQ,iCAAkB,GAAG,EAAE;AAAA,IACxC;AAGA,QAAI,OAAO,WAAW,aAAa,OAAO,QAAQ,SAAS,GAAG;AAC5D,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,8DAAiB;AAC7B,iBAAW,QAAQ,wBAAwB,OAAO,OAAO,GAAG;AAC1D,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,aAAa;AACzB,aAAO,KAAK,kEAAoC;AAChD,aAAO,KAAK,qEAAiD;AAC7D,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,gBAAgB;AACjC,aAAO,KAAK,+BAAW;AACvB;AAAA,IACF;AACA,UAAM,UAAU,gBAAgB,GAAG;AACnC,WAAO,MAAM,0BAAW,OAAO,EAAE;AACjC,WAAO,MAAM,eAAe,QAAQ,IAAI,SAAS,KAAK,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AS7MH,SAAS,WAAAC,iBAAe;AACxB,YAAYC,YAAU;AACtB,YAAYC,cAAa;;;ACFzB,YAAYC,UAAQ;AACpB,YAAYC,YAAU;AAyBtB,IAAMC,cAAa;AACnB,IAAM,gBAAgB;AACtB,IAAM,WAAW;AACjB,IAAM,YAAY;AAElB,IAAM,eAAe;AAiDrB,SAASC,aAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,SAAS,GAAG;AACjC;AAOA,SAAS,YAAY,MAAsB;AAEzC,SAAO,KAAK;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAsB,eACpB,aACA,OAA8B,CAAC,GACC;AAChC,QAAM,YAAiB,YAAK,aAAaD,WAAU;AACnD,MAAI;AACF,UAAME,QAAO,MAAS,UAAK,SAAS;AACpC,QAAI,CAACA,MAAK,YAAY,EAAG,QAAO;AAAA,EAClC,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AAEA,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY;AACrC,QAAM,KAAKD,aAAY,KAAK;AAC5B,QAAM,eAAoB,YAAK,WAAW,aAAa;AACvD,QAAM,SAAc,YAAK,cAAc,EAAE;AACzC,QAAS,WAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,UAAU,MAAS,aAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AACnE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,cAAe;AAClC,QAAI,MAAM,SAAS,SAAU;AAC7B,UAAM,MAAW,YAAK,WAAW,MAAM,IAAI;AAC3C,UAAM,MAAW,YAAK,QAAQ,MAAM,IAAI;AACxC,UAAS,QAAG,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,QAAM,OAAO;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,KAAK,UAAU;AAAA,EACzB;AACA,QAAS;AAAA,IACF,YAAK,QAAQ,SAAS;AAAA,IAC3B,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,2BAA2B,gBAAS,aAAa,MAAM,CAAC,KAAK,KAAK,MAAM;AAAA,EAC1E;AAEA,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,eAAe,aAAa,MAAM,EAAE,aAAa,KAAK,YAAY,CAAC;AAEzE,SAAO,EAAE,IAAI,MAAM,OAAO;AAC5B;AAMA,eAAsB,cACpB,aAC0B;AAC1B,QAAM,eAAoB,YAAK,aAAaD,aAAY,aAAa;AACrE,MAAI;AACJ,MAAI;AACF,cAAU,MAAS,aAAQ,cAAc,EAAE,eAAe,KAAK,CAAC;AAAA,EAClE,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AAEA,QAAM,SAA0B,CAAC;AACjC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,MAAW,YAAK,cAAc,MAAM,IAAI;AAC9C,QAAI,QAAuB;AAC3B,QAAI,SAAgC;AACpC,QAAI;AACF,YAAM,MAAM,MAAS,cAAc,YAAK,KAAK,SAAS,GAAG,OAAO;AAChE,YAAM,SAAS,KAAK,MAAM,GAAG;AAI7B,UAAI,OAAO,OAAO,OAAO,SAAU,SAAQ,OAAO;AAClD,UACE,OAAO,OAAO,WAAW,YACzB,CAAC,QAAQ,UAAU,UAAU,WAAW,QAAQ,EAAE;AAAA,QAChD,OAAO;AAAA,MACT,GACA;AACA,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF,QAAQ;AAEN,cAAQ,YAAY,MAAM,IAAI;AAAA,IAChC;AACA,WAAO,KAAK,EAAE,IAAI,MAAM,MAAM,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC1D;AAGA,SAAO,KAAK,CAAC,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAE;AAC9D,SAAO;AACT;AAkBA,eAAsB,eACpB,aACA,OAAe,cACf,OAA8B,CAAC,GACZ;AACnB,MAAI,OAAO;AACT,UAAM,IAAI,MAAM,0CAA0C,IAAI,EAAE;AAClE,QAAM,YAAY,MAAM,cAAc,WAAW;AACjD,MAAI,UAAU,UAAU,KAAM,QAAO,CAAC;AAEtC,QAAM,OAAO,UAAU,MAAM,IAAI;AACjC,QAAM,WAAW,KAAK,cAClB,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,IAC5C;AACJ,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,UAAU;AAC3B,UAAS,QAAG,KAAK,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACvD,YAAQ,KAAK,KAAK,EAAE;AACpB,WAAO,MAAM,mBAAmB,KAAK,EAAE,EAAE;AAAA,EAC3C;AAEA,SAAO,QAAQ,QAAQ;AACzB;AAkBA,eAAsB,gBACpB,aACA,IACe;AACf,QAAM,eAAoB,YAAK,aAAaA,aAAY,aAAa;AACrE,QAAM,SAAc,YAAK,cAAc,EAAE;AACzC,MAAI;AACF,UAAME,QAAO,MAAS,UAAK,MAAM;AACjC,QAAI,CAACA,MAAK,YAAY,GAAG;AACvB,YAAM,IAAI,MAAM,qCAAqC,MAAM,EAAE;AAAA,IAC/D;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM,IAAI;AAAA,QACR,wBAAwB,EAAE;AAAA,MAC5B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAKA,QAAM,eAAe,aAAa,EAAE,QAAQ,WAAW,aAAa,GAAG,CAAC;AAIxE,QAAM,YAAiB,YAAK,aAAaF,WAAU;AACnD,QAAM,OAAO,MAAS,aAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,aAAW,SAAS,MAAM;AACxB,QAAI,MAAM,SAAS,cAAe;AAClC,QAAI,MAAM,SAAS,SAAU;AAC7B,UAAS,QAAQ,YAAK,WAAW,MAAM,IAAI,GAAG;AAAA,MAC5C,WAAW;AAAA,MACX,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAIA,QAAM,kBAAkB,MAAS,aAAQ,QAAQ,EAAE,eAAe,KAAK,CAAC;AACxE,aAAW,SAAS,iBAAiB;AACnC,QAAI,MAAM,SAAS,UAAW;AAC9B,UAAM,MAAW,YAAK,QAAQ,MAAM,IAAI;AACxC,UAAM,MAAW,YAAK,WAAW,MAAM,IAAI;AAC3C,UAAS,QAAG,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,SAAO,MAAM,uCAAuC,EAAE,EAAE;AAC1D;;;AD7QO,SAAS,uBAAgC;AAC9C,SAAO,IAAIG,UAAQ,SAAS,EACzB;AAAA,IACC;AAAA,EACF,EACC,SAAS,QAAQ,qFAA6C,EAC9D,OAAO,UAAU,mFAAuB,EACxC,OAAO,eAAe,kGAAkB,EACxC,OAAO,aAAa,iGAA2B,EAC/C,OAAO,OAAO,IAAwB,SAA4B;AACjE,UAAM,MAAW,eAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAElD,QAAI;AACF,YAAM,YAAY,MAAM,cAAc,GAAG;AAGzC,UAAI,KAAK,MAAM;AACb,2BAAmB,SAAS;AAC5B;AAAA,MACF;AAGA,UAAI,CAAC,IAAI;AACP,eAAO,KAAK,oBAAK;AACjB,eAAO;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,UACL;AAAA,QACF;AACA,eAAO,KAAK,EAAE;AACd,YAAI,UAAU,WAAW,GAAG;AAC1B,iBAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,sBAAO,UAAU,MAAM,oCAAgB;AAAA,QACrD;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,YAAM,SAAS,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAChD,UAAI,CAAC,QAAQ;AACX,eAAO,MAAM,oCAAgB,EAAE,EAAE;AACjC,eAAO,KAAK,EAAE;AACd,eAAO;AAAA,UACL;AAAA,QACF;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AAIA,YAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AACjD,UAAI,CAAC,KAAK,OAAO,eAAe;AAC9B,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,gDAAkB,OAAO,EAAE,EAAE;AACzC,YAAI,OAAO,OAAQ,QAAO,KAAK,8BAAU,OAAO,MAAM,EAAE;AACxD,YAAI,OAAO,MAAO,QAAO,KAAK,8BAAU,OAAO,KAAK,EAAE;AACtD,eAAO;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,UACL;AAAA,QACF;AACA,cAAM,YAAY,MAAc,iBAAQ;AAAA,UACtC,SAAS;AAAA,QACX,CAAC;AACD,YAAY,kBAAS,SAAS,KAAK,CAAC,WAAW;AAC7C,iBAAO,KAAK,0BAAM;AAClB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,gBAAgB,KAAK,EAAE;AAC7B,aAAO,QAAQ,0CAAiB,EAAE,EAAE;AACpC,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,GAAG;AACnC,aAAO,MAAM,6BAAc,OAAO,EAAE;AACpC,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;AAGO,IAAM,iBAAiB,qBAAqB;AAMnD,SAAS,mBAAmB,WAAkC;AAC5D,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,KAAK,+CAAiB;AAC7B,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,IACF;AACA;AAAA,EACF;AAEA,SAAO,KAAK,UAAK,UAAU,MAAM,4DAAoB;AACrD,SAAO,KAAK,EAAE;AACd,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,IAAI,UAAU,CAAC;AACrB,UAAM,SAAS,EAAE,UAAU;AAC3B,UAAM,MAAM,EAAE,SAAS;AACvB,WAAO,KAAK,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE;AAClC,WAAO,KAAK,gBAAgB,MAAM,SAAS,GAAG,EAAE;AAAA,EAClD;AACA,SAAO,KAAK,EAAE;AACd,SAAO,KAAK,uDAA8B;AAC5C;;;AEhKA,SAAS,WAAAC,iBAAe;AACxB,YAAYC,YAAU;AACtB,YAAYC,cAAa;;;ACwBzB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AACpB;AAAA,EACE,6BAAAC;AAAA,EACA,mBAAAC;AAAA,OAIK;AAmBP,IAAMC,0BAAyB;AAC/B,IAAMC,iCAAwD;AAAA,EAC5D,aAAa;AAAA,EACb,iBAAiB;AACnB;AAmEA,eAAsB,iBACpB,SACiC;AACjC,QAAM,EAAE,aAAa,YAAY,QAAQ,MAAM,IAAI;AACnD,QAAM,cAAc,QAAQ,eAAeD;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,MAAI,mBAAmB,YAAY;AACjC,WAAO,EAAE,QAAQ,sBAAsB,SAAS,eAAe;AAAA,EACjE;AAEA,QAAM,cACJ,QAAQ,eAAe,yBAAyB,WAAW;AAC7D,QAAM,UAAU,MAAME,2BAA0B,WAAW;AAC3D,QAAM,eAAeC,iBAAgB,SAAS,UAAU;AACxD,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC/C;AAAA,EACF;AAGA,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,aAAW,WAAW,aAAa,OAAO;AACxC,uBAAmB;AAAA,MACZ,gBAAS,OAAO;AAAA,MAChB,YAAK,aAAa,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,QAAS,MAAM,sBAAsB,WAAW,KAAM;AAAA,IAC1D,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,eAAe,MAAM,UAAU;AAAA,IACnC,CAACC,OAAMA,GAAE,YAAY;AAAA,EACvB;AACA,QAAM,iBACJ,gBAAgB,IAAI,MAAM,UAAU,YAAY,EAAG,YAAY,CAAC;AAGlE,QAAM,eACJ,gBAAgB,IAAI,MAAM,UAAU,YAAY,EAAG,UAAU;AAG/D,QAAM,UAAiC,CAAC;AACxC,aAAW,YAAY,gBAAgB;AACrC,UAAM,mBAAwB,gBAAS,SAAS,MAAM;AACtD,UAAM,mBAAmBC,wBAAuB,gBAAgB;AAChE,UAAM,cAAc,mBAChB,mBAAmB,IAAI,gBAAgB,IACvC;AAEJ,QAAI,SAAS,aAAa,UAAU;AAClC,cAAQ,KAAK;AAAA,QACX,QAAQ,SAAS;AAAA,QACjB,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK;AAAA,QACX,QAAQ,SAAS;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,SAAS;AAAA,QACnB,QAAQ,uCAAuC,UAAU;AAAA,MAC3D,CAAC;AACD;AAAA,IACF;AACA,UAAM,kBAAkB,MAAS,cAAS,aAAa,OAAO;AAE9D,QAAI,SAAS,aAAa,eAAe;AACvC,YAAM,UAAU,YAAY,eAAe;AAC3C,UAAI,YAAY,SAAS,MAAM;AAC7B,gBAAQ,KAAK;AAAA,UACX,QAAQ,SAAS;AAAA,UACjB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,QAAQ,SAAS;AAAA,UACjB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ,qBAAqB,cAAc,WAAM,UAAU;AAAA,QAC7D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,YAAQ,KAAK;AAAA,MACX,QAAQ,SAAS;AAAA,MACjB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAKA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAInC,MAAI,WAAkC;AACtC,MAAI;AACJ,MAAI;AACF,WAAO;AAAA,MACL,4DAA4D,cAAc,QAAQ,UAAU;AAAA,IAC9F;AACA,eAAW,MAAM,eAAe,aAAa,EAAE,QAAQ,SAAS,CAAC;AACjE,WAAO;AAAA,MACL,uCAAuC,UAAU,MAAM,QAAQ;AAAA,IACjE;AAAA,EACF,SAAS,KAAK;AACZ,oBAAgB,gBAAgB,GAAG;AACnC,WAAO,MAAM,6CAA6C,aAAa,EAAE;AAAA,EAC3E;AAEA,QAAM,qBAA0C,CAAC;AACjD,aAAW,YAAY,gBAAgB;AACrC,UAAM,cAAmB,kBAAW,SAAS,MAAM,IAC/C,SAAS,SACJ,YAAK,aAAa,SAAS,MAAM;AAC1C,UAAM,mBAAwB,gBAAS,SAAS,MAAM;AACtD,UAAM,mBAAmBA,wBAAuB,gBAAgB;AAChE,UAAM,cAAc,mBAChB,mBAAmB,IAAI,gBAAgB,IACvC;AAEJ,QAAI,SAAS,aAAa,iBAAiB,aAAa;AACtD,YAAM,kBAAkB,MAAS,cAAS,aAAa,OAAO;AAC9D,YAAM,cAAc,aAAa,eAAe;AAChD,aAAO,MAAM,yCAAyC,SAAS,MAAM,EAAE;AACvE,yBAAmB,KAAK;AAAA,QACtB,GAAG;AAAA,QACH,MAAM,YAAY,eAAe;AAAA,MACnC,CAAC;AACD;AAAA,IACF;AAEA,QACE,SAAS,aAAa,aACtB,eACC,MAAM,WAAW,WAAW,GAC7B;AACA,YAAM,kBAAkB,MAAS,cAAS,aAAa,OAAO;AAC9D,YAAM,kBAAkB,MAAS,cAAS,aAAa,OAAO;AAC9D,YAAM,SAAS,oBAAoB,iBAAiB,eAAe;AACnE,UAAI,WAAW,iBAAiB;AAC9B,cAAM,cAAc,aAAa,MAAM;AACvC,eAAO,MAAM,oCAAoC,SAAS,MAAM,EAAE;AAAA,MACpE,OAAO;AACL,eAAO;AAAA,UACL,4DAA4D,SAAS,MAAM;AAAA,QAC7E;AAAA,MACF;AACA,yBAAmB,KAAK;AAAA,QACtB,GAAG;AAAA,QACH,MAAM,YAAY,MAAM;AAAA,MAC1B,CAAC;AACD;AAAA,IACF;AAGA,uBAAmB,KAAK,QAAQ;AAAA,EAClC;AAGA,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,aAAa;AAAA,EACf;AACA,QAAM;AAAA,IACC,YAAK,aAAa,eAAe,kBAAkB;AAAA,IACxD,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,EAClC;AACA,SAAO;AAAA,IACL,sDAAsD,UAAU,aAAa,aAAa,OAAO;AAAA,EACnG;AAMA,QAAM,UAAU;AAAA,IACd,aAAa,WAAW,CAAC;AAAA,IACzB;AAAA,IACA,aAAa;AAAA,EACf;AACA,QAAM,aAAqC,CAAC;AAC5C,aAAW,KAAK,QAAS,YAAW,EAAE,IAAI,IAAI,EAAE;AAEhD,QAAM,WAAW;AACjB,SAAO,eAAe;AACtB,SAAO,SAAS,OAAO,UAAU;AACjC,SAAO,SAAS,OAAO,UAAU,aAAa;AAC9C,QAAM,UAAU,OAAO,sBAAsB,CAAC;AAC9C,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,SAAS;AAAA,EACX,CAAC;AACD,SAAO,qBAAqB;AAC5B,QAAM,mBAAmB,aAAa,MAAM;AAC5C,SAAO;AAAA,IACL,sDAAsD,cAAc,aAAa,UAAU,aAAa,QAAQ,MAAM;AAAA,EACxH;AAGA,MAAI,gBAAgB,GAAG;AACrB,UAAM,UAAU,YAAY,IAAI;AAAA,MAC9B,GAAG,MAAM,UAAU,YAAY;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS,aAAa;AAAA,MACtB,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AACA,UAAM,uBAAuB,aAAa,KAAK;AAC/C,WAAO;AAAA,MACL,0DAA0D,mBAAmB,MAAM;AAAA,IACrF;AAAA,EACF;AAKA,MAAI;AACJ,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,OAAO,MAAM,uBAAuB;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW,aAAa;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AACD,QAAI,KAAM,YAAW,KAAK;AAAA,EAC5B;AACA,MAAI,UAAU;AACZ,WAAO,MAAM,0CAA0C,QAAQ,EAAE;AAAA,EACnE;AACA,SAAO;AAAA,IACL,yCAAyC,cAAc,QAAQ,UAAU,eAAe,aAAa,OAAO;AAAA,EAC9G;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,WAAW,aAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;AAEA,SAASA,wBAAuB,kBAA8C;AAC5E,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO;AAAA,IACxCJ;AAAA,EACF,GAAG;AACD,QAAI,aAAa,iBAAkB,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;;;ADxZA,IAAM,YAAyD;AAAA,EAC7D,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,WAAW;AACb;AAEA,IAAM,aAA0D;AAAA,EAC9D,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,WAAW;AACb;AAcO,SAAS,sBAA+B;AAC7C,SAAO,IAAIK,UAAQ,QAAQ,EACxB;AAAA,IACC;AAAA,EACF,EACC,SAAS,iBAAiB,kEAAyC,EACnE,OAAO,eAAe,kGAAkB,EACxC,OAAO,WAAW,0GAA0B,EAC5C,OAAO,aAAa,0GAAoC,EACxD,OAAO,OAAO,YAAoB,SAA2B;AAC5D,UAAM,MAAW,eAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAClD,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI;AAEF,YAAM,OAAO,MAAM,iBAAiB;AAAA,QAClC,aAAa;AAAA,QACb;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,UAAI,KAAK,WAAW,mBAAmB;AACrC,eAAO;AAAA,UACL;AAAA,QACF;AACA,eAAO,KAAK,0EAAuC;AACnD,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,UAAI,KAAK,WAAW,sBAAsB;AACxC,eAAO,QAAQ,sCAAkB,KAAK,OAAO,uCAAS;AACtD;AAAA,MACF;AAEA,UAAI,KAAK,WAAW,qBAAqB;AACvC,eAAO,MAAM,8BAAe,KAAK,SAAS,GAAG;AAC7C,eAAO,KAAK,6BAAc,KAAK,UAAU,KAAK,IAAI,KAAK,QAAQ,EAAE;AACjE,eAAO;AAAA,UACL;AAAA,QACF;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AAGA,sBAAgB,KAAK,MAAM,KAAK,IAAI,KAAK,WAAW,KAAK,OAAO;AAEhE,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE;AACd,eAAO;AAAA,UACL;AAAA,QACF;AACA;AAAA,MACF;AAGA,YAAM,gBAAgB,QAAQ,QAAQ,MAAM,KAAK;AACjD,UAAI,CAAC,KAAK,OAAO,eAAe;AAC9B,eAAO,KAAK,EAAE;AACd,eAAO;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,UACL;AAAA,QACF;AACA,cAAM,YAAY,MAAc,iBAAQ;AAAA,UACtC,SAAS,mCAAU,UAAU;AAAA,QAC/B,CAAC;AACD,YAAY,kBAAS,SAAS,KAAK,CAAC,WAAW;AAC7C,iBAAO,KAAK,0BAAM;AAClB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,iBAAiB;AAAA,QACrC,aAAa;AAAA,QACb;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,UAAI,QAAQ,WAAW,YAAY;AAIjC,eAAO,MAAM,yCAAgB,QAAQ,MAAM,EAAE;AAC7C,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,qCAAiB,QAAQ,EAAE,OAAO,QAAQ,SAAS;AAAA,MACrD;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO;AAAA,UACL,2BAAe,QAAQ,SAAS,EAAE,gDAA4B,QAAQ,SAAS,EAAE;AAAA,QACnF;AAAA,MACF,WAAW,QAAQ,eAAe;AAChC,eAAO,MAAM,0CAAiB,QAAQ,aAAa,EAAE;AAAA,MACvD;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO,KAAK,EAAE;AACd,eAAO,KAAK,gCAAyB,QAAQ,QAAQ,EAAE;AACvD,eAAO;AAAA,UACL,yBAAU,QAAQ,QAAQ,MAAM;AAAA,QAClC;AAAA,MACF,OAAO;AACL,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,GAAG;AACnC,aAAO,MAAM,4BAAa,OAAO,EAAE;AACnC,aAAO,MAAO,IAAc,SAAS,EAAE;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;AAEO,IAAM,gBAAgB,oBAAoB;AAEjD,SAAS,gBACP,MACA,IACA,WACA,SACM;AACN,SAAO,KAAK,EAAE;AACd,SAAO,KAAK,yCAAgB,IAAI,WAAM,EAAE,MAAM,SAAS,GAAG;AAC1D,SAAO,KAAK,EAAE;AACd,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL;AAAA,IACF;AACA;AAAA,EACF;AACA,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,UAAU,OAAO,IAAI;AAClC,UAAM,QAAQ,WAAW,OAAO,IAAI;AACpC,WAAO;AAAA,MACL,KAAK,IAAI,KAAK,KAAK,KAAK,OAAO,MAAM,MAAM,OAAO,QAAQ,YAAO,OAAO,MAAM;AAAA,IAChF;AAAA,EACF;AACF;;;A1G5KA,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,aAAa;AAChC,QAAQ,WAAW,gBAAgB;AACnC,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAWC,YAAW;AAC9B,QAAQ,WAAW,cAAc;AACjC,QAAQ,WAAW,aAAa;AAKhC,SAAS,qBAAqB,KAAoB;AAChD,MAAI,mBAAmB,IAAI;AAC3B,aAAW,SAAS,IAAI,SAAU,sBAAqB,KAAK;AAC9D;AACA,qBAAqB,OAAO;AAE5B,QAAQ,MAAM;","names":["Command","createRequire","Command","os","path","path","fs","path","rel","path","p","path","fs","require","path","fs","fs","path","fs","createRequire","require","require","stat","rel","targetFile","newContent","exists","written","path","p","DEFAULT_SKILLS_PACKAGE","p","fs","os","path","TEAMIX_DIR","CONFIG_FILE","Command","path","fs","loadTokensPackageManifest","getVariantEntry","path","TEAMIX_DIR","compareSemver","hasManagedRegion","replaceManagedRegion","DEFAULT_TOKENS_PACKAGE","DEFAULT_TOKENS_PACKAGE","loadTokensPackageManifest","getVariantEntry","p","Command","Command","Command","version","p","Command","Command","Command","fs","path","Command","p","confirm","note","Command","fs","path","Command","Command","fs","path","fs","path","Command","Command","fs","path","exec","promisify","execAsync","promisify","exec","p","Command","p","Command","Command","Command","path","exec","promisify","execAsync","normaliseHex","Command","Command","path","Command","Command","Command","Command","prompts","p","initCommand","Command","Command","prompts","Command","resolveIdesAndScope","Command","listCommand","Command","p","Command","createRequire","DEFAULT_SKILLS_PACKAGE","FLAT_VARIANT","entry","p","require","createRequire","SKILLS_PACKAGE","updateCommand","Command","Command","prompts","path","fs","SKILLS_PACKAGE","uninstallCommand","Command","p","confirm","Command","path","fs","createRequire","loadSkillsPackageManifest","require","createRequire","loadSkillsPackageManifest","p","stat","Command","Command","path","fs","dirExists","rel","p","stat","Command","Command","initCommand","listCommand","updateCommand","uninstallCommand","Command","Command","prompts","initCommand","Command","Command","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","quote","p","path","fs","DEFAULT_UI_PACKAGE","rel","p","mergeResources","addCommand","Command","Command","DEFAULT_UI_PACKAGE","p","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","fs","path","p","stat","path","TEAMIX_DIR","PACKAGE_NAME","isoToFsSafe","createRequire","resolvePackageRoot","loadUiPackageManifest","Command","Command","fs","path","fs","path","rel","quote","TEAMIX_DIR","STAGING_DIR","rel","mergeIntoInstalledManifest","posix","TEAMIX_DIR","STAGING_DIR","p","fs","path","p","rel","Command","p","Command","initCommand","addCommand","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","loadVariantUiPackageManifest","require","createRequire","resolvePackageRoot","loadVariantUiPackageManifest","loadUiPackageManifest","p","mergeResources","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","upgradeCommand","Command","addCommand","listCommand","listVariantsCommand","upgradeCommand","Command","Command","p","mergeResources","addCommand","Command","Command","listCommand","Command","upgradeCommand","Command","addCommand","listCommand","upgradeCommand","Command","Command","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","existsSync","resolve","join","join","text","Command","resolve","join","existsSync","Command","existsSync","resolve","join","Command","resolve","join","existsSync","Command","Command","Command","prompts","path","fs","rel","initCommand","Command","Command","initCommand","Command","path","fs","fs","path","hasPackageJson","fs","path","stat","p","rel","fs","path","hasManagedRegion","replaceManagedRegion","hasManagedRegion","replaceManagedRegion","fs","path","exec","promisify","execAsync","promisify","exec","path","initCommand","Command","Command","path","prompts","fs","path","TEAMIX_DIR","isoToFsSafe","stat","Command","Command","path","prompts","path","fs","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","CONSUMER_BASENAME_BY_UPSTREAM","loadTokensPackageManifest","getVariantEntry","p","lookupUpstreamBasename","Command","require","createRequire","Command","initCommand"]}
1
+ {"version":3,"sources":["../src/codemods/hsl-to-v4.ts","../src/codemods/hex-to-token.ts","../src/codemods/tw-scale-to-semantic.ts","../src/codemods/space-to-gap.ts","../src/codemods/arbitrary-to-token.ts","../src/codemods/registry.ts","../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/utils/error.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/core/upgrade-hints.ts","../src/core/managed-merge.ts","../src/commands/tokens/list.ts","../src/commands/tokens/list-variants.ts","../src/commands/tokens/uninstall.ts","../src/commands/tokens/audit.ts","../src/core/tokens-audit.ts","../src/commands/tokens/codemod.ts","../src/codemods/index.ts","../src/codemods/runner.ts","../src/core/tokens-treat.ts","../src/utils/lint.ts","../src/commands/tokens/diagnose.ts","../src/core/tokens-diagnose.ts","../src/commands/tokens/treat.ts","../src/commands/tokens/reflect.ts","../src/core/tokens-reflect.ts","../src/commands/tokens/baseline-check.ts","../src/core/baseline-check.ts","../src/commands/skills/index.ts","../src/commands/skills/init.ts","../src/utils/cancelled.ts","../src/commands/skills/_parse.ts","../src/commands/skills/add.ts","../src/commands/skills/list.ts","../src/commands/skills/update.ts","../src/core/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/core/ui-adopt.ts","../src/commands/ui/list.ts","../src/core/ui-list.ts","../src/commands/_upgrade-command-factory.ts","../src/core/ui-upgrade.ts","../src/core/ui-upgrade-detector.ts","../src/core/ui-upgrade-staging.ts","../src/commands/ui/upgrade.ts","../src/commands/ui/promote.ts","../src/core/ui-promote.ts","../src/core/ui-promote-imports.ts","../src/core/file-changes.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/biz-ui/upgrade.ts","../src/commands/blocks/index.ts","../src/commands/blocks/add.ts","../src/core/blocks-add.ts","../src/commands/blocks/list.ts","../src/commands/blocks/upgrade.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/_io.ts","../src/commands/logs/trace.ts","../src/commands/lint/index.ts","../src/commands/lint/init.ts","../src/core/lint-init.ts","../src/commands/init/index.ts","../src/core/init-detect.ts","../src/core/init-conflicts.ts","../src/core/agents-md.ts","../src/core/deps-install.ts","../src/core/init-checklist-template.ts","../src/core/project-init.ts","../src/commands/init/wizard.ts","../src/commands/_shared/step-icon.ts","../src/commands/restore/index.ts","../src/core/snapshot.ts","../src/commands/switch/index.ts","../src/core/variant-switch.ts"],"sourcesContent":["/**\n * Codemod: `hsl-to-v4` — L2 format, full-auto.\n *\n * Rewrites the shadcn v3 CSS color pattern:\n * `hsl(var(--xxx))` → `var(--color-xxx)`\n *\n * This is the single highest-volume lint error after init (TrekClaw: 2300+\n * hits). The rewrite is purely syntactic — no semantic mapping needed.\n *\n * Target files: `.css`, `.tsx`, `.ts` (inline styles / Tailwind arbitrary).\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/**\n * Pattern: `hsl(var(--<name>))` with optional whitespace.\n * Captures the CSS custom property name (without `--`).\n */\nconst HSL_VAR_RE = /hsl\\(\\s*var\\(\\s*--([\\w-]+)\\s*\\)\\s*\\)/g;\n\nexport const hslToV4: CodemodDefinition = {\n id: 'hsl-to-v4',\n description: 'hsl(var(--xxx)) → var(--color-xxx) (shadcn v3 → v4)',\n layer: 'L2-format',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{css,tsx,ts}',\n extensions: ['css', 'tsx', 'ts'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(HSL_VAR_RE.source, HSL_VAR_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const varName = m[1]!;\n const original = m[0];\n const replacement = `var(--color-${varName})`;\n matches.push({\n line: i + 1,\n original,\n replacement,\n reason: 'shadcn v3 hsl() wrapper → Tailwind v4 native CSS variable',\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(HSL_VAR_RE, (_match, varName: string) => {\n return `var(--color-${varName})`;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `hex-to-token` — L3 semantic, full-auto.\n *\n * Replaces hard-coded hex colour literals with their corresponding semantic\n * token CSS variable. Requires the project's token map (`tokenMap` parameter)\n * to resolve `#1a2b3c` → `var(--color-xxx)`.\n *\n * Target files: `.css`, `.tsx`, `.ts`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches 3/4/6/8-digit hex colour values. */\nconst HEX_COLOR_RE = /#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\b/g;\n\n/** Normalise any hex value to lowercase 6-digit form for map lookup. */\nfunction normaliseHex(hex: string): string {\n const raw = hex.slice(1).toLowerCase();\n if (raw.length === 3) return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 4) return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 8) return `#${raw.slice(0, 6)}`;\n return `#${raw}`;\n}\n\nexport const hexToToken: CodemodDefinition = {\n id: 'hex-to-token',\n description: 'hex colour literal → semantic token var (requires token map)',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{css,tsx,ts}',\n extensions: ['css', 'tsx', 'ts'],\n\n transform(content, filePath, tokenMap): CodemodFileResult | null {\n if (!tokenMap || tokenMap.size === 0) return null;\n\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(HEX_COLOR_RE.source, HEX_COLOR_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const norm = normaliseHex(m[0]);\n const token = tokenMap.get(norm);\n if (token) {\n matches.push({\n line: i + 1,\n original: m[0],\n replacement: `var(--${token})`,\n reason: `hex ${m[0]} maps to semantic token --${token}`,\n });\n }\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(HEX_COLOR_RE, (match) => {\n const norm = normaliseHex(match);\n const token = tokenMap.get(norm);\n return token ? `var(--${token})` : match;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `tw-scale-to-semantic` — L3 semantic, full-auto.\n *\n * Replaces Tailwind built-in colour scale classes (e.g. `text-gray-500`,\n * `bg-blue-100`) with their semantic token equivalents from the project's\n * design system (`text-foreground`, `bg-muted`, etc.).\n *\n * Requires `tokenMap` mapping Tailwind scale names → semantic class names.\n *\n * Target files: `.tsx`, `.ts`, `.jsx` (className / class attributes).\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/**\n * Matches Tailwind colour-scale utility classes. Captures:\n * - group 1: prefix (e.g. `text`, `bg`, `border`, `ring`)\n * - group 2: colour-scale (e.g. `gray-500`, `blue-100`)\n */\nconst TW_SCALE_RE =\n /\\b(text|bg|border|ring|fill|stroke|shadow|outline|accent|decoration)-((?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\\d{1,3})\\b/g;\n\nexport const twScaleToSemantic: CodemodDefinition = {\n id: 'tw-scale-to-semantic',\n description: 'Tailwind colour scale (e.g. text-gray-500) → semantic token class',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath, tokenMap): CodemodFileResult | null {\n if (!tokenMap || tokenMap.size === 0) return null;\n\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(TW_SCALE_RE.source, TW_SCALE_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const prefix = m[1]!;\n const scaleName = m[2]!;\n const key = `${prefix}-${scaleName}`;\n const semantic = tokenMap.get(key);\n if (semantic) {\n matches.push({\n line: i + 1,\n original: m[0],\n replacement: semantic,\n reason: `Tailwind scale ${key} → semantic ${semantic}`,\n });\n }\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(\n TW_SCALE_RE,\n (match, prefix: string, scaleName: string) => {\n const key = `${prefix}-${scaleName}`;\n const semantic = tokenMap?.get(key);\n return semantic ?? match;\n },\n );\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `space-to-gap` — L3 semantic, full-auto.\n *\n * Replaces the legacy `space-x-*` / `space-y-*` Tailwind utilities with\n * the modern `gap-x-*` / `gap-y-*` equivalents. Aligns with the\n * `prefer-gap-over-space` ESLint rule (ADR 0008).\n *\n * Caveat: `space-*` uses `> * + *` selector (margin-based), while `gap-*`\n * uses CSS `gap` on the parent (requires flex/grid). The codemod only\n * rewrites when the pattern is detected; full flex/grid context validation\n * is deferred to Wave 2.\n *\n * Target files: `.tsx`, `.ts`, `.jsx`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches `space-x-<value>` / `space-y-<value>` Tailwind classes. */\nconst SPACE_RE = /\\bspace-(x|y)-(\\d+(?:\\.\\d+)?|px|reverse)\\b/g;\n\nexport const spaceToGap: CodemodDefinition = {\n id: 'space-to-gap',\n description: 'space-x-* / space-y-* → gap-x-* / gap-y-* (flex/grid context)',\n layer: 'L3-semantic',\n automation: 'full-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n let rewritten = content;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(SPACE_RE.source, SPACE_RE.flags);\n while ((m = re.exec(line)) !== null) {\n if (m[2] === 'reverse') continue;\n const axis = m[1]!;\n const value = m[2]!;\n const replacement = `gap-${axis}-${value}`;\n matches.push({\n line: i + 1,\n original: m[0],\n replacement,\n reason: `space-${axis} (margin-based) → gap-${axis} (CSS gap); ensure parent is flex/grid`,\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n rewritten = content.replace(SPACE_RE, (match, axis: string, value: string) => {\n if (value === 'reverse') return match;\n return `gap-${axis}-${value}`;\n });\n\n return { file: filePath, matches, rewritten };\n },\n};\n","/**\n * Codemod: `arbitrary-to-token` — L3 semantic, semi-auto.\n *\n * Detects Tailwind arbitrary value classes (`w-[200px]`, `p-[1.5rem]`,\n * `text-[#ff0000]`, etc.) and produces candidate replacements using the\n * project's spacing / colour / sizing token scale.\n *\n * **Semi-auto**: the codemod identifies matches and suggests candidates but\n * does NOT auto-apply. The AI / user must confirm each replacement because\n * the \"correct\" token may depend on design intent.\n *\n * Target files: `.tsx`, `.ts`, `.jsx`.\n */\nimport type { CodemodDefinition, CodemodFileResult, CodemodMatch } from './types.js';\n\n/** Matches Tailwind arbitrary-value classes: `<utility>-[<value>]`. */\nconst ARBITRARY_RE = /\\b([a-z][a-z0-9-]*)-\\[([^\\]]+)\\]/g;\n\nexport const arbitraryToToken: CodemodDefinition = {\n id: 'arbitrary-to-token',\n description:\n 'Tailwind arbitrary values (w-[200px]) → token / spacing var candidates (AI-assisted)',\n layer: 'L3-semantic',\n automation: 'semi-auto',\n defaultGlob: 'src/**/*.{tsx,ts,jsx}',\n extensions: ['tsx', 'ts', 'jsx'],\n\n transform(content, filePath): CodemodFileResult | null {\n const lines = content.split('\\n');\n const matches: CodemodMatch[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n let m: RegExpExecArray | null;\n const re = new RegExp(ARBITRARY_RE.source, ARBITRARY_RE.flags);\n while ((m = re.exec(line)) !== null) {\n const utility = m[1]!;\n const value = m[2]!;\n matches.push({\n line: i + 1,\n original: m[0],\n // Semi-auto: replacement is null — AI / user decides\n replacement: null,\n reason: `arbitrary value ${utility}-[${value}]: consider replacing with a design token or spacing variable`,\n });\n }\n }\n\n if (matches.length === 0) return null;\n\n // Semi-auto: rewritten is null (never auto-apply)\n return { file: filePath, matches, rewritten: null };\n },\n};\n","/**\n * Codemod registry — single source of truth for all built-in codemods.\n *\n * Import this module to enumerate available codemods, look up by id, or\n * iterate the full list for `--help` / `tokens codemod --list`.\n */\nimport type { CodemodDefinition } from './types.js';\nimport { hslToV4 } from './hsl-to-v4.js';\nimport { hexToToken } from './hex-to-token.js';\nimport { twScaleToSemantic } from './tw-scale-to-semantic.js';\nimport { spaceToGap } from './space-to-gap.js';\nimport { arbitraryToToken } from './arbitrary-to-token.js';\n\n/** All built-in codemods, ordered by recommended execution sequence. */\nexport const ALL_CODEMODS: readonly CodemodDefinition[] = [\n hslToV4,\n hexToToken,\n twScaleToSemantic,\n spaceToGap,\n arbitraryToToken,\n];\n\n/** Look up a codemod by id. Returns `undefined` if not found. */\nexport function getCodemod(id: string): CodemodDefinition | undefined {\n return ALL_CODEMODS.find((c) => c.id === id);\n}\n\n/** All registered codemod ids. */\nexport function listCodemodIds(): string[] {\n return ALL_CODEMODS.map((c) => c.id);\n}\n","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 { blocksCommand } from './commands/blocks/index.js';\nimport { templatesCommand } from './commands/templates/index.js';\nimport { logsCommand } from './commands/logs/index.js';\nimport { lintCommand } from './commands/lint/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { restoreCommand } from './commands/restore/index.js';\nimport { switchCommand } from './commands/switch/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(blocksCommand);\nprogram.addCommand(templatesCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(lintCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(restoreCommand);\nprogram.addCommand(switchCommand);\n\n// 未知命令 / 未知 option 时自动追加该层级的完整 help 输出。\n// commander v12 的 addCommand() 不继承父级 showHelpAfterError 配置,\n// 所以递归遍历整棵命令树挨个开启。\nfunction enableHelpAfterError(cmd: Command): void {\n cmd.showHelpAfterError(true);\n for (const child of cmd.commands) enableHelpAfterError(child);\n}\nenableHelpAfterError(program);\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';\nimport { auditCommand } from './audit.js';\nimport { codemodCommand } from './codemod.js';\nimport { diagnoseCommand } from './diagnose.js';\nimport { treatCommand } from './treat.js';\nimport { reflectCommand } from './reflect.js';\nimport { baselineCheckCommand } from './baseline-check.js';\n\nexport const tokensCommand = new Command('tokens').description(\n '管理 design tokens(变体级 theme.css 等)',\n);\n\ntokensCommand.addCommand(initCommand);\ntokensCommand.addCommand(updateCommand);\ntokensCommand.addCommand(listCommand);\ntokensCommand.addCommand(listVariantsCommand);\ntokensCommand.addCommand(uninstallCommand);\ntokensCommand.addCommand(auditCommand);\ntokensCommand.addCommand(codemodCommand);\ntokensCommand.addCommand(diagnoseCommand);\ntokensCommand.addCommand(treatCommand);\ntokensCommand.addCommand(reflectCommand);\ntokensCommand.addCommand(baselineCheckCommand);\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';\nimport { getErrorMessage } from '../../utils/error.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.exitCode = 1;\n return;\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 \"npx teamix-evo@latest 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. npx teamix-evo@latest tokens uninstall --yes');\n logger.info(\n ` 2. npx teamix-evo@latest tokens init ${result.requestedVariant}`,\n );\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(` Skills: auto-installed ${addedSkillIds.join(', ')}`);\n }\n if (skippedSkillIds.length > 0) {\n logger.info(\n ` Skills: already installed (skipped) ${skippedSkillIds.join(\n ', ',\n )}`,\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(\n 'Run \"npx teamix-evo@latest tokens update\" to update resources later.',\n );\n logger.info(\n 'Run \"npx teamix-evo@latest tokens list-variants\" to see all available variants.',\n );\n } catch (err) {\n logger.error(`Failed to initialize: ${getErrorMessage(err)}`);\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 {\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 { backupFile, 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';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { getErrorMessage } from '../utils/error.js';\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\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 \\`npx teamix-evo@latest 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 // Dedup: only add overrides resource if installVariantFile didn't already\n // register it (happens when the variant ships an overrides.css file).\n const overridesId = `tokens:${CONSUMER_OVERRIDES_FILE}`;\n if (!installed.some((r) => r.id === overridesId)) {\n const overridesContent = await fs.readFile(overridesAbs, 'utf-8');\n installed.push({\n id: overridesId,\n target: path.posix.join(CONSUMER_TOKENS_DIR, CONSUMER_OVERRIDES_FILE),\n hash: computeHash(overridesContent),\n strategy: 'frozen',\n });\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/v2.json',\n schemaVersion: 2,\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 init` (bulk) or `skills add <id>`\n // (incremental) 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 (${getErrorMessage(\n err,\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): ${getErrorMessage(err)}`,\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(CONSUMER_TOKENS_DIR, CONSUMER_THEME_FILE);\n const targetAbs = path.join(projectRoot, targetRel);\n const content = await fs.readFile(sourceAbs, 'utf-8');\n // Phase 1.A2: theme.css is regenerable but users sometimes hand-edit it.\n // Stash any pre-existing copy under .teamix-evo/.backups/ before we\n // overwrite so a stale-state recovery is always possible.\n if (await fileExists(targetAbs)) {\n await backupFile(targetAbs, projectRoot);\n }\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 * 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 InstalledPackage,\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 { getErrorMessage } from '../utils/error.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';\n/**\n * Consumer-side directory under `.teamix-evo/` that holds the skill source\n * mirrors (per ADR 0013). Renamed from `skills` → `skills-source` in the Init\n * landing improvement plan to avoid name-clash with installed package roots\n * and IDE mirror buckets; legacy paths are migrated lazily via\n * `migrateLegacySkillsSourceDir` (see `skills-installer.ts`).\n */\nconst SKILLS_DIR = 'skills-source';\n/** Legacy directory name retained for one-shot migration detection. */\nexport const LEGACY_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 (${getErrorMessage(err)}). ` +\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 (${getErrorMessage(err)}). ` +\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(`Failed to parse tokens-lock.json: ${getErrorMessage(err)}`);\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 * Resolves under `<projectRoot>/.teamix-evo/skills-source/[<skillName>]`.\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 * Absolute path to the legacy `<projectRoot>/.teamix-evo/skills/` directory.\n * Used **only** by the lazy migration path; do not write into this location.\n */\nexport function getLegacySkillsSourceDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR, LEGACY_SKILLS_DIR);\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: ${getErrorMessage(err)}`,\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\n/**\n * Look up an installed package record by package name.\n *\n * The {@link InstalledManifest} schema does not enforce uniqueness on the\n * `package` key — variant switches re-append a new record rather than\n * mutating the old one. We therefore return the **last** match (chronological\n * latest) and `null` when no record exists.\n *\n * Shared helper consumed by both {@link ui-upgrade-detector} and\n * {@link ui-upgrade-staging} to keep the lookup semantics aligned.\n */\nexport function findInstalledPackage(\n installed: InstalledManifest | null,\n packageName: string,\n): InstalledPackage | null {\n if (!installed) return null;\n const matches = installed.installed.filter((p) => p.package === packageName);\n if (matches.length === 0) return null;\n return matches[matches.length - 1] ?? null;\n}\n","/**\n * Safely extract an error message from an unknown thrown value.\n *\n * JavaScript allows `throw \"string\"` / `throw 42` / `throw null` — using\n * `(err as Error).message` directly is unsafe. This normaliser covers all\n * runtime cases.\n */\nexport function getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\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 extractFrontmatter,\n replaceFrontmatter,\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 { getErrorMessage } from '../utils/error.js';\nimport { walkDir } from '../utils/path.js';\nimport {\n getSkillsSourceDir,\n getLegacySkillsSourceDir,\n LEGACY_SKILLS_DIR,\n readInstalledManifest,\n writeInstalledManifest,\n} 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-source/<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 // One-shot lazy migration: rename legacy `.teamix-evo/skills/` to\n // `.teamix-evo/skills-source/` and rewrite manifest target paths if needed.\n // Runs unconditionally on every install; the function short-circuits when\n // there is nothing to migrate.\n await migrateLegacySkillsSourceDir(options.projectRoot);\n\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 \\`npx teamix-evo@latest skills sync\\`.`,\n );\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n return existing;\n }\n\n let merged = existing;\n // ADR 0015: frontmatter is the IDE-facing protocol — always pull from\n // upstream so trigger/description changes propagate through update + sync\n // without requiring uninstall + reinstall. Body outside managed regions\n // remains user-owned.\n const upstreamFm = extractFrontmatter(sourceContent);\n if (upstreamFm) {\n merged = replaceFrontmatter(merged, upstreamFm);\n }\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 * Optional: limit the update to these skill ids. When provided, skills not\n * in the set are skipped (no source rewrite, no mirror). Per ADR 0035,\n * the high-level `runSkillsUpdate` always passes this with the intersection\n * of `keys(lock.skills)` and the current install scope, ensuring update\n * never accidentally installs new skills or skills from a mismatched scope.\n *\n * Type matches `SkillInstallOptions.onlyIds` (mutable `string[] | undefined`).\n */\n onlyIds?: string[];\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 idFilter = options.onlyIds ? new Set(options.onlyIds) : null;\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n const updated: InstalledResource[] = [];\n\n for (const skill of manifest.skills) {\n if (idFilter && !idFilter.has(skill.id)) continue;\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) continue;\n\n const sourceRecords = await rewriteSkillSource(skill, options, summary);\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 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 newContent =\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\n const written = await rewriteSingleFile({\n targetFile,\n newContent,\n exists,\n updateStrategy: skill.updateStrategy,\n managedRegions: skill.managedRegions,\n projectRoot,\n summary,\n });\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, written, 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 const written = await rewriteSingleFile({\n targetFile,\n newContent,\n exists,\n updateStrategy: skill.updateStrategy,\n managedRegions: skill.managedRegions,\n projectRoot,\n summary,\n });\n return [makeSourceRecord(skill, targetFile, written)];\n}\n\n/**\n * Apply updateStrategy logic to a single file (used by both single-file and\n * directory skill update paths).\n *\n * Returns the content actually on disk after the operation.\n */\nasync function rewriteSingleFile(args: {\n targetFile: string;\n newContent: string;\n exists: boolean;\n updateStrategy: SkillEntry['updateStrategy'];\n managedRegions: readonly string[] | undefined;\n projectRoot: string;\n summary: SkillUpdateResult['summary'];\n}): Promise<string> {\n const {\n targetFile,\n newContent,\n exists,\n updateStrategy,\n managedRegions,\n projectRoot,\n summary,\n } = args;\n\n if (updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n return (await readFileOrNull(targetFile)) ?? newContent;\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n return newContent;\n }\n\n if (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 newContent;\n }\n\n // managed: preserve outside-region content from the existing SOURCE.\n // Per ADR 0015, the YAML frontmatter is part of the skill's PROTOCOL\n // (name / description / trigger contract) and MUST always follow the\n // upstream package — only the body outside managed regions is treated\n // as user-owned. We therefore overlay the upstream frontmatter first,\n // then apply managed-region replacement on the body.\n const current = await readFileOrNull(targetFile);\n let merged = current ?? newContent;\n const upstreamFm = extractFrontmatter(newContent);\n if (upstreamFm) {\n merged = replaceFrontmatter(merged, upstreamFm);\n }\n for (const regionId of 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 if (merged !== current) {\n await backupFile(targetFile, projectRoot);\n await writeFileSafe(targetFile, merged);\n }\n summary.managed++;\n return 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 // One-shot lazy migration so a stale `.teamix-evo/skills/` from a prior CLI\n // version is moved to the new layout before we walk source dirs.\n await migrateLegacySkillsSourceDir(options.projectRoot);\n\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 * One-shot migration of the consumer-side skill source directory from the\n * legacy `<projectRoot>/.teamix-evo/skills/` layout to the current\n * `<projectRoot>/.teamix-evo/skills-source/` layout (Init landing plan §A3).\n *\n * Behavior:\n * - When **only** the legacy dir exists → rename it to `skills-source`.\n * - When both exist → keep `skills-source` authoritative; warn that legacy\n * `skills/` is now stale (caller may delete manually).\n * - When neither exists or only `skills-source/` exists → no-op.\n *\n * Side effects:\n * - Updates `InstalledManifest` resources whose `target` still references the\n * legacy `.teamix-evo/skills/` path so subsequent `findInstalledPackage` /\n * uninstall lookups don't dangle.\n *\n * Failures are logged and swallowed: the rest of the install/sync should not\n * be blocked by a best-effort migration step.\n */\nexport async function migrateLegacySkillsSourceDir(\n projectRoot: string,\n): Promise<void> {\n const legacyDir = getLegacySkillsSourceDir(projectRoot);\n const newDir = getSkillsSourceDir(projectRoot);\n\n let legacyExists = false;\n let newExists = false;\n try {\n legacyExists = (await fs.stat(legacyDir)).isDirectory();\n } catch {\n legacyExists = false;\n }\n try {\n newExists = (await fs.stat(newDir)).isDirectory();\n } catch {\n newExists = false;\n }\n\n if (!legacyExists) return;\n if (newExists) {\n logger.warn(\n `Detected stale legacy skills source dir at ${legacyDir} alongside ${newDir}; ` +\n `the new layout takes precedence — you can safely delete the legacy dir.`,\n );\n return;\n }\n\n try {\n await fs.rename(legacyDir, newDir);\n logger.info(\n `Migrated skills source dir: \\`.teamix-evo/${LEGACY_SKILLS_DIR}/\\` → \\`.teamix-evo/skills-source/\\``,\n );\n } catch (err) {\n logger.warn(\n `Failed to rename legacy skills source dir (${getErrorMessage(\n err,\n )}); leaving as-is. New skills will install under the new layout.`,\n );\n return;\n }\n\n // Rewrite manifest targets that still reference the legacy path. We match\n // both POSIX and platform-native separators because Windows installs may\n // have stored back-slashed absolute paths.\n try {\n const manifest = await readInstalledManifest(projectRoot);\n if (!manifest) return;\n const legacyFragmentPosix = `/.teamix-evo/${LEGACY_SKILLS_DIR}/`;\n const newFragmentPosix = `/.teamix-evo/skills-source/`;\n const legacyFragmentNative = `${path.sep}.teamix-evo${path.sep}${LEGACY_SKILLS_DIR}${path.sep}`;\n const newFragmentNative = `${path.sep}.teamix-evo${path.sep}skills-source${path.sep}`;\n let touched = 0;\n for (const pkg of manifest.installed) {\n for (const r of pkg.resources) {\n if (typeof r.target !== 'string') continue;\n const before = r.target;\n let after = before.replace(legacyFragmentPosix, newFragmentPosix);\n after = after.replace(legacyFragmentNative, newFragmentNative);\n if (after !== before) {\n r.target = after;\n touched += 1;\n }\n }\n }\n if (touched > 0) {\n await writeInstalledManifest(projectRoot, manifest);\n logger.debug(\n `Rewrote ${touched} manifest target(s) to the new skills-source path.`,\n );\n }\n } catch (err) {\n logger.warn(\n `Migrated skills source dir but failed to update manifest paths (${getErrorMessage(\n err,\n )}); manifest may still reference legacy paths.`,\n );\n }\n}\n\n/**\n * Prune empty IDE skill directories under each adapter's skill root.\n *\n * Some workflows leave behind empty `<ide-root>/skills/<id>/` shells — e.g.\n * the upstream package dropped a skill, the user toggled it out via\n * `onlyIds`, or a partial mirror failed mid-write and removed the SKILL.md\n * but not the parent dir. Per the Init landing plan §G, every install /\n * sync run sweeps these out so the IDE side stays tidy.\n *\n * Safety:\n * - Only completely empty dirs are removed (no SKILL.md AND no other files).\n * - Non-empty dirs without SKILL.md are LEFT ALONE; deciding whether they\n * are user content vs stale mirror is out of scope for this best-effort\n * pass.\n * - All errors are swallowed; this is decoration, never a hard failure.\n *\n * Returns the list of absolute paths that were removed (for diagnostics).\n */\nexport async function pruneEmptyIdeSkillDirs(args: {\n projectRoot: string;\n ides: readonly SkillIde[];\n scope: SkillScope;\n}): Promise<string[]> {\n const removed: string[] = [];\n for (const ide of args.ides) {\n const adapter = getAdapter(ide);\n // Use a placeholder name to derive the per-IDE skill root, then take\n // dirname — every adapter returns `<root>/<name>/` shape.\n const placeholderDir = adapter.getSkillTargetDir(\n '__placeholder__',\n args.scope,\n args.projectRoot,\n );\n const skillsRoot = path.dirname(placeholderDir);\n let entries: string[];\n try {\n entries = await fs.readdir(skillsRoot);\n } catch {\n continue;\n }\n for (const name of entries) {\n const dir = path.join(skillsRoot, name);\n let stat;\n try {\n stat = await fs.stat(dir);\n } catch {\n continue;\n }\n if (!stat.isDirectory()) continue;\n let children: string[];\n try {\n children = await fs.readdir(dir);\n } catch {\n continue;\n }\n // Skip dirs that still contain a SKILL.md — they're live.\n if (children.some((c) => c === 'SKILL.md')) continue;\n // Only delete completely empty dirs; preserve any user content\n // sitting in a SKILL.md-less directory.\n if (children.length !== 0) continue;\n try {\n await fs.rmdir(dir);\n removed.push(dir);\n logger.debug(`Pruned empty IDE skill dir: ${dir}`);\n } catch {\n // Best-effort; ignore.\n }\n }\n }\n return removed;\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}: ${getErrorMessage(err)}`);\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';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\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 * Common directory names to skip when walking user project trees.\n */\nexport const DEFAULT_SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.teamix-evo',\n]);\n\n/**\n * Recursively walk a directory and return all file paths.\n * When `skipDirs` is provided, directories whose names are in the set will not\n * be entered — this avoids the cost of recursing into large trees like\n * `node_modules/` only to discard results later.\n */\nexport async function walkDir(\n dir: string,\n skipDirs?: Set<string>,\n): 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 if (skipDirs && skipDirs.has(entry.name)) continue;\n files.push(...(await walkDir(fullPath, skipDirs)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Locate the root directory of an installed npm package by resolving its\n * `package.json`. Used to read token source CSS and variant manifests.\n */\nexport function resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n","import * as path from 'node:path';\nimport { writeFileSafe, fileExists } from './fs.js';\nimport { getErrorMessage } from './error.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(\n mcpPath,\n JSON.stringify(MCP_JSON_CONTENT, null, 2) + '\\n',\n );\n logger.debug(`Wrote .mcp.json → ${mcpPath}`);\n return 'created';\n } catch (err) {\n logger.warn(`Failed to write .mcp.json: ${getErrorMessage(err)}`);\n return 'failed';\n }\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\n SkillsPackageManifest,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport {\n installSkills,\n updateSkills,\n pruneEmptyIdeSkillDirs,\n} 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\n// ─── runSkillsInit ────────────────────────────────────────────────────────────\n// Bulk bootstrap: install every skill in the manifest that matches the current\n// tokens variant + install scope (per ADR 0033). No skill ids accepted —\n// granular adds go through `runSkillsAdd`. Verb split per ADR 0034.\n\nexport interface RunSkillsInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Target IDEs to inject skills into. Required (bulk has no fallback source). */\n ides: readonly SkillIde[];\n /** Install scope. Required (bulk has no fallback source). */\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\nexport type RunSkillsInitResult =\n | {\n status: 'installed';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n skillCount: number;\n fileCount: number;\n resources: InstalledResource[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n /**\n * Skill ids that were auto-upgraded because their locked version was\n * older than the manifest version.\n */\n autoUpdatedSkillIds: string[];\n /**\n * @deprecated Outdated skills are now auto-upgraded; kept for compat.\n */\n outdatedSkills: OutdatedSkillInfo[];\n }\n | {\n /** Returned when a skills package is already installed and bulk has nothing new to add. */\n status: 'already-initialized';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo skills init`.\n *\n * Installs every manifest skill that matches the current tokens variant +\n * install scope (per ADR 0033 scope filter). Re-running on a project whose\n * `packages.skills` is already configured AND has no missing candidates\n * returns `'already-initialized'`.\n */\nexport async function runSkillsInit(\n options: RunSkillsInitOptions,\n): Promise<RunSkillsInitResult> {\n const { projectRoot } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\n const ides = [...options.ides] as SkillIde[];\n const scope = options.scope;\n if (ides.length === 0) {\n throw new Error('At least one IDE must be selected.');\n }\n\n await ensureTeamixDir(projectRoot);\n const existingConfig = await readProjectConfig(projectRoot);\n const existingSkillsCfg = existingConfig?.packages?.skills;\n\n const { manifest, data, packageRoot } = await loadSkillsData(packageName);\n const currentTokensVariant = await readTokensVariant(projectRoot);\n\n const existing = await readExistingState(projectRoot, packageName);\n\n // ADR 0033 + tokens variant: filter manifest skills to those eligible for\n // this install scope and current variant.\n const candidateIds = manifest.skills\n .filter((s) => {\n const effectiveScope = s.scope ?? 'project';\n if (effectiveScope !== scope) {\n logger.debug(\n `Skipping skill \"${s.id}\" (scope=${effectiveScope}): current install scope is \"${scope}\". Use \\`skills add ${s.id} --scope ${effectiveScope}\\` to install.`,\n );\n return false;\n }\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\n // Partition candidate skills the same way `runSkillsAdd` does: brand-new go\n // to `onlyIds`; already installed and at-or-above manifest version go to\n // `skippedSkillIds`; already installed but with `lock.version < manifest.version`\n // surface as `outdatedSkills` so callers can suggest `skills update <id>`.\n const { onlyIds, skippedSkillIds, outdatedSkills } = partitionByVersion(\n candidateIds,\n manifest,\n existing,\n );\n\n // Idempotent fast path: nothing new and nothing outdated. Preserve the\n // historical `already-initialized` status only when there's literally\n // nothing for the caller to act on; if any skill is outdated we fall\n // through to the empty-install fast path below so the upgrade hint is\n // surfaced to the CLI layer.\n if (\n existingSkillsCfg &&\n onlyIds.length === 0 &&\n outdatedSkills.length === 0\n ) {\n return { status: 'already-initialized' };\n }\n\n // Empty-install fast path mirrors `runSkillsAdd`: nothing new to install,\n // but at least one outdated skill needs to be auto-upgraded.\n if (onlyIds.length === 0) {\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig,\n });\n }\n return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n autoUpdatedSkillIds,\n outdatedSkills: [],\n };\n }\n\n return finalizeSkillsInstall({\n projectRoot,\n packageName,\n ideIdent: options.ide ?? 'qoder',\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n });\n}\n\n// ─── runSkillsAdd ─────────────────────────────────────────────────────────────\n// Incremental: install named skill ids. `names` is required (≥ 1).\n// Skills already present are skipped. ADR 0034.\n\nexport interface RunSkillsAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Skill ids to add. **Required, must contain at least one id.** Use\n * {@link runSkillsInit} for bulk bootstrap (no ids).\n */\n names: readonly string[];\n /** Target IDEs. Optional — falls back to the previously installed config. */\n ides?: readonly SkillIde[];\n /** Install scope. Optional — falls back to existing config. */\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\n/**\n * Detail for an already-installed skill whose locked version is older than\n * the manifest's latest version. Use `skills update <id>` to upgrade.\n */\nexport interface OutdatedSkillInfo {\n /** Skill id */\n id: string;\n /** Version recorded in `.teamix-evo/skills.lock.json` */\n installed: string;\n /** Version available in the upstream manifest (i.e. `npx` resolved `@latest`) */\n latest: string;\n}\n\nexport type RunSkillsAddResult = {\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 /**\n * Skill ids that were requested but already installed at the latest version;\n * nothing to do.\n */\n skippedSkillIds: string[];\n /**\n * Skill ids that were auto-upgraded because their locked version was older\n * than the manifest version.\n */\n autoUpdatedSkillIds: string[];\n /**\n * @deprecated Outdated skills are now auto-upgraded; this array is always\n * empty. Kept for backward-compatible callers; will be removed in next major.\n */\n outdatedSkills: OutdatedSkillInfo[];\n};\n\n/**\n * Programmatic equivalent of `teamix-evo skills add <names...>` (ADR 0034).\n *\n * Installs only the listed skills. Skills already present are skipped (use\n * `skills update` to refresh). `ides` / `scope` may be omitted — they fall\n * back to the previously installed config.\n *\n * Throws if `names` is empty — bulk bootstrap belongs to {@link runSkillsInit}.\n */\nexport async function runSkillsAdd(\n options: RunSkillsAddOptions,\n): Promise<RunSkillsAddResult> {\n if (!options.names || options.names.length === 0) {\n throw new Error(\n 'runSkillsAdd requires at least one skill id. Use runSkillsInit() for bulk install.',\n );\n }\n\n const { projectRoot, names: requestedNames } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\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 // Validate requested names against manifest.\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 // ADR 0033: warn when explicitly naming a skill whose declared scope\n // doesn't match the current install scope. Don't block — explicit\n // naming overrides the default; user takes responsibility.\n for (const s of manifest.skills) {\n if (requestedNames.includes(s.id) && s.scope && s.scope !== scope) {\n logger.warn(\n `\"${s.id}\" 推荐 ${s.scope} scope 安装。当前以 ${scope} scope 强制安装,可能与另一 scope 的副本冲突。建议改用 \\`skills add ${s.id} --scope ${s.scope}\\`。`,\n );\n }\n }\n\n const existing = await readExistingState(projectRoot, packageName);\n\n // Partition requested names: already-installed-and-up-to-date go to\n // `skippedSkillIds`; already-installed-but-older go to `outdatedSkills`\n // (caller surfaces an upgrade hint); brand-new go to `onlyIds`.\n const { onlyIds, skippedSkillIds, outdatedSkills } = partitionByVersion(\n requestedNames,\n manifest,\n existing,\n );\n\n // Incremental fast path: nothing new to install. But if there are\n // outdated skills, auto-upgrade them before returning.\n if (onlyIds.length === 0) {\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig,\n });\n }\n return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n autoUpdatedSkillIds,\n outdatedSkills: [],\n };\n }\n\n return finalizeSkillsInstall({\n projectRoot,\n packageName,\n ideIdent: options.ide ?? 'qoder',\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n });\n}\n\n// ─── partition helper (shared by init + add) ────────────────────────────────\n// Split a list of skill ids into three buckets based on `existing` lock state\n// vs `manifest` version. `onlyIds` (new) → drives `installSkills`;\n// `skippedSkillIds` (already at latest) and `outdatedSkills` (lock < manifest)\n// are surfaced to the CLI for messaging. Pre-ADR-0013 legacy installs whose\n// lock is missing fall through to `skippedSkillIds` (conservative — don't\n// nag a user we can't reliably version-check).\nfunction partitionByVersion(\n ids: readonly string[],\n manifest: SkillsPackageManifest,\n existing: ExistingState,\n): {\n onlyIds: string[];\n skippedSkillIds: string[];\n outdatedSkills: OutdatedSkillInfo[];\n} {\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n const onlyIds: string[] = [];\n const skippedSkillIds: string[] = [];\n const outdatedSkills: OutdatedSkillInfo[] = [];\n for (const name of ids) {\n if (!existing.skillIds.has(name)) {\n onlyIds.push(name);\n continue;\n }\n const installedVer = existing.lock?.skills?.[name]?.version;\n const latestVer = manifestById.get(name)?.version;\n if (\n installedVer &&\n latestVer &&\n compareSemver(installedVer, latestVer) < 0\n ) {\n outdatedSkills.push({\n id: name,\n installed: installedVer,\n latest: latestVer,\n });\n } else {\n skippedSkillIds.push(name);\n }\n }\n return { onlyIds, skippedSkillIds, outdatedSkills };\n}\n\n// ─── semver helpers (light, no dep) ───────────────────────────────────────────\n// Only needed by `runSkillsAdd` to decide whether an already-installed skill is\n// truly outdated (installed < manifest). We deliberately avoid pulling in a\n// `semver` runtime dep; manifest versions are validated against\n// `^\\d+\\.\\d+\\.\\d+/` by the registry schema, so a numeric major.minor.patch\n// triple is sufficient. Pre-release / build metadata is ignored — if two\n// versions share the same triple they're considered equal here.\nfunction parseSemverTriple(v: string): [number, number, number] | null {\n const m = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(v);\n if (!m) return null;\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\n/** -1 if a < b, 0 if equal (or unparseable + identical strings), 1 if a > b. */\nfunction compareSemver(a: string, b: string): number {\n const pa = parseSemverTriple(a);\n const pb = parseSemverTriple(b);\n if (!pa || !pb) {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n }\n for (let i = 0; i < 3; i++) {\n if (pa[i]! !== pb[i]!) return pa[i]! < pb[i]! ? -1 : 1;\n }\n return 0;\n}\n\n// ─── shared internals ─────────────────────────────────────────────────────────\n\ninterface ExistingState {\n installed: InstalledManifest | null;\n pkg:\n | {\n package: string;\n resources: InstalledResource[];\n }\n | undefined;\n lock: SkillsLock | null;\n skillIds: Set<string>;\n}\n\nasync function readExistingState(\n projectRoot: string,\n packageName: string,\n): Promise<ExistingState> {\n const installed = await readInstalledManifest(projectRoot);\n const pkg = installed?.installed.find((p) => p.package === packageName);\n const lock = await readSkillsLock(projectRoot);\n const skillIds = new Set<string>([\n ...Object.keys(lock?.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 ...(pkg?.resources ?? []).map((r) => r.id.split(':')[0] ?? r.id),\n ]);\n return { installed, pkg, lock, skillIds };\n}\n\ninterface FinalizeArgs {\n projectRoot: string;\n packageName: string;\n ideIdent: string;\n manifest: SkillsPackageManifest;\n data: Parameters<typeof installSkills>[0]['data'];\n packageRoot: string;\n ides: SkillIde[];\n scope: SkillScope;\n onlyIds: string[];\n skippedSkillIds: string[];\n /** Optional — only populated by `runSkillsAdd`. `runSkillsInit` leaves empty. */\n outdatedSkills?: OutdatedSkillInfo[];\n existing: ExistingState;\n existingConfig: ProjectConfig | null;\n}\n\nasync function finalizeSkillsInstall(args: FinalizeArgs): Promise<{\n status: 'installed';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n skillCount: number;\n fileCount: number;\n resources: InstalledResource[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n autoUpdatedSkillIds: string[];\n outdatedSkills: OutdatedSkillInfo[];\n}> {\n const {\n projectRoot,\n packageName,\n ideIdent,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\n outdatedSkills,\n existing,\n existingConfig,\n } = args;\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/v2.json',\n schemaVersion: 2,\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 = existing.installed ?? {\n schemaVersion: 1,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n const mergedResources = mergeInstalledResources(\n existing.pkg?.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 = existing.lock ?? {\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 // Phase 5.G: sweep empty IDE skill dirs left over from prior installs\n // (e.g. a removed upstream skill). Best-effort — swallows errors.\n try {\n await pruneEmptyIdeSkillDirs({ projectRoot, ides, scope });\n } catch {\n // Cleanup is decoration; never a hard failure.\n }\n\n // Auto-upgrade outdated skills alongside the fresh install.\n let autoUpdatedSkillIds: string[] = [];\n if (outdatedSkills && outdatedSkills.length > 0) {\n autoUpdatedSkillIds = await autoUpgradeOutdatedSkills({\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n existingConfig: existingConfig ?? config,\n });\n }\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 autoUpdatedSkillIds,\n outdatedSkills: [],\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// ─── auto-upgrade outdated skills ──────────────────────────────────────────────\n// When `skills add` detects already-installed skills whose locked version is\n// older than the manifest version, we auto-upgrade them in-place rather than\n// just surfacing a hint. This ensures the client-side AI always uses the latest\n// skill version available in the resolved `@latest` package.\n\ninterface AutoUpgradeArgs {\n projectRoot: string;\n packageName: string;\n manifest: SkillsPackageManifest;\n data: Parameters<typeof installSkills>[0]['data'];\n packageRoot: string;\n ides: SkillIde[];\n scope: SkillScope;\n outdatedSkills: OutdatedSkillInfo[];\n existing: ExistingState;\n existingConfig: ProjectConfig | null;\n}\n\nasync function autoUpgradeOutdatedSkills(\n args: AutoUpgradeArgs,\n): Promise<string[]> {\n const {\n projectRoot,\n packageName,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n outdatedSkills,\n existing,\n } = args;\n\n const targetIds = outdatedSkills.map((o) => o.id);\n\n // Use the updateSkills flow which preserves managed regions.\n await updateSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds: targetIds,\n });\n\n // Update the lock for auto-upgraded skills.\n const lock: SkillsLock = existing.lock ?? {\n schemaVersion: 1,\n skills: {},\n };\n const installedAt = new Date().toISOString();\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n for (const id of targetIds) {\n const skillDef = manifestById.get(id);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[id] = {\n version: skillDef.version,\n from: packageName,\n installedAt,\n scope,\n mirroredTo,\n };\n }\n await writeSkillsLock(projectRoot, lock);\n\n // Update installed manifest resources for upgraded skills.\n const installedManifest = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n if (idx >= 0) {\n installedManifest.installed[idx]!.version = manifest.version;\n installedManifest.installed[idx]!.installedAt = installedAt;\n }\n await writeInstalledManifest(projectRoot, installedManifest);\n\n logger.debug(\n `Auto-upgraded ${targetIds.length} outdated skill(s): ${targetIds.join(\n ', ',\n )}`,\n );\n\n return targetIds;\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 init` / `skills add` with project scope): refuses to run when the\n * cwd has no `package.json`, because that almost always means the user is in\n * the 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 init --scope global` (or `skills add ... --scope global`) writes\n * metadata to ~/.teamix-evo-global when cwd isn't a teamix-evo project, so\n * maintenance commands must look there too — otherwise the user gets\n * \"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 tokens with three-state semantics.\n *\n * Per ADR 0003 + ADR 0019 §D2: regenerable files rewritten, managed regions\n * replaced (markers preserved), frozen files preserved with upstream-drift\n * warnings surfaced (`--accept-upstream` is a future batch).\n */\nimport { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensUpdate } from '../../core/tokens-update.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const updateCommand = new Command('update')\n .description(\n '刷新 design tokens(regenerable 覆盖 / managed 区段替换 / 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 `npx teamix-evo@latest 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(' Regenerable files refreshed in case of manual edits.');\n printFrozenDrift(result.frozenDrift);\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.managedReplaced.length > 0) {\n logger.info(\n ` Managed regions updated: ${result.managedReplaced.join(', ')}`,\n );\n }\n if (result.preserved.length > 0) {\n logger.info(\n ` Preserved: ${result.preserved.join(\n ', ',\n )} (frozen — your customizations kept)`,\n );\n }\n printFrozenDrift(result.frozenDrift);\n if (result.hintPath) {\n logger.info('');\n logger.info(`💡 token rename hint: ${result.hintPath}`);\n logger.info(\n ` 检测到 ${result.renames.length} 个 token rename,建议调用 \\`teamix-evo-upgrade\\` skill 扫 src/** 给 codemod 建议(ADR 0019 §D4)。`,\n );\n }\n } catch (err) {\n logger.error(`Failed to update tokens: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nfunction printFrozenDrift(\n drift: ReadonlyArray<{ target: string; reason: string }>,\n): void {\n if (drift.length === 0) return;\n logger.warn(\n ` ⚠️ frozen drift(上游有变动,但本地属用户受控文件 — ADR 0019 §D2):${drift\n .map((d) => d.target)\n .join(', ')}`,\n );\n logger.info(\n ' 如需对照上游变动,请手动 diff 或后续使用 `--accept-upstream <target>`(待批次 5 落地)。',\n );\n}\n","/**\n * `teamix-evo tokens update` — refresh tokens with three-state semantics.\n *\n * Per [ADR 0003](../../../../docs/adr/0003-update-strategy-tri-state.md) +\n * [ADR 0019 §D2](../../../../docs/adr/0019-project-upgrade-flow.md), the\n * update is **strategy-driven** off the consumer-side InstalledManifest\n * (recorded at install time):\n *\n * - `regenerable` → upstream content rewrites the file in place.\n * - `managed` → only the marked regions are rewritten via\n * `replaceManagedRegion`; user content outside markers\n * is preserved verbatim. Missing markers in the upstream\n * payload skip that region; missing markers in the\n * consumer file fail loudly (per ADR 0003 Negative — no\n * silent rewrite when anchors are gone).\n * - `frozen` → never overwritten. We still hash-compare upstream vs.\n * the recorded baseline and report \"upstream changed\"\n * drift so the CLI can prompt the user (`--accept-upstream`\n * in a future batch; today we just surface the list).\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 */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledResource,\n type TokensPackLock,\n type TokenRenameEntry,\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';\nimport {\n selectApplicableRenames,\n writeTokensUpgradeHint,\n} from './upgrade-hints.js';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { mergeManagedRegions } from './managed-merge.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_TOKENS_DIR = 'tokens';\n/** Consumer basename ↔ upstream basename mapping (variants ship `theme.css` / `overrides.css`). */\nconst CONSUMER_BASENAME_BY_UPSTREAM: Record<string, string> = {\n 'theme.css': 'tokens.theme.css',\n 'overrides.css': 'tokens.overrides.css',\n};\n\nexport interface RunTokensUpdateOptions {\n projectRoot: string;\n packageName?: string;\n /** Override resolution of the upstream tokens package root. */\n packageRoot?: string;\n}\n\n/**\n * Per-frozen-resource drift report (ADR 0019 §D2 — surfaced, never\n * auto-applied). Today the only reason we surface is `upstream-changed`:\n * a frozen resource whose upstream content moved since install. Consumer-\n * only files (no upstream counterpart, e.g. an empty `overrides.css`\n * template) are silent — there is nothing to compare against.\n */\nexport interface FrozenDrift {\n /** Consumer-relative path (e.g. `tokens/tokens.overrides.css`). */\n target: string;\n reason: 'upstream-changed';\n}\n\nexport type RunTokensUpdateResult =\n | {\n status: 'updated';\n packageName: string;\n variant: string;\n from: string;\n to: string;\n /** Files fully rewritten (regenerable). */\n rewritten: string[];\n /** Files whose managed regions were replaced. Empty when no managed resource exists. */\n managedReplaced: string[];\n /** Frozen files preserved verbatim. */\n preserved: string[];\n /** Frozen drift hints — surfaced only, never auto-merged. */\n frozenDrift: FrozenDrift[];\n /** Token renames that took effect in this version range (oldest first). */\n renames: TokenRenameEntry[];\n /** Absolute path of the `.teamix-evo/.upgrade-hints/tokens-<ts>.json` file written when `renames` is non-empty. */\n hintPath?: string;\n }\n | {\n status: 'not-initialized';\n }\n | {\n status: 'up-to-date';\n packageName: string;\n variant: string;\n version: string;\n /** Frozen drift may still be reported on `up-to-date` if upstream catalog moved hashes. */\n frozenDrift: FrozenDrift[];\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 \\`npx teamix-evo@latest tokens uninstall\\` then \\`npx teamix-evo@latest tokens init <variant>\\` to switch.`,\n );\n }\n\n // Build upstream basename → absolute path index for strategy dispatch.\n const upstreamByBasename = new Map<string, string>();\n for (const fileRel of variantEntry.files) {\n upstreamByBasename.set(\n path.basename(fileRel),\n path.join(packageRoot, fileRel),\n );\n }\n\n // Pull installed resources for this package — they carry the strategy\n // recorded at install time, which is the dispatch key.\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const installedIdx = prior.installed.findIndex(\n (p) => p.package === packageName,\n );\n const priorResources: InstalledResource[] =\n installedIdx >= 0 ? prior.installed[installedIdx]!.resources : [];\n\n const rewritten: string[] = [];\n const managedReplaced: string[] = [];\n const preserved: string[] = [];\n const frozenDrift: FrozenDrift[] = [];\n const refreshedResources: InstalledResource[] = [];\n\n for (const resource of priorResources) {\n const consumerAbs = path.isAbsolute(resource.target)\n ? resource.target\n : path.join(projectRoot, resource.target);\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'regenerable') {\n if (!upstreamAbs) {\n // Upstream dropped this regenerable resource — leave the consumer file\n // alone and keep the prior record so removal is the user's call.\n refreshedResources.push(resource);\n continue;\n }\n const content = await fs.readFile(upstreamAbs, 'utf-8');\n await writeFileSafe(consumerAbs, content);\n rewritten.push(resource.target);\n refreshedResources.push({\n ...resource,\n hash: computeHash(content),\n });\n continue;\n }\n\n if (resource.strategy === 'managed') {\n if (!upstreamAbs || !(await fileExists(consumerAbs))) {\n refreshedResources.push(resource);\n continue;\n }\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const consumerContent = await fs.readFile(consumerAbs, 'utf-8');\n const merged = mergeManagedRegions(upstreamContent, consumerContent);\n if (merged !== consumerContent) {\n await writeFileSafe(consumerAbs, merged);\n managedReplaced.push(resource.target);\n }\n refreshedResources.push({\n ...resource,\n hash: computeHash(merged),\n });\n continue;\n }\n\n // strategy === 'frozen' — never overwrite. Surface drift only when an\n // upstream counterpart exists AND its hash moved.\n if (await fileExists(consumerAbs)) preserved.push(resource.target);\n if (upstreamAbs) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const upstreamHash = computeHash(upstreamContent);\n if (resource.hash && upstreamHash !== resource.hash) {\n frozenDrift.push({\n target: resource.target,\n reason: 'upstream-changed',\n });\n }\n }\n refreshedResources.push(resource);\n }\n\n // Same-version path: still ran regenerable rewrites + managed merges +\n // collected frozen drift. Report `up-to-date` for clarity but include drift.\n if (variantEntry.version === currentVersion) {\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n }\n return {\n status: 'up-to-date',\n packageName,\n variant: currentVariant,\n version: currentVersion,\n frozenDrift,\n };\n }\n\n // Version bump path: lock + config + manifest refresh.\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 config.packages.tokens.version = variantEntry.version;\n await writeProjectConfig(projectRoot, config);\n\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n version: variantEntry.version,\n installedAt: new Date().toISOString(),\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n }\n\n // Emit `.teamix-evo/.upgrade-hints/tokens-<ts>.json` when this version\n // bump introduced any token renames (ADR 0019 §D4 — codemod hint, not\n // codemod). Empty rename list → no file written.\n const renames = selectApplicableRenames(\n variantEntry.renames ?? [],\n currentVersion,\n variantEntry.version,\n );\n let hintPath: string | undefined;\n if (renames.length > 0) {\n const hint = await writeTokensUpgradeHint({\n projectRoot,\n trigger: 'update',\n fromVariant: currentVariant,\n toVariant: currentVariant,\n fromVersion: currentVersion,\n toVersion: variantEntry.version,\n renames,\n });\n if (hint) hintPath = hint.path;\n }\n\n return {\n status: 'updated',\n packageName,\n variant: currentVariant,\n from: currentVersion,\n to: variantEntry.version,\n rewritten,\n managedReplaced,\n preserved,\n frozenDrift,\n renames,\n ...(hintPath ? { hintPath } : {}),\n };\n}\n\nfunction lookupUpstreamBasename(consumerBasename: string): string | undefined {\n for (const [upstream, consumer] of Object.entries(\n CONSUMER_BASENAME_BY_UPSTREAM,\n )) {\n if (consumer === consumerBasename) return upstream;\n }\n // managed resources may share basename across upstream/consumer.\n return consumerBasename;\n}\n","/**\n * `.teamix-evo/.upgrade-hints/` writer — emits codemod hint files consumed\n * by the future `teamix-evo-upgrade` skill ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §D4).\n *\n * The hint is **passive guidance**: the CLI never auto-rewrites consumer\n * source code (frozen boundary). Hints describe the rename surface so an\n * AI agent / human can scan `src/**` and propose codemods, with the user\n * deciding whether to accept each suggestion.\n *\n * Storage layout:\n * ```\n * .teamix-evo/\n * └── .upgrade-hints/\n * ├── tokens-2026-06-12T03-15-00-000Z.json\n * └── …\n * ```\n *\n * Naming convention: `tokens-<filesystem-safe-iso-ts>.json`. The ts is\n * isoToFsSafe-encoded so directory listings sort chronologically.\n */\nimport * as path from 'node:path';\nimport { writeFileSafe } from '../utils/fs.js';\nimport type { TokenRenameEntry } from '@teamix-evo/registry';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst HINTS_DIR = '.upgrade-hints';\n\n/** Source of the hint — identifies which command produced it. */\nexport type TokensUpgradeHintTrigger = 'update' | 'switch';\n\n/**\n * Schema of a single `tokens-<ts>.json` hint file. Versioned so we can\n * evolve the shape without breaking older AI skill consumers.\n */\nexport interface TokensUpgradeHint {\n schemaVersion: 1;\n /** ISO timestamp the hint was generated (matches the filename ts). */\n ts: string;\n /** Always `'tokens'` today; reserved for future per-package hints. */\n package: 'tokens';\n /** Which command emitted the hint. */\n trigger: TokensUpgradeHintTrigger;\n /** Variant in effect *before* the operation that produced the hint. */\n fromVariant: string;\n /** Variant in effect *after* the operation. */\n toVariant: string;\n /** Variant version the consumer was on before the operation. */\n fromVersion: string;\n /** Variant version the consumer is on after the operation. */\n toVersion: string;\n /** Rename entries that apply to this transition (ordered by sinceVersion ASC). */\n renames: ReadonlyArray<TokenRenameEntry>;\n}\n\n/**\n * Convert an ISO-8601 timestamp into a filesystem-safe directory / filename\n * fragment. Mirrors `snapshot.isoToFsSafe` — kept private here to avoid a\n * cross-module dependency for one tiny helper.\n */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\nexport interface WriteTokensUpgradeHintOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Trigger that produced the hint. */\n trigger: TokensUpgradeHintTrigger;\n fromVariant: string;\n toVariant: string;\n fromVersion: string;\n toVersion: string;\n /** Pre-filtered rename entries that apply to this transition. */\n renames: ReadonlyArray<TokenRenameEntry>;\n /** Optional ISO ts override (testing hook). Defaults to `new Date().toISOString()`. */\n isoTs?: string;\n}\n\n/**\n * Result of `writeTokensUpgradeHint` — `null` when there were no renames to\n * record (writer skips file creation rather than emit a noisy empty file).\n */\nexport interface TokensUpgradeHintResult {\n /** Absolute path of the written hint file. */\n path: string;\n /** Filesystem-safe ts that appears in the filename. */\n ts: string;\n /** Number of rename entries persisted. */\n renameCount: number;\n}\n\n/**\n * Persist a `tokens-<ts>.json` hint file when there are renames worth\n * surfacing. Returns `null` when `renames` is empty (no-op contract).\n */\nexport async function writeTokensUpgradeHint(\n options: WriteTokensUpgradeHintOptions,\n): Promise<TokensUpgradeHintResult | null> {\n if (options.renames.length === 0) return null;\n\n const isoTs = options.isoTs ?? new Date().toISOString();\n const fsTs = isoToFsSafe(isoTs);\n const filename = `tokens-${fsTs}.json`;\n const target = path.join(\n options.projectRoot,\n TEAMIX_DIR,\n HINTS_DIR,\n filename,\n );\n\n const payload: TokensUpgradeHint = {\n schemaVersion: 1,\n ts: isoTs,\n package: 'tokens',\n trigger: options.trigger,\n fromVariant: options.fromVariant,\n toVariant: options.toVariant,\n fromVersion: options.fromVersion,\n toVersion: options.toVersion,\n renames: options.renames,\n };\n\n await writeFileSafe(target, JSON.stringify(payload, null, 2) + '\\n');\n\n return {\n path: target,\n ts: fsTs,\n renameCount: options.renames.length,\n };\n}\n\n/**\n * Filter a variant's rename log down to the entries that apply when moving\n * from `fromVersion` to `toVersion`. Inclusive of `toVersion`, exclusive of\n * `fromVersion` (the consumer was already on `fromVersion` so any rename\n * recorded at that exact version was already absorbed).\n *\n * Pure semver comparison via numeric splitting (`\\d+\\.\\d+\\.\\d+` shape\n * enforced by `TokenRenameEntrySchema`). Pre-release suffixes use\n * `localeCompare` with `{ numeric: true }` so `rc.10` sorts after `rc.2`\n * (lexicographic comparison is wrong for numeric suffixes).\n */\nexport function selectApplicableRenames(\n renames: ReadonlyArray<TokenRenameEntry>,\n fromVersion: string,\n toVersion: string,\n): TokenRenameEntry[] {\n return renames\n .filter(\n (r) =>\n compareSemver(r.sinceVersion, fromVersion) > 0 &&\n compareSemver(r.sinceVersion, toVersion) <= 0,\n )\n .sort((a, b) => compareSemver(a.sinceVersion, b.sinceVersion));\n}\n\n/**\n * Tri-state semver comparator: returns negative / zero / positive matching\n * the standard `Array.prototype.sort` contract.\n */\nfunction compareSemver(a: string, b: string): number {\n const [aMain = '', aRest = ''] = a.split('-', 2);\n const [bMain = '', bRest = ''] = b.split('-', 2);\n const aParts = aMain.split('.').map((n) => Number.parseInt(n, 10));\n const bParts = bMain.split('.').map((n) => Number.parseInt(n, 10));\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const ai = aParts[i] ?? 0;\n const bi = bParts[i] ?? 0;\n if (ai !== bi) return ai - bi;\n }\n // Pre-release suffixes — numeric-aware compare so `rc.10` > `rc.2`;\n // absent suffix > present (per semver §11).\n if (aRest === '' && bRest !== '') return 1;\n if (aRest !== '' && bRest === '') return -1;\n return aRest.localeCompare(bRest, undefined, { numeric: true });\n}\n","import { hasManagedRegion, replaceManagedRegion } from '@teamix-evo/registry';\n\n/**\n * Walk every managed region present in the upstream payload and apply it\n * onto the consumer file. Regions present upstream but missing in the\n * consumer file fail-fast (ADR 0003 Negative — corrupted anchors must not be\n * silently rewritten). Regions absent upstream are left untouched.\n */\nexport function mergeManagedRegions(\n upstreamContent: string,\n consumerContent: string,\n): string {\n let updated = consumerContent;\n const re =\n /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->([\\s\\S]*?)<!-- teamix-evo:managed:end(?: id=\"\\1\")? -->/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(upstreamContent)) !== null) {\n const id = match[1]!;\n const body = match[2]!.replace(/^\\n/, '').replace(/\\n$/, '');\n if (!hasManagedRegion(updated, id)) {\n throw new Error(\n `Managed region \"${id}\" missing from consumer file — refusing to silently rewrite (ADR 0003).`,\n );\n }\n updated = replaceManagedRegion(updated, id, body);\n }\n return updated;\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Run \"npx teamix-evo@latest tokens init [variant]\" to get started.',\n );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install a variant: npx teamix-evo@latest tokens init <name>',\n );\n } catch (err) {\n logger.error(`Failed to list variants: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(`Failed to remove ${target}: ${getErrorMessage(err)}`);\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: ${getErrorMessage(err)}`,\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: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport {\n runTokensAudit,\n renderAuditSummary,\n type AuditCategory,\n} from '../../core/tokens-audit.js';\n\n/**\n * `teamix-evo tokens audit` — read-only analysis of `tokens.overrides.css`\n * against `tokens.theme.css`. Classifies each override into one of four\n * buckets (redundant / kept / migrate / custom) per the Init landing plan\n * §C.5. Never mutates files; the user (or AI skill) decides what to act on.\n */\nexport const auditCommand = new Command('audit')\n .description(\n '审计 tokens/tokens.overrides.css:与变体 theme.css 对照,分类输出冗余/保留/迁移/项目特有',\n )\n .option('--json', '以 JSON 格式输出结果(便于 skill 消费)')\n .option(\n '--filter <category>',\n '仅显示指定 bucket(redundant|kept|migrate|custom),可逗号分隔',\n )\n .action(async (opts: { json?: boolean; filter?: string }) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n const result = await runTokensAudit({ projectRoot });\n\n if (result.status === 'no-theme') {\n logger.error(\n `No tokens.theme.css found at ${result.themePath}. Run \\`tokens init <variant>\\` first.`,\n );\n process.exitCode = 1;\n return;\n }\n if (result.status === 'no-overrides') {\n logger.info(\n `No tokens.overrides.css at ${result.overridesPath}. Nothing to audit.`,\n );\n return;\n }\n if (result.status !== 'audited') {\n // Exhaustiveness fence — TS narrows to 'audited' below.\n return;\n }\n\n // Optional category filter (comma-separated, case-insensitive).\n const filterSet = parseFilter(opts.filter);\n const filtered = filterSet\n ? {\n ...result,\n entries: result.entries.filter((e) => filterSet.has(e.category)),\n }\n : result;\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(filtered, null, 2) + '\\n');\n return;\n }\n\n logger.info(renderAuditSummary(filtered));\n logger.info('');\n logger.info(\n '提示:此命令只读,不会修改 overrides.css;按上面的 REDUNDANT / MIGRATE 分类自行裁剪。',\n );\n } catch (err) {\n logger.error(`Failed to audit tokens: ${getErrorMessage(err)}`);\n process.exitCode = 1;\n }\n });\n\nfunction parseFilter(raw: string | undefined): Set<AuditCategory> | null {\n if (!raw) return null;\n const valid: AuditCategory[] = ['redundant', 'kept', 'migrate', 'custom'];\n const out = new Set<AuditCategory>();\n for (const part of raw.split(',').map((s) => s.trim().toLowerCase())) {\n if (!part) continue;\n if ((valid as string[]).includes(part)) {\n out.add(part as AuditCategory);\n }\n }\n return out.size > 0 ? out : null;\n}\n","/**\n * Token overrides audit — analyses `tokens/tokens.overrides.css` against the\n * regenerable `tokens/tokens.theme.css` and classifies every override entry\n * into one of four buckets per the Init landing plan §C.5:\n *\n * - `redundant` — override value already matches the variant theme\n * (after v3 ↔ v4 semantic normalisation). Safe to delete.\n * - `kept` — override genuinely differs from theme; user-owned tweak.\n * - `migrate` — override is written in legacy v3 shadcn shape\n * (`--primary: 218.6 100% 46.7%`) while the theme is in Tailwind v4\n * `@theme` shape (`--color-primary: hsl(218.6 100% 46.7%)`). Recommend\n * rewriting to the v4 form (still classifies as redundant/kept underneath).\n * - `custom` — override has no matching theme variable; project-specific\n * extension.\n *\n * The audit is **read-only**: it never mutates `overrides.css`. Callers\n * surface the entries to the user (CLI / skill) for manual decision-making.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nconst THEME_REL = 'tokens/tokens.theme.css';\nconst OVERRIDES_REL = 'tokens/tokens.overrides.css';\n\n/** Single CSS custom-property declaration parsed out of a theme/overrides file. */\nexport interface ParsedToken {\n /** Variable name including the leading `--`. */\n name: string;\n /** Raw value as it appears in source (post `:` pre `;`, trimmed). */\n value: string;\n /** 1-based line number for diagnostics. */\n line: number;\n}\n\nexport type AuditCategory = 'redundant' | 'kept' | 'migrate' | 'custom';\n\nexport interface TokenAuditEntry {\n /** Override variable name (as authored in `tokens.overrides.css`). */\n name: string;\n /** Override value (as authored). */\n value: string;\n /** 1-based line number inside `tokens.overrides.css`. */\n line: number;\n /** Primary classification bucket. */\n category: AuditCategory;\n /** Theme variable matched against (after v3 → v4 mapping if needed). */\n themeName?: string;\n /** Theme variable value (raw). */\n themeValue?: string;\n /**\n * `migrate` flag is orthogonal to the redundant/kept axis: an override may\n * simultaneously be redundant **and** in legacy v3 shape. We still classify\n * it as `migrate` so the user is nudged to rewrite the form first; the\n * `compareCategory` field carries the redundant/kept verdict for that case.\n */\n compareCategory?: 'redundant' | 'kept';\n /** Human-readable explanation. */\n reason: string;\n}\n\nexport interface RunTokensAuditOptions {\n /** Absolute project root. */\n projectRoot: string;\n}\n\nexport type RunTokensAuditResult =\n | {\n status: 'audited';\n themePath: string;\n overridesPath: string;\n totalOverrides: number;\n entries: TokenAuditEntry[];\n /** Bucket counts for quick CLI summary. */\n summary: Record<AuditCategory, number>;\n }\n | {\n status: 'no-theme' | 'no-overrides';\n themePath: string;\n overridesPath: string;\n };\n\n/**\n * Run the audit for `<projectRoot>/tokens/`. Both files are read directly off\n * disk; no manifest lookup. Missing theme is fatal-ish (status `no-theme` —\n * caller decides whether to error). Missing overrides means nothing to audit.\n */\nexport async function runTokensAudit(\n options: RunTokensAuditOptions,\n): Promise<RunTokensAuditResult> {\n const themePath = path.join(options.projectRoot, THEME_REL);\n const overridesPath = path.join(options.projectRoot, OVERRIDES_REL);\n\n const themeSrc = await safeRead(themePath);\n if (themeSrc === null) {\n return { status: 'no-theme', themePath, overridesPath };\n }\n const overridesSrc = await safeRead(overridesPath);\n if (overridesSrc === null) {\n return { status: 'no-overrides', themePath, overridesPath };\n }\n\n const themeTokens = parseCssVariables(themeSrc);\n const overrideTokens = parseCssVariables(overridesSrc);\n\n const themeIndex = new Map<string, ParsedToken>();\n for (const tok of themeTokens) themeIndex.set(tok.name, tok);\n\n const entries: TokenAuditEntry[] = [];\n for (const tok of overrideTokens) {\n entries.push(classifyOverride(tok, themeIndex));\n }\n\n const summary: Record<AuditCategory, number> = {\n redundant: 0,\n kept: 0,\n migrate: 0,\n custom: 0,\n };\n for (const entry of entries) summary[entry.category] += 1;\n\n return {\n status: 'audited',\n themePath,\n overridesPath,\n totalOverrides: entries.length,\n entries,\n summary,\n };\n}\n\nasync function safeRead(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Parse `--name: value;` declarations out of CSS source. We deliberately keep\n * this tolerant: comments are stripped first, then a single regex captures\n * any custom-property assignment regardless of which selector / at-rule block\n * it sits inside (`@theme {}`, `:root {}`, `[data-theme=\"...\"] {}`, etc.).\n *\n * A given variable may legitimately appear multiple times across blocks\n * (e.g. dark-mode override). The parser returns *every* occurrence so callers\n * can decide; the audit code uses last-write-wins on the theme side.\n */\nexport function parseCssVariables(source: string): ParsedToken[] {\n // Strip block comments so they can't shadow a `--var:` inside a comment.\n const stripped = source.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (m) =>\n m.replace(/[^\\n]/g, ' '),\n );\n const out: ParsedToken[] = [];\n const lines = stripped.split('\\n');\n for (let i = 0; i < lines.length; i += 1) {\n const lineRaw = lines[i] ?? '';\n const match = /^\\s*(--[A-Za-z0-9_-]+)\\s*:\\s*([^;]+?)\\s*;/.exec(lineRaw);\n if (!match) continue;\n const name = match[1];\n const value = match[2];\n if (!name || !value) continue;\n out.push({ name, value: value.trim(), line: i + 1 });\n }\n return out;\n}\n\n/**\n * Classify one override token against the theme index.\n *\n * Strategy (in priority order):\n * 1. Direct same-name match (`--color-primary` ↔ `--color-primary`):\n * compare normalised values → redundant / kept.\n * 2. v3 → v4 mapping (`--primary` ↔ `--color-primary`): the override is in\n * legacy shadcn shape (no `--color-` prefix, bare HSL triplet); we wrap\n * it into `hsl(...)` and look up the v4 sibling. Always classified as\n * `migrate`, but we still surface the redundant/kept verdict via\n * `compareCategory`.\n * 3. No match anywhere → `custom`.\n *\n * Note: v3 mapping is best-effort. `--background: 0 0% 100%` maps to\n * `--color-background`. Tokens like `--radius: 0.5rem` (where the v4 `@theme`\n * spec keeps `--radius` un-prefixed) fall through to step 1 cleanly.\n */\nfunction classifyOverride(\n override: ParsedToken,\n themeIndex: Map<string, ParsedToken>,\n): TokenAuditEntry {\n // Step 1 — direct same-name match.\n const direct = themeIndex.get(override.name);\n if (direct) {\n const equal = areValuesSemanticallyEqual(override.value, direct.value);\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: equal ? 'redundant' : 'kept',\n themeName: direct.name,\n themeValue: direct.value,\n reason: equal\n ? `theme already declares ${direct.name} with an equivalent value — safe to delete`\n : `genuinely differs from theme value — kept as user override`,\n };\n }\n\n // Step 2 — v3 → v4 colour mapping. Heuristics:\n // - override name does NOT start with `--color-`\n // - theme has a `--color-<same-suffix>` entry\n // - override value parses as a bare HSL triplet (e.g. `220 9% 7%`) or\n // as a CSS color function. Either way wrapping with `hsl(...)` lets\n // us compare against the theme's v4 form.\n if (!override.name.startsWith('--color-')) {\n const v4Name = `--color-${override.name.slice(2)}`; // strip `--`\n const v4Match = themeIndex.get(v4Name);\n if (v4Match) {\n const wrapped = wrapAsHslIfBare(override.value);\n const equal = areValuesSemanticallyEqual(wrapped, v4Match.value);\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: 'migrate',\n themeName: v4Match.name,\n themeValue: v4Match.value,\n compareCategory: equal ? 'redundant' : 'kept',\n reason: equal\n ? `legacy v3 shape; theme has ${v4Match.name} with equivalent value — rewrite as v4 (or delete)`\n : `legacy v3 shape; rewrite as v4 \\`${v4Name}: hsl(...)\\` and keep override`,\n };\n }\n }\n\n // Step 3 — no match: project-specific extension.\n return {\n name: override.name,\n value: override.value,\n line: override.line,\n category: 'custom',\n reason: `no matching theme variable — project-specific extension`,\n };\n}\n\n/**\n * Compare two CSS values for semantic equality. Implementation is intentionally\n * narrow: collapse whitespace, lower-case function names, drop trailing zero\n * fractions on numbers. We do NOT attempt full colour-space conversion — the\n * audit is heuristic; users still get a `kept` if values diverge in a way we\n * can't normalise (e.g. `oklch(...)` vs `hsl(...)`).\n */\nexport function areValuesSemanticallyEqual(a: string, b: string): boolean {\n return normaliseCssValue(a) === normaliseCssValue(b);\n}\n\nfunction normaliseCssValue(value: string): string {\n let v = value.trim().toLowerCase();\n // Collapse whitespace runs.\n v = v.replace(/\\s+/g, ' ');\n // Strip whitespace around commas / parens.\n v = v.replace(/\\s*([(),/])\\s*/g, '$1');\n // Drop trailing-zero fractions: `46.700` → `46.7`, `12.0` → `12`.\n v = v\n .replace(/(\\d+\\.\\d*?)0+(?=[^0-9]|$)/g, '$1')\n .replace(/\\.(?=[^0-9]|$)/g, '');\n return v;\n}\n\n/**\n * If the value looks like a bare HSL triplet (`<deg> <pct>% <pct>%` with optional\n * alpha), wrap it as `hsl(...)`. Otherwise return as-is.\n *\n * Examples:\n * `220 9% 7%` → `hsl(220 9% 7%)`\n * `218.6 100% 46.7%` → `hsl(218.6 100% 46.7%)`\n * `0 0% 100% / 0.5` → `hsl(0 0% 100% / 0.5)`\n * `hsl(220 9% 7%)` → unchanged\n * `oklch(0.55 0.22 250)` → unchanged\n */\nexport function wrapAsHslIfBare(value: string): string {\n const trimmed = value.trim();\n // Already a function call.\n if (/^[a-z-]+\\s*\\(/i.test(trimmed)) return trimmed;\n // Bare triplet: <num> <num>% <num>% [/ <num>]\n const triplet =\n /^-?\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?%\\s+\\d+(?:\\.\\d+)?%(?:\\s*\\/\\s*\\S+)?$/;\n if (triplet.test(trimmed)) {\n return `hsl(${trimmed})`;\n }\n return trimmed;\n}\n\n/** Format a single audit entry for human display. */\nexport function formatAuditEntry(entry: TokenAuditEntry): string {\n const head = ` ${entry.name}: ${entry.value};`;\n switch (entry.category) {\n case 'redundant':\n return `${head}\\n → REDUNDANT — ${entry.reason}`;\n case 'kept':\n return `${head}\\n → KEEP — ${entry.reason}`;\n case 'migrate': {\n const sub = entry.compareCategory\n ? ` (currently ${entry.compareCategory})`\n : '';\n return `${head}\\n → MIGRATE${sub} — ${entry.reason}`;\n }\n case 'custom':\n return `${head}\\n → CUSTOM — ${entry.reason}`;\n }\n}\n\n/** Render a section grouped by category for CLI output. */\nexport function renderAuditSummary(\n result: Extract<RunTokensAuditResult, { status: 'audited' }>,\n): string {\n const lines: string[] = [];\n lines.push(`tokens audit · ${result.totalOverrides} override(s) inspected`);\n lines.push(\n ` redundant=${result.summary.redundant} kept=${result.summary.kept} migrate=${result.summary.migrate} custom=${result.summary.custom}`,\n );\n for (const cat of ['redundant', 'migrate', 'custom', 'kept'] as const) {\n const subset = result.entries.filter((e) => e.category === cat);\n if (subset.length === 0) continue;\n lines.push('');\n lines.push(`[${cat.toUpperCase()}] (${subset.length})`);\n for (const entry of subset) lines.push(formatAuditEntry(entry));\n }\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport {\n runCodemod,\n ALL_CODEMODS,\n listCodemodIds,\n} from '../../codemods/index.js';\nimport { buildTokenMapFromProject } from '../../core/tokens-treat.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const codemodCommand = new Command('codemod')\n .description('运行内置 token codemod(默认 dry-run)')\n .argument('[name]', '要运行的 codemod 名称(留空列出所有可用 codemod)')\n .option('--glob <pattern>', '覆盖默认文件匹配规则')\n .option('--apply', '实际应用变更(默认仅展示 dry-run 结果)')\n .option('--list', '列出所有可用 codemod')\n .action(\n async (\n name: string | undefined,\n opts: { glob?: string; apply?: boolean; list?: boolean },\n ) => {\n // --list or no name: show available codemods\n if (opts.list || !name) {\n logger.info('可用 codemods:\\n');\n for (const cm of ALL_CODEMODS) {\n const auto =\n cm.automation === 'full-auto' ? '全自动' : '半自动(AI辅助)';\n logger.info(` ${cm.id.padEnd(24)} ${cm.layer.padEnd(12)} ${auto}`);\n logger.info(`${''.padEnd(24)} ${cm.description}`);\n logger.info('');\n }\n return;\n }\n\n const dryRun = !opts.apply;\n const projectRoot = process.cwd();\n\n try {\n // Build tokenMap for L3-semantic codemods\n const tokenMap = await buildTokenMapFromProject(projectRoot);\n\n const result = await runCodemod({\n projectRoot,\n codemodId: name,\n glob: opts.glob,\n dryRun,\n tokenMap,\n });\n\n const mode = dryRun ? '[dry-run]' : '[applied]';\n logger.info(\n `\\n${mode} ${result.codemodId}: 扫描 ${result.scanned} 个文件, ${result.affected} 个文件命中, ${result.totalMatches} 处匹配\\n`,\n );\n\n for (const file of result.files) {\n logger.info(` 📄 ${file.file} (${file.matches.length} 处)`);\n for (const m of file.matches.slice(0, 5)) {\n const arrow = m.replacement ? ` → ${m.replacement}` : '';\n logger.info(` L${m.line}: ${m.original}${arrow}`);\n logger.info(` ${m.reason}`);\n }\n if (file.matches.length > 5) {\n logger.info(` ... 及其余 ${file.matches.length - 5} 处`);\n }\n }\n\n if (dryRun && result.totalMatches > 0) {\n logger.info('\\n💡 确认后使用 --apply 实际执行变更');\n }\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n },\n );\n","/**\n * Built-in codemod system — public API.\n *\n * Re-exports types, registry, and runner so consumers (CLI commands, tests)\n * can import from a single entry point:\n *\n * ```ts\n * import { runCodemod, ALL_CODEMODS } from '../codemods/index.js';\n * ```\n */\nexport type {\n CodemodLayer,\n CodemodAutomation,\n CodemodMatch,\n CodemodFileResult,\n CodemodDefinition,\n RunCodemodOptions,\n RunCodemodResult,\n} from './types.js';\n\nexport { ALL_CODEMODS, getCodemod, listCodemodIds } from './registry.js';\nexport { runCodemod } from './runner.js';\n","/**\n * Codemod runner — scans project files and applies (or dry-runs) a codemod.\n *\n * Orchestrates: walk → filter by extension → read → transform → optionally\n * write back. The runner is the shared execution engine consumed by the CLI\n * command (`teamix-evo tokens codemod <name>`) and future `tokens treat`.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { walkDir, DEFAULT_SKIP_DIRS } from '../utils/path.js';\nimport { getCodemod } from './registry.js';\nimport type {\n RunCodemodOptions,\n RunCodemodResult,\n CodemodFileResult,\n} from './types.js';\n\n/**\n * Run a single codemod against the project.\n *\n * @throws if the codemod id is unknown.\n */\nexport async function runCodemod(\n options: RunCodemodOptions,\n): Promise<RunCodemodResult> {\n const { projectRoot, codemodId, dryRun = true } = options;\n\n const codemod = getCodemod(codemodId);\n if (!codemod) {\n throw new Error(\n `Unknown codemod \"${codemodId}\". Available: ${(\n await import('./registry.js')\n )\n .listCodemodIds()\n .join(', ')}`,\n );\n }\n\n // Determine the scan root from the glob pattern or default to `src/`.\n // The skeleton uses a simple walkDir approach; full glob support lands\n // in Wave 2 with the `tokens treat` pipeline.\n const scanRoot = path.join(projectRoot, 'src');\n\n let allFiles: string[];\n try {\n allFiles = await walkDir(scanRoot, DEFAULT_SKIP_DIRS);\n } catch {\n // src/ may not exist (e.g. dry-run on a fresh project)\n allFiles = [];\n }\n\n // Filter to target extensions only (dir-level filtering handled by walkDir skipDirs)\n const files = allFiles.filter((abs) => {\n const ext = path.extname(abs).slice(1);\n return codemod.extensions.includes(ext);\n });\n\n const results: CodemodFileResult[] = [];\n let scanned = 0;\n\n for (const absPath of files) {\n scanned++;\n const relFile = path.relative(projectRoot, absPath);\n const content = await fs.readFile(absPath, 'utf-8');\n const result = codemod.transform(content, relFile, options.tokenMap);\n\n if (result) {\n results.push(result);\n\n // Apply changes when not in dry-run mode and the codemod is full-auto\n if (!dryRun && result.rewritten !== null) {\n await fs.writeFile(absPath, result.rewritten, 'utf-8');\n }\n }\n }\n\n const totalMatches = results.reduce((sum, r) => sum + r.matches.length, 0);\n\n return {\n codemodId,\n scanned,\n affected: results.length,\n totalMatches,\n files: results,\n applied: !dryRun && codemod.automation === 'full-auto',\n };\n}\n","/**\n * `tokens treat` — one-click treatment pipeline with metrics.\n *\n * Orchestrates the token treatment flow:\n * 1. Run lint → capture pre-baseline\n * 2. Execute codemods in phase order (L2 → L3 auto)\n * 3. Run lint → capture post-baseline\n * 4. Generate treatment report with delta metrics\n * 5. Optionally lock baseline\n *\n * See PLAN Task 6.3.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { collectTeamixEvoViolations } from '../utils/lint.js';\nimport { logger } from '../utils/logger.js';\nimport { runCodemod } from '../codemods/runner.js';\nimport { listCodemodIds } from '../codemods/registry.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface TreatOptions {\n projectRoot: string;\n /** Lock the post-treatment baseline */\n lockBaseline?: boolean;\n /** Skip npm install after treatment */\n skipInstall?: boolean;\n /** Apply codemods (false = dry-run only) */\n apply?: boolean;\n /** Pre-built token map for L3 codemods. If omitted, auto-parsed from tokens/tokens.theme.css. */\n tokenMap?: Map<string, string>;\n}\n\nexport interface BaselineSnapshot {\n timestamp: string;\n rules: Record<string, number>;\n total: number;\n}\n\nexport interface TreatmentDelta {\n rule: string;\n before: number;\n after: number;\n delta: number;\n percentage: string;\n}\n\nexport interface TreatResult {\n /** Pre-treatment baseline */\n preBaseline: BaselineSnapshot;\n /** Post-treatment baseline */\n postBaseline: BaselineSnapshot;\n /** Per-rule deltas */\n deltas: TreatmentDelta[];\n /** Total reduction */\n totalReduction: number;\n /** Treatment report path */\n reportPath: string;\n /** Whether baseline was locked */\n baselineLocked: boolean;\n}\n\n// ─── Codemod execution order ─────────────────────────────────────────────────\n\n/**\n * Codemods to execute in treatment order.\n * Only full-auto codemods are included in the automatic pipeline.\n */\nconst TREATMENT_CODEMODS = [\n 'hsl-to-v4', // L2 format\n 'hex-to-token', // L3 semantic\n 'tw-scale-to-semantic', // L3 semantic\n 'space-to-gap', // L3 semantic\n] as const;\n\n// ─── Core treat logic ────────────────────────────────────────────────────────\n\nexport async function runTokensTreat(\n options: TreatOptions,\n): Promise<TreatResult> {\n const { projectRoot, lockBaseline = false, apply = false } = options;\n\n // Build token map for L3-semantic codemods\n const tokenMap =\n options.tokenMap ?? (await buildTokenMapFromProject(projectRoot));\n\n // Step 1: Capture pre-treatment baseline\n logger.info(' capturing pre-treatment baseline...');\n const preBaseline = await captureBaseline(projectRoot);\n\n // Step 2: Run codemods\n const codemodResults: Array<{\n id: string;\n matches: number;\n applied: boolean;\n }> = [];\n\n for (const codemodId of TREATMENT_CODEMODS) {\n const availableIds = listCodemodIds();\n if (!availableIds.includes(codemodId)) {\n logger.debug(` codemod ${codemodId} not found, skipping`);\n continue;\n }\n\n logger.info(` running codemod: ${codemodId}...`);\n try {\n const result = await runCodemod({\n projectRoot,\n codemodId,\n dryRun: !apply,\n tokenMap,\n });\n\n const totalMatches = result.files.reduce(\n (sum, f) => sum + f.matches.length,\n 0,\n );\n\n codemodResults.push({\n id: codemodId,\n matches: totalMatches,\n applied: apply && totalMatches > 0,\n });\n\n if (totalMatches > 0) {\n logger.info(\n ` ${codemodId}: ${totalMatches} matches${\n apply ? ' (applied)' : ' (dry-run)'\n }`,\n );\n }\n } catch (err) {\n logger.warn(\n ` ${codemodId} failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n codemodResults.push({ id: codemodId, matches: 0, applied: false });\n }\n }\n\n // Step 3: Capture post-treatment baseline\n logger.info(' capturing post-treatment baseline...');\n const postBaseline = await captureBaseline(projectRoot);\n\n // Step 4: Calculate deltas\n const deltas: TreatmentDelta[] = [];\n const allRules = new Set([\n ...Object.keys(preBaseline.rules),\n ...Object.keys(postBaseline.rules),\n ]);\n\n for (const rule of allRules) {\n const before = preBaseline.rules[rule] ?? 0;\n const after = postBaseline.rules[rule] ?? 0;\n if (before === 0 && after === 0) continue;\n\n const delta = after - before;\n const percentage =\n before > 0\n ? `${delta >= 0 ? '+' : ''}${Math.round((delta / before) * 100)}%`\n : after > 0\n ? '+∞'\n : '0%';\n\n deltas.push({ rule, before, after, delta, percentage });\n }\n\n const totalReduction = preBaseline.total - postBaseline.total;\n\n // Step 5: Generate report\n const reportPath = await generateTreatmentReport(\n projectRoot,\n preBaseline,\n postBaseline,\n deltas,\n codemodResults,\n );\n\n // Step 6: Optionally lock baseline\n let baselineLocked = false;\n if (lockBaseline) {\n await lockBaselineFile(projectRoot, postBaseline);\n baselineLocked = true;\n logger.info(' baseline locked → .teamix-evo/tokens-baseline.json');\n }\n\n return {\n preBaseline,\n postBaseline,\n deltas,\n totalReduction,\n reportPath,\n baselineLocked,\n };\n}\n\n// ─── Baseline capture ────────────────────────────────────────────────────────\n\nasync function captureBaseline(projectRoot: string): Promise<BaselineSnapshot> {\n const rules = await collectTeamixEvoViolations(projectRoot);\n const total = Object.values(rules).reduce((sum, n) => sum + n, 0);\n\n return {\n timestamp: new Date().toISOString(),\n rules,\n total,\n };\n}\n\n// ─── Report generation ───────────────────────────────────────────────────────\n\nasync function generateTreatmentReport(\n projectRoot: string,\n pre: BaselineSnapshot,\n post: BaselineSnapshot,\n deltas: TreatmentDelta[],\n codemodResults: Array<{ id: string; matches: number; applied: boolean }>,\n): Promise<string> {\n const reportsDir = path.join(\n projectRoot,\n '.teamix-evo',\n '.treatment-reports',\n );\n await ensureDir(reportsDir);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const reportPath = path.join(reportsDir, `${ts}.md`);\n\n let content = `# Token 治理报告\n\n> 执行时间: ${post.timestamp}\n> 前置基线: ${pre.total} violations\n> 后置基线: ${post.total} violations\n> **总降幅: ${pre.total - post.total} (${\n pre.total > 0 ? Math.round(((pre.total - post.total) / pre.total) * 100) : 0\n }%)**\n\n## 降幅对比表\n\n| 规则 | 治理前 | 治理后 | 变化 |\n| ---- | ------ | ------ | ---- |\n`;\n\n for (const d of deltas) {\n content += `| \\`${d.rule}\\` | ${d.before} | ${d.after} | ${d.percentage} |\\n`;\n }\n\n content += `\\n## Codemod 执行记录\\n\\n`;\n content += '| Codemod | 匹配数 | 已应用 |\\n| ------- | ------ | ------ |\\n';\n\n for (const c of codemodResults) {\n content += `| \\`${c.id}\\` | ${c.matches} | ${\n c.applied ? '✅' : '❌ (dry-run)'\n } |\\n`;\n }\n\n content += `\\n---\\n\\n> 锁定基线: \\`npx teamix-evo tokens treat --lock-baseline\\`\\n`;\n\n await fs.writeFile(reportPath, content, 'utf-8');\n return reportPath;\n}\n\n// ─── Baseline lock ───────────────────────────────────────────────────────────\n\nasync function lockBaselineFile(\n projectRoot: string,\n baseline: BaselineSnapshot,\n): Promise<void> {\n const baselinePath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-baseline.json',\n );\n await fs.writeFile(\n baselinePath,\n JSON.stringify(baseline, null, 2) + '\\n',\n 'utf-8',\n );\n}\n\n// ─── Token map builder ───────────────────────────────────────────────────────────\n\n/**\n * Parse CSS custom properties from the project's token files and build\n * a reverse lookup map: normalised hex value → CSS variable name (without --).\n *\n * Reads `tokens/tokens.theme.css` and `tokens/tokens.overrides.css`.\n */\nexport async function buildTokenMapFromProject(\n projectRoot: string,\n): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n const tokenFiles = [\n path.join(projectRoot, 'tokens', 'tokens.theme.css'),\n path.join(projectRoot, 'tokens', 'tokens.overrides.css'),\n ];\n\n for (const file of tokenFiles) {\n const content = await readFileOrNull(file);\n if (!content) continue;\n\n // Match lines like: --color-primary: #1a2b3c;\n const propRe = /--([\\w-]+):\\s*(#[0-9a-fA-F]{3,8})\\b/g;\n let m: RegExpExecArray | null;\n while ((m = propRe.exec(content)) !== null) {\n const varName = m[1]!;\n const hex = normaliseHexForMap(m[2]!);\n // First occurrence wins (theme > overrides handled by file order)\n if (!map.has(hex)) {\n map.set(hex, varName);\n }\n }\n }\n\n return map;\n}\n\n/** Normalise hex to lowercase 6-digit form for consistent map lookup. */\nfunction normaliseHexForMap(hex: string): string {\n const raw = hex.slice(1).toLowerCase();\n if (raw.length === 3)\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 4)\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n if (raw.length === 8) return `#${raw.slice(0, 6)}`;\n return `#${raw}`;\n}\n","/**\n * Shared ESLint execution utilities for baseline/treatment modules.\n */\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Run ESLint in JSON format and collect `teamix-evo/` rule violation counts.\n *\n * Returns an empty record when ESLint is unavailable, produces no output,\n * or when JSON parsing fails. This makes it safe to call in environments\n * without ESLint installed (e.g. CI without devDeps).\n */\nexport async function collectTeamixEvoViolations(\n projectRoot: string,\n): Promise<Record<string, number>> {\n const rules: Record<string, number> = {};\n\n try {\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n messages: Array<{ ruleId: string | null }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n if (msg.ruleId && msg.ruleId.startsWith('teamix-evo/')) {\n rules[msg.ruleId] = (rules[msg.ruleId] ?? 0) + 1;\n }\n }\n }\n } catch {\n // JSON parse failure — return empty\n }\n }\n } catch {\n // ESLint not available or timed out\n }\n\n return rules;\n}\n","/**\n * CLI command: `teamix-evo tokens diagnose`\n * See PLAN Task 6.2.\n */\nimport { Command } from 'commander';\nimport { runTokensDiagnose } from '../../core/tokens-diagnose.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const diagnoseCommand = new Command('diagnose')\n .description('生成分级 token 治理计划(.teamix-evo/.treatment-plan.md)')\n .action(async () => {\n const projectRoot = process.cwd();\n logger.info('Running tokens diagnose...');\n\n try {\n const result = await runTokensDiagnose({ projectRoot });\n\n logger.info(`\\nToken 治理计划已生成: ${result.planPath}`);\n logger.info(`总违规数: ${result.totalViolations}`);\n logger.info('');\n\n const phases = [\n { key: 'L1-structure' as const, label: 'L1 结构' },\n { key: 'L2-format' as const, label: 'L2 格式' },\n { key: 'L3-semantic-auto' as const, label: 'L3 自动' },\n { key: 'L3-semantic-semi' as const, label: 'L3 半自动' },\n { key: 'L3-manual' as const, label: 'L3 人工' },\n { key: 'reflect' as const, label: '反哺' },\n ];\n\n for (const p of phases) {\n const count = result.phaseSummary[p.key];\n if (count > 0) {\n logger.info(` ${p.label}: ${count} violations`);\n }\n }\n\n logger.info('\\n执行治理: npx teamix-evo tokens treat');\n } catch (err) {\n logger.error(\n `diagnose failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * `tokens diagnose` — tiered treatment plan generator.\n *\n * Scans the project for token-related lint violations and classifies them\n * into treatment phases (L1 structure → L2 format → L3 semantic → L3 semi-auto\n * → L3 manual → reflect). Produces `.teamix-evo/.treatment-plan.md`.\n *\n * See PLAN Task 6.2.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport type TreatmentPhase =\n | 'L1-structure'\n | 'L2-format'\n | 'L3-semantic-auto'\n | 'L3-semantic-semi'\n | 'L3-manual'\n | 'reflect';\n\nexport interface DiagnosticEntry {\n /** ESLint/Stylelint rule id */\n ruleId: string;\n /** Phase classification */\n phase: TreatmentPhase;\n /** Number of violations */\n count: number;\n /** Recommended codemod or action */\n action: string;\n /** Automation level */\n automation: 'full-auto' | 'semi-auto' | 'manual';\n}\n\nexport interface DiagnoseResult {\n /** Treatment plan file path */\n planPath: string;\n /** All diagnostic entries by phase */\n entries: DiagnosticEntry[];\n /** Total violation count */\n totalViolations: number;\n /** Per-phase summary */\n phaseSummary: Record<TreatmentPhase, number>;\n}\n\n// ─── Rule → Phase mapping ────────────────────────────────────────────────────\n\nconst RULE_PHASE_MAP: Record<\n string,\n {\n phase: TreatmentPhase;\n action: string;\n automation: DiagnosticEntry['automation'];\n }\n> = {\n // L2 format\n 'teamix-evo/no-color-literal': {\n phase: 'L2-format',\n action: 'codemod: hsl-to-v4 → hex-to-token',\n automation: 'full-auto',\n },\n // L3 semantic auto\n 'teamix-evo/no-raw-color-scale': {\n phase: 'L3-semantic-auto',\n action: 'codemod: tw-scale-to-semantic',\n automation: 'full-auto',\n },\n 'teamix-evo/prefer-gap-over-space': {\n phase: 'L3-semantic-auto',\n action: 'codemod: space-to-gap',\n automation: 'full-auto',\n },\n // L3 semi-auto\n 'teamix-evo/no-arbitrary-tw-value': {\n phase: 'L3-semantic-semi',\n action: 'codemod: arbitrary-to-token (AI assist)',\n automation: 'semi-auto',\n },\n // L3 manual\n 'teamix-evo/no-large-radius': {\n phase: 'L3-manual',\n action: 'manual: use semantic radius tokens',\n automation: 'manual',\n },\n 'teamix-evo/no-bare-border': {\n phase: 'L3-manual',\n action: 'manual: use semantic border tokens',\n automation: 'manual',\n },\n 'teamix-evo/no-manual-dark-classnames': {\n phase: 'L3-manual',\n action: 'manual: use CSS custom properties for dark mode',\n automation: 'manual',\n },\n};\n\n// ─── Core diagnose logic ─────────────────────────────────────────────────────\n\n/**\n * Run lint and classify violations into treatment phases.\n */\nexport async function runTokensDiagnose(options: {\n projectRoot: string;\n}): Promise<DiagnoseResult> {\n const { projectRoot } = options;\n\n // Try to run ESLint and parse output\n const violations = await collectLintViolations(projectRoot);\n\n // Classify into diagnostic entries\n const entryMap = new Map<string, DiagnosticEntry>();\n\n for (const { ruleId } of violations) {\n if (!ruleId) continue;\n const mapping = RULE_PHASE_MAP[ruleId];\n if (!mapping) continue;\n\n const existing = entryMap.get(ruleId);\n if (existing) {\n existing.count++;\n } else {\n entryMap.set(ruleId, {\n ruleId,\n phase: mapping.phase,\n count: 1,\n action: mapping.action,\n automation: mapping.automation,\n });\n }\n }\n\n const entries = [...entryMap.values()].sort((a, b) => {\n const phaseOrder: TreatmentPhase[] = [\n 'L1-structure',\n 'L2-format',\n 'L3-semantic-auto',\n 'L3-semantic-semi',\n 'L3-manual',\n 'reflect',\n ];\n return phaseOrder.indexOf(a.phase) - phaseOrder.indexOf(b.phase);\n });\n\n const totalViolations = entries.reduce((sum, e) => sum + e.count, 0);\n\n const phaseSummary: Record<TreatmentPhase, number> = {\n 'L1-structure': 0,\n 'L2-format': 0,\n 'L3-semantic-auto': 0,\n 'L3-semantic-semi': 0,\n 'L3-manual': 0,\n reflect: 0,\n };\n\n for (const entry of entries) {\n phaseSummary[entry.phase] += entry.count;\n }\n\n // Generate treatment plan markdown\n const planPath = await generateTreatmentPlan(\n projectRoot,\n entries,\n totalViolations,\n phaseSummary,\n );\n\n return { planPath, entries, totalViolations, phaseSummary };\n}\n\n// ─── Lint runner ─────────────────────────────────────────────────────────────\n\ninterface LintViolation {\n ruleId: string | null;\n file: string;\n line: number;\n}\n\nasync function collectLintViolations(\n projectRoot: string,\n): Promise<LintViolation[]> {\n const violations: LintViolation[] = [];\n\n try {\n // Run ESLint with JSON formatter\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n filePath: string;\n messages: Array<{\n ruleId: string | null;\n line: number;\n }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n violations.push({\n ruleId: msg.ruleId,\n file: path.relative(projectRoot, result.filePath),\n line: msg.line,\n });\n }\n }\n } catch {\n logger.debug('Failed to parse ESLint JSON output');\n }\n }\n } catch {\n logger.debug('ESLint not available or failed — using empty violations');\n }\n\n return violations;\n}\n\n// ─── Treatment plan generator ────────────────────────────────────────────────\n\nasync function generateTreatmentPlan(\n projectRoot: string,\n entries: DiagnosticEntry[],\n totalViolations: number,\n phaseSummary: Record<TreatmentPhase, number>,\n): Promise<string> {\n const teamixDir = path.join(projectRoot, '.teamix-evo');\n await ensureDir(teamixDir);\n const planPath = path.join(teamixDir, '.treatment-plan.md');\n\n const now = new Date().toISOString().slice(0, 19).replace('T', ' ');\n\n const phases: Array<{\n phase: TreatmentPhase;\n title: string;\n description: string;\n }> = [\n {\n phase: 'L1-structure',\n title: 'Phase 1 · L1 结构治理',\n description: '`tokens audit` 输出:token 文件结构完整性检查',\n },\n {\n phase: 'L2-format',\n title: 'Phase 2 · L2 格式归一化',\n description: '推荐 codemod: `hsl-to-v4`',\n },\n {\n phase: 'L3-semantic-auto',\n title: 'Phase 3 · L3 语义替换(自动批次)',\n description:\n 'codemod: `hex-to-token` / `tw-scale-to-semantic` / `space-to-gap`',\n },\n {\n phase: 'L3-semantic-semi',\n title: 'Phase 4 · L3 半自动(AI 引导)',\n description: '`no-arbitrary-tw-value` 清单,由 AI 选候选 token',\n },\n {\n phase: 'L3-manual',\n title: 'Phase 5 · L3 纯人工',\n description: '需要开发者判断语义的 lint 违规',\n },\n {\n phase: 'reflect',\n title: 'Phase 6 · Token 反哺建议',\n description: '高频色值 → 项目级 token 候选',\n },\n ];\n\n let content = `# Token 治理计划\n\n> 生成时间: ${now}\n> 总违规数: ${totalViolations}\n\n## 概览\n\n| Phase | 违规数 | 自动化 |\n| ----- | ------ | ------ |\n`;\n\n for (const p of phases) {\n const count = phaseSummary[p.phase];\n const auto =\n p.phase === 'L1-structure'\n ? 'audit'\n : p.phase === 'L2-format' || p.phase === 'L3-semantic-auto'\n ? '全自动'\n : p.phase === 'L3-semantic-semi'\n ? 'AI 辅助'\n : p.phase === 'reflect'\n ? '分析'\n : '人工';\n content += `| ${p.title} | ${count} | ${auto} |\\n`;\n }\n\n content += '\\n---\\n\\n';\n\n for (const p of phases) {\n const phaseEntries = entries.filter((e) => e.phase === p.phase);\n content += `## ${p.title}\\n\\n${p.description}\\n\\n`;\n\n if (phaseEntries.length > 0) {\n content += '| 规则 | 违规数 | 处理方式 |\\n| ---- | ------ | -------- |\\n';\n for (const e of phaseEntries) {\n content += `| \\`${e.ruleId}\\` | ${e.count} | ${e.action} |\\n`;\n }\n } else {\n content += '_(无违规)_\\n';\n }\n content += '\\n';\n }\n\n content += `---\\n\\n> 执行治理流水线: \\`npx teamix-evo tokens treat\\`\\n`;\n\n await fs.writeFile(planPath, content, 'utf-8');\n return planPath;\n}\n","/**\n * CLI command: `teamix-evo tokens treat`\n * See PLAN Task 6.3.\n */\nimport { Command } from 'commander';\nimport { runTokensTreat } from '../../core/tokens-treat.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const treatCommand = new Command('treat')\n .description('一键 token 治理流水线(codemod + 度量报告)')\n .option('--lock-baseline', '治理后锁定基线到 tokens-baseline.json')\n .option('--apply', '应用 codemod 修改(默认 dry-run)')\n .option('--skip-install', '跳过 npm install')\n .action(\n async (opts: {\n lockBaseline?: boolean;\n apply?: boolean;\n skipInstall?: boolean;\n }) => {\n const projectRoot = process.cwd();\n logger.info('Running tokens treat...');\n\n try {\n const result = await runTokensTreat({\n projectRoot,\n lockBaseline: opts.lockBaseline,\n apply: opts.apply,\n skipInstall: opts.skipInstall,\n });\n\n logger.info(`\\n治理报告: ${result.reportPath}`);\n logger.info(`前置基线: ${result.preBaseline.total} violations`);\n logger.info(`后置基线: ${result.postBaseline.total} violations`);\n logger.info(\n `总降幅: -${result.totalReduction} (${\n result.preBaseline.total > 0\n ? Math.round(\n (result.totalReduction / result.preBaseline.total) * 100,\n )\n : 0\n }%)`,\n );\n\n if (result.deltas.length > 0) {\n logger.info('\\n降幅明细:');\n for (const d of result.deltas) {\n logger.info(\n ` ${d.rule}: ${d.before} → ${d.after} (${d.percentage})`,\n );\n }\n }\n\n if (result.baselineLocked) {\n logger.info('\\n基线已锁定 → .teamix-evo/tokens-baseline.json');\n }\n } catch (err) {\n logger.error(\n `treat failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n },\n );\n","/**\n * CLI command: `teamix-evo tokens reflect`\n * See PLAN Task 6.4.\n */\nimport { Command } from 'commander';\nimport { runTokensReflect } from '../../core/tokens-reflect.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const reflectCommand = new Command('reflect')\n .description('扫描重复色值,推荐新增项目级 token(反哺)')\n .option('--min-frequency <n>', '最少出现次数(默认 3)', '3')\n .action(async (opts: { minFrequency?: string }) => {\n const projectRoot = process.cwd();\n const minFrequency = parseInt(opts.minFrequency ?? '3', 10) || 3;\n logger.info('Running tokens reflect...');\n\n try {\n const result = await runTokensReflect({ projectRoot, minFrequency });\n\n logger.info(`\\n扫描完成: ${result.totalUniqueColors} 个唯一色值`);\n logger.info(`低于阈值: ${result.belowThreshold} 个`);\n logger.info(`推荐新增 token: ${result.candidates.length} 个\\n`);\n\n if (result.candidates.length > 0) {\n logger.info('建议新增的 token:');\n logger.info('');\n for (const c of result.candidates.slice(0, 20)) {\n logger.info(\n ` ${c.value.padEnd(10)} (${c.frequency}次) → --${c.suggestedName}`,\n );\n logger.info(\n `${''.padEnd(14)}出现于: ${[...c.files].slice(0, 3).join(', ')}${\n c.files.length > 3 ? ` +${c.files.length - 3}` : ''\n }`,\n );\n }\n if (result.candidates.length > 20) {\n logger.info(`\\n ... 及其余 ${result.candidates.length - 20} 个`);\n }\n logger.info(\n '\\n💡 将建议的 token 添加到 tokens/tokens.overrides.css 中',\n );\n } else {\n logger.info('✅ 当前项目无高频重复色值,无需新增 token');\n }\n } catch (err) {\n logger.error(\n `reflect failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * Token reflect (反哺) mechanism.\n *\n * Scans remaining `no-color-literal` violations, clusters color values\n * by frequency and hue proximity, and suggests new project-level tokens.\n *\n * See PLAN Task 6.4.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { ensureDir, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface ColorCandidate {\n /** Raw color value (hex) */\n value: string;\n /** Number of occurrences across the project */\n frequency: number;\n /** Files where this color appears */\n files: string[];\n /** Suggested semantic token name */\n suggestedName: string;\n}\n\nexport interface ReflectResult {\n /** Color candidates grouped by frequency ≥ threshold */\n candidates: ColorCandidate[];\n /** Total unique colors found */\n totalUniqueColors: number;\n /** Colors with frequency below threshold (not suggested) */\n belowThreshold: number;\n}\n\nexport interface ReflectOptions {\n projectRoot: string;\n /** Minimum occurrence count to suggest a token (default: 3) */\n minFrequency?: number;\n}\n\n// ─── Core reflect logic ──────────────────────────────────────────────────────\n\n/**\n * Scan project for repeated color literals and suggest project-level tokens.\n */\nexport async function runTokensReflect(\n options: ReflectOptions,\n): Promise<ReflectResult> {\n const { projectRoot, minFrequency = 3 } = options;\n\n // Collect color literals from ESLint violations\n const colorMap = new Map<string, { frequency: number; files: Set<string> }>();\n\n try {\n const { stdout } = await execAsync(\n 'npx eslint src/ --format json --rule \\'{\"teamix-evo/no-color-literal\": \"error\"}\\' --no-error-on-unmatched-pattern 2>/dev/null || true',\n { cwd: projectRoot, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 },\n );\n\n if (stdout.trim()) {\n try {\n const results = JSON.parse(stdout) as Array<{\n filePath: string;\n messages: Array<{\n ruleId: string | null;\n message: string;\n }>;\n }>;\n\n for (const result of results) {\n for (const msg of result.messages) {\n if (msg.ruleId !== 'teamix-evo/no-color-literal') continue;\n\n // Extract color value from message\n const colorMatch = msg.message.match(/#[0-9a-fA-F]{3,8}/);\n if (!colorMatch) continue;\n const color = normaliseHex(colorMatch[0]);\n const relFile = path.relative(projectRoot, result.filePath);\n\n const entry = colorMap.get(color) ?? {\n frequency: 0,\n files: new Set<string>(),\n };\n entry.frequency++;\n entry.files.add(relFile);\n colorMap.set(color, entry);\n }\n }\n } catch {\n // Parse failure\n }\n }\n } catch {\n // ESLint not available\n }\n\n const totalUniqueColors = colorMap.size;\n const candidates: ColorCandidate[] = [];\n let belowThreshold = 0;\n\n for (const [value, entry] of colorMap) {\n if (entry.frequency >= minFrequency) {\n candidates.push({\n value,\n frequency: entry.frequency,\n files: [...entry.files],\n suggestedName: suggestTokenName(value, entry.files),\n });\n } else {\n belowThreshold++;\n }\n }\n\n // Sort by frequency descending\n candidates.sort((a, b) => b.frequency - a.frequency);\n\n return { candidates, totalUniqueColors, belowThreshold };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction normaliseHex(hex: string): string {\n const h = hex.replace('#', '').toLowerCase();\n if (h.length === 3) {\n return `#${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n }\n return `#${h.slice(0, 6)}`;\n}\n\n/**\n * Suggest a semantic token name based on file context.\n * Simple heuristic: extract the most common parent directory name.\n */\nfunction suggestTokenName(color: string, files: Iterable<string>): string {\n const dirCounts = new Map<string, number>();\n for (const file of files) {\n const parts = file.split('/');\n // Take the component/feature directory name (usually 2nd-to-last segment)\n const dirName = parts.length >= 2 ? parts[parts.length - 2] : 'project';\n if (dirName) {\n dirCounts.set(dirName, (dirCounts.get(dirName) ?? 0) + 1);\n }\n }\n\n let topDir = 'custom';\n let topCount = 0;\n for (const [dir, count] of dirCounts) {\n if (count > topCount) {\n topDir = dir;\n topCount = count;\n }\n }\n\n // Convert to kebab-case token name\n const kebab = topDir\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '');\n return `--color-${kebab}-accent`;\n}\n\n// ─── CLI command ─────────────────────────────────────────────────────────────\n\nexport { type ColorCandidate as ReflectColorCandidate };\n","/**\n * CLI command: `teamix-evo tokens baseline-check`\n *\n * Compares current lint violations against the locked baseline\n * (`.teamix-evo/tokens-baseline.json`). Fails when violations exceed\n * baseline counts — suitable for CI integration.\n */\nimport { Command } from 'commander';\nimport { checkBaseline } from '../../core/baseline-check.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const baselineCheckCommand = new Command('baseline-check')\n .description('对比 baseline 检查 token 违规是否超标(CI 友好)')\n .action(async () => {\n const projectRoot = process.cwd();\n\n try {\n const result = await checkBaseline(projectRoot);\n\n if (result.status === 'no-baseline') {\n logger.info(\n 'No baseline found (.teamix-evo/tokens-baseline.json). Run `tokens treat --lock-baseline` first.',\n );\n return;\n }\n\n if (result.status === 'pass') {\n logger.info(\n `✅ Baseline check PASSED (${result.currentTotal}/${result.baselineTotal} violations)`,\n );\n return;\n }\n\n // status === 'fail'\n const violations = result.violations ?? [];\n logger.error(\n `❌ Baseline check FAILED — ${violations.length} rule(s) exceeded:`,\n );\n for (const v of violations) {\n logger.error(\n ` ${v.rule}: ${v.current} > ${v.baseline} (+${v.exceeded})`,\n );\n }\n logger.error(\n `\\n Total: ${result.currentTotal} (baseline: ${result.baselineTotal})`,\n );\n process.exitCode = 1;\n } catch (err) {\n logger.error(\n `baseline-check failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n process.exitCode = 1;\n }\n });\n","/**\n * Lint baseline enforcement module.\n *\n * Reads `.teamix-evo/tokens-baseline.json` (written by `tokens treat\n * --lock-baseline`) and compares current violation counts. Returns PASS\n * when current ≤ baseline, FAIL when exceeded.\n *\n * This is NOT an ESLint rule but a standalone check suitable for CI\n * integration. Called by `tokens treat --lock-baseline` validation and\n * can be wired into `package.json` scripts.\n *\n * See PLAN Task 6.5.\n */\nimport * as path from 'node:path';\nimport { readFileOrNull } from '../utils/fs.js';\nimport { collectTeamixEvoViolations } from '../utils/lint.js';\nimport { logger } from '../utils/logger.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface BaselineData {\n timestamp: string;\n rules: Record<string, number>;\n total: number;\n}\n\nexport interface BaselineCheckResult {\n status: 'pass' | 'fail' | 'no-baseline';\n /** Present when status is 'fail' */\n violations?: Array<{\n rule: string;\n baseline: number;\n current: number;\n exceeded: number;\n }>;\n /** Total current violations */\n currentTotal?: number;\n /** Total baseline violations */\n baselineTotal?: number;\n}\n\n// ─── Core check logic ────────────────────────────────────────────────────────\n\n/**\n * Check whether current lint violations exceed the locked baseline.\n */\nexport async function checkBaseline(\n projectRoot: string,\n): Promise<BaselineCheckResult> {\n // Read baseline\n const baselinePath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-baseline.json',\n );\n const raw = await readFileOrNull(baselinePath);\n if (!raw) {\n return { status: 'no-baseline' };\n }\n\n let baseline: BaselineData;\n try {\n baseline = JSON.parse(raw) as BaselineData;\n } catch {\n logger.warn('Invalid tokens-baseline.json format');\n return { status: 'no-baseline' };\n }\n\n // Get current violations\n const currentRules = await collectTeamixEvoViolations(projectRoot);\n\n const currentTotal = Object.values(currentRules).reduce(\n (sum, n) => sum + n,\n 0,\n );\n\n // Compare per-rule\n const violations: BaselineCheckResult['violations'] = [];\n\n for (const [rule, baselineCount] of Object.entries(baseline.rules)) {\n const currentCount = currentRules[rule] ?? 0;\n if (currentCount > baselineCount) {\n violations.push({\n rule,\n baseline: baselineCount,\n current: currentCount,\n exceeded: currentCount - baselineCount,\n });\n }\n }\n\n // Check for new rules not in baseline\n for (const [rule, currentCount] of Object.entries(currentRules)) {\n if (!(rule in baseline.rules) && currentCount > 0) {\n violations.push({\n rule,\n baseline: 0,\n current: currentCount,\n exceeded: currentCount,\n });\n }\n }\n\n if (violations.length > 0) {\n return {\n status: 'fail',\n violations,\n currentTotal,\n baselineTotal: baseline.total,\n };\n }\n\n return {\n status: 'pass',\n currentTotal,\n baselineTotal: baseline.total,\n };\n}\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\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(initCommand);\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 { runSkillsInit } from '../../core/skills-add.js';\nimport {\n ensureGlobalMetaRoot,\n hasPackageJson,\n isTeamixEvoProject,\n} from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface InitOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '自举 teamix-evo skills(按 tokens variant + scope 全装符合条件的 skill;scope 为 global-only 的 entry skill 自动跳过 — ADR 0033)',\n )\n .option('--ide <list>', '逗号分隔的 IDE 列表,如 \"qoder,claude\"')\n .option('--scope <scope>', 'project | global(默认 project)')\n .option('-y, --yes', '使用默认值,跳过交互')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n\n const { ides, scope } = await resolveIdesAndScope({ opts });\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.exitCode = 1;\n return;\n }\n\n logger.info(\n `Initializing skills (bulk): ides=[${ides.join(\n ',',\n )}], scope=\"${scope}\"`,\n );\n logger.debug(`Project root: ${projectRoot}`);\n\n const result = await runSkillsInit({\n projectRoot,\n ides,\n scope,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n `Skills already initialized. Use \"npx teamix-evo@latest skills add <name>\" to add specific skills, ` +\n `\"npx teamix-evo@latest skills update\" to refresh, or \"npx teamix-evo@latest skills uninstall\" to remove.`,\n );\n return;\n }\n\n logger.success(`Skills initialized: ${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 if (result.autoUpdatedSkillIds.length > 0) {\n logger.success(\n ` Auto-upgraded: ${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info(\n 'Run \"npx teamix-evo@latest skills list\" to see installed skills.',\n );\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('skills init 已取消。');\n return;\n }\n logger.error(`Failed to init skills: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: InitOptions;\n}): Promise<{ ides: SkillIde[]; scope: SkillScope }> {\n const { opts } = args;\n\n // Non-TTY (CI / AI agent / piped stdin): default to \"yes\" so @clack/prompts\n // never tries `uv_tty_init` and crashes with `EINVAL`. The user can still\n // override via --ide / --scope.\n const isInteractive = Boolean(process.stdin.isTTY);\n\n // From CLI flags / -y / non-TTY\n if (opts.ide || opts.yes || !isInteractive) {\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 CancelledError();\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 CancelledError();\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\n}\n","/**\n * Sentinel error thrown when an interactive prompt is cancelled (Ctrl-C / Esc\n * inside `@clack/prompts`). Command-layer entry points use `instanceof\n * CancelledError` to print a soft \"cancelled\" message and exit cleanly,\n * instead of fragile string matching against `err.message`.\n *\n * Library / core code MUST NOT swallow `CancelledError` — let it propagate so\n * the command layer can distinguish a real failure from a user-aborted prompt.\n */\nexport class CancelledError extends Error {\n constructor(message = 'Cancelled by user.') {\n super(message);\n this.name = 'CancelledError';\n }\n}\n","import type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { ALL_IDE_KINDS } from '../../ide/index.js';\n\nexport function 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\nexport function parseScope(input?: string): 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 * 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';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface AddOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const addCommand = new Command('add')\n .description(\n '增量添加 teamix-evo skills(必须指定至少一个 skill id;自举请用 `skills init`)',\n )\n .argument('<names...>', '至少一个 skill id(增量装)')\n .option('--ide <list>', '逗号分隔的 IDE 列表,如 \"qoder,claude\"')\n .option(\n '--scope <scope>',\n 'project | global(默认沿用既有 skills 配置;首次安装默认 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\n const { ides, scope } = await resolveIdesAndScope({\n opts,\n projectRoot: cwd,\n });\n\n // scope=global 且 cwd 不是 Teamix Evo 项目 → 元数据写到全局根\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 logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(\n `Adding skills [${names.join(',')}]: ides=[${ides.join(\n ',',\n )}], 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,\n });\n\n const hasAdded = result.addedSkillIds.length > 0;\n const hasSkipped = result.skippedSkillIds.length > 0;\n const hasAutoUpdated = result.autoUpdatedSkillIds.length > 0;\n\n // Branch 1: nothing freshly added.\n if (!hasAdded) {\n if (hasAutoUpdated) {\n logger.success(\n `已自动升级至最新版本:${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n if (hasSkipped) {\n if (hasAutoUpdated) {\n logger.info(`其余已是最新:${result.skippedSkillIds.join(', ')}`);\n } else {\n logger.warn(\n `已存在,无需添加:${result.skippedSkillIds.join(\n ', ',\n )}。如需刷新内容请运行 \"npx teamix-evo@latest skills update\"。`,\n );\n }\n }\n return;\n }\n\n // Branch 2: at least one new skill installed.\n logger.success(`Skills added: ${result.skillCount} skill(s)`);\n logger.info(` IDEs: ${result.ides.join(', ')}`);\n logger.info(` Scope: ${result.scope}`);\n logger.info(` Added: ${result.addedSkillIds.join(', ')}`);\n if (hasSkipped) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (already added)`,\n );\n }\n if (hasAutoUpdated) {\n logger.success(\n ` Auto-upgraded: ${result.autoUpdatedSkillIds.join(', ')}`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info(\n 'Run \"npx teamix-evo@latest skills list\" to see installed skills.',\n );\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('skills add 已取消。');\n return;\n }\n logger.error(`Failed to add skills: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: AddOptions;\n projectRoot: string;\n}): Promise<{ ides: SkillIde[]; scope: SkillScope }> {\n const { opts, projectRoot } = args;\n\n // Default: silently reuse existing config when no flags are given.\n if (!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 / -y\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 CancelledError();\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 CancelledError();\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Run \"npx teamix-evo@latest skills init\" to get started.',\n );\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 \"npx teamix-evo@latest skills doctor\" to repair.`,\n );\n } else {\n logger.info('Skills package not yet added.');\n logger.info(\n 'Run \"npx teamix-evo@latest skills init\" to bootstrap, or \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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: ${getErrorMessage(err)}`);\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 { createRequire } from 'node:module';\nimport { detectIde } from '../../ide/index.js';\nimport {\n runSkillsUpdate,\n type UpdatePlanItem,\n} from '../../core/skills-update.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport {\n resolveSkillsMaintenanceRoot,\n getGlobalMetaRoot,\n isTeamixEvoProject,\n} from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { parseScope } from './_parse.js';\n\nconst require = createRequire(import.meta.url);\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface UpdateOptions {\n dryRun?: boolean;\n scope?: string;\n}\n\nexport const updateCommand = new Command('update')\n .description(\n '更新已安装的 teamix-evo skills(仅升级 lock 已记录且 scope 匹配的 skill — ADR 0035)',\n )\n .argument('[names...]', '可选:仅升级指定 skill id;省略则升级全部已装')\n .option('--dry-run', '预览变更,不写盘')\n .option(\n '--scope <scope>',\n 'project | global(默认按 cwd 推断:cwd 是项目→project;否则 fallback 到全局)',\n )\n .action(async (names: string[], opts: UpdateOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveUpdateRoot(cwd, opts.scope);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n // Banner: CLI version + skills package version.\n await printVersionBanner();\n\n const result = await runSkillsUpdate({\n projectRoot,\n names: names.length > 0 ? names : undefined,\n dryRun: opts.dryRun,\n });\n\n switch (result.status) {\n case 'no-skills':\n logger.error(\n 'Skills not added. Run \"npx teamix-evo@latest skills init\" first.',\n );\n process.exitCode = 1;\n return;\n\n case 'no-changes':\n logger.success(\n `Already up-to-date (skills package v${result.version}).`,\n );\n logger.info(\n ` Checked: ${result.checkedSkillIds.join(', ') || '(none)'}`,\n );\n return;\n\n case 'dry-run':\n logger.info(\n `Plan (${result.currentVersion} → ${result.availableVersion}):`,\n );\n if (result.plan.length === 0) {\n logger.info(' (no skills to update)');\n } else {\n for (const item of result.plan) {\n logger.info(formatPlanItem(item));\n }\n }\n logger.info('');\n logger.info('Re-run without --dry-run to apply.');\n return;\n\n case 'updated': {\n const { summary } = result;\n logger.success(\n `Skills updated to v${result.version} (${result.updatedSkillIds.length} skill(s)).`,\n );\n if (result.updatedSkillIds.length > 0) {\n logger.info(` Updated: ${result.updatedSkillIds.join(', ')}`);\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(\n ', ',\n )} (scope mismatch / removed upstream)`,\n );\n }\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n return;\n }\n }\n } catch (err) {\n logger.error(`Failed to update skills: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\n/**\n * Resolve maintenance root for `skills update`.\n *\n * - `--scope project` (or no flag + cwd is a teamix-evo project): use cwd\n * - `--scope global`: force ~/.teamix-evo-global, regardless of cwd\n * - no flag + cwd is not a project: fall back to ~/.teamix-evo-global if it\n * has been initialized (legacy behavior preserved by\n * `resolveSkillsMaintenanceRoot`)\n */\nexport function resolveUpdateRoot(\n cwd: string,\n scopeFlag: string | undefined,\n): string {\n if (scopeFlag === undefined) {\n return resolveSkillsMaintenanceRoot(cwd);\n }\n const scope = parseScope(scopeFlag);\n if (scope === 'global') {\n const globalRoot = getGlobalMetaRoot();\n if (!isTeamixEvoProject(globalRoot)) {\n throw new Error(\n `No global skills installed at ${globalRoot}. ` +\n 'Run \"npx teamix-evo@latest skills add <id> --scope global\" first.',\n );\n }\n return globalRoot;\n }\n // scope === 'project'\n if (!isTeamixEvoProject(cwd)) {\n throw new Error(\n `Current directory is not a teamix-evo project (.teamix-evo/config.json missing). ` +\n 'Re-run without --scope, or use \"--scope global\".',\n );\n }\n return cwd;\n}\n\nfunction formatPlanItem(item: UpdatePlanItem): string {\n const tag =\n item.action === 'up-to-date'\n ? ' ='\n : item.strategy === 'frozen'\n ? ' ⊘ '\n : item.strategy === 'managed'\n ? ' ⊕ '\n : ' → ';\n const ver =\n item.action === 'up-to-date'\n ? `v${item.current} (no change)`\n : `v${item.current} → v${item.next} [${item.strategy}]`;\n return `${tag}${item.id} ${ver}`;\n}\n\nasync function printVersionBanner(): Promise<void> {\n let cliVersion: string | undefined;\n // After bundling, this file lives at dist/index.js; `../package.json`\n // resolves to packages/cli/package.json. Source-mode (e.g. tests) won't\n // reach this path — banner is silenced rather than printed with `undefined`.\n try {\n const pkg = require('../package.json') as { version: string };\n cliVersion = pkg.version;\n } catch {\n /* dev mode: skip CLI version */\n }\n try {\n const { manifest } = await loadSkillsData(SKILLS_PACKAGE);\n if (cliVersion) {\n logger.info(\n `teamix-evo CLI v${cliVersion} · skills package v${manifest.version}`,\n );\n } else {\n logger.info(`skills package v${manifest.version}`);\n }\n } catch {\n // banner is informational only; never block update on banner failure.\n }\n}\n","import type {\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport { updateSkills } from './skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\n// ─── runSkillsUpdate ──────────────────────────────────────────────────────────\n// ADR 0035: update only refreshes skills that are (a) recorded in the lock and\n// (b) match the current install scope. New skills added to the manifest are NOT\n// auto-installed by update — use `skills add <id>` for that. version-diff\n// short-circuits when nothing has actually changed.\n\nexport interface RunSkillsUpdateOptions {\n /** Absolute project (or global meta) root. */\n projectRoot: string;\n /**\n * Optional: limit the update to these skill ids. Falls back to \"every\n * skill in lock that matches the current install scope\".\n */\n names?: readonly string[];\n /** When true, plan only — no source rewrite, no mirror, no lock write. */\n dryRun?: boolean;\n /** Override the skills package name (defaults to `@teamix-evo/skills`). */\n packageName?: string;\n}\n\nexport interface UpdatePlanItem {\n id: string;\n current: string;\n next: string;\n /** Same as updateStrategy semantics, computed from the manifest. */\n strategy: 'frozen' | 'regenerable' | 'managed';\n /**\n * Predicted action for this skill source file in non-dryRun mode.\n * - `up-to-date` — version unchanged; safe to skip\n * - `version-bump` — version changed; will overwrite/merge per strategy\n */\n action: 'up-to-date' | 'version-bump';\n}\n\nexport type RunSkillsUpdateResult =\n | { status: 'no-skills' }\n | {\n status: 'no-changes';\n packageName: string;\n version: string;\n checkedSkillIds: string[];\n }\n | {\n status: 'dry-run';\n packageName: string;\n currentVersion: string;\n availableVersion: string;\n plan: UpdatePlanItem[];\n }\n | {\n status: 'updated';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n updatedSkillIds: string[];\n skippedSkillIds: string[];\n summary: { overwritten: number; managed: number; skipped: number; created: number };\n resources: InstalledResource[];\n };\n\n/**\n * Programmatic equivalent of `teamix-evo skills update [names...] [--dry-run]`.\n *\n * Per ADR 0035:\n * 1. Range = `keys(lock.skills) ∩ scope-match ∩ (names if given)`\n * 2. version-diff short-circuit when every target id has the same lock\n * version as the manifest\n * 3. New skills (not in lock) are NEVER auto-installed by update\n * 4. lock writeback only touches `targetIds` — existing entries are preserved\n */\nexport async function runSkillsUpdate(\n options: RunSkillsUpdateOptions,\n): Promise<RunSkillsUpdateResult> {\n const { projectRoot, names: requestedNames, dryRun } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\n\n const config = await readProjectConfig(projectRoot);\n const skillsCfg = config?.packages?.skills;\n if (!skillsCfg) {\n return { status: 'no-skills' };\n }\n\n const ides = (skillsCfg.ides ?? ['qoder', 'claude']) as SkillIde[];\n const scope = (skillsCfg.scope ?? 'project') as SkillScope;\n\n const existingLock = await readSkillsLock(projectRoot);\n if (!existingLock || Object.keys(existingLock.skills).length === 0) {\n return { status: 'no-skills' };\n }\n\n const { manifest, data, packageRoot } = await loadSkillsData(packageName);\n const manifestById = new Map(manifest.skills.map((s) => [s.id, s]));\n\n // Three-gate intersection: lock ∩ scope ∩ names.\n const lockIds = Object.keys(existingLock.skills);\n const requestedSet = requestedNames ? new Set(requestedNames) : null;\n if (requestedSet) {\n const unknown = requestedNames!.filter(\n (n) => !lockIds.includes(n) && !manifestById.has(n),\n );\n if (unknown.length > 0) {\n throw new Error(\n `Unknown skill id(s): ${unknown.join(\n ', ',\n )}. Available (installed): ${lockIds.join(', ') || '(none)'}.`,\n );\n }\n }\n\n const targetIds: string[] = [];\n const skippedSkillIds: string[] = [];\n for (const id of lockIds) {\n if (requestedSet && !requestedSet.has(id)) continue;\n const entry = manifestById.get(id);\n if (!entry) {\n // Lock has it, manifest no longer does (skill removed upstream).\n // Skip without error — uninstall is the user's call.\n logger.debug(\n `Skipping \"${id}\": no longer in upstream manifest. Use \\`skills uninstall ${id}\\` to remove.`,\n );\n skippedSkillIds.push(id);\n continue;\n }\n const effectiveScope = entry.scope ?? 'project';\n if (effectiveScope !== scope) {\n logger.debug(\n `Skipping \"${id}\" (scope=${effectiveScope}): current install scope is \"${scope}\".`,\n );\n skippedSkillIds.push(id);\n continue;\n }\n targetIds.push(id);\n }\n\n // version-diff short-circuit\n const allSame = targetIds.every((id) => {\n const lockVer = existingLock.skills[id]!.version;\n const manVer = manifestById.get(id)!.version;\n return lockVer === manVer;\n });\n if (targetIds.length > 0 && allSame && !dryRun) {\n return {\n status: 'no-changes',\n packageName,\n version: manifest.version,\n checkedSkillIds: targetIds,\n };\n }\n\n if (dryRun) {\n const plan: UpdatePlanItem[] = targetIds.map((id) => {\n const lockVer = existingLock.skills[id]!.version;\n const entry = manifestById.get(id)!;\n const sameVersion = lockVer === entry.version;\n return {\n id,\n current: lockVer,\n next: entry.version,\n strategy: entry.updateStrategy ?? 'managed',\n action: sameVersion ? 'up-to-date' : 'version-bump',\n };\n });\n return {\n status: 'dry-run',\n packageName,\n currentVersion: skillsCfg.version,\n availableVersion: manifest.version,\n plan,\n };\n }\n\n if (targetIds.length === 0) {\n return {\n status: 'updated',\n packageName,\n version: manifest.version,\n ides,\n scope,\n updatedSkillIds: [],\n skippedSkillIds,\n summary: { overwritten: 0, managed: 0, skipped: 0, created: 0 },\n resources: [],\n };\n }\n\n const result = await updateSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds: targetIds,\n });\n\n // Update config.version (track the package-level version we last consumed).\n config!.packages.skills = {\n ...skillsCfg,\n version: manifest.version,\n };\n await writeProjectConfig(projectRoot, config!);\n\n // Update installed manifest (replace the package-level entry's resources).\n const installedManifest = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n const installedAt = new Date().toISOString();\n // Merge: keep resources from skills NOT in targetIds (preserve existing\n // entries for skills we didn't touch this round).\n const prior = idx >= 0 ? installedManifest.installed[idx]!.resources : [];\n const targetSet = new Set(targetIds);\n const preserved = prior.filter((r) => {\n const skillId = r.id.split(':')[0];\n return skillId ? !targetSet.has(skillId) : true;\n });\n const entry = {\n package: packageName,\n variant: FLAT_VARIANT,\n version: manifest.version,\n installedAt,\n resources: [...preserved, ...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 lock — only for targetIds, preserving other entries.\n const lock: SkillsLock = {\n schemaVersion: 1,\n skills: { ...existingLock.skills },\n };\n for (const id of targetIds) {\n const skillDef = manifestById.get(id);\n if (!skillDef) continue;\n const mirroredTo = skillDef.ides.filter((i) => ides.includes(i));\n lock.skills[id] = {\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: 'updated',\n packageName,\n version: manifest.version,\n ides,\n scope,\n updatedSkillIds: targetIds,\n skippedSkillIds,\n summary: result.summary,\n resources: result.resources,\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 { detectIde, getAdapter, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport { getErrorMessage } from '../../utils/error.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('[ids...]', '可选:仅卸载指定 skill id;省略则卸载整个 skills 包')\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: ${getErrorMessage(err)}`);\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(`Failed to remove ${skillsRoot}: ${getErrorMessage(err)}`);\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}: ${getErrorMessage(err)}`);\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(`Removed ${matched.length} skill(s): ${matched.join(', ')}`);\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 = 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}: ${getErrorMessage(err)}`);\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 } from '../../ide/index.js';\nimport { runSkillsSync } from '../../core/skills-sync.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { parseIdeList, parseScope } from './_parse.js';\n\ninterface SyncOptions {\n ide?: string;\n scope?: string;\n}\n\nexport const syncCommand = new Command('sync')\n .description(\n '把 .teamix-evo/skills-source/ 下的源重新镜像到 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('--scope <scope>', 'project | global(覆盖 lock 中记录的 scope)')\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-source/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: ${getErrorMessage(err)}`);\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 {\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';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const doctorCommand = new Command('doctor')\n .description(\n '检查 .teamix-evo/skills-source/ 源与 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 \"npx teamix-evo@latest skills init\" 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 \"npx teamix-evo@latest 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: ${getErrorMessage(err)}`);\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 \"npx teamix-evo@latest skills init\" 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 \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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 \"npx teamix-evo@latest 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';\nimport { upgradeCommand } from './upgrade.js';\nimport { promoteCommand } from './promote.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);\nuiCommand.addCommand(upgradeCommand);\nuiCommand.addCommand(promoteCommand);\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';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.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.exitCode = 1;\n return;\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 `npx teamix-evo@latest 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@latest ui add button`');\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('ui init 已取消。');\n return;\n }\n logger.error(`Failed to initialize ui: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.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 // Non-TTY (CI / AI agent / piped stdin): silently fall back to defaults so\n // @clack/prompts does not throw `uv_tty_init EINVAL`. Equivalent to passing\n // --yes; any flags the caller provided still take precedence.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (opts.yes || !isInteractive) {\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 blocks: DEFAULT_UI_ALIASES.blocks,\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 CancelledError();\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 CancelledError();\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 CancelledError();\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 CancelledError();\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 CancelledError();\n\n const tsxAns = await prompts.confirm({\n message: '使用 TSX?',\n initialValue: opts.tsx ?? true,\n });\n if (prompts.isCancel(tsxAns)) throw new CancelledError();\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 CancelledError();\n\n return {\n aliases: {\n components,\n hooks,\n utils,\n lib,\n business: DEFAULT_UI_ALIASES.business,\n blocks: DEFAULT_UI_ALIASES.blocks,\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 blocks: 'src/blocks',\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 blocks: options.aliases?.blocks ?? DEFAULT_UI_ALIASES.blocks,\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/v2.json',\n schemaVersion: 2,\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 { runUiAdopt } from '../../core/ui-adopt.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个 ui entry(按 id,自动展开 registryDependencies)',\n )\n // Make ids optional when --adopt scans the existing tree.\n .argument('[ids...]', 'entry id 列表,如 \"button\" \"dialog\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .option(\n '--include-deprecated',\n '允许安装已归档的 deprecated entry(仅迁移 / 审计场景,ADR 0028)',\n )\n .option('--adopt', '扫描项目现有 UI 源码纳管到 manifest,不写入任何文件内容')\n .option(\n '--dry-run',\n '仅扫描 + 输出报告,不修改 manifest(仅与 --adopt 同用)',\n )\n .action(\n async (\n ids: string[],\n opts: {\n overwrite?: boolean;\n includeDeprecated?: boolean;\n adopt?: boolean;\n dryRun?: boolean;\n },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n if (opts.adopt) {\n await runAdoptCli(projectRoot, opts.dryRun ?? false);\n return;\n }\n\n if (opts.dryRun) {\n logger.warn(\n '`--dry-run` only takes effect together with `--adopt`; ignoring for plain ui add.',\n );\n }\n\n if (!ids || ids.length === 0) {\n throw new Error(\n 'At least one entry id must be provided (or pass `--adopt`).',\n );\n }\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 = getErrorMessage(err);\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\nasync function runAdoptCli(\n projectRoot: string,\n dryRun: boolean,\n): Promise<void> {\n logger.info(\n dryRun\n ? 'Adopt scan (dry-run) — no manifest changes will be written.'\n : 'Adopting existing UI source files into manifest...',\n );\n const result = await runUiAdopt({ projectRoot, dryRun });\n\n logger.success(\n `UI adopt complete: ${result.adopted.length} adopted, ${result.foreign.length} foreign, ${result.hooks.length} hooks, ${result.utils.length} utils, ${result.types.length} types.`,\n );\n\n if (result.adopted.length > 0) {\n logger.info('');\n logger.info('Adopted (matched registry id):');\n for (const a of result.adopted) {\n logger.info(` • ${a.id} ← ${a.rel} [${a.sourceLineage}]`);\n }\n }\n if (result.foreign.length > 0) {\n logger.info('');\n logger.info('Foreign (no registry match — keep as-is):');\n for (const f of result.foreign) logger.info(` • ${f.rel}`);\n }\n if (result.hooks.length > 0) {\n logger.info('');\n logger.info('Hooks:');\n for (const h of result.hooks) logger.info(` • ${h.rel}`);\n }\n if (result.utils.length > 0) {\n logger.info('');\n logger.info('Utils:');\n for (const u of result.utils) logger.info(` • ${u.rel}`);\n }\n if (result.types.length > 0) {\n logger.info('');\n logger.info('Type-only modules:');\n for (const t of result.types) logger.info(` • ${t.rel}`);\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 { backupFile, 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';\nimport { getErrorMessage } from '../utils/error.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 /** When false, preserve directory structure in import paths (skip flattenRestPath). Defaults to true. */\n flatten?: 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 flatten = 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, { flatten });\n // Phase 1.A2: any existing user file we are about to overwrite must be\n // backed up under .teamix-evo/.backups/. This applies to:\n // - regenerable entries on re-install,\n // - frozen entries when caller passes overwrite=true (init conflict\n // decision \"shadcn-source: overwrite\").\n if (exists) {\n await backupFile(targetAbs, projectRoot);\n }\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 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}: ${getErrorMessage(err)}`);\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 blocks: 'blocks',\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(\n source: string,\n aliases: UiAliases,\n opts?: { flatten?: boolean },\n): string {\n const shouldFlatten = opts?.flatten !== false;\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 const resolvedRest = shouldFlatten ? flattenRestPath(rest) : (rest ?? '');\n return `${quote}${normalized}${resolvedRest}${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 * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n InstalledManifest,\n InstalledResource,\n UiEntry,\n UiPackageManifest,\n UiAliases,\n} from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\n/**\n * File classification used by `ui add --adopt` to bucket existing user files\n * before deciding whether they map to a registry entry. Mirrors the buckets\n * defined in the Init landing plan §1.1 (file-type triage).\n */\nexport type AdoptFileType =\n | 'component'\n | 'hook'\n | 'util'\n | 'type'\n | 'provider'\n | 'unknown';\n\n/**\n * Lineage assigned to an adopted file.\n *\n * - `teamix-evo` — id matched **and** byte-content equals the upstream entry\n * (modulo alias rewriting), so the file is effectively a\n * pristine copy of the registry source\n * - `custom` — id matched but content drifted from upstream\n * - `detected` — id matched but content was not compared (shouldn't normally\n * happen in the adopt flow, kept for forward compatibility)\n */\nexport type AdoptedLineage = 'teamix-evo' | 'custom' | 'detected';\n\nexport interface AdoptedRecord {\n /** registry entry id */\n id: string;\n /** absolute target path on disk */\n target: string;\n /** project-relative path (posix) for human-readable output */\n rel: string;\n /** file classification */\n fileType: AdoptFileType;\n /** content lineage assignment */\n sourceLineage: AdoptedLineage;\n /** content hash recorded into manifest */\n hash: string;\n}\n\nexport interface ForeignRecord {\n /** project-relative path (posix) */\n rel: string;\n /** file classification — may be component/hook/util/type/provider */\n fileType: AdoptFileType;\n /** absolute path on disk */\n target: string;\n /** absolute reason this file is foreign (no registry match by basename) */\n reason: 'no-registry-match';\n}\n\nexport interface RunUiAdoptOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n /**\n * When true, do not write the installed manifest. Useful for `--dry-run`.\n * Defaults to false.\n */\n dryRun?: boolean;\n}\n\nexport interface RunUiAdoptResult {\n packageName: string;\n /** Files that matched a registry entry by id (basename → entry id). */\n adopted: AdoptedRecord[];\n /** Files under `aliases.components/business` that did not match any entry. */\n foreign: ForeignRecord[];\n /** Hooks discovered under `aliases.hooks` (or `use-*.ts(x)` under components). */\n hooks: ForeignRecord[];\n /** Utils discovered under `aliases.utils|lib`. */\n utils: ForeignRecord[];\n /** Type-only files (`.d.ts` or modules that only export types). */\n types: ForeignRecord[];\n /** When true the manifest was not modified. */\n dryRun: boolean;\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui add --adopt`.\n *\n * Walks the project's UI source tree, classifies files by type, and registers\n * components matching a known registry entry id into the installed manifest as\n * `strategy=frozen, sourceLineage=detected|teamix-evo|custom`.\n *\n * NEVER modifies any source file — the goal is to surface the existing surface\n * area to the registry layer so downstream commands (`ui upgrade`,\n * `promote-to-biz`) can reason about it.\n */\nexport async function runUiAdopt(\n options: RunUiAdoptOptions,\n): Promise<RunUiAdoptResult> {\n const { projectRoot, dryRun = false } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\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 const aliases = uiCfg.aliases;\n\n const adopted: AdoptedRecord[] = [];\n const foreign: ForeignRecord[] = [];\n const hooks: ForeignRecord[] = [];\n const utils: ForeignRecord[] = [];\n const types: ForeignRecord[] = [];\n\n // 1. Build lookup maps from manifest.\n // Multiple entries may collide on the same id within deprecatedEntries —\n // the active list wins.\n const idToEntry = new Map<string, UiEntry>();\n for (const e of manifest.deprecatedEntries ?? []) idToEntry.set(e.id, e);\n for (const e of manifest.entries) idToEntry.set(e.id, e);\n\n // 2. Walk all alias roots concurrently.\n const aliasRoots: Array<{\n abs: string;\n bucket: 'components' | 'hooks' | 'utils' | 'business';\n }> = [\n { abs: path.join(projectRoot, aliases.components), bucket: 'components' },\n { abs: path.join(projectRoot, aliases.hooks), bucket: 'hooks' },\n { abs: path.join(projectRoot, aliases.utils), bucket: 'utils' },\n { abs: path.join(projectRoot, aliases.business), bucket: 'components' },\n ];\n // `lib` is optional/may overlap with utils; only walk if it differs.\n if (aliases.lib && aliases.lib !== aliases.utils) {\n aliasRoots.push({\n abs: path.join(projectRoot, aliases.lib),\n bucket: 'utils',\n });\n }\n\n for (const root of aliasRoots) {\n const files = await listSourceFiles(root.abs);\n for (const abs of files) {\n const rel = toPosixRel(projectRoot, abs);\n const content = await fs.readFile(abs, 'utf-8');\n const fileType = classifyFile(abs, content);\n const id = inferEntryId(abs);\n\n // Hooks/utils/types go into their own bucket and are NOT registered into\n // the installed manifest (registry hooks/utils are addressable but the\n // adopt path keeps writes minimal — explicit `ui add <id>` will pick\n // them up).\n if (fileType === 'type') {\n types.push({ rel, fileType, target: abs, reason: 'no-registry-match' });\n continue;\n }\n if (fileType === 'hook' || root.bucket === 'hooks') {\n hooks.push({\n rel,\n fileType: 'hook',\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n if (fileType === 'util' || root.bucket === 'utils') {\n utils.push({\n rel,\n fileType: 'util',\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n\n const entry = id ? idToEntry.get(id) : undefined;\n if (!entry) {\n foreign.push({\n rel,\n fileType: fileType === 'unknown' ? 'component' : fileType,\n target: abs,\n reason: 'no-registry-match',\n });\n continue;\n }\n\n // Match found. Compare with upstream content (alias-rewritten) to decide\n // lineage. We pick the first .tsx file in the entry — multi-file entries\n // are rare for components and the lineage tag is best-effort.\n const upstream = await readUpstreamContent(\n packageRoot,\n entry,\n aliases,\n ).catch((err) => {\n logger.debug(\n `Failed to read upstream for ${entry.id}: ${(err as Error).message}`,\n );\n return null;\n });\n const lineage: AdoptedLineage =\n upstream === null\n ? 'detected'\n : normalize(upstream) === normalize(content)\n ? 'teamix-evo'\n : 'custom';\n\n adopted.push({\n id: entry.id,\n target: abs,\n rel,\n fileType: fileType === 'unknown' ? 'component' : fileType,\n sourceLineage: lineage,\n hash: computeHash(content),\n });\n }\n }\n\n if (!dryRun && adopted.length > 0) {\n await mergeIntoInstalledManifest({\n projectRoot,\n packageName,\n manifest,\n adopted,\n });\n }\n\n return {\n packageName,\n adopted,\n foreign,\n hooks,\n utils,\n types,\n dryRun,\n };\n}\n\n/**\n * Recursively list `.ts/.tsx` source files (including `.d.ts`) under `dir`.\n * Type-only modules are NOT filtered here — `classifyFile` later routes\n * `.d.ts` into the `types` bucket. Returns an empty array if the directory\n * does not exist.\n */\nasync function listSourceFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const stack: string[] = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw err;\n }\n for (const e of entries) {\n const abs = path.join(current, e.name);\n if (e.isDirectory()) {\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n stack.push(abs);\n continue;\n }\n if (!e.isFile()) continue;\n if (/\\.(ts|tsx)$/.test(e.name)) out.push(abs);\n }\n }\n return out;\n}\n\n/**\n * Best-effort file-type classifier. Pure regex / heuristic — avoids ts-morph\n * to keep the adopt path fast even on large UI trees.\n */\nexport function classifyFile(abs: string, content: string): AdoptFileType {\n const base = path.basename(abs);\n if (base.endsWith('.d.ts')) return 'type';\n if (/^use-[a-z0-9-]+\\.tsx?$/i.test(base)) return 'hook';\n\n const hasJsx = /<[A-Za-z][^>]*?>/.test(content);\n const hasReactImport = /from ['\"]react['\"]/.test(content);\n const hasForwardRef = /forwardRef\\s*[<(]/.test(content);\n const hasProvider =\n /\\.Provider\\b/.test(content) || /createContext\\s*[<(]/.test(content);\n\n if (hasProvider && (hasJsx || hasReactImport)) return 'provider';\n if (hasJsx || hasForwardRef) return 'component';\n if (hasReactImport && /export\\s+(const|function|default)/.test(content))\n return 'component';\n\n // Type-only check: only `export type` / `export interface` / `import type` —\n // no values exported.\n const exportsValue = /export\\s+(const|function|class|default|let|var)\\b/.test(\n content,\n );\n const exportsType =\n /export\\s+(type|interface)\\b/.test(content) || /^\\s*type\\s+/m.test(content);\n if (!exportsValue && exportsType) return 'type';\n\n if (base.startsWith('use-')) return 'hook';\n if (/\\b(use[A-Z]\\w+)\\s*\\(/.test(content) && !hasJsx) {\n // Util that consumes a hook — treat as util.\n return 'util';\n }\n if (!hasJsx && !hasReactImport) return 'util';\n\n return 'unknown';\n}\n\n/**\n * Derive the canonical registry entry id from an on-disk filename.\n * `button.tsx` → `button`; `card-header.tsx` → `card-header`.\n */\nfunction inferEntryId(abs: string): string | null {\n const base = path.basename(abs).replace(/\\.(tsx?|d\\.ts)$/i, '');\n if (!base) return null;\n if (!/^[a-z0-9][a-z0-9-]*$/.test(base)) return null;\n // Hooks live in their own bucket; never treat them as components.\n if (base.startsWith('use-')) return null;\n return base;\n}\n\nasync function readUpstreamContent(\n packageRoot: string,\n entry: UiEntry,\n aliases: UiAliases,\n): Promise<string | null> {\n const file = entry.files[0];\n if (!file) return null;\n const sourceAbs = path.resolve(packageRoot, file.source);\n let raw: string;\n try {\n raw = await fs.readFile(sourceAbs, 'utf-8');\n } catch {\n return null;\n }\n return rewriteImports(raw, aliases);\n}\n\nfunction normalize(s: string): string {\n return s.replace(/\\r\\n/g, '\\n').trim();\n}\n\nfunction toPosixRel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs).split(path.sep).join('/');\n}\n\ninterface MergeArgs {\n projectRoot: string;\n packageName: string;\n manifest: UiPackageManifest;\n adopted: AdoptedRecord[];\n}\n\nasync function mergeIntoInstalledManifest(args: MergeArgs): Promise<void> {\n const { projectRoot, packageName, manifest, adopted } = args;\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\n const newResources: InstalledResource[] = adopted.map((a) => {\n // `id` follows the same `${entryId}:${targetName}` convention as `ui add`\n // so a subsequent `ui add <id>` writes back to the same record.\n const targetName = path.basename(a.target);\n return {\n id: `${a.id}:${targetName}`,\n target: a.target,\n hash: a.hash,\n strategy: 'frozen',\n sourceLineage: a.sourceLineage,\n };\n });\n\n const merged = mergeResources(prior?.resources ?? [], newResources);\n const entry = {\n package: packageName,\n variant: '_flat',\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: merged,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n\n await writeInstalledManifest(projectRoot, installed);\n}\n\nfunction mergeResources(\n prior: InstalledResource[],\n next: InstalledResource[],\n): InstalledResource[] {\n const merged = new Map<string, InstalledResource>();\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';\nimport { getErrorMessage } from '../../utils/error.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: ${getErrorMessage(err)}`);\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 * Shared factory for the `ui upgrade` and `biz-ui upgrade` commands\n * ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md)).\n *\n * Both commands share the same staging-only contract — the only differences\n * are the install dir hint, the \"not installed\" follow-up command, and the\n * trigger string written into the staging manifest. We materialise those\n * differences via {@link CategoryMeta} and build a single `commander` Command.\n *\n * Frozen boundary preserved: the command **never writes** into\n * `src/components/{ui,business}/**`. Application is delegated to the\n * `teamix-evo-upgrade` skill via the staging dir.\n */\nimport { Command } from 'commander';\nimport type { ComponentCategory } from '../core/ui-upgrade-detector.js';\nimport { detectIde } from '../ide/index.js';\nimport { runUiUpgrade } from '../core/ui-upgrade.js';\nimport { logger } from '../utils/logger.js';\nimport { getErrorMessage } from '../utils/error.js';\n\ninterface CategoryMeta {\n /** ui-installer alias key surface (kept identical to category for clarity). */\n category: ComponentCategory;\n /** Frozen install dir, used in error messaging only. */\n installDirHint: string;\n /** Recovery command suggested when the package is not installed. */\n notInstalledHint: string;\n /** Trigger string persisted in the staging manifest. */\n trigger: 'ui-upgrade' | 'biz-ui-upgrade' | 'blocks-upgrade';\n}\n\nconst META: Record<ComponentCategory, CategoryMeta> = {\n ui: {\n category: 'ui',\n installDirHint: 'src/components/ui',\n notInstalledHint: 'npx teamix-evo ui init',\n trigger: 'ui-upgrade',\n },\n 'biz-ui': {\n category: 'biz-ui',\n installDirHint: 'src/components/business',\n notInstalledHint: 'npx teamix-evo biz-ui add <id>',\n trigger: 'biz-ui-upgrade',\n },\n blocks: {\n category: 'blocks',\n installDirHint: 'src/blocks',\n notInstalledHint: 'npx teamix-evo blocks add <id>',\n trigger: 'blocks-upgrade',\n },\n};\n\n/**\n * Build a `commander` Command implementing the source-layer upgrade pipeline\n * for the given component category.\n */\nexport function makeUpgradeCommand(category: ComponentCategory): Command {\n const meta = META[category];\n return new Command('upgrade')\n .description(\n `为 ${category} 组件生成升级 staging(不写 src,需通过 teamix-evo-upgrade skill 应用)`,\n )\n .argument(\n '[ids...]',\n '可选 entry id 列表;省略时对全部已安装组件生成 staging',\n )\n .option(\n '--apply',\n `(守卫提示)保留但拒绝执行:CLI 不写 ${meta.installDirHint},请通过 teamix-evo-upgrade skill 应用 staging`,\n )\n .action(async (ids: string[], opts: { apply?: boolean }) => {\n if (opts.apply) {\n logger.error(\n `CLI 不会自动写入 ${meta.installDirHint}(ADR 0019 frozen 边界)。`,\n );\n logger.error(\n `请运行 \\`teamix-evo ${category} upgrade\\` 生成 staging,再让 AI 调用 teamix-evo-upgrade skill 逐文件应用。`,\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const result = await runUiUpgrade({\n projectRoot,\n category: meta.category,\n ids,\n trigger: meta.trigger,\n });\n\n switch (result.status) {\n case 'not-initialized':\n logger.error(\n 'Project not initialized. Run `npx teamix-evo init` first.',\n );\n process.exitCode = 1;\n return;\n case 'not-installed':\n logger.error(`${category} not installed: ${result.detail}`);\n logger.error(`Run \\`${meta.notInstalledHint}\\` first.`);\n process.exitCode = 1;\n return;\n case 'skipped':\n logger.info(\n `Nothing to stage (lineage=${result.lineage}): ${result.detail}`,\n );\n return;\n case 'staged': {\n const { manifest, stagingDir } = result;\n logger.success(\n `${category} staging written: ${manifest.summary.total} entries → ${stagingDir}`,\n );\n const byRisk = manifest.summary.byRisk;\n const parts = Object.entries(byRisk)\n .filter(([, n]) => (n ?? 0) > 0)\n .map(([k, n]) => `${k}=${n}`);\n if (parts.length > 0) {\n logger.info(` risk: ${parts.join(', ')}`);\n }\n logger.info('');\n logger.info(\n 'Next: 让 AI 调用 teamix-evo-upgrade skill,按 risk 分批 review & apply。',\n );\n return;\n }\n }\n } catch (err) {\n logger.error(\n `Failed to build ${category} staging: ${getErrorMessage(err)}`,\n );\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Programmatic core for `teamix-evo ui upgrade` / `teamix-evo biz-ui upgrade`\n * ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D5).\n *\n * The CLI command delegates here; the project-update orchestrator also reuses\n * `buildComponentSourceStaging` so the same staging shape is produced by both\n * paths. Frozen boundary preserved: this module **never writes** into\n * `src/components/{ui,business}/**`. The skill consumes the staging.\n */\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport {\n loadUiPackageManifest,\n loadVariantUiPackageManifest,\n} from '@teamix-evo/registry';\nimport type {\n UiAliases,\n UiEntry,\n UiPackageManifest,\n UpgradeStagingManifest,\n UpgradeStagingTrigger,\n} from '@teamix-evo/registry';\nimport { readProjectConfig, readInstalledManifest } from './state.js';\nimport {\n detectComponentLineage,\n type ComponentCategory,\n type ComponentLineageReport,\n} from './ui-upgrade-detector.js';\nimport {\n buildUiUpgradeStaging,\n type BuildUiUpgradeStagingResult,\n} from './ui-upgrade-staging.js';\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = nodeRequire.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\nexport interface RunUiUpgradeOptions {\n /** Absolute project root. */\n projectRoot: string;\n /** Which package category to stage. */\n category: ComponentCategory;\n /**\n * Restrict to a subset of entry ids. Empty / undefined → all registered ids\n * (plus foreign ids in `mixed` lineage).\n */\n ids?: string[];\n /** Trigger label written into the staging manifest. */\n trigger: UpgradeStagingTrigger;\n /** Override package roots (test hook). */\n uiPackageRoot?: string;\n bizUiPackageRoot?: string;\n}\n\nexport type RunUiUpgradeResult =\n | {\n status: 'not-initialized';\n }\n | {\n status: 'not-installed';\n detail: string;\n }\n | {\n status: 'skipped';\n detail: string;\n lineage: ComponentLineageReport['lineage'];\n }\n | {\n status: 'staged';\n stagingDir: string;\n manifest: UpgradeStagingManifest;\n };\n\n/**\n * High-level orchestration:\n *\n * 1. Read project config (must be teamix-evo-installed)\n * 2. Detect lineage for the requested category\n * 3. Resolve upstream manifest (variant-aware for biz-ui)\n * 4. Delegate to `buildUiUpgradeStaging`\n *\n * Throws only on programming errors; expected user-facing failures (no\n * config, package not installed, unknown id) are surfaced via the discriminated\n * return type so the CLI / orchestrator can render them consistently.\n */\nexport async function runUiUpgrade(\n options: RunUiUpgradeOptions,\n): Promise<RunUiUpgradeResult> {\n const { projectRoot, category, ids = [], trigger } = options;\n\n const config = await readProjectConfig(projectRoot);\n if (!config) return { status: 'not-initialized' };\n\n const cfgKey = category === 'blocks' ? 'blocks' : category === 'ui' ? 'ui' : 'biz-ui';\n if (!config.packages?.[cfgKey]) {\n return { status: 'not-installed', detail: `${category} not installed` };\n }\n\n // ui aliases live under packages.ui per ADR 0014; biz-ui shares the map.\n const aliases =\n config.packages.ui?.aliases ??\n (config.packages['biz-ui']?.aliases as UiAliases | undefined);\n if (!aliases) {\n return {\n status: 'not-installed',\n detail: `${category} aliases not configured (run \\`teamix-evo ui init\\` first)`,\n };\n }\n\n const installed = await readInstalledManifest(projectRoot);\n const lineageReport = await detectComponentLineage({\n projectRoot,\n category,\n config,\n installed,\n });\n\n if (\n lineageReport.lineage !== 'teamix-evo' &&\n lineageReport.lineage !== 'mixed'\n ) {\n return {\n status: 'skipped',\n detail: `lineage=${lineageReport.lineage}; nothing to stage`,\n lineage: lineageReport.lineage,\n };\n }\n\n // Validate that explicit ids are recognised — surface a clear error rather\n // than silently producing an empty staging dir.\n if (ids.length > 0) {\n const knownIds = new Set([\n ...lineageReport.registeredIds,\n ...lineageReport.unregisteredIds,\n ]);\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown ${category} component id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(\n ', ',\n )}. Hint: \\`teamix-evo ${category} list\\` shows available ids.`,\n );\n }\n }\n\n const built = await buildStaging({\n category,\n projectRoot,\n aliases,\n lineageReport,\n trigger,\n onlyIds: ids,\n uiPackageRoot: options.uiPackageRoot,\n bizUiPackageRoot: options.bizUiPackageRoot,\n });\n\n if (built === null) {\n return {\n status: 'skipped',\n detail: 'no entries to stage',\n lineage: lineageReport.lineage,\n };\n }\n\n return {\n status: 'staged',\n stagingDir: built.stagingDir,\n manifest: built.manifest,\n };\n}\n\ninterface BuildStagingArgs {\n category: ComponentCategory;\n projectRoot: string;\n aliases: UiAliases;\n lineageReport: ComponentLineageReport;\n trigger: UpgradeStagingTrigger;\n onlyIds: string[];\n uiPackageRoot?: string;\n bizUiPackageRoot?: string;\n blocksPackageRoot?: string;\n}\n\n/**\n * Resolve upstream manifest + (for biz-ui) merge cross-package deps from\n * `@teamix-evo/ui`, then delegate to `buildUiUpgradeStaging`. Exposed so the\n * project-update orchestrator can reuse the exact same code path.\n */\nexport async function buildStaging(\n args: BuildStagingArgs,\n): Promise<BuildUiUpgradeStagingResult | null> {\n const { category, projectRoot, aliases, lineageReport, trigger, onlyIds } =\n args;\n if (category === 'blocks') {\n const root =\n args.blocksPackageRoot ?? resolvePackageRoot('@teamix-evo/blocks');\n const manifest = await loadUiPackageManifest(root);\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest,\n packageRoot: root,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n }\n\n if (category === 'ui') {\n const root = args.uiPackageRoot ?? resolvePackageRoot('@teamix-evo/ui');\n const manifest = await loadUiPackageManifest(root);\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest,\n packageRoot: root,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n }\n\n // biz-ui — merge variant entries with @teamix-evo/ui entries (for transitive\n // ui deps that may have landed under biz-ui's installed record). Mirrors\n // `runVariantUiAdd` so the same dep graph applies.\n const bizRoot =\n args.bizUiPackageRoot ?? resolvePackageRoot('@teamix-evo/biz-ui');\n const variant = lineageReport.installedVariant ?? '_flat';\n const variantDir = path.join(bizRoot, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n const uiRoot = args.uiPackageRoot ?? resolvePackageRoot('@teamix-evo/ui');\n const uiManifest = await loadUiPackageManifest(uiRoot);\n\n const entryPackageRoot = new Map<string, string>();\n const merged: UiEntry[] = [];\n for (const e of variantManifest.entries) {\n entryPackageRoot.set(e.id, variantDir);\n merged.push(e);\n }\n for (const e of uiManifest.entries) {\n if (entryPackageRoot.has(e.id)) continue;\n entryPackageRoot.set(e.id, uiRoot);\n merged.push(e);\n }\n\n const synthetic: UiPackageManifest = {\n schemaVersion: 1,\n package: 'ui',\n version: variantManifest.version,\n engines: variantManifest.engines,\n entries: merged,\n };\n\n return buildUiUpgradeStaging({\n projectRoot,\n category,\n manifest: synthetic,\n packageRoot: variantDir,\n entryPackageRoot,\n aliases,\n lineageReport,\n trigger,\n onlyIds,\n });\n}\n","/**\n * Component-source upgrade lineage detector ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D1).\n *\n * Classifies the consumer project's `ui` / `biz-ui` directory into one of four\n * lineage buckets so the upgrade pipeline (and downstream skill) can choose\n * the right opening line + bucket strategy:\n *\n * | lineage | criterion |\n * | --------------- | --------------------------------------------------------------------------- |\n * | `teamix-evo` | manifest has the package, every on-disk file is registered |\n * | `mixed` | manifest has the package, but extra unregistered files exist on disk |\n * | `shadcn-native` | manifest lacks the package, `components.json` exists, on-disk files exist |\n * | `custom-only` | manifest lacks the package, no `components.json`, on-disk files exist |\n * | `absent` | none of the above — nothing to upgrade |\n *\n * Pure read-only — never mutates the filesystem.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ComponentLineage,\n InstalledManifest,\n InstalledPackage,\n ProjectConfig,\n UiAliases,\n} from '@teamix-evo/registry';\nimport { fileExists } from '../utils/fs.js';\nimport {\n findInstalledPackage,\n readInstalledManifest,\n readProjectConfig,\n} from './state.js';\nimport { DEFAULT_UI_ALIASES } from './ui-init.js';\n\n/** Which package category to detect lineage for. */\nexport type ComponentCategory = 'ui' | 'biz-ui' | 'blocks';\n\n/** Lineage classification including the special `absent` bucket. */\nexport type ComponentLineageWithAbsent = ComponentLineage | 'absent';\n\nconst PACKAGE_NAME: Record<ComponentCategory, string> = {\n ui: '@teamix-evo/ui',\n 'biz-ui': '@teamix-evo/biz-ui',\n blocks: '@teamix-evo/blocks',\n};\n\nconst ALIAS_KEY: Record<ComponentCategory, keyof UiAliases> = {\n ui: 'components',\n 'biz-ui': 'business',\n blocks: 'blocks',\n};\n\n/** Files matching this regex inside the install dir are considered components. */\nconst COMPONENT_FILE_RE = /\\.(tsx|ts)$/;\n\n/** Filenames that are conventional helpers and should NOT be counted as components. */\nconst SKIP_FILENAMES = new Set(['index.ts', 'index.tsx']);\n\nexport interface ComponentLineageReport {\n /** Which package category this report describes. */\n category: ComponentCategory;\n /** Bucket assignment per the table above. */\n lineage: ComponentLineageWithAbsent;\n /** Resolved install dir (project-relative, e.g. `src/components/ui`). */\n installDir: string;\n /** Whether the install dir exists on disk. */\n installDirExists: boolean;\n /** Whether `components.json` exists at project root. */\n hasComponentsJson: boolean;\n /** Component ids registered in `.teamix-evo/manifest.json` (e.g. `[\"button\", \"input\"]`). */\n registeredIds: string[];\n /** Component ids found on disk but absent from the installed manifest. */\n unregisteredIds: string[];\n /** Installed package version, or null if the package is not in the manifest. */\n installedVersion: string | null;\n /** Variant: `'_flat'` for ui; concrete variant id (e.g. `'opentrek'`) for biz-ui; null when not installed. */\n installedVariant: string | null;\n}\n\nexport interface DetectComponentLineageOptions {\n projectRoot: string;\n category: ComponentCategory;\n /**\n * Optional pre-loaded project config. When omitted the detector reads it\n * from `.teamix-evo/config.json` itself; supplying it avoids redundant I/O\n * when the caller already holds one (e.g. `runProjectUpdate`).\n */\n config?: ProjectConfig | null;\n /**\n * Optional pre-loaded installed manifest. Same rationale as `config`.\n */\n installed?: InstalledManifest | null;\n}\n\n/**\n * Detect component-source lineage for the given project + category.\n *\n * Always returns a report — `lineage: 'absent'` when nothing to do, never\n * throws on an empty directory.\n */\nexport async function detectComponentLineage(\n options: DetectComponentLineageOptions,\n): Promise<ComponentLineageReport> {\n const { projectRoot, category } = options;\n const config = options.config ?? (await readProjectConfig(projectRoot));\n const installed =\n options.installed ?? (await readInstalledManifest(projectRoot));\n\n const installDir = resolveInstallDir(category, config);\n const installDirAbs = path.join(projectRoot, installDir);\n const installDirExists = await directoryExists(installDirAbs);\n const hasComponentsJson = await fileExists(\n path.join(projectRoot, 'components.json'),\n );\n\n const installedPkg = findInstalledPackage(installed, PACKAGE_NAME[category]);\n const registeredIds = installedPkg ? extractIds(installedPkg).sort() : [];\n\n const layout = category === 'blocks' ? 'directory' : 'flat';\n const onDiskIds = installDirExists\n ? await listComponentIds(installDirAbs, layout)\n : [];\n const registeredSet = new Set(registeredIds);\n const unregisteredIds = onDiskIds\n .filter((id) => !registeredSet.has(id))\n .sort();\n\n const lineage = classifyLineage({\n hasInstalled: installedPkg !== null,\n hasComponentsJson,\n onDiskIds,\n unregisteredIds,\n });\n\n return {\n category,\n lineage,\n installDir,\n installDirExists,\n hasComponentsJson,\n registeredIds,\n unregisteredIds,\n installedVersion: installedPkg?.version ?? null,\n installedVariant: installedPkg?.variant ?? null,\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveInstallDir(\n category: ComponentCategory,\n config: ProjectConfig | null,\n): string {\n // ui aliases live under packages.ui (per ui-init); biz-ui shares the same\n // alias map (UiAliasesSchema includes the `business` field).\n const aliasMap =\n config?.packages?.ui?.aliases ??\n (config?.packages?.['biz-ui']?.aliases as UiAliases | undefined) ??\n DEFAULT_UI_ALIASES;\n const key = ALIAS_KEY[category];\n return aliasMap[key] ?? DEFAULT_UI_ALIASES[key];\n}\n\n/**\n * Extract distinct component ids from an installed package's resources.\n * `InstalledResource.id` is shaped `\"<entryId>:<filename>\"` (see\n * `ui-installer.ts` L111). We collapse on the entryId portion so a multi-file\n * entry (rare) only shows up once.\n */\nfunction extractIds(pkg: InstalledPackage): string[] {\n const ids = new Set<string>();\n for (const r of pkg.resources) {\n const colon = r.id.indexOf(':');\n ids.add(colon >= 0 ? r.id.slice(0, colon) : r.id);\n }\n return [...ids];\n}\n\nasync function directoryExists(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\n/**\n * List component ids on disk.\n *\n * For flat layouts (ui/biz-ui): strips file extension; skips `index.{ts,tsx}`\n * and nested directories (entry sources are flattened by ui-installer).\n *\n * For directory layouts (blocks): each subdirectory name is an id.\n */\nasync function listComponentIds(\n installDirAbs: string,\n layout: 'flat' | 'directory' = 'flat',\n): Promise<string[]> {\n const entries = await fs.readdir(installDirAbs, { withFileTypes: true });\n const ids: string[] = [];\n if (layout === 'directory') {\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (e.name.startsWith('.')) continue;\n ids.push(e.name);\n }\n } else {\n for (const e of entries) {\n if (!e.isFile()) continue;\n if (SKIP_FILENAMES.has(e.name)) continue;\n if (!COMPONENT_FILE_RE.test(e.name)) continue;\n ids.push(e.name.replace(COMPONENT_FILE_RE, ''));\n }\n }\n return ids.sort();\n}\n\ninterface ClassifyArgs {\n hasInstalled: boolean;\n hasComponentsJson: boolean;\n onDiskIds: string[];\n unregisteredIds: string[];\n}\n\nfunction classifyLineage(args: ClassifyArgs): ComponentLineageWithAbsent {\n const { hasInstalled, hasComponentsJson, onDiskIds, unregisteredIds } = args;\n if (hasInstalled) {\n return unregisteredIds.length === 0 ? 'teamix-evo' : 'mixed';\n }\n // Not installed via teamix-evo.\n if (onDiskIds.length === 0) return 'absent';\n return hasComponentsJson ? 'shadcn-native' : 'custom-only';\n}\n","/**\n * Component-source upgrade staging builder ([ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md) §D2-D4).\n *\n * Given a lineage report (from `ui-upgrade-detector`) and the upstream package\n * manifest + root, produces a `.teamix-evo/.upgrade-staging/<category>-<ts>/`\n * directory containing:\n *\n * - `meta.json` — {@link UpgradeStagingManifest} payload (the truth source)\n * - `<id>/current.{tsx,ts}` — copy of the consumer's installed file\n * - `<id>/incoming.{tsx,ts}`— upstream source after applying the consumer's import-rewrite aliases\n *\n * Pure produce-only — never writes into `src/components/{ui,business}/**`\n * (frozen boundary preserved). The staging dir is consumed by the\n * `teamix-evo-upgrade` skill, which decides per-file apply with user consent.\n *\n * Risk classification uses regex-level heuristics (no AST) — the skill is\n * expected to refine the level after reading the staged sources.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n InstalledManifest,\n InstalledPackage,\n InstalledResource,\n PromoteFeatureVector,\n PromoteFileType,\n PromoteMode,\n UiAliases,\n UiEntry,\n UiPackageManifest,\n UpgradeRiskLevel,\n UpgradeStagingDiff,\n UpgradeStagingEntry,\n UpgradeStagingManifest,\n UpgradeStagingPromotion,\n UpgradeStagingTrigger,\n} from '@teamix-evo/registry';\nimport {\n writeFileSafe,\n ensureDir,\n readFileOrNull,\n fileExists,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport { findInstalledPackage, readInstalledManifest } from './state.js';\nimport type {\n ComponentCategory,\n ComponentLineageReport,\n} from './ui-upgrade-detector.js';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst STAGING_DIR = '.upgrade-staging';\n\nconst PACKAGE_NAME: Record<ComponentCategory, string> = {\n ui: '@teamix-evo/ui',\n 'biz-ui': '@teamix-evo/biz-ui',\n blocks: '@teamix-evo/blocks',\n};\n\n/** Match `iso-to-fs-safe` used by `upgrade-hints.ts` so dirs sort chronologically. */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\nexport interface BuildUiUpgradeStagingOptions {\n /** Absolute project root. */\n projectRoot: string;\n /** Which category this run targets. */\n category: ComponentCategory;\n /**\n * Upstream package manifest (already loaded by the caller — avoids forcing\n * this module to know about variant resolution; the caller adapts variant\n * manifests via `loadVariantUiPackageManifest` and synthesizes a\n * `UiPackageManifest` shape per `variant-ui-add.ts`).\n */\n manifest: UiPackageManifest;\n /** Absolute upstream package root (where `entry.files[].source` resolves). */\n packageRoot: string;\n /**\n * Optional per-entry root override — used by biz-ui where some entries come\n * from the variant dir and cross-package deps come from `@teamix-evo/ui`.\n */\n entryPackageRoot?: Map<string, string>;\n /** Consumer-side alias map (from `config.packages.ui.aliases`). */\n aliases: UiAliases;\n /** Pre-computed lineage report for this category. */\n lineageReport: ComponentLineageReport;\n /** Which command produced the staging. */\n trigger: UpgradeStagingTrigger;\n /** Restrict processing to a subset of entry ids (single-component path). */\n onlyIds?: string[];\n /** Pre-loaded installed manifest (to avoid double I/O when caller has it). */\n installed?: InstalledManifest | null;\n /** Testing hook — fixed iso ts so the staging dir name is deterministic. */\n isoTs?: string;\n}\n\nexport interface BuildUiUpgradeStagingResult {\n /** Absolute staging dir path (`.teamix-evo/.upgrade-staging/<category>-<ts>/`). */\n stagingDir: string;\n /** The manifest payload that was written to `meta.json`. */\n manifest: UpgradeStagingManifest;\n}\n\n/**\n * Build a staging dir + manifest. Returns `null` when there is nothing to\n * stage (no installed package for this category, or all entries filtered out).\n */\nexport async function buildUiUpgradeStaging(\n options: BuildUiUpgradeStagingOptions,\n): Promise<BuildUiUpgradeStagingResult | null> {\n const { lineageReport, category } = options;\n\n // Lineages without an installed teamix-evo package have nothing to compare\n // against. shadcn-native / custom-only / absent are no-ops here — they are\n // handled by the skill (migration suggestions), not by staging.\n if (\n lineageReport.lineage !== 'teamix-evo' &&\n lineageReport.lineage !== 'mixed'\n ) {\n return null;\n }\n\n const installed =\n options.installed ?? (await readInstalledManifest(options.projectRoot));\n const installedPkg = findInstalledPackage(installed, PACKAGE_NAME[category]);\n if (!installedPkg) return null;\n\n const isoTs = options.isoTs ?? new Date().toISOString();\n const fsTs = isoToFsSafe(isoTs);\n const stagingDir = path.join(\n options.projectRoot,\n TEAMIX_DIR,\n STAGING_DIR,\n `${category}-${fsTs}`,\n );\n\n const entryMap = new Map<string, UiEntry>(\n options.manifest.entries.map((e) => [e.id, e]),\n );\n\n // First installed resource per entry id (multi-file entries are rare; we\n // stage the primary file and emit a hint when extras exist).\n const resByEntryId = collectResourcesByEntry(installedPkg.resources);\n\n const onlyIds =\n options.onlyIds && options.onlyIds.length > 0\n ? new Set(options.onlyIds)\n : null;\n\n const entries: UpgradeStagingEntry[] = [];\n\n // ─── Registered ids (have installed records) ─────────────────────────────\n for (const id of lineageReport.registeredIds) {\n if (onlyIds && !onlyIds.has(id)) continue;\n const built = await processRegistered({\n id,\n entry: entryMap.get(id),\n resource: resByEntryId.get(id),\n packageRoot: options.packageRoot,\n entryPackageRoot: options.entryPackageRoot,\n aliases: options.aliases,\n stagingDir,\n projectRoot: options.projectRoot,\n category,\n sourceVersion: options.manifest.version,\n });\n if (built) entries.push(built);\n }\n\n // ─── Foreign ids (mixed lineage extras) ──────────────────────────────────\n for (const id of lineageReport.unregisteredIds) {\n if (onlyIds && !onlyIds.has(id)) continue;\n const built = await processForeign({\n id,\n installDirAbs: path.join(options.projectRoot, lineageReport.installDir),\n stagingDir,\n projectRoot: options.projectRoot,\n category,\n });\n if (built) entries.push(built);\n }\n\n if (entries.length === 0) return null;\n\n const byRisk = aggregateByRisk(entries);\n const manifestOut: UpgradeStagingManifest = {\n schemaVersion: 1,\n ts: isoTs,\n package: category,\n trigger: options.trigger,\n variant: lineageReport.installedVariant ?? '_flat',\n fromVersion: lineageReport.installedVersion ?? '',\n toVersion: options.manifest.version,\n lineage: lineageReport.lineage,\n summary: { total: entries.length, byRisk },\n entries,\n };\n\n await ensureDir(stagingDir);\n await writeFileSafe(\n path.join(stagingDir, 'meta.json'),\n JSON.stringify(manifestOut, null, 2) + '\\n',\n );\n\n return { stagingDir, manifest: manifestOut };\n}\n\n// ─── Per-entry processors ────────────────────────────────────────────────────\n\ninterface ProcessRegisteredArgs {\n id: string;\n entry: UiEntry | undefined;\n resource: InstalledResource | undefined;\n packageRoot: string;\n entryPackageRoot?: Map<string, string>;\n aliases: UiAliases;\n stagingDir: string;\n projectRoot: string;\n category: ComponentCategory;\n sourceVersion: string;\n}\n\nasync function processRegistered(\n args: ProcessRegisteredArgs,\n): Promise<UpgradeStagingEntry | null> {\n const { id, entry, resource, stagingDir, projectRoot, category } = args;\n if (!resource) return null;\n\n const currentSource = await readFileOrNull(resource.target);\n // File present in installed manifest but missing on disk — surface as\n // breaking so the AI can reconcile (likely user deleted the file).\n if (currentSource === null) {\n return buildBreakingEntry({\n id,\n category,\n resource,\n projectRoot,\n stagingDir,\n currentSource: '',\n hint: 'installed file missing on disk',\n });\n }\n\n // Upstream removed this entry — breaking, emit current.tsx only.\n if (!entry) {\n return buildBreakingEntry({\n id,\n category,\n resource,\n projectRoot,\n stagingDir,\n currentSource,\n hint: 'entry removed in upstream package',\n });\n }\n\n const file = entry.files[0];\n if (!file) return null;\n\n const rootForEntry = args.entryPackageRoot?.get(id) ?? args.packageRoot;\n const sourceAbs = path.resolve(rootForEntry, file.source);\n const raw = await readFileOrNull(sourceAbs);\n if (raw === null) {\n // Upstream manifest references a missing file — degenerate; skip rather\n // than fail the whole pipeline.\n return null;\n }\n const incomingTransformed = rewriteImports(raw, args.aliases);\n const incomingHash = computeHash(incomingTransformed);\n\n const currentExt = path.extname(resource.target) || '.tsx';\n const incomingExt = path.extname(file.targetName) || currentExt;\n const currentRel = `${id}/current${currentExt}`;\n const incomingRel = `${id}/incoming${incomingExt}`;\n await writeFileSafe(path.join(stagingDir, currentRel), currentSource);\n await writeFileSafe(path.join(stagingDir, incomingRel), incomingTransformed);\n\n const diff = classifyRisk({\n currentHash: resource.hash,\n incomingHash,\n currentSource,\n incomingSource: incomingTransformed,\n multiFile: entry.files.length > 1,\n });\n\n const promotion = derivePromotion({\n currentSource,\n incomingSource: incomingTransformed,\n targetName: entry.files[0]?.targetName ?? `${id}.tsx`,\n });\n\n return {\n id,\n category,\n current: {\n target: path.relative(projectRoot, resource.target),\n hash: resource.hash,\n sourceLineage: 'teamix-evo',\n },\n incoming: {\n sourceVersion: args.sourceVersion,\n hash: incomingHash,\n relPath: incomingRel,\n },\n diff,\n promotion,\n };\n}\n\ninterface ProcessForeignArgs {\n id: string;\n installDirAbs: string;\n stagingDir: string;\n projectRoot: string;\n category: ComponentCategory;\n}\n\nasync function processForeign(\n args: ProcessForeignArgs,\n): Promise<UpgradeStagingEntry | null> {\n const { id, installDirAbs, stagingDir, projectRoot, category } = args;\n const tsx = path.join(installDirAbs, `${id}.tsx`);\n const ts = path.join(installDirAbs, `${id}.ts`);\n const target = (await fileExists(tsx))\n ? tsx\n : (await fileExists(ts))\n ? ts\n : null;\n if (!target) return null;\n\n const raw = await readFileOrNull(target);\n if (raw === null) return null;\n\n const ext = path.extname(target);\n const currentRel = `${id}/current${ext}`;\n await writeFileSafe(path.join(stagingDir, currentRel), raw);\n\n return {\n id,\n category,\n current: {\n target: path.relative(projectRoot, target),\n hash: computeHash(raw),\n sourceLineage: 'custom',\n },\n diff: {\n riskLevel: 'foreign',\n hints: [\n 'component is on disk but not registered in .teamix-evo/manifest.json',\n 'AI should propose: (a) ignore, (b) re-register via teamix-evo ui add, or (c) remove',\n ],\n filesChangedCount: 0,\n },\n };\n}\n\ninterface BuildBreakingArgs {\n id: string;\n category: ComponentCategory;\n resource: InstalledResource;\n projectRoot: string;\n stagingDir: string;\n currentSource: string;\n hint: string;\n}\n\nasync function buildBreakingEntry(\n args: BuildBreakingArgs,\n): Promise<UpgradeStagingEntry> {\n const ext = path.extname(args.resource.target) || '.tsx';\n const currentRel = `${args.id}/current${ext}`;\n // Always materialize the current snapshot so the AI can reason even when\n // the source disappeared from disk (zero-byte file is still informative).\n await writeFileSafe(\n path.join(args.stagingDir, currentRel),\n args.currentSource,\n );\n return {\n id: args.id,\n category: args.category,\n current: {\n target: path.relative(args.projectRoot, args.resource.target),\n hash: args.resource.hash,\n sourceLineage: 'teamix-evo',\n },\n diff: {\n riskLevel: 'breaking',\n hints: [args.hint],\n filesChangedCount: 0,\n },\n };\n}\n\n// ─── Risk classifier ─────────────────────────────────────────────────────────\n\ninterface ClassifyRiskArgs {\n currentHash: string;\n incomingHash: string;\n currentSource: string;\n incomingSource: string;\n multiFile: boolean;\n}\n\n/**\n * Lightweight risk classifier — regex-level only (per ADR 0040 §D3). The\n * skill is expected to refine after reading the staged sources, but the\n * default level lets the AI summarize \"X risky / Y medium / Z low\" without\n * reading any source code.\n */\nfunction classifyRisk(args: ClassifyRiskArgs): UpgradeStagingDiff {\n if (args.currentHash === args.incomingHash) {\n return { riskLevel: 'unchanged', hints: [], filesChangedCount: 0 };\n }\n\n const curExports = extractExportNames(args.currentSource);\n const newExports = extractExportNames(args.incomingSource);\n // Risk-classification perspective: \"removed\" = upstream dropped an export\n // the user still relied on; \"added\" = upstream introduced a new symbol.\n // (Compare to buildFeatureVector below which uses the user's perspective.)\n const removedExports = setDiff(curExports, newExports);\n const addedExports = setDiff(newExports, curExports);\n\n const curVariants = extractCvaVariantValues(args.currentSource);\n const newVariants = extractCvaVariantValues(args.incomingSource);\n const removedVariants = setDiff(curVariants, newVariants);\n const addedVariants = setDiff(newVariants, curVariants);\n\n const hints: string[] = [];\n for (const e of removedExports) hints.push(`removed export: ${e}`);\n for (const e of addedExports) hints.push(`new export: ${e}`);\n for (const v of removedVariants) hints.push(`removed cva variant: ${v}`);\n for (const v of addedVariants) hints.push(`new cva variant: ${v}`);\n if (args.multiFile) hints.push('multi-file entry; only first file staged');\n\n let riskLevel: UpgradeRiskLevel;\n if (removedExports.length > 0 || removedVariants.length > 0) {\n riskLevel = 'risky';\n } else if (\n addedExports.length > 0 ||\n addedVariants.length > 0 ||\n args.multiFile\n ) {\n riskLevel = 'upgradable-medium';\n } else {\n riskLevel = 'upgradable-low';\n }\n\n return { riskLevel, hints, filesChangedCount: 1 };\n}\n\n/**\n * Best-effort export-name extractor (regex). Catches `export const Foo`,\n * `export function Foo`, `export class Foo`, `export interface Foo`,\n * `export type Foo`, `export enum Foo`, and `export default <Identifier>`.\n * Misses re-exports (`export { X } from`) — those are rare for ui entries\n * and would require AST-level analysis to do correctly.\n */\nfunction extractExportNames(src: string): string[] {\n const names = new Set<string>();\n const re =\n /^\\s*export\\s+(?:default\\s+)?(?:async\\s+)?(?:const|let|var|function|class|interface|type|enum)\\s+(\\w+)/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(src)) !== null) {\n if (m[1]) names.add(m[1]);\n }\n // `export default Foo` (referenced identifier, not a declaration)\n for (const dm of src.matchAll(/^\\s*export\\s+default\\s+(\\w+)\\s*;/gm)) {\n if (dm[1]) names.add(dm[1]);\n }\n return [...names];\n}\n\n/**\n * Extract value-level cva variant keys (e.g. `default`, `ghost`, `destructive`).\n * Looks for a `variants: { ... }` object literal and harvests the second-level\n * keys inside each named group (`variant: { default: ..., ghost: ... }`).\n *\n * Naive, two-step regex:\n * 1. Locate the outermost `variants: { ... }` block via balanced-brace scan.\n * 2. For each top-level group `<name>: { ... }`, harvest its inner keys.\n *\n * Returns the union of inner keys across all groups (a single name like\n * `ghost` showing up in two groups still counts as one).\n */\nfunction extractCvaVariantValues(src: string): string[] {\n const block = extractVariantsBlock(src);\n if (block === null) return [];\n const names = new Set<string>();\n for (const groupBody of extractGroupBodies(block)) {\n for (const km of groupBody.matchAll(/^\\s*(?:['\"]?)(\\w+)(?:['\"]?)\\s*:/gm)) {\n if (km[1]) names.add(km[1]);\n }\n }\n return [...names];\n}\n\n/** Brace-balanced extraction of the body inside `variants: { ... }`. */\nfunction extractVariantsBlock(src: string): string | null {\n const idx = src.search(/\\bvariants\\s*:\\s*\\{/);\n if (idx < 0) return null;\n const open = src.indexOf('{', idx);\n if (open < 0) return null;\n let depth = 0;\n for (let i = open; i < src.length; i++) {\n const c = src[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) return src.slice(open + 1, i);\n }\n }\n return null;\n}\n\n/** Yield each `<name>: { ... }` group body inside a `variants` block. */\nfunction* extractGroupBodies(block: string): Generator<string> {\n const re = /(\\w+)\\s*:\\s*\\{/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(block)) !== null) {\n const open = block.indexOf('{', m.index);\n if (open < 0) continue;\n let depth = 0;\n for (let i = open; i < block.length; i++) {\n const c = block[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) {\n yield block.slice(open + 1, i);\n re.lastIndex = i + 1;\n break;\n }\n }\n }\n }\n}\n\nfunction setDiff(a: string[], b: string[]): string[] {\n const bset = new Set(b);\n return a.filter((x) => !bset.has(x)).sort();\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction collectResourcesByEntry(\n resources: InstalledResource[],\n): Map<string, InstalledResource> {\n const out = new Map<string, InstalledResource>();\n for (const r of resources) {\n const colon = r.id.indexOf(':');\n const eid = colon >= 0 ? r.id.slice(0, colon) : r.id;\n if (!out.has(eid)) out.set(eid, r);\n }\n return out;\n}\n\nfunction aggregateByRisk(\n entries: UpgradeStagingEntry[],\n): Partial<Record<UpgradeRiskLevel, number>> {\n const out: Partial<Record<UpgradeRiskLevel, number>> = {};\n for (const e of entries) {\n const k = e.diff.riskLevel;\n out[k] = (out[k] ?? 0) + 1;\n }\n return out;\n}\n\n// ─── Promotion-vector heuristics (Init landing plan Phase 2.C.2) ────────────\n\ninterface DerivePromotionArgs {\n currentSource: string;\n incomingSource: string;\n targetName: string;\n}\n\n/**\n * Build the optional promotion-planning payload for a registered staging entry.\n *\n * The CLI emits this best-effort vector so the `promote-to-biz` skill can\n * recommend a default mode without re-deriving every axis. All axes use\n * regex-level heuristics — the skill is expected to refine via AST when the\n * confidence is below the threshold.\n */\nfunction derivePromotion(args: DerivePromotionArgs): UpgradeStagingPromotion {\n const fileType = classifyPromoteFileType(args.targetName, args.currentSource);\n const featureVector = buildFeatureVector(\n args.currentSource,\n args.incomingSource,\n );\n const { recommendedModes, confidence, reasons } = scorePromotionModes(\n fileType,\n featureVector,\n );\n return { fileType, featureVector, recommendedModes, confidence, reasons };\n}\n\n/**\n * Heuristic file-type classifier for the user's installed file. Mirrors\n * `ui-adopt.ts#classifyFile` but lighter — the staging emitter operates on\n * registered entries that already passed `ui add`, so the bias is towards\n * `component`.\n */\nfunction classifyPromoteFileType(\n targetName: string,\n src: string,\n): PromoteFileType {\n if (targetName.endsWith('.d.ts')) return 'type';\n if (/^use-[a-z0-9-]+\\.tsx?$/i.test(targetName)) return 'hook';\n const hasJsx = /<[A-Za-z][^>]*?>/.test(src);\n const hasReactImport = /from ['\"]react['\"]/.test(src);\n const hasProvider =\n /\\.Provider\\b/.test(src) || /createContext\\s*[<(]/.test(src);\n if (hasProvider && (hasJsx || hasReactImport)) return 'provider';\n if (hasJsx || /forwardRef\\s*[<(]/.test(src)) return 'component';\n if (!hasJsx && !hasReactImport) return 'util';\n return 'component';\n}\n\nfunction buildFeatureVector(\n current: string,\n incoming: string,\n): PromoteFeatureVector {\n const curExports = extractExportNames(current);\n const newExports = extractExportNames(incoming);\n // Promotion-vector perspective: \"added\" = user-side has it, upstream\n // does not (i.e. user added on top of upstream); \"removed\" = upstream\n // brings it but user has dropped it. Mirror inverse of classifyRisk above.\n const apiAdded = setDiff(curExports, newExports);\n const apiRemoved = setDiff(newExports, curExports);\n\n const curVariants = extractCvaVariantValues(current);\n const newVariants = extractCvaVariantValues(incoming);\n const cvaAdded = setDiff(curVariants, newVariants);\n const cvaModified: string[] = [];\n // \"modified\" — same key on both sides but body changed; we do a regex-level\n // proxy: a variant whose group body differs between current and incoming.\n const sharedVariants = curVariants.filter((v) => newVariants.includes(v));\n for (const v of sharedVariants) {\n if (extractVariantBody(current, v) !== extractVariantBody(incoming, v)) {\n cvaModified.push(v);\n }\n }\n\n // Style delta: heuristic on className literals & token references in current\n // (the user's file) compared to incoming.\n const curClass = extractClassNameLiterals(current);\n const newClass = extractClassNameLiterals(incoming);\n const classNameDiff = curClass !== newClass;\n const curTokens = extractTokenRefs(current);\n const newTokens = extractTokenRefs(incoming);\n const tokenUsageDiff =\n curTokens.size !== newTokens.size ||\n [...curTokens].some((t) => !newTokens.has(t));\n\n // Logic delta is read off the *current* (user) side — these signals decide\n // whether the user added stateful behaviour on top of the upstream import.\n const hasState = /\\buseState\\s*[<(]/.test(current);\n const hasEffect =\n /\\b(useEffect|useLayoutEffect|useMemo|useCallback)\\s*[<(]/.test(current);\n const curImports = extractImportSources(current);\n const newImports = extractImportSources(incoming);\n const hasExtraImports = [...curImports].some((src) => !newImports.has(src));\n\n // Structure delta — detect a composition pattern (multiple atomic children\n // rendered side-by-side) on the user side. Best effort: count distinct\n // capitalised JSX tag names; >2 distinct upstream-looking tags hints at a\n // compose pattern.\n const tagSet = new Set<string>();\n for (const m of current.matchAll(/<([A-Z]\\w+)[\\s/>]/g)) {\n if (m[1]) tagSet.add(m[1]);\n }\n const atomicChildren = [...tagSet];\n const isComposition = atomicChildren.length > 2;\n\n // Signature change — heuristic on default-export function parameter list.\n const signatureChanged =\n extractDefaultParamList(current) !== extractDefaultParamList(incoming);\n\n return {\n apiDelta: { added: apiAdded, removed: apiRemoved, signatureChanged },\n styleDelta: { classNameDiff, tokenUsageDiff },\n logicDelta: { hasState, hasEffect, hasExtraImports },\n cvaDelta: { addedVariants: cvaAdded, modifiedVariants: cvaModified },\n structureDelta: { isComposition, atomicChildren },\n };\n}\n\n/**\n * Score every mode independently, then return the recommended subset per the\n * Init landing plan §1.3 §5 (mode synthesis). Mutually exclusive terminals\n * (Coexist / Fork / TokenOnly) win when they fire; otherwise we return the\n * union of {Preset, Wrapper, Variant} above the 0.6 threshold.\n */\nfunction scorePromotionModes(\n fileType: PromoteFileType,\n fv: PromoteFeatureVector,\n): { recommendedModes: PromoteMode[]; confidence: number; reasons: string[] } {\n const reasons: string[] = [];\n if (fileType === 'hook' || fileType === 'util' || fileType === 'type') {\n reasons.push(\n `fileType=${fileType} — not a component, deferred to ManualReview`,\n );\n return { recommendedModes: ['ManualReview'], confidence: 0.5, reasons };\n }\n\n const apiNoChange =\n fv.apiDelta.added.length === 0 &&\n fv.apiDelta.removed.length === 0 &&\n !fv.apiDelta.signatureChanged;\n const logicMinimal =\n !fv.logicDelta.hasState &&\n !fv.logicDelta.hasEffect &&\n !fv.logicDelta.hasExtraImports;\n\n // Terminal modes (mutually exclusive)\n if (fv.apiDelta.removed.length > 0 || fv.apiDelta.signatureChanged) {\n reasons.push(\n 'signature changed or props removed — Coexist preserves user version',\n );\n return { recommendedModes: ['Coexist'], confidence: 0.85, reasons };\n }\n if (\n apiNoChange &&\n logicMinimal &&\n (fv.styleDelta.classNameDiff || fv.styleDelta.tokenUsageDiff) &&\n fv.cvaDelta.addedVariants.length === 0 &&\n fv.cvaDelta.modifiedVariants.length === 0\n ) {\n reasons.push(\n 'only style / token differences — push to tokens.overrides.css',\n );\n return { recommendedModes: ['TokenOnly'], confidence: 0.8, reasons };\n }\n\n const modes: PromoteMode[] = [];\n let score = 0;\n if (\n fv.cvaDelta.addedVariants.length > 0 ||\n fv.cvaDelta.modifiedVariants.length > 0\n ) {\n modes.push('Variant');\n reasons.push(\n `cva variants delta: +${fv.cvaDelta.addedVariants.length} ~${fv.cvaDelta.modifiedVariants.length}`,\n );\n score = Math.max(score, 0.7);\n }\n if (\n fv.logicDelta.hasState ||\n fv.logicDelta.hasEffect ||\n fv.logicDelta.hasExtraImports ||\n fv.apiDelta.added.length > 0\n ) {\n modes.push('Wrapper');\n reasons.push('user added state / effect / imports / props');\n score = Math.max(score, 0.75);\n }\n if (\n apiNoChange &&\n logicMinimal &&\n !fv.styleDelta.classNameDiff &&\n !fv.styleDelta.tokenUsageDiff &&\n fv.cvaDelta.addedVariants.length === 0 &&\n fv.cvaDelta.modifiedVariants.length === 0\n ) {\n // No detectable delta beyond defaults — Preset is the safe choice.\n modes.push('Preset');\n reasons.push('no API/logic delta — Preset captures default-prop tweaks');\n score = Math.max(score, 0.6);\n }\n if (fv.structureDelta.isComposition) {\n modes.push('Compose');\n reasons.push(\n `composition of ${fv.structureDelta.atomicChildren.length} atomic children`,\n );\n score = Math.max(score, 0.65);\n }\n\n if (modes.length === 0) {\n reasons.push('no axis crossed the 0.6 threshold');\n return { recommendedModes: ['ManualReview'], confidence: 0.4, reasons };\n }\n return { recommendedModes: modes, confidence: score, reasons };\n}\n\nfunction extractVariantBody(src: string, key: string): string {\n const block = extractVariantsBlock(src);\n if (block === null) return '';\n const re = new RegExp(`(?:[\"\\']?${key}[\"\\']?)\\\\s*:\\\\s*\\\\{`);\n const idx = block.search(re);\n if (idx < 0) return '';\n const open = block.indexOf('{', idx);\n if (open < 0) return '';\n let depth = 0;\n for (let i = open; i < block.length; i++) {\n const c = block[i];\n if (c === '{') depth++;\n else if (c === '}') {\n depth--;\n if (depth === 0) return block.slice(open + 1, i);\n }\n }\n return '';\n}\n\nfunction extractClassNameLiterals(src: string): string {\n const out: string[] = [];\n // 1) Static `className=\"...\"` / `className='...'` / `className={`...`}`.\n for (const m of src.matchAll(/className\\s*=\\s*[\"'`]([^\"'`]*)[\"'`]/g)) {\n if (m[1]) out.push(m[1]);\n }\n // 2) Dynamic `cn(...)` / `clsx(...)` / `cva(...)` calls — extract any\n // string literal arguments. shadcn-style components use these heavily,\n // so missing them under-counted classNameDiff signal (Concern-7).\n // We use a conservative approach: capture the call arglist, then pluck\n // out top-level string literals.\n for (const m of src.matchAll(/\\b(?:cn|clsx|cva)\\s*\\(/g)) {\n const open = (m.index ?? 0) + m[0].length - 1;\n let depth = 1;\n let i = open + 1;\n for (; i < src.length && depth > 0; i++) {\n const c = src[i];\n if (c === '(') depth++;\n else if (c === ')') depth--;\n }\n const body = src.slice(open + 1, i - 1);\n for (const lit of body.matchAll(/[\"'`]([^\"'`]*)[\"'`]/g)) {\n if (lit[1]) out.push(lit[1]);\n }\n }\n return out.sort().join('|');\n}\n\nfunction extractTokenRefs(src: string): Set<string> {\n const out = new Set<string>();\n for (const m of src.matchAll(/var\\(--([a-z0-9-]+)\\)/g)) {\n if (m[1]) out.add(m[1]);\n }\n for (const m of src.matchAll(/--([a-z][a-z0-9-]*)\\s*:/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction extractImportSources(src: string): Set<string> {\n const out = new Set<string>();\n for (const m of src.matchAll(/^\\s*import\\b[^'\"]*['\"]([^'\"]+)['\"]/gm)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction extractDefaultParamList(src: string): string {\n const m =\n /export\\s+default\\s+(?:async\\s+)?function\\s+\\w*\\s*\\(([^)]*)\\)/.exec(src) ??\n /export\\s+default\\s+(?:\\([^)]*\\)|\\w+)\\s*=>/.exec(src) ??\n /(?:const|function)\\s+\\w+\\s*=?\\s*(?:\\(([^)]*)\\)|\\w+)\\s*(?:=>|\\{)/.exec(src);\n return m?.[1]?.replace(/\\s+/g, ' ').trim() ?? '';\n}\n","/**\n * `teamix-evo ui upgrade [id...]` — produce a staging dir for ui source-layer\n * upgrades. Frozen boundary preserved per [ADR 0040](../../../../../docs/adr/0040-component-source-layer-upgrade-flow.md):\n * this command **never writes** into `src/components/ui/**`. The staging is\n * applied via the `teamix-evo-upgrade` skill.\n *\n * Implementation is shared with `biz-ui upgrade` via {@link makeUpgradeCommand}.\n */\nimport { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('ui');\n","import { Command } from 'commander';\nimport type { PromoteMode } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport {\n runUiPromote,\n type RunUiPromoteResult,\n} from '../../core/ui-promote.js';\nimport { formatFileChangeSummary } from '../../core/file-changes.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nconst VALID_MODES: PromoteMode[] = [\n 'Coexist',\n 'Preset',\n 'Wrapper',\n 'Compose',\n 'Variant',\n 'Fork',\n 'TokenOnly',\n 'ManualReview',\n];\n\ninterface PromoteOptions {\n modes?: string;\n migrateImports?: boolean;\n keepOriginalNames?: boolean;\n dryRun?: boolean;\n stagingDir?: string;\n}\n\nexport const promoteCommand = new Command('promote-to-biz')\n .description(\n '将 staging 中的组件按 8 模式 promote 到 src/components/business/(Init 落地计划 §C.3)',\n )\n .argument('[ids...]', '可选 entry id 列表;省略时处理 staging 中全部条目')\n .option(\n '--modes <list>',\n '逗号分隔的模式列表(覆盖 staging 推荐),如 \"Wrapper,Preset\"',\n )\n .option(\n '--migrate-imports',\n 'Coexist 模式时同步重写 src/** 中 ui/<id> import 为 legacy-<id>',\n )\n .option(\n '--keep-original-names',\n 'Coexist 模式跳过 Foo → LegacyFoo 重命名(默认会重命名)',\n )\n .option('--dry-run', '只输出变更计划,不写入任何文件')\n .option(\n '--staging-dir <path>',\n '指定 staging 目录(默认使用 .teamix-evo/.upgrade-staging/ui-* 中最新的)',\n )\n .action(async (ids: string[], opts: PromoteOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const modesOverride = parseModes(opts.modes);\n\n const result = await runUiPromote({\n projectRoot,\n ids: ids ?? [],\n modesOverride,\n migrateImports: opts.migrateImports ?? false,\n keepOriginalNames: opts.keepOriginalNames ?? false,\n dryRun: opts.dryRun ?? false,\n stagingDir: opts.stagingDir,\n });\n\n renderResult(result, opts.dryRun ?? false);\n } catch (err) {\n logger.error(`promote-to-biz failed: ${getErrorMessage(err)}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n\nfunction parseModes(raw: string | undefined): PromoteMode[] | undefined {\n if (!raw || raw.trim().length === 0) return undefined;\n const parts = raw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const out: PromoteMode[] = [];\n for (const p of parts) {\n const match = VALID_MODES.find((m) => m.toLowerCase() === p.toLowerCase());\n if (!match) {\n throw new Error(`Unknown mode \"${p}\". Valid: ${VALID_MODES.join(', ')}`);\n }\n out.push(match);\n }\n return out;\n}\n\nfunction renderResult(result: RunUiPromoteResult, dryRun: boolean): void {\n switch (result.status) {\n case 'not-initialized':\n logger.error('UI not initialized. Run `npx teamix-evo ui init` first.');\n process.exitCode = 1;\n return;\n case 'no-staging':\n logger.error(\n 'No `ui-*` staging dir found under `.teamix-evo/.upgrade-staging/`. Run `teamix-evo ui upgrade` first.',\n );\n process.exitCode = 1;\n return;\n case 'no-entries':\n logger.warn(`Staging dir is empty: ${result.stagingDir}`);\n return;\n case 'promoted':\n break;\n }\n\n const promoted = result.promotions.filter((p) => p.status === 'promoted');\n const manual = result.promotions.filter((p) => p.status === 'manual-review');\n const tokenOnly = result.promotions.filter((p) => p.status === 'token-only');\n const failed = result.promotions.filter((p) => p.status === 'skipped');\n\n logger.success(\n `${dryRun ? '[dry-run] ' : ''}promote-to-biz complete: ${\n promoted.length\n } promoted, ${manual.length} manual-review, ${\n tokenOnly.length\n } token-only, ${failed.length} skipped.`,\n );\n logger.info('');\n\n if (promoted.length > 0) {\n logger.info('Promoted:');\n for (const p of promoted) {\n logger.info(` • ${p.id} [${p.modes.join('+')}]`);\n for (const out of p.outputs) logger.info(` → ${out}`);\n if (p.reason) logger.info(` ${p.reason}`);\n }\n logger.info('');\n }\n\n if (manual.length > 0) {\n logger.info('Manual review needed (no file written):');\n for (const p of manual) logger.info(` • ${p.id} — ${p.reason ?? ''}`);\n logger.info('');\n }\n if (tokenOnly.length > 0) {\n logger.info('Token-only (edit tokens.overrides.css instead):');\n for (const p of tokenOnly) logger.info(` • ${p.id}`);\n logger.info('');\n }\n if (failed.length > 0) {\n logger.warn('Failed:');\n for (const p of failed) logger.warn(` • ${p.id} — ${p.reason ?? ''}`);\n logger.info('');\n }\n\n // Import-rewrite output (Coexist + --migrate-imports)\n if (result.importRewrite.rewritten.length > 0) {\n logger.info(\n `Import rewrite: ${result.importRewrite.rewritten.length} file(s) updated under src/**.`,\n );\n }\n if (result.importRewrite.skipped.length > 0) {\n logger.warn('Manual import fix needed (could not be rewritten safely):');\n for (const s of result.importRewrite.skipped) {\n logger.warn(` • ${s.file}:${s.line} [${s.reason}] — ${s.snippet}`);\n }\n logger.info('');\n }\n\n // Four-bucket file-change summary.\n if (result.fileChanges.length > 0) {\n logger.info('文件变更:');\n for (const line of formatFileChangeSummary(result.fileChanges)) {\n logger.info(` ${line}`);\n }\n }\n}\n","/**\n * `teamix-evo ui promote-to-biz` core (Init landing plan Task 1 + §5.1).\n *\n * Reads a `.teamix-evo/.upgrade-staging/ui-<ts>/meta.json` (the staging\n * already produced by `ui upgrade`), and for each requested entry executes\n * the chosen promotion {@link PromoteMode} — generating files under\n * `src/components/business/` (and, for Coexist, also rewriting the\n * `src/components/ui/` slot back to upstream).\n *\n * Frozen-boundary discipline:\n * - The CLI is allowed to write `src/components/business/**` (frozen on\n * re-add but free during promotion since this *is* user-initiated).\n * - `src/components/ui/<id>.tsx` is rewritten **only** when Coexist mode\n * fires (we restore the upstream snapshot and move the user's previous\n * version to `business/legacy-<id>.tsx`).\n * - All overwrites are preceded by `backupFile()` so `.teamix-evo/.backups/`\n * captures the pre-promote state — see Phase 1.A2.\n *\n * Mode catalogue (8 modes from the plan §1.2):\n * - **Coexist** — keep user version as `LegacyXxx` in business/, restore\n * upstream into `ui/<id>.tsx`. Optional callsite\n * migration via `--migrate-imports`.\n * - **Preset** — wrapper file that pins default props on upstream.\n * - **Wrapper** — wrapper file that adds state/effect/extra props.\n * - **Variant** — extends upstream cva variants.\n * - **Compose** — composition of upstream atomic children.\n * - **Fork** — copy current source verbatim into business/.\n * - **TokenOnly** — emits a hint pointing at `tokens/tokens.overrides.css`,\n * no file written.\n * - **ManualReview** — emits a hint, no file written.\n *\n * Modes can stack per the plan §1.5. The composed file picks the highest\n * applicable layer order: `Variant` (cva) ▸ `Wrapper` (state) ▸ `Preset`\n * (destructured defaults). Terminal modes (`Coexist` / `Fork` / `TokenOnly` /\n * `ManualReview`) fire alone.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n InstalledManifest,\n InstalledPackage,\n InstalledResource,\n PromoteMode,\n UpgradeStagingEntry,\n UpgradeStagingManifest,\n} from '@teamix-evo/registry';\nimport {\n backupFile,\n ensureDir,\n fileExists,\n readFileOrNull,\n writeFileSafe,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport {\n findInstalledPackage,\n readInstalledManifest,\n readProjectConfig,\n writeInstalledManifest,\n} from './state.js';\nimport type { FileChange } from './file-changes.js';\nimport {\n rewriteProjectImports,\n type ImportRewriteSpec,\n type RewriteImportsResult,\n type SkippedImport,\n} from './ui-promote-imports.js';\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst STAGING_DIR = '.upgrade-staging';\nconst UI_PACKAGE = '@teamix-evo/ui';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport type PromotionStatus =\n | 'promoted'\n | 'skipped'\n | 'manual-review'\n | 'token-only';\n\nexport interface PromotedEntry {\n id: string;\n modes: PromoteMode[];\n status: PromotionStatus;\n /** Project-rel posix paths actually written / affected. */\n outputs: string[];\n /** Reason for non-`promoted` statuses, or notes for `promoted`. */\n reason?: string;\n}\n\nexport interface RunUiPromoteOptions {\n /** Absolute project root. */\n projectRoot: string;\n /**\n * Specific staging dir to read. When omitted, the latest `ui-<ts>/` under\n * `.teamix-evo/.upgrade-staging/` is selected.\n */\n stagingDir?: string;\n /** Subset of entry ids. Empty/undefined → every entry in the staging meta. */\n ids?: string[];\n /**\n * Override modes for *every* requested id. Useful for explicit invocation\n * (`--modes wrapper,preset`); when omitted we fall back to\n * `entry.promotion.recommendedModes`, then to `['ManualReview']`.\n */\n modesOverride?: PromoteMode[];\n /** When true, also rewrite `src/**` callsites that still reference `ui/<id>` (Coexist only). */\n migrateImports?: boolean;\n /**\n * When true, skip the `Foo` → `LegacyFoo` rename in Coexist mode. Default\n * false (rename for safety per the plan §306 open question).\n */\n keepOriginalNames?: boolean;\n /** Dry-run — no files written, but the result still reflects what would change. */\n dryRun?: boolean;\n}\n\nexport interface RunUiPromoteResult {\n status: 'promoted' | 'no-staging' | 'no-entries' | 'not-initialized';\n /** Absolute staging dir that was used (when status === 'promoted'). */\n stagingDir?: string;\n /** Per-entry outcomes. */\n promotions: PromotedEntry[];\n /** Aggregated file-change ledger for the four-bucket summary. */\n fileChanges: FileChange[];\n /** Import rewrite output (Coexist + --migrate-imports). */\n importRewrite: RewriteImportsResult;\n}\n\n// ─── Orchestration ───────────────────────────────────────────────────────────\n\nexport async function runUiPromote(\n options: RunUiPromoteOptions,\n): Promise<RunUiPromoteResult> {\n const { projectRoot } = options;\n const dryRun = options.dryRun ?? false;\n const promotions: PromotedEntry[] = [];\n const fileChanges: FileChange[] = [];\n const skipped: SkippedImport[] = [];\n const rewritten: string[] = [];\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.ui?.aliases) {\n return {\n status: 'not-initialized',\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n const aliases = config.packages.ui.aliases;\n\n // 1. Resolve staging dir.\n const stagingDir =\n options.stagingDir ?? (await findLatestUiStagingDir(projectRoot));\n if (!stagingDir) {\n return {\n status: 'no-staging',\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n\n const meta = await readStagingMeta(stagingDir);\n if (!meta || meta.entries.length === 0) {\n return {\n status: 'no-entries',\n stagingDir,\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n }\n\n // 2. Filter to requested ids.\n const onlyIds =\n options.ids && options.ids.length > 0 ? new Set(options.ids) : null;\n const targetEntries = onlyIds\n ? meta.entries.filter((e) => onlyIds.has(e.id))\n : meta.entries;\n\n // 3. Per-entry promotion.\n const newResources: InstalledResource[] = [];\n for (const entry of targetEntries) {\n const decision = decideModes(entry, options.modesOverride);\n try {\n const outcome = await promoteEntry({\n projectRoot,\n stagingDir,\n entry,\n modes: decision,\n aliases,\n keepOriginalNames: options.keepOriginalNames ?? false,\n dryRun,\n });\n promotions.push(outcome.promotion);\n fileChanges.push(...outcome.fileChanges);\n newResources.push(...outcome.newResources);\n\n // Coexist + --migrate-imports: rewrite ui/<id> references project-wide\n // to legacy-<id> so old callsites continue to render the user's prior\n // implementation (rather than the freshly restored upstream).\n if (\n decision.includes('Coexist') &&\n options.migrateImports &&\n outcome.coexistRewriteSpec\n ) {\n const r = await rewriteProjectImports(\n projectRoot,\n [outcome.coexistRewriteSpec],\n { dryRun, backup: true },\n );\n rewritten.push(...r.rewritten);\n skipped.push(...r.skipped);\n for (const rel of r.rewritten) {\n fileChanges.push({\n kind: 'modified',\n path: rel,\n step: 'ui-promote-imports',\n });\n }\n }\n } catch (err) {\n logger.error(`Promotion failed for ${entry.id}: ${getErrorMessage(err)}`);\n promotions.push({\n id: entry.id,\n modes: decision,\n status: 'skipped',\n outputs: [],\n reason: getErrorMessage(err),\n });\n }\n }\n\n // 4. Update installed manifest with new business resources (frozen-on-add).\n if (!dryRun && newResources.length > 0) {\n await mergeIntoInstalledManifest(projectRoot, newResources);\n }\n\n return {\n status: 'promoted',\n stagingDir,\n promotions,\n fileChanges,\n importRewrite: { rewritten, skipped },\n };\n}\n\n// ─── Per-entry promotion ─────────────────────────────────────────────────────\n\ninterface PromoteEntryArgs {\n projectRoot: string;\n stagingDir: string;\n entry: UpgradeStagingEntry;\n modes: PromoteMode[];\n aliases: import('@teamix-evo/registry').UiAliases;\n keepOriginalNames: boolean;\n dryRun: boolean;\n}\n\ninterface PromoteEntryOutcome {\n promotion: PromotedEntry;\n fileChanges: FileChange[];\n newResources: InstalledResource[];\n /** Set when Coexist fires, used by `--migrate-imports`. */\n coexistRewriteSpec?: ImportRewriteSpec;\n}\n\nasync function promoteEntry(\n args: PromoteEntryArgs,\n): Promise<PromoteEntryOutcome> {\n const { entry, modes, projectRoot, stagingDir, aliases, dryRun } = args;\n const fileChanges: FileChange[] = [];\n const newResources: InstalledResource[] = [];\n let coexistRewriteSpec: ImportRewriteSpec | undefined;\n\n // Terminal: ManualReview.\n if (modes.includes('ManualReview')) {\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'manual-review',\n outputs: [],\n reason:\n 'Confidence below threshold or fileType non-component — see staging meta.json',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Terminal: TokenOnly.\n if (modes.includes('TokenOnly')) {\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'token-only',\n outputs: [],\n reason:\n '差异仅限 className/token — 编辑 tokens/tokens.overrides.css 而非创建 biz-ui 文件',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Read staged sources up-front; not all modes need both.\n const currentSrc = await readStagedFile(stagingDir, entry, 'current');\n const incomingSrc = await readStagedFile(stagingDir, entry, 'incoming');\n\n const businessDir = path.join(projectRoot, aliases.business);\n const uiDir = path.join(projectRoot, aliases.components);\n const businessRel = aliases.business;\n const uiRel = aliases.components;\n\n // Terminal: Coexist.\n if (modes.includes('Coexist')) {\n if (!currentSrc) {\n throw new Error('Coexist requires a current.tsx in staging');\n }\n if (!incomingSrc) {\n throw new Error('Coexist requires an incoming.tsx in staging');\n }\n\n const legacyId = `legacy-${entry.id}`;\n const legacyAbs = path.join(businessDir, `${legacyId}.tsx`);\n const uiAbs = path.join(uiDir, `${entry.id}.tsx`);\n\n // 1) Back up the user's existing ui/<id>.tsx (it will be replaced by upstream).\n if (await fileExists(uiAbs)) {\n if (!dryRun) await backupFile(uiAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, uiAbs)),\n step: 'ui-promote',\n detail: 'pre-coexist user version',\n });\n }\n\n // 2) Write the renamed user version into business/legacy-<id>.tsx.\n const renamed = args.keepOriginalNames\n ? currentSrc\n : prefixExportsLegacy(currentSrc, entry.id);\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(legacyAbs, renamed);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${legacyId}.tsx`)),\n step: 'ui-promote',\n detail: 'Coexist legacy snapshot',\n });\n newResources.push({\n id: `${legacyId}:${legacyId}.tsx`,\n target: legacyAbs,\n hash: computeHash(renamed),\n strategy: 'frozen',\n });\n\n // 3) Restore upstream into ui/<id>.tsx.\n if (!dryRun) await writeFileSafe(uiAbs, incomingSrc);\n fileChanges.push({\n kind: 'modified',\n path: posix(path.join(uiRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: 'Coexist upstream restore',\n });\n\n coexistRewriteSpec = {\n oldPath: importPathFor(uiRel, entry.id),\n newPath: importPathFor(businessRel, legacyId),\n };\n\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [\n posix(path.join(businessRel, `${legacyId}.tsx`)),\n posix(path.join(uiRel, `${entry.id}.tsx`)),\n ],\n reason: '双轨:upstream 装回 ui/、用户版改名进 business/legacy-',\n },\n fileChanges,\n newResources,\n coexistRewriteSpec,\n };\n }\n\n // Terminal: Fork (the user's source moves verbatim to business/).\n if (modes.includes('Fork')) {\n if (!currentSrc) throw new Error('Fork requires a current.tsx in staging');\n const forkAbs = path.join(businessDir, `${entry.id}.tsx`);\n if (await fileExists(forkAbs)) {\n if (!dryRun) await backupFile(forkAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, forkAbs)),\n step: 'ui-promote',\n detail: 'pre-fork existing business file',\n });\n }\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(forkAbs, currentSrc);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: 'Fork — full custom copy',\n });\n newResources.push({\n id: `${entry.id}:${entry.id}.tsx`,\n target: forkAbs,\n hash: computeHash(currentSrc),\n strategy: 'frozen',\n });\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [posix(path.join(businessRel, `${entry.id}.tsx`))],\n reason: 'Fork:完整保留用户实现',\n },\n fileChanges,\n newResources,\n };\n }\n\n // Composable modes: Preset / Wrapper / Variant / Compose. Stack into one\n // business/<id>.tsx file.\n const businessAbs = path.join(businessDir, `${entry.id}.tsx`);\n const composedSource = composeBusinessFile({\n id: entry.id,\n modes,\n aliases,\n entry,\n incomingSource: incomingSrc,\n });\n\n if (await fileExists(businessAbs)) {\n if (!dryRun) await backupFile(businessAbs, projectRoot);\n fileChanges.push({\n kind: 'backed-up',\n path: posix(path.relative(projectRoot, businessAbs)),\n step: 'ui-promote',\n detail: 'pre-promote business file',\n });\n }\n if (!dryRun) {\n await ensureDir(businessDir);\n await writeFileSafe(businessAbs, composedSource);\n }\n fileChanges.push({\n kind: 'created',\n path: posix(path.join(businessRel, `${entry.id}.tsx`)),\n step: 'ui-promote',\n detail: `modes: ${modes.join('+')}`,\n });\n newResources.push({\n id: `${entry.id}:${entry.id}.tsx`,\n target: businessAbs,\n hash: computeHash(composedSource),\n strategy: 'frozen',\n });\n\n return {\n promotion: {\n id: entry.id,\n modes,\n status: 'promoted',\n outputs: [posix(path.join(businessRel, `${entry.id}.tsx`))],\n reason: `modes: ${modes.join('+')} 已生成 business/${entry.id}.tsx`,\n },\n fileChanges,\n newResources,\n };\n}\n\n// ─── Mode synthesis ──────────────────────────────────────────────────────────\n\ninterface ComposeArgs {\n id: string;\n modes: PromoteMode[];\n aliases: import('@teamix-evo/registry').UiAliases;\n entry: UpgradeStagingEntry;\n incomingSource: string | null;\n}\n\n/**\n * Generate the wrapping business component file when one or more of\n * Preset / Wrapper / Variant / Compose fires. We deliberately emit a\n * scaffolded file with `TODO` markers so the AI / user can fill in the\n * specifics — the goal is to land the import topology correctly, not to\n * synthesise final logic from heuristics.\n */\nfunction composeBusinessFile(args: ComposeArgs): string {\n const { id, modes, aliases, entry } = args;\n const componentName = pascalCase(id);\n const upstreamImport = importPathFor(aliases.components, id);\n const hasVariant = modes.includes('Variant');\n const hasWrapper = modes.includes('Wrapper');\n const hasPreset = modes.includes('Preset');\n const hasCompose = modes.includes('Compose');\n\n const banner = renderBanner({ id, modes, entry });\n\n const importLines: string[] = [\n `import * as React from 'react';`,\n `import { ${componentName} as Base${componentName}, type ${componentName}Props as Base${componentName}Props } from '${upstreamImport}';`,\n ];\n if (\n hasCompose &&\n entry.promotion?.featureVector?.structureDelta?.atomicChildren\n ) {\n const children = entry.promotion.featureVector.structureDelta.atomicChildren\n .filter((c) => c !== componentName)\n .slice(0, 4);\n for (const child of children) {\n importLines.push(\n `// TODO: confirm import path for atomic child <${child} />`,\n );\n }\n }\n\n const body: string[] = [];\n body.push(\n `export interface ${componentName}Props extends Base${componentName}Props {`,\n );\n if (hasWrapper) {\n body.push(\n ` // TODO(Wrapper): add business-only props (e.g. loading?: boolean, confirm?: () => void)`,\n );\n }\n body.push(`}`);\n body.push('');\n\n if (hasVariant) {\n body.push(\n `// TODO(Variant): extend cva variants from upstream — when upstream`,\n );\n body.push(\n `// exports \\`${id}Variants\\`, import + spread it here; when not, copy the`,\n );\n body.push(\n `// configuration into this file and annotate \\`SOURCE_OF_TRUTH\\`.`,\n );\n body.push('');\n }\n\n if (hasPreset) {\n // Preset: encode defaults as destructured parameters (React 18+ deprecates\n // SFC.defaultProps; see ADR pattern in plan §C.3).\n body.push(\n `export const ${componentName}: React.FC<${componentName}Props> = ({`,\n );\n body.push(\n ` // TODO(Preset): fill defaults migrated from your previous user version,`,\n );\n body.push(\n ` // e.g. \\`size = 'md'\\`, \\`variant = 'primary'\\`.`,\n );\n body.push(` ...props`);\n body.push(`}) => {`);\n } else {\n body.push(\n `export const ${componentName}: React.FC<${componentName}Props> = (props) => {`,\n );\n }\n if (hasWrapper) {\n body.push(\n ` // TODO(Wrapper): pull business state / effects out of props before rendering.`,\n );\n }\n if (hasCompose) {\n body.push(\n ` // TODO(Compose): assemble atomic children — ${\n entry.promotion?.featureVector?.structureDelta?.atomicChildren?.join(\n ', ',\n ) ?? '...'\n }`,\n );\n }\n body.push(` return <Base${componentName} {...props} />;`);\n body.push(`};`);\n\n return [banner, '', importLines.join('\\n'), '', body.join('\\n'), ''].join(\n '\\n',\n );\n}\n\nfunction renderBanner(args: {\n id: string;\n modes: PromoteMode[];\n entry: UpgradeStagingEntry;\n}): string {\n const reasons = args.entry.promotion?.reasons ?? [];\n const lines = [\n `/**`,\n ` * Generated by \\`teamix-evo ui promote-to-biz\\` (Init landing plan §C.3).`,\n ` *`,\n ` * id : ${args.id}`,\n ` * modes : ${args.modes.join(' + ')}`,\n ` * note : 业务定制层;上游 ui/${args.id}.tsx 仍是 SOURCE_OF_TRUTH,请避免在此再次复制其内部细节。`,\n ];\n if (reasons.length > 0) {\n lines.push(' *');\n lines.push(' * 推荐理由:');\n for (const r of reasons) lines.push(` * • ${r}`);\n }\n lines.push(' */');\n return lines.join('\\n');\n}\n\n// ─── Helpers: staging IO ─────────────────────────────────────────────────────\n\nasync function findLatestUiStagingDir(\n projectRoot: string,\n): Promise<string | null> {\n const base = path.join(projectRoot, TEAMIX_DIR, STAGING_DIR);\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(base, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n const candidates = entries\n .filter((e) => e.isDirectory() && e.name.startsWith('ui-'))\n .map((e) => e.name)\n .sort();\n const last = candidates[candidates.length - 1];\n return last ? path.join(base, last) : null;\n}\n\nasync function readStagingMeta(\n stagingDir: string,\n): Promise<UpgradeStagingManifest | null> {\n const raw = await readFileOrNull(path.join(stagingDir, 'meta.json'));\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as UpgradeStagingManifest;\n } catch {\n return null;\n }\n}\n\nasync function readStagedFile(\n stagingDir: string,\n entry: UpgradeStagingEntry,\n kind: 'current' | 'incoming',\n): Promise<string | null> {\n const ext = path.extname(entry.current.target) || '.tsx';\n // Try the canonical name first, then fall back to the explicit relPath\n // recorded on the entry (incoming may have a different ext).\n const direct = path.join(stagingDir, entry.id, `${kind}${ext}`);\n const directRead = await readFileOrNull(direct);\n if (directRead !== null) return directRead;\n if (kind === 'incoming' && entry.incoming?.relPath) {\n return readFileOrNull(path.join(stagingDir, entry.incoming.relPath));\n }\n return null;\n}\n\n// ─── Helpers: mode decision + manifest merge ────────────────────────────────\n\nfunction decideModes(\n entry: UpgradeStagingEntry,\n override?: PromoteMode[],\n): PromoteMode[] {\n if (override && override.length > 0) return override;\n const recommended = entry.promotion?.recommendedModes;\n if (recommended && recommended.length > 0) return recommended;\n return ['ManualReview'];\n}\n\nasync function mergeIntoInstalledManifest(\n projectRoot: string,\n newResources: InstalledResource[],\n): Promise<void> {\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n const idx = installed.installed.findIndex(\n (p) => p.package === '@teamix-evo/biz-ui-promoted',\n );\n const prior: InstalledPackage | undefined =\n idx >= 0 ? installed.installed[idx] : undefined;\n const merged = new Map<string, InstalledResource>();\n for (const r of prior?.resources ?? []) merged.set(r.id, r);\n for (const r of newResources) merged.set(r.id, r);\n const next: InstalledPackage = {\n package: '@teamix-evo/biz-ui-promoted',\n variant: '_promoted',\n version: '0.0.0',\n installedAt: new Date().toISOString(),\n resources: Array.from(merged.values()),\n };\n if (idx >= 0) installed.installed[idx] = next;\n else installed.installed.push(next);\n await writeInstalledManifest(projectRoot, installed);\n}\n\n// ─── Helpers: name + path tweaks ─────────────────────────────────────────────\n\n/**\n * Best-effort `Foo` → `LegacyFoo` rename for Coexist mode. Targets:\n * - `export const Foo` → `export const LegacyFoo`\n * - `export function Foo` → `export function LegacyFoo`\n * - `export class Foo` → `export class LegacyFoo`\n * - `export interface Foo` → `export interface LegacyFoo`\n * - `export { Foo, FooHeader }` → `export { LegacyFoo, LegacyFooHeader }`\n * - `export default function Foo` (named) → `export default function LegacyFoo`\n * - `export default Foo;` → `export default LegacyFoo;`\n *\n * Identifier match is best-effort regex: starts with a capital letter and\n * shares the {entryId} stem so we only rename the component-family symbols.\n * Anything ambiguous is left alone — the user can finish the rename in a\n * follow-up when they review the file.\n */\nfunction prefixExportsLegacy(source: string, id: string): string {\n const stem = pascalCase(id);\n const stemRe = new RegExp(`\\\\b${stem}([A-Z]\\\\w*)?\\\\b`, 'g');\n\n let out = source;\n\n // 1. Direct named exports (declaration form).\n out = out.replace(\n new RegExp(\n `(\\\\bexport\\\\s+(?:const|let|var|function|class|interface|type|enum)\\\\s+)(${stem}[A-Z]?\\\\w*)\\\\b`,\n 'g',\n ),\n (_full, prefix: string, name: string) => `${prefix}Legacy${name}`,\n );\n\n // 2. Re-export specifier list `export { Foo, FooHeader }`.\n out = out.replace(/export\\s*\\{([^}]+)\\}/g, (full, body: string) => {\n const replacedBody = body.replace(stemRe, (m: string) => `Legacy${m}`);\n return `export {${replacedBody}}`;\n });\n\n // 3. `export default Foo;` (referenced identifier form).\n out = out.replace(\n new RegExp(`(\\\\bexport\\\\s+default\\\\s+)(${stem}[A-Z]?\\\\w*)(\\\\s*;)`, 'g'),\n (_full, prefix: string, name: string, suffix: string) =>\n `${prefix}Legacy${name}${suffix}`,\n );\n\n // 4. `export default function Foo(...)` / `class Foo`.\n out = out.replace(\n new RegExp(\n `(\\\\bexport\\\\s+default\\\\s+(?:function|class)\\\\s+)(${stem}[A-Z]?\\\\w*)\\\\b`,\n 'g',\n ),\n (_full, prefix: string, name: string) => `${prefix}Legacy${name}`,\n );\n\n return out;\n}\n\nfunction pascalCase(id: string): string {\n return id\n .split(/[-_]/g)\n .filter(Boolean)\n .map((p) => p[0]!.toUpperCase() + p.slice(1))\n .join('');\n}\n\nfunction importPathFor(aliasDir: string, id: string): string {\n // Mirror `transform-imports.ts#aliasToImportPath` — strip leading `src/`.\n const trimmed = aliasDir.replace(/^\\.\\//, '').replace(/\\/$/, '');\n const root = trimmed.startsWith('src/')\n ? `@/${trimmed.slice('src/'.length)}`\n : `@/${trimmed}`;\n return `${root}/${id}`;\n}\n\nfunction posix(p: string): string {\n return p.split(path.sep).join('/');\n}\n","/**\n * Project-wide static import rewriter for `ui promote-to-biz`\n * (Init landing plan §1.7).\n *\n * Goal: when promotion moves a component from `src/components/ui/<id>.tsx` to\n * `src/components/business/<id>.tsx` (or renames it to `legacy-<id>` in\n * Coexist mode), every callsite under `src/**` referencing the old import\n * specifier needs to be updated to the new location.\n *\n * Scope (intentionally narrow):\n * - Only static `import` statements with **string-literal** specifiers are\n * rewritten. Dynamic `import('...')`, template-string specifiers and\n * re-exports (`export { X } from '...';`) are detected and surfaced as\n * {@link SkippedImport} entries so the user can fix them by hand.\n * - Only files under `<projectRoot>/src/**` are scanned. Other roots\n * (`tests/`, `scripts/`, generated `dist/`) are out of scope.\n *\n * Why no AST: the rewriter is a deliberate regex pass, not a refactor. We\n * rely on the line-by-line shape of `import ... from '<spec>';` and surface\n * every ambiguity to the user. Adding ts-morph would 4x the dependency\n * footprint with no win for the cases we actually rewrite.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { backupFile, writeFileSafe, readFileOrNull } from '../utils/fs.js';\n\nexport interface ImportRewriteSpec {\n /** Source specifier prefix, e.g. `@/components/ui/button`. */\n oldPath: string;\n /** Replacement specifier prefix, e.g. `@/components/business/legacy-button`. */\n newPath: string;\n}\n\nexport type SkippedImportReason =\n | 'dynamic-import'\n | 'aliased-export'\n | 'string-template';\n\nexport interface SkippedImport {\n /** Project-root-relative posix path. */\n file: string;\n /** 1-based line number. */\n line: number;\n reason: SkippedImportReason;\n /** Original line (trimmed) — useful for the user to locate the spot. */\n snippet: string;\n}\n\nexport interface RewriteImportsResult {\n /** Project-rel posix paths of files modified (or that would be modified in dry-run). */\n rewritten: string[];\n /** Locations that need manual fix. */\n skipped: SkippedImport[];\n}\n\nexport interface RewriteImportsOptions {\n dryRun?: boolean;\n /** When true, back up each modified file under `.teamix-evo/.backups/`. Defaults to true. */\n backup?: boolean;\n /** Override scan root (defaults to `<projectRoot>/src`). */\n scanRoot?: string;\n}\n\nconst SOURCE_FILE_EXT = /\\.(tsx?|jsx?|mts|cts)$/;\nconst STATIC_IMPORT_FROM =\n /^(\\s*(?:import|export)\\s[\\s\\S]*?from\\s+['\"])([^'\"\\n]+)(['\"])/;\nconst SIDE_EFFECT_IMPORT = /^(\\s*import\\s+['\"])([^'\"\\n]+)(['\"])/;\nconst DYNAMIC_IMPORT_STR = /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\nconst DYNAMIC_IMPORT_TPL = /\\bimport\\s*\\(\\s*`/g;\n\n/**\n * Walk `src/**` and rewrite import specifiers per `specs`. Static line-level\n * matches are rewritten in place; everything else is surfaced via the\n * returned `skipped` array.\n */\nexport async function rewriteProjectImports(\n projectRoot: string,\n specs: ImportRewriteSpec[],\n options: RewriteImportsOptions = {},\n): Promise<RewriteImportsResult> {\n if (specs.length === 0) return { rewritten: [], skipped: [] };\n\n const scanRoot = options.scanRoot ?? path.join(projectRoot, 'src');\n const dryRun = options.dryRun ?? false;\n const backup = options.backup ?? true;\n\n const files = await collectTsFiles(scanRoot);\n const rewritten: string[] = [];\n const skipped: SkippedImport[] = [];\n\n for (const file of files) {\n const raw = await readFileOrNull(file);\n if (raw === null) continue;\n\n const rel = toRel(projectRoot, file);\n const lines = raw.split('\\n');\n let changed = false;\n\n for (let i = 0; i < lines.length; i++) {\n const orig = lines[i] ?? '';\n\n // (1) Static `import ... from '<spec>'` (and `export ... from '<spec>'`)\n const staticMatch = orig.match(STATIC_IMPORT_FROM);\n if (staticMatch) {\n const whole = staticMatch[0];\n const prefix = staticMatch[1] ?? '';\n const spec = staticMatch[2] ?? '';\n const quote = staticMatch[3] ?? '';\n const replaced = applySpecs(spec, specs);\n if (replaced !== null) {\n // Surface re-export aliasing as ambiguous — `export X as Y from`\n // can change observable surface; we touch only `import ... from`.\n if (/^\\s*export\\s/.test(orig)) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'aliased-export',\n snippet: orig.trim(),\n });\n continue;\n }\n lines[i] = `${prefix}${replaced}${quote}${orig.slice(whole.length)}`;\n changed = true;\n }\n continue;\n }\n\n // (2) Side-effect import: `import '<spec>';`\n const sideMatch = orig.match(SIDE_EFFECT_IMPORT);\n if (sideMatch) {\n const whole = sideMatch[0];\n const prefix = sideMatch[1] ?? '';\n const spec = sideMatch[2] ?? '';\n const quote = sideMatch[3] ?? '';\n const replaced = applySpecs(spec, specs);\n if (replaced !== null) {\n lines[i] = `${prefix}${replaced}${quote}${orig.slice(whole.length)}`;\n changed = true;\n }\n continue;\n }\n\n // (3) Dynamic `import('<spec>')` — string literal we *could* rewrite,\n // but doing so silently changes an async boundary; report instead.\n for (const m of orig.matchAll(DYNAMIC_IMPORT_STR)) {\n const target = m[1] ?? '';\n if (specs.some((s) => isAffected(target, s.oldPath))) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'dynamic-import',\n snippet: orig.trim(),\n });\n }\n }\n\n // (4) Template-string dynamic import — cannot reason about content.\n if (DYNAMIC_IMPORT_TPL.test(orig)) {\n skipped.push({\n file: rel,\n line: i + 1,\n reason: 'string-template',\n snippet: orig.trim(),\n });\n DYNAMIC_IMPORT_TPL.lastIndex = 0;\n }\n }\n\n if (changed) {\n const updated = lines.join('\\n');\n if (!dryRun) {\n if (backup) await backupFile(file, projectRoot);\n await writeFileSafe(file, updated);\n }\n rewritten.push(rel);\n }\n }\n\n return { rewritten, skipped };\n}\n\nfunction applySpecs(target: string, specs: ImportRewriteSpec[]): string | null {\n for (const s of specs) {\n if (target === s.oldPath) return s.newPath;\n if (target.startsWith(s.oldPath + '/')) {\n return s.newPath + target.slice(s.oldPath.length);\n }\n }\n return null;\n}\n\nfunction isAffected(target: string, oldPath: string): boolean {\n return target === oldPath || target.startsWith(oldPath + '/');\n}\n\nasync function collectTsFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string): Promise<void> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw err;\n }\n for (const e of entries) {\n // Skip hidden + node_modules + common build outputs.\n if (\n e.name.startsWith('.') ||\n e.name === 'node_modules' ||\n e.name === 'dist'\n ) {\n continue;\n }\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await walk(full);\n } else if (e.isFile() && SOURCE_FILE_EXT.test(e.name)) {\n out.push(full);\n }\n }\n }\n await walk(root);\n return out;\n}\n\nfunction toRel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs).split(path.sep).join('/');\n}\n","/**\n * File-change ledger for the init / update pipelines.\n *\n * Phase 1.A1 (init 落地改进): every orchestrator step records what it touched\n * so the CLI can print a single \"新建 / 修改 / 备份 / 删除\" summary at the end.\n * Today's pipeline only piggybacks on side-effectful sub-commands' result\n * objects (`resources`, `wroteEslint`, …) — without an explicit ledger the\n * user has no way to see, in one glance, which user-owned files moved.\n *\n * Design constraints:\n * - Pure data type — no I/O, no global mutable state. The orchestrator passes\n * a single mutable array down to each helper; sub-step adapters return\n * `FileChange[]` they can derive from their own return values.\n * - \"modified\" vs \"created\" is decided by checking whether a fresh backup\n * exists under `.teamix-evo/.backups/<rel>.*.bak` for that path — see\n * {@link diffBackupSet}. Any path that gained a backup during the pipeline\n * is classified `modified`; everything else surfaced by the steps is\n * `created`. This keeps the classification truthful even when a sub-step\n * has no idea whether the file pre-existed.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport type FileChangeKind = 'created' | 'modified' | 'backed-up' | 'deleted';\n\nexport interface FileChange {\n kind: FileChangeKind;\n /** Project-root-relative path, posix style (forward slashes). */\n path: string;\n /** Originating pipeline step (free-form to avoid coupling on `ProjectInitStepName`). */\n step: string;\n /** Optional human-readable note (e.g. `frozen` / `regenerable` / `managed`). */\n detail?: string;\n}\n\n/**\n * Convert any abs/rel path to a project-root-relative posix path.\n * Returns the input unchanged if it cannot be relativised.\n */\nexport function toRelativePosix(p: string, projectRoot: string): string {\n let rel = p;\n if (path.isAbsolute(p)) {\n rel = path.relative(projectRoot, p);\n }\n return rel.split(path.sep).join('/');\n}\n\n/**\n * Recursively enumerate `.teamix-evo/.backups/` and return the set of\n * original (project-root-relative) paths that have at least one `.bak` copy.\n *\n * Backup file names follow `<rel>.<isoTsSafe>.bak` where `<isoTsSafe>` is the\n * output of `new Date().toISOString().replace(/[:.]/g, '-')` — a fixed-shape\n * `YYYY-MM-DDTHH-MM-SS-mmmZ` token. We strip that suffix to recover `<rel>`.\n *\n * Returns an empty set when the backups directory does not exist.\n */\nexport async function listBackupOriginals(\n projectRoot: string,\n): Promise<Set<string>> {\n const backupsDir = path.join(projectRoot, '.teamix-evo', '.backups');\n const out = new Set<string>();\n const stack: string[] = [backupsDir];\n while (stack.length > 0) {\n const dir = stack.pop()!;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw err;\n }\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n stack.push(full);\n } else if (e.isFile() && e.name.endsWith('.bak')) {\n const rel = path.relative(backupsDir, full);\n const original = stripBackupSuffix(rel);\n if (original) out.add(original.split(path.sep).join('/'));\n }\n }\n }\n return out;\n}\n\n/**\n * Strip the `.<isoTsSafe>.bak` tail from a backup-relative path. Returns null\n * when the suffix doesn't match (file isn't one of ours — leave untouched).\n */\nexport function stripBackupSuffix(rel: string): string | null {\n const m = rel.match(\n /^(.+)\\.\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z\\.bak$/,\n );\n return m?.[1] ?? null;\n}\n\n/**\n * Compute the relative-path set that gained a fresh backup between `before`\n * and `after` (i.e. paths the pipeline modified in-place).\n */\nexport function diffBackupSet(\n before: ReadonlySet<string>,\n after: ReadonlySet<string>,\n): Set<string> {\n const out = new Set<string>();\n for (const p of after) {\n if (!before.has(p)) out.add(p);\n }\n return out;\n}\n\n/**\n * Format a flat list of `FileChange` rows into a markdown-ish summary.\n * Returns an array of lines suitable for the CLI logger.\n *\n * Empty buckets are omitted from the output. Order: created → modified →\n * backed-up → deleted. Each bucket lists paths sorted lexicographically with\n * de-duplication on `(kind, path)`.\n */\nexport function formatFileChangeSummary(changes: FileChange[]): string[] {\n if (changes.length === 0) return [];\n const buckets: Record<FileChangeKind, Map<string, FileChange>> = {\n created: new Map(),\n modified: new Map(),\n 'backed-up': new Map(),\n deleted: new Map(),\n };\n for (const c of changes) {\n const existing = buckets[c.kind].get(c.path);\n if (!existing) buckets[c.kind].set(c.path, c);\n }\n const order: Array<[FileChangeKind, string]> = [\n ['created', '🆕 新建'],\n ['modified', '✏️ 修改'],\n ['backed-up', '💾 已备份'],\n ['deleted', '🗑 删除'],\n ];\n const lines: string[] = [];\n for (const [kind, label] of order) {\n const bucket = buckets[kind];\n if (bucket.size === 0) continue;\n lines.push(`${label}(${bucket.size}):`);\n const sorted = [...bucket.values()].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n for (const c of sorted) {\n const detail = c.detail ? ` — ${c.detail}` : '';\n lines.push(` • ${c.path} [${c.step}]${detail}`);\n }\n }\n return lines;\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';\nimport { upgradeCommand } from './upgrade.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);\nbizUiCommand.addCommand(upgradeCommand);\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';\nimport { getErrorMessage } from '../../utils/error.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 (ids: string[], opts: { variant?: string; overwrite?: boolean }) => {\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 );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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: npx teamix-evo@latest biz-ui add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install from a variant: npx teamix-evo@latest biz-ui add <id> --variant <name>',\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo biz-ui upgrade [id...]` — variant-aware staging for business UI\n * source upgrades. Frozen boundary preserved per [ADR 0040](../../../../../docs/adr/0040-component-source-layer-upgrade-flow.md):\n * the command **never writes** into `src/components/business/**`. The staging\n * is applied via the `teamix-evo-upgrade` skill.\n *\n * Implementation is shared with `ui upgrade` via {@link makeUpgradeCommand}.\n */\nimport { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('biz-ui');\n","import { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { upgradeCommand } from './upgrade.js';\n\nexport const blocksCommand = new Command('blocks').description(\n '管理 marketing blocks(源码注入式安装,token 驱动换肤)',\n);\n\nblocksCommand.addCommand(addCommand);\nblocksCommand.addCommand(listCommand);\nblocksCommand.addCommand(upgradeCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runBlocksAdd } from '../../core/blocks-add.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const addCommand = new Command('add')\n .description('安装一个或多个 block(按 id,自动解析 registryDependencies)')\n .argument('<ids...>', 'block id 列表,如 \"hero-gradient\" \"features-grid\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .action(\n async (\n ids: string[],\n opts: { overwrite?: boolean },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Installing blocks: ${ids.join(', ')}`);\n\n const result = await runBlocksAdd({\n projectRoot,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `Blocks 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 = getErrorMessage(err);\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 blocks: ${message}`);\n }\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\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_BLOCKS_PACKAGE = '@teamix-evo/blocks';\n\nexport interface RunBlocksAddOptions {\n projectRoot: string;\n ids: string[];\n overwrite?: boolean;\n packageName?: string;\n}\n\nexport interface RunBlocksAddResult {\n packageName: string;\n orderedIds: string[];\n written: number;\n skipped: number;\n npmDependencies: Record<string, string>;\n resources: InstalledResource[];\n}\n\nexport async function runBlocksAdd(\n options: RunBlocksAddOptions,\n): Promise<RunBlocksAddResult> {\n const { projectRoot, ids, overwrite } = options;\n const packageName = options.packageName ?? DEFAULT_BLOCKS_PACKAGE;\n\n if (ids.length === 0) {\n throw new Error('At least one block 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.',\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 block id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo blocks 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 flatten: false,\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 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';\nimport { getErrorMessage } from '../../utils/error.js';\n\nexport const listCommand = new Command('list')\n .description('列出 @teamix-evo/blocks 的所有 block 及已安装状态')\n .option('--installed', '仅展示已安装的 block')\n .option('--json', 'JSON 格式输出')\n .action(\n async (opts: { installed?: boolean; json?: 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 packageName: '@teamix-evo/blocks',\n });\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ entries, total, installedCount }, null, 2) + '\\n');\n return;\n }\n\n if (entries.length === 0) {\n logger.info(\n opts.installed\n ? 'No blocks installed.'\n : 'No blocks 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(typeWidth)} STATUS DESCRIPTION`,\n );\n logger.info(\n `${'─'.repeat(idWidth)} ${'─'.repeat(typeWidth)} ────────── ───────────`,\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(typeWidth)} ${status.padEnd(10)} ${e.description}`,\n );\n }\n\n logger.info('');\n logger.info(\n `Total: ${total} block${total === 1 ? '' : 's'}, ${installedCount} installed.`,\n );\n } catch (err) {\n logger.error(`Failed to list blocks: ${getErrorMessage(err)}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import { makeUpgradeCommand } from '../_upgrade-command-factory.js';\n\nexport const upgradeCommand = makeUpgradeCommand('blocks');\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 '[废弃] 管理页面模板 — 请改用 teamix-evo blocks',\n);\n\ntemplatesCommand.hook('preAction', () => {\n console.warn(\n '\\x1b[33m⚠️ templates 命令已废弃,请使用 teamix-evo blocks。\\x1b[0m',\n );\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';\nimport { getErrorMessage } from '../../utils/error.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 (ids: string[], opts: { variant?: string; overwrite?: boolean }) => {\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 );\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: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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: npx teamix-evo@latest templates add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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';\nimport { getErrorMessage } from '../../utils/error.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(\n 'Install from a variant: npx teamix-evo@latest templates add <id> --variant <name>',\n );\n } catch (err) {\n logger.error(`Failed: ${getErrorMessage(err)}`);\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 输出 (.teamix-evo/logs/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 { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport { readRecords, parseIntOrUndef } from './_io.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\nexport const logsAnalyzeCommand = new Command('analyze')\n .description(\n '汇总 vibe-logger 输出 (.teamix-evo/logs/ai/**/*.jsonl) — 工具 / 包标签 / MCP 调用频率,辅助生态优化',\n )\n .option('--dir <path>', 'log 目录 (默认 <project>/.teamix-evo/logs/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(\n opts.dir ?? join(process.cwd(), '.teamix-evo', 'logs', 'ai'),\n );\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(默认路径 .teamix-evo/logs/ai)',\n );\n return;\n }\n const dayLimit = parseIntOrUndef(opts.days);\n const top = parseIntOrUndef(opts.top) ?? 10;\n\n const records = readRecords(baseDir, dayLimit);\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, dayLimit, report);\n });\n\nexport function buildReport(records: LogRecord[], top: number): 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 dayLimit: number | undefined,\n r: AnalyzeReport,\n): void {\n logger.info(`vibe-logger 分析报告`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 天数: ${dayLimit ?? 'all'}`);\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=${\n e.file ?? '-'\n }`,\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\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { LogRecord } from './analyze.js';\n\nexport const DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function 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\nexport function 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 =\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 return records;\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 { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport type { LogRecord } from './analyze.js';\nimport { readRecords, parseIntOrUndef } from './_io.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\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>/.teamix-evo/logs/ai)')\n .option('--json', '以 JSON 输出 (CI/工具友好)')\n .action((opts: TraceOptions) => {\n const baseDir = resolve(\n opts.dir ?? join(process.cwd(), '.teamix-evo', 'logs', 'ai'),\n );\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(默认路径 .teamix-evo/logs/ai)',\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\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(\n truncate(c.prompt, 200),\n )}`,\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\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\n\nexport const lintCommand = new Command('lint').description(\n '管理工程规范(ESLint + Stylelint token-discipline 规则集)',\n);\n\nlintCommand.addCommand(initCommand);\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport { detectIde } from '../../ide/index.js';\nimport { runLintInit } from '../../core/lint-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '初始化 ESLint + Stylelint 工程规范(安装依赖 + 生成配置文件 + 注入 scripts)',\n )\n .option('-y, --yes', '跳过确认,直接执行')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\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.exitCode = 1;\n return;\n }\n\n // Confirm unless -y. Non-TTY (CI / AI agent / piped stdin) is treated\n // as implicit yes so @clack/prompts does not crash with `uv_tty_init\n // EINVAL` when there is no controlling terminal to read confirmation\n // from.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n const shouldContinue = await prompts.confirm({\n message:\n '即将安装 ESLint + Stylelint token-discipline 规则集并生成配置文件,是否继续?',\n });\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n const result = await runLintInit({ projectRoot });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n 'Lint already initialized. eslint.config.js and stylelint.config.cjs both exist.',\n );\n return;\n }\n\n logger.success('Lint initialized.');\n if (result.eslint) {\n logger.info(' + eslint.config.js');\n }\n if (result.stylelint) {\n logger.info(' + stylelint.config.cjs');\n }\n logger.info('');\n logger.info('Run \"npm run lint\" to check JSX/TSX token discipline.');\n logger.info('Run \"npm run lint:css\" to check CSS token discipline.');\n } catch (err) {\n logger.error(`Failed to initialize lint: ${getErrorMessage(err)}`);\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';\nimport { execa } from 'execa';\nimport {\n backupFile,\n fileExists,\n readFileOrNull,\n writeFileSafe,\n} from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\n// ─── Config file content ─────────────────────────────────────────────────────\n\nconst ESLINT_CONFIG_CONTENT = `/**\n * teamix-evo consumer ESLint preset — 9 token-discipline rules.\n * - Repo-wide: no-color-literal / no-arbitrary-tw-value / no-raw-color-scale /\n * no-large-radius / prefer-gap-over-space / no-manual-dark-classnames /\n * dialog-must-have-title (all error)\n * - src/components/ui/** only: no-relative-ui-import / icon-from-lucide (error)\n *\n * See ADR 0008 / docs/principles.md §P4.\n */\nimport consumerPreset from '@teamix-evo/eslint-config/presets/consumer';\n\nexport default [...consumerPreset];\n`;\n\nconst STYLELINT_CONFIG_CONTENT = `/** @type {import('stylelint').Config} */\nmodule.exports = {\n extends: ['@teamix-evo/stylelint-config/presets/consumer'],\n};\n`;\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Phase 3.E lint conflict strategies (mirrors `init-conflicts.ts`).\n *\n * `merge` and `backup-overwrite` both back up the existing user file before\n * writing the teamix-evo template; `merge` additionally surfaces an AI-assist\n * hint so the manage / code skill can guide the user through merging custom\n * rules. `skip` keeps the user's file as-is and emits no template.\n */\nexport type LintConflictStrategy =\n | 'merge'\n | 'backup-overwrite'\n | 'skip'\n | 'overwrite';\n\nexport interface RunLintInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Skip npm dependency installation. Used by the create scaffold where\n * dependencies are already declared in the template package.json and\n * installed in a later batch step.\n */\n skipInstall?: boolean;\n /**\n * Phase 3.E: strategy for handling existing ESLint config files.\n * Defaults to `'overwrite'` (legacy behaviour); the `init` orchestrator\n * passes the wizard-resolved value when consumer files are detected.\n */\n eslintStrategy?: LintConflictStrategy;\n /**\n * Phase 3.E: strategy for handling existing Stylelint config files.\n */\n stylelintStrategy?: LintConflictStrategy;\n /**\n * Phase 3.E: paths of existing ESLint configs (relative to projectRoot)\n * to back up. Empty when no consumer config was detected.\n */\n eslintExistingPaths?: string[];\n /**\n * Phase 3.E: paths of existing Stylelint configs (relative to projectRoot).\n */\n stylelintExistingPaths?: string[];\n}\n\nexport type RunLintInitResult =\n | {\n status: 'installed';\n eslint: boolean;\n stylelint: boolean;\n /** True when the user had a custom config and asked for AI-assisted merge. */\n eslintMergeRequested?: boolean;\n stylelintMergeRequested?: boolean;\n /** True when the strategy asked us to keep the user file untouched. */\n eslintSkipped?: boolean;\n stylelintSkipped?: boolean;\n /**\n * True when `package.json` was actually patched (lint / lint:css\n * scripts inserted). Powers the project-init change ledger so the\n * CLI does not report a phantom write when both scripts already\n * existed.\n */\n packageJsonPatched?: boolean;\n /**\n * True when the consumer's existing stylelint config was kept (skip /\n * merge) and does not extend a teamix-evo preset — token definition\n * files may trigger false-positive lint errors without `ignoreFiles`.\n */\n stylelintIgnoreFilesWarning?: boolean;\n }\n | {\n status: 'already-initialized';\n };\n\n// ─── Lint dependencies ───────────────────────────────────────────────────────\n\nconst ESLINT_DEPS = [\n '@teamix-evo/eslint-config',\n 'eslint',\n '@typescript-eslint/parser',\n];\n\nconst STYLELINT_DEPS = ['@teamix-evo/stylelint-config', 'stylelint'];\n\n// ─── Implementation ──────────────────────────────────────────────────────────\n\n/**\n * Programmatic equivalent of `teamix-evo lint init`.\n *\n * Writes lint configuration files and optionally installs dependencies.\n * Idempotent: if both config files already exist, returns `already-initialized`.\n */\nexport async function runLintInit(\n options: RunLintInitOptions,\n): Promise<RunLintInitResult> {\n const {\n projectRoot,\n skipInstall,\n eslintStrategy = 'overwrite',\n stylelintStrategy = 'overwrite',\n eslintExistingPaths = [],\n stylelintExistingPaths = [],\n } = options;\n\n const eslintConfigPath = path.join(projectRoot, 'eslint.config.js');\n const stylelintConfigPath = path.join(projectRoot, 'stylelint.config.cjs');\n\n const eslintTemplateExists = await fileExists(eslintConfigPath);\n const stylelintTemplateExists = await fileExists(stylelintConfigPath);\n\n // Phase 3.E: a `skip` strategy only short-circuits when the *consumer*\n // already has a config. Without it we still need to write our template.\n const eslintSkipRequested =\n eslintStrategy === 'skip' && eslintExistingPaths.length > 0;\n const stylelintSkipRequested =\n stylelintStrategy === 'skip' && stylelintExistingPaths.length > 0;\n\n const eslintNeedsWrite = !eslintTemplateExists && !eslintSkipRequested;\n const stylelintNeedsWrite =\n !stylelintTemplateExists && !stylelintSkipRequested;\n\n if (!eslintNeedsWrite && !stylelintNeedsWrite) {\n return { status: 'already-initialized' };\n }\n\n // ─── Install dependencies ──────────────────────────────────────────────\n if (!skipInstall) {\n const depsToInstall = [\n ...(eslintNeedsWrite ? ESLINT_DEPS : []),\n ...(stylelintNeedsWrite ? STYLELINT_DEPS : []),\n ];\n\n if (depsToInstall.length > 0) {\n const pm = detectPm(projectRoot);\n const args =\n pm === 'yarn'\n ? ['add', '--dev', ...depsToInstall]\n : pm === 'pnpm'\n ? ['add', '-D', ...depsToInstall]\n : ['install', '--save-dev', ...depsToInstall];\n\n logger.info(`Installing lint deps via ${pm}...`);\n await execa(pm, args, { cwd: projectRoot, stdio: 'inherit' });\n }\n }\n\n // ─── Phase 3.E: back up consumer configs before writing template ───────\n // Phase 1.A2 — `overwrite` strategy still demands a `.bak` so the user\n // can recover the original file. Only `eslintNeedsWrite` /\n // `stylelintNeedsWrite` gates the operation (a `skip`d file is left\n // untouched, so no backup is needed).\n if (eslintNeedsWrite && eslintExistingPaths.length > 0) {\n for (const rel of eslintExistingPaths) {\n await backupFile(path.join(projectRoot, rel), projectRoot);\n }\n }\n if (stylelintNeedsWrite && stylelintExistingPaths.length > 0) {\n for (const rel of stylelintExistingPaths) {\n await backupFile(path.join(projectRoot, rel), projectRoot);\n }\n }\n\n // ─── Write config files ────────────────────────────────────────────────\n let wroteEslint = false;\n let wroteStylelint = false;\n\n if (eslintNeedsWrite) {\n await writeFileSafe(eslintConfigPath, ESLINT_CONFIG_CONTENT);\n logger.debug(`Wrote eslint.config.js → ${eslintConfigPath}`);\n wroteEslint = true;\n }\n\n if (stylelintNeedsWrite) {\n await writeFileSafe(stylelintConfigPath, STYLELINT_CONFIG_CONTENT);\n logger.debug(`Wrote stylelint.config.cjs → ${stylelintConfigPath}`);\n wroteStylelint = true;\n }\n\n // ─── Patch package.json scripts ────────────────────────────────────────\n // Phase 1.A2: package.json is a high-value user file — back it up before\n // we mutate `scripts.lint` / `scripts['lint:css']` so the user can revert\n // the patch without git if needed.\n const packageJsonPatched = await patchPackageJsonScripts(projectRoot);\n\n // ─── Phase 2.3: detect missing ignoreFiles for token files ────────────\n // When the consumer keeps their own stylelint config (skip / merge), check\n // whether it extends a teamix-evo preset. If not, token definition files\n // (tokens.theme.css, tokens.overrides.css) will trigger false-positive\n // no-color-literal / no-hardcoded-dimension errors. Print a non-invasive\n // warning with the recommended fix (review safety-net: never auto-modify).\n let stylelintIgnoreFilesWarning = false;\n if (!stylelintNeedsWrite && stylelintTemplateExists) {\n try {\n const existingContent = fs.readFileSync(stylelintConfigPath, 'utf-8');\n const usesTeamixPreset =\n existingContent.includes('@teamix-evo/stylelint-config/presets/') ||\n existingContent.includes('@teamix-evo/stylelint-config/preset/');\n const hasTokenIgnore =\n existingContent.includes('tokens.theme.css') &&\n existingContent.includes('tokens.overrides.css');\n if (!usesTeamixPreset && !hasTokenIgnore) {\n stylelintIgnoreFilesWarning = true;\n logger.warn(\n [\n '检测到现有 stylelint 配置未排除 token 定义文件。',\n '建议在 stylelint.config.cjs 中添加 ignoreFiles:',\n '',\n ' ignoreFiles: [',\n \" '**/tokens.theme.css',\",\n \" '**/tokens.overrides.css',\",\n ' ]',\n '',\n '或切换到 teamix-evo 预设以自动获得排除规则:',\n '',\n \" extends: ['@teamix-evo/stylelint-config/presets/consumer']\",\n ].join('\\n'),\n );\n }\n } catch {\n // best-effort — config may not be a readable text file\n }\n }\n\n return {\n status: 'installed',\n eslint: wroteEslint,\n stylelint: wroteStylelint,\n eslintMergeRequested:\n wroteEslint &&\n eslintStrategy === 'merge' &&\n eslintExistingPaths.length > 0,\n stylelintMergeRequested:\n wroteStylelint &&\n stylelintStrategy === 'merge' &&\n stylelintExistingPaths.length > 0,\n eslintSkipped: eslintSkipRequested,\n stylelintSkipped: stylelintSkipRequested,\n packageJsonPatched,\n stylelintIgnoreFilesWarning,\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Detect package manager from lockfile presence.\n */\nfunction detectPm(projectRoot: string): 'pnpm' | 'yarn' | 'npm' {\n if (fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fs.existsSync(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\n/**\n * Add lint scripts to package.json if they don't already exist.\n *\n * Returns `true` when at least one of `scripts.lint` / `scripts['lint:css']`\n * was inserted (so the caller can decide whether to surface a `package.json`\n * change in the project-init ledger). Returns `false` when both scripts\n * already existed or when `package.json` is missing/unparseable.\n */\nasync function patchPackageJsonScripts(projectRoot: string): Promise<boolean> {\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) return false;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw);\n } catch {\n return false;\n }\n\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n let changed = false;\n\n if (!scripts.lint) {\n scripts.lint = 'eslint src/';\n changed = true;\n }\n if (!scripts['lint:css']) {\n scripts['lint:css'] = \"stylelint 'src/**/*.css'\";\n changed = true;\n }\n\n if (changed) {\n // Backup user package.json before patching scripts (Phase 1.A2).\n await backupFile(pkgPath, projectRoot);\n pkg.scripts = scripts;\n await writeFileSafe(pkgPath, JSON.stringify(pkg, null, 2) + '\\n');\n logger.debug('Patched package.json scripts with lint / lint:css');\n }\n return changed;\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { detectProjectState } from '../../core/init-detect.js';\nimport { detectConflicts } from '../../core/init-conflicts.js';\nimport { runProjectInit } from '../../core/project-init.js';\nimport { formatFileChangeSummary } from '../../core/file-changes.js';\nimport { runInitWizard } from './wizard.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\n\n/**\n * Detect whether the project is a fresh skeleton generated by `create-teamix-evo`.\n * Heuristic: has package.json with `@teamix-evo/ui` in dependencies or devDependencies,\n * but no `.teamix-evo/` directory yet (which means init hasn't run).\n */\nasync function isCreateTeamixSkeleton(cwd: string): Promise<boolean> {\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf-8');\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return '@teamix-evo/ui' in allDeps;\n } catch {\n return false;\n }\n}\nimport { STEP_ICON } from '../_shared/step-icon.js';\n\ninterface InitCmdOptions {\n cwd?: string;\n yes?: boolean;\n dryRun?: boolean;\n variant?: string;\n force?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '把 teamix-evo AI 套件接入已有工程(8 步流水线:tokens → skills → agents-md → ui → biz-ui → lint → gitignore)',\n )\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('-y, --yes', '跳过交互,全部使用推荐默认值(需搭配 --variant)')\n .option('--dry-run', '只输出执行计划,不写任何文件')\n .option('--variant <name>', 'tokens variant(覆盖 wizard 询问)')\n .option('--force', '跳过冲突检测,全量覆盖已有文件')\n .action(async (opts: InitCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n\n try {\n // ─── 1. detect project state ───────────────────────────────────────\n const state = await detectProjectState(cwd);\n if (state.state === 'empty') {\n logger.warn('当前目录是空目录或仅含可忽略文件。');\n logger.info('');\n logger.info(\n '推荐使用脚手架:`npm create teamix-evo@latest`(生成 Vite + React + TS + Tailwind v4 骨架)。',\n );\n logger.info(\n '如确需在空目录上跑 init,请先 `npm init -y` 生成 package.json。',\n );\n return;\n }\n if (state.state === 'teamix-evo-installed') {\n logger.warn(\n '当前目录已检测到 .teamix-evo/ — 该工程已经接入过 teamix-evo。',\n );\n logger.info('');\n logger.info('再次运行 init 会自动跳过已完成步骤(每步幂等)。');\n logger.info('如需强制全量覆盖,请使用 --force。');\n // Don't block — allow re-run for idempotent resume\n }\n if (!state.hasPackageJson && state.state !== 'teamix-evo-installed') {\n logger.error(\n '当前目录无 package.json — 请在工程根目录执行,或先 `npm init -y`。',\n );\n process.exitCode = 1;\n return;\n }\n\n // ─── 2. conflict detection (thin: detect → terminate) ──────────────\n // 幂等重跑:已装入过的工程(state === 'teamix-evo-installed')会被\n // detectConflicts 识别为冲突(AGENTS.md / tokens / …),这里跳过检测让\n // 子步骤自身的幂等逻辑生效(与 “再次运行 init 会自动跳过已完成步骤” 提示一致)。\n //\n // Fresh skeleton: create-teamix-evo 产出的骨架已包含 tailwind.config.ts /\n // src/index.css 等文件,但还没有 .teamix-evo/ 目录。通过检测 package.json\n // 中是否包含 @teamix-evo/ui 依赖来识别,跳过冲突检测。\n const isReentry = state.state === 'teamix-evo-installed';\n const isFreshSkeleton = await isCreateTeamixSkeleton(cwd);\n if (!opts.force && !isReentry && !isFreshSkeleton) {\n const conflicts = await detectConflicts(cwd);\n if (conflicts.hasAnyConflict) {\n // Structured output for AI consumption\n const conflictItems = conflicts.items\n .filter((i) => i.exists)\n .map((i) => ({ category: i.key, paths: i.paths }));\n\n logger.error('检测到冲突文件,init 终止。');\n logger.info('');\n logger.info('冲突清单:');\n for (const item of conflictItems) {\n logger.info(` • [${item.category}] ${item.paths.join(', ')}`);\n }\n logger.info('');\n logger.info('处理方式:');\n logger.info(' • --force 全量覆盖(跳过冲突检测)');\n logger.info(' • 让 AI 助手逐项决策(推荐)');\n logger.info('');\n // JSON output for programmatic consumption\n logger.debug(JSON.stringify({ conflicts: conflictItems }, null, 2));\n process.exitCode = 1;\n return;\n }\n }\n\n // ─── 3. run wizard ─────────────────────────────────────────────────\n const isInteractive = Boolean(process.stdin.isTTY);\n const answers = await runInitWizard({\n cwd,\n variant: opts.variant,\n acceptDefaults: opts.yes ?? false,\n nonInteractive: !isInteractive,\n });\n\n // ─── 4. run orchestrator ───────────────────────────────────────────\n const dryRun = opts.dryRun ?? false;\n if (dryRun) {\n logger.info('');\n logger.info('📋 dry-run 模式:以下计划不会写入任何文件');\n }\n\n const result = await runProjectInit({\n projectRoot: cwd,\n variant: answers.variant,\n ides: answers.ides,\n force: opts.force,\n skipInstall: false,\n dryRun,\n onStep: (step) => {\n const icon = STEP_ICON[step.status];\n const detail = step.detail ? ` — ${step.detail}` : '';\n logger.info(` ${icon} ${step.name}${detail}`);\n },\n });\n\n // ─── 5. summary ────────────────────────────────────────────────────\n logger.info('');\n if (result.status === 'dry-run') {\n logger.success('dry-run 完成。移除 --dry-run 即可实际执行。');\n } else if (result.status === 'partial') {\n logger.warn('init 部分完成(含失败步骤)。详见上方步骤明细。');\n if (result.resumeHint) {\n const { failedAt, completed, error, resumeCommand } =\n result.resumeHint;\n logger.info('');\n logger.info('恢复指引:');\n logger.info(` • 失败步骤:${failedAt}`);\n logger.info(` • 错误信息:${error}`);\n if (completed.length > 0) {\n logger.info(\n ` • 已完成步骤(再次运行会自动跳过):${completed.join(', ')}`,\n );\n }\n logger.info(\n ` • 修复后重跑:\\`${resumeCommand}\\`(幂等,从断点续接)`,\n );\n }\n process.exitCode = 1;\n } else {\n logger.success(`teamix-evo 已接入 ${cwd}`);\n }\n\n // File change ledger\n if (result.status !== 'dry-run' && result.changes.length > 0) {\n logger.info('');\n logger.info('本次 init 文件变更清单:');\n for (const line of formatFileChangeSummary(result.changes)) {\n logger.info(line);\n }\n }\n\n // Post-init guidance (simplified)\n if (result.status === 'installed') {\n logger.info('');\n logger.info('Next steps:');\n logger.info(\n ' • 提交变更:`git add . && git commit -m \"chore: init teamix-evo\"`',\n );\n logger.info(' • 启动 dev server 验证:`npm run dev`');\n logger.info(' • lint 检查:`npm run lint` / `npm run lint:css`');\n logger.info(\n ' • 让 AI 接力:在 IDE 中对话触发 `teamix-evo-manage` 继续配置',\n );\n }\n } catch (err) {\n if (err instanceof CancelledError) {\n logger.info('init 已取消。');\n return;\n }\n const message = getErrorMessage(err);\n logger.error(`init 失败:${message}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileExists } from '../utils/fs.js';\nimport { getTeamixDir } from './state.js';\n\n/**\n * Three branches of `teamix-evo init` decision tree (ADR 0019 D1).\n *\n * - `empty` : 空目录或仅含可忽略文件 → 推荐用户走 `npm create teamix-evo`(完整版)\n * - `teamix-evo-installed`: 已存在 `.teamix-evo/` → 推荐 `teamix-evo update` / 卸载流程\n * - `non-teamix-evo` : 已有非 teamix-evo 工程 → 走 `teamix-evo init` 普通版接入\n */\nexport type ProjectState = 'empty' | 'teamix-evo-installed' | 'non-teamix-evo';\n\nexport interface ProjectStateReport {\n /** Decision-tree branch the caller should take. */\n state: ProjectState;\n /** Absolute path that was inspected. */\n cwd: string;\n /** Whether `.teamix-evo/` exists at `cwd`. */\n hasTeamixDir: boolean;\n /** Whether `package.json` exists at `cwd`. */\n hasPackageJson: boolean;\n /**\n * Up to 20 entries (relative to `cwd`) that caused us to consider the\n * directory non-empty. Useful for explaining the decision to humans.\n */\n significantEntries: string[];\n}\n\n/**\n * Filenames that should NOT cause us to flip out of the `empty` branch.\n *\n * Mirrors the convention shared by `create-next-app`, `nx init`, and\n * `npm init` — these are typical files added by `git init`, an editor,\n * or the OS, not project content.\n */\nconst IGNORED_TOP_LEVEL = new Set<string>([\n '.git',\n '.gitignore',\n '.gitattributes',\n '.gitkeep',\n '.DS_Store',\n 'Thumbs.db',\n '.idea',\n '.vscode',\n '.qoder',\n '.claude',\n 'README.md',\n 'README',\n 'README.txt',\n 'LICENSE',\n 'LICENSE.md',\n 'LICENSE.txt',\n]);\n\n/**\n * Inspect `cwd` and decide which branch of the `teamix-evo init` decision\n * tree applies. Pure read-only — never mutates the filesystem.\n *\n * Resolution order (first match wins):\n * 1. `.teamix-evo/` exists → `teamix-evo-installed`\n * 2. cwd missing OR all entries are in the IGNORED_TOP_LEVEL set\n * → `empty`\n * 3. otherwise → `non-teamix-evo`\n */\nexport async function detectProjectState(\n cwd: string,\n): Promise<ProjectStateReport> {\n const absCwd = path.resolve(cwd);\n\n const teamixDir = getTeamixDir(absCwd);\n const hasTeamixDir = await fileExists(teamixDir);\n if (hasTeamixDir) {\n return {\n state: 'teamix-evo-installed',\n cwd: absCwd,\n hasTeamixDir: true,\n hasPackageJson: await fileExists(path.join(absCwd, 'package.json')),\n significantEntries: [],\n };\n }\n\n let entries: string[];\n try {\n entries = await fs.readdir(absCwd);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n // Caller pointed us at a directory that doesn't exist yet — treat as\n // empty so `init` can create it (mirrors `npm create` behavior).\n return {\n state: 'empty',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson: false,\n significantEntries: [],\n };\n }\n throw err;\n }\n\n const significant = entries.filter((e) => !IGNORED_TOP_LEVEL.has(e));\n const hasPackageJson = entries.includes('package.json');\n\n if (significant.length === 0) {\n return {\n state: 'empty',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson: false,\n significantEntries: [],\n };\n }\n\n return {\n state: 'non-teamix-evo',\n cwd: absCwd,\n hasTeamixDir: false,\n hasPackageJson,\n significantEntries: significant.slice(0, 20).sort(),\n };\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileExists, readFileOrNull } from '../utils/fs.js';\n\n/**\n * The 8 categories of consumer-side files that `teamix-evo init` may\n * conflict with when running against a non-teamix-evo project.\n *\n * See ADR 0019 D1 task #5 — these are the only files we mutate at\n * `init` time, so they're the only ones we ask the user about.\n */\nexport type ConflictKey =\n | 'agents-md'\n | 'components-json'\n | 'tailwind-config'\n | 'tokens'\n | 'index-css'\n | 'shadcn-source'\n | 'eslint-config'\n | 'stylelint-config';\n\n/** Strategy options per conflict category. */\nexport type ConflictStrategy =\n // agents-md\n | 'overwrite'\n | 'merge-managed'\n | 'skip'\n // components-json\n | 'diff-prompt'\n // tailwind-config\n | 'backup-overwrite'\n // tokens\n | 'migrate'\n | 'coexist'\n // index-css\n | 'append'\n // shadcn-source\n | 'skip-existing'\n | 'per-file-prompt'\n // eslint-config / stylelint-config (Phase 3.E)\n | 'merge';\n\nexport interface ConflictItem {\n /** Stable id for the category. */\n key: ConflictKey;\n /** True if at least one path in `paths` matched on disk. */\n exists: boolean;\n /**\n * Project-relative paths that matched. Empty when `exists === false`.\n * For `shadcn-source`, may contain a directory path (with trailing `/`).\n */\n paths: string[];\n /** sha256 fingerprint of (sorted) matched contents. Omitted for directories or when nothing matched. */\n fingerprint?: string;\n /** Default strategy presented to the user. */\n recommendedStrategy: ConflictStrategy;\n /** All allowed strategies for this category, in display order. */\n availableStrategies: ConflictStrategy[];\n /** Category-specific metadata (e.g. detected tailwind major version). */\n meta?: Record<string, unknown>;\n}\n\nexport interface ConflictReport {\n cwd: string;\n /** Always 8 items, ordered by ConflictKey enumeration above. */\n items: ConflictItem[];\n /** True if any item has `exists === true`. */\n hasAnyConflict: boolean;\n}\n\n// ─── Path candidates per category ────────────────────────────────────────────\n\nconst TAILWIND_CONFIG_CANDIDATES = [\n 'tailwind.config.ts',\n 'tailwind.config.js',\n 'tailwind.config.cjs',\n 'tailwind.config.mjs',\n];\n\nconst TOKENS_FILE_CANDIDATES = [\n 'src/design-tokens.css',\n 'src/styles/design-tokens.css',\n 'src/styles/tokens.css',\n];\n\nconst TOKENS_DIR_CANDIDATES = ['tokens'];\n\nconst INDEX_CSS_CANDIDATES = [\n 'src/index.css',\n 'src/main.css',\n 'src/app.css',\n 'src/styles/index.css',\n 'src/styles/globals.css',\n];\n\nconst SHADCN_FILE_CANDIDATES = ['src/lib/utils.ts'];\nconst SHADCN_DIR_CANDIDATES = ['src/components/ui'];\n\n// Phase 3.E: 8 ESLint candidates (legacy `.eslintrc.*` + flat `eslint.config.*`)\nconst ESLINT_CONFIG_CANDIDATES = [\n '.eslintrc.cjs',\n '.eslintrc.js',\n '.eslintrc.json',\n '.eslintrc.yml',\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.mjs',\n 'eslint.config.ts',\n];\n\n// Phase 3.E: 8 Stylelint candidates (legacy `.stylelintrc.*` + flat `stylelint.config.*`)\nconst STYLELINT_CONFIG_CANDIDATES = [\n '.stylelintrc.cjs',\n '.stylelintrc.js',\n '.stylelintrc.json',\n '.stylelintrc.yml',\n 'stylelint.config.cjs',\n 'stylelint.config.js',\n 'stylelint.config.mjs',\n 'stylelint.config.ts',\n];\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nasync function isDir(target: string): Promise<boolean> {\n try {\n const stat = await fs.stat(target);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function dirHasContent(target: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(target);\n return entries.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Hash of UTF-8 string content; truncate to 16 chars for log readability. */\nfunction fingerprint(parts: string[]): string {\n const hash = crypto.createHash('sha256');\n for (const p of [...parts].sort()) hash.update(p);\n return `sha256:${hash.digest('hex').slice(0, 16)}`;\n}\n\ninterface PackageJsonShape {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJsonShape | null> {\n const raw = await readFileOrNull(path.join(cwd, 'package.json'));\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as PackageJsonShape;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect tailwind major version from package.json.\n * Returns 4 / 3 / null. We trust dependencies + devDependencies.\n */\nfunction detectTailwindMajor(pkg: PackageJsonShape | null): 3 | 4 | null {\n if (!pkg) return null;\n const v =\n pkg.dependencies?.tailwindcss ?? pkg.devDependencies?.tailwindcss ?? null;\n if (!v) return null;\n // Accept \"^4.0.0\" / \"~4.2.2\" / \"4.x\" / \"next\" → conservative: parse leading digit\n const m = /(\\d+)/.exec(v);\n if (!m) return null;\n const major = Number.parseInt(m[1]!, 10);\n if (major === 3) return 3;\n if (major === 4) return 4;\n return null;\n}\n\n// ─── Per-category detectors ──────────────────────────────────────────────────\n\nasync function detectAgentsMd(cwd: string): Promise<ConflictItem> {\n const target = path.join(cwd, 'AGENTS.md');\n const content = await readFileOrNull(target);\n const exists = content !== null;\n return {\n key: 'agents-md',\n exists,\n paths: exists ? ['AGENTS.md'] : [],\n fingerprint: exists ? fingerprint([content!]) : undefined,\n recommendedStrategy: exists ? 'merge-managed' : 'overwrite',\n availableStrategies: ['merge-managed', 'overwrite', 'skip'],\n };\n}\n\nasync function detectComponentsJson(cwd: string): Promise<ConflictItem> {\n const target = path.join(cwd, 'components.json');\n const content = await readFileOrNull(target);\n const exists = content !== null;\n return {\n key: 'components-json',\n exists,\n paths: exists ? ['components.json'] : [],\n fingerprint: exists ? fingerprint([content!]) : undefined,\n recommendedStrategy: exists ? 'diff-prompt' : 'overwrite',\n availableStrategies: ['diff-prompt', 'overwrite', 'skip'],\n };\n}\n\nasync function detectTailwindConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of TAILWIND_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const pkg = await readPackageJson(cwd);\n const tailwindMajor = detectTailwindMajor(pkg);\n const exists = matched.length > 0;\n return {\n key: 'tailwind-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'backup-overwrite' : 'overwrite',\n availableStrategies: ['backup-overwrite', 'overwrite', 'skip'],\n meta: { tailwindMajor },\n };\n}\n\nasync function detectTokens(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of TOKENS_FILE_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n for (const rel of TOKENS_DIR_CANDIDATES) {\n const abs = path.join(cwd, rel);\n if ((await isDir(abs)) && (await dirHasContent(abs))) {\n matched.push(`${rel}/`);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'tokens',\n exists,\n paths: matched,\n fingerprint: contents.length > 0 ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'migrate' : 'overwrite',\n availableStrategies: ['migrate', 'coexist', 'overwrite', 'skip'],\n };\n}\n\nasync function detectIndexCss(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of INDEX_CSS_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'index-css',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'append' : 'overwrite',\n availableStrategies: ['append', 'diff-prompt', 'overwrite', 'skip'],\n };\n}\n\nasync function detectShadcnSource(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n for (const rel of SHADCN_FILE_CANDIDATES) {\n if (await fileExists(path.join(cwd, rel))) matched.push(rel);\n }\n for (const rel of SHADCN_DIR_CANDIDATES) {\n const abs = path.join(cwd, rel);\n if ((await isDir(abs)) && (await dirHasContent(abs))) {\n matched.push(`${rel}/`);\n }\n }\n // For shadcn dir, count component files for meta.\n let componentCount = 0;\n try {\n const uiDir = path.join(cwd, 'src/components/ui');\n if (await isDir(uiDir)) {\n const entries = await fs.readdir(uiDir);\n componentCount = entries.filter(\n (e) => e.endsWith('.tsx') || e.endsWith('.ts'),\n ).length;\n }\n } catch {\n // ignore\n }\n const exists = matched.length > 0;\n return {\n key: 'shadcn-source',\n exists,\n paths: matched,\n recommendedStrategy: exists ? 'skip-existing' : 'overwrite',\n availableStrategies: ['skip-existing', 'per-file-prompt', 'overwrite'],\n meta: { componentCount },\n };\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Inspect `cwd` for the 8 categories of files that `teamix-evo init` may\n * touch. Pure read-only — never mutates the filesystem. Returns one\n * `ConflictItem` per category in stable order so callers can render a\n * deterministic wizard.\n */\nexport async function detectConflicts(cwd: string): Promise<ConflictReport> {\n const absCwd = path.resolve(cwd);\n const items: ConflictItem[] = await Promise.all([\n detectAgentsMd(absCwd),\n detectComponentsJson(absCwd),\n detectTailwindConfig(absCwd),\n detectTokens(absCwd),\n detectIndexCss(absCwd),\n detectShadcnSource(absCwd),\n detectEslintConfig(absCwd),\n detectStylelintConfig(absCwd),\n ]);\n return {\n cwd: absCwd,\n items,\n hasAnyConflict: items.some((i) => i.exists),\n };\n}\n\nasync function detectEslintConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of ESLINT_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'eslint-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'merge' : 'overwrite',\n availableStrategies: ['merge', 'backup-overwrite', 'overwrite', 'skip'],\n };\n}\n\nasync function detectStylelintConfig(cwd: string): Promise<ConflictItem> {\n const matched: string[] = [];\n const contents: string[] = [];\n for (const rel of STYLELINT_CONFIG_CANDIDATES) {\n const c = await readFileOrNull(path.join(cwd, rel));\n if (c !== null) {\n matched.push(rel);\n contents.push(c);\n }\n }\n const exists = matched.length > 0;\n return {\n key: 'stylelint-config',\n exists,\n paths: matched,\n fingerprint: exists ? fingerprint(contents) : undefined,\n recommendedStrategy: exists ? 'merge' : 'overwrite',\n availableStrategies: ['merge', 'backup-overwrite', 'overwrite', 'skip'],\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { hasManagedRegion, replaceManagedRegion } from '@teamix-evo/registry';\nimport { backupFile, fileExists, readFileOrNull } from '../utils/fs.js';\nimport { getSkillsSourceDir } from './state.js';\n\n/**\n * Generate `<projectRoot>/AGENTS.md` as a skill-trigger fallback (ADR 0038).\n *\n * The file is **regenerable**: it consolidates TRIGGER / SKIP excerpts from\n * each installed SKILL.md frontmatter description into one terse index, so\n * AGENTS.md-aware IDEs (Codex / Cursor / Claude Code / Qoder) preheat the\n * skill activation conditions even when the user prompt does not directly\n * hit the description-based trigger.\n *\n * Out of scope (per ADR 0038):\n * - Does NOT copy skill body / rules / patterns — those stay in the skill.\n * - Does NOT include `teamix-evo-manage` (entry skill, global scope, ADR 0033).\n *\n * Lifted from `create-teamix-evo` (v0.5) into `teamix-evo/core` so both\n * `npm create teamix-evo` (scaffold path) and `teamix-evo init` (existing-\n * project path, ADR 0019 task #5) emit identical AGENTS.md output.\n *\n * @module teamix-evo/core/agents-md\n */\n\nexport interface RunGenerateAgentsMdOptions {\n /** Absolute path to the consumer project root. */\n projectRoot: string;\n /** Tokens / skills variant (e.g. \"opentrek\"). Used for header context. */\n variant: string;\n /**\n * Skill ids whose `<projectRoot>/.teamix-evo/skills/<id>/SKILL.md` should be\n * indexed. Caller is responsible for filtering out global-only skills\n * (e.g. `teamix-evo-manage`).\n */\n skillIds: string[];\n /**\n * Reconciliation mode (Phase 2.B):\n * - `'overwrite'` (default): always rewrite the full file. Pre-existing\n * content is backed up and discarded.\n * - `'merge-managed'`: rewrite only the `teamix-evo-skills` managed\n * region. When the consumer file lacks the region, prepend a fresh\n * managed block ahead of the user's content (auto-adopt). The user's\n * non-managed sections are preserved.\n *\n * In both modes, an existing file is backed up under\n * `.teamix-evo/.backups/AGENTS.md.<isoTs>.bak` before any mutation.\n */\n mode?: 'overwrite' | 'merge-managed';\n}\n\nexport interface RunGenerateAgentsMdResult {\n /** Absolute path of the written `AGENTS.md`. */\n path: string;\n /** Number of skill sections rendered (missing SKILL.md degradations are still counted). */\n skillCount: number;\n /** Skill ids whose SKILL.md could not be read (rendered as degraded section). */\n missingSkillIds: string[];\n /**\n * True when an existing AGENTS.md was backed up under\n * `.teamix-evo/.backups/AGENTS.md.<isoTs>.bak` before being overwritten\n * (Phase 1.A2 — full backup strategy).\n */\n backedUp: boolean;\n /**\n * Outcome of the merge step (Phase 2.B):\n * - `'created'`: no AGENTS.md existed; wrote a fresh full template.\n * - `'overwritten'`: existed but mode='overwrite' — full rewrite.\n * - `'managed-replaced'`: mode='merge-managed' and the consumer file\n * already had the `teamix-evo-skills` managed region; only that region\n * was rewritten. User content outside is preserved.\n * - `'managed-prepended'`: mode='merge-managed' but the consumer file\n * did not yet have the managed region; a fresh block was inserted at\n * the top, with the existing user content kept below.\n */\n merge: 'created' | 'overwritten' | 'managed-replaced' | 'managed-prepended';\n}\n\n/** Region id wrapping the auto-generated skill index. */\nexport const AGENTS_MD_MANAGED_ID = 'teamix-evo-skills';\n\ninterface SkillDescriptionParts {\n /** First non-empty line(s) of `description` (the capability statement). */\n capability: string;\n trigger: string | null;\n skip: string | null;\n coordinates: string | null;\n}\n\n/**\n * Generate and write the `AGENTS.md` file.\n *\n * Phase 2.B — reconciliation modes:\n * - `'overwrite'` (default): regenerable behaviour, full rewrite.\n * - `'merge-managed'`: rewrite only the `teamix-evo-skills` managed region\n * so user-authored sections (project-specific guidance, design tokens,\n * prompts) are never clobbered.\n *\n * Existing files are always backed up under `.teamix-evo/.backups/` before\n * mutation (ADR 0019 §2, Phase 1.A2).\n */\nexport async function runGenerateAgentsMd(\n options: RunGenerateAgentsMdOptions,\n): Promise<RunGenerateAgentsMdResult> {\n const { projectRoot, variant, skillIds } = options;\n const mode = options.mode ?? 'overwrite';\n\n // Stable order: design → code → others (alphabetical within each bucket).\n const ordered = [...skillIds].sort(\n (a, b) => bucketRank(a) - bucketRank(b) || a.localeCompare(b),\n );\n\n const sections: string[] = [];\n const missingSkillIds: string[] = [];\n for (const id of ordered) {\n const { section, missing } = await renderSkillSection(projectRoot, id);\n sections.push(section);\n if (missing) missingSkillIds.push(id);\n }\n\n const target = path.join(projectRoot, 'AGENTS.md');\n const targetExists = await fileExists(target);\n const fullTemplate = renderAgentsMd({ variant, sections });\n const managedBody = renderManagedBlockBody({ variant, sections });\n\n let outputContent: string;\n let merge: RunGenerateAgentsMdResult['merge'];\n\n if (!targetExists) {\n outputContent = fullTemplate;\n merge = 'created';\n } else {\n // Backup before any mutation — truthful even if downstream throws.\n await backupFile(target, projectRoot);\n if (mode === 'merge-managed') {\n const existing = (await readFileOrNull(target)) ?? '';\n if (hasManagedRegion(existing, AGENTS_MD_MANAGED_ID)) {\n outputContent = replaceManagedRegion(\n existing,\n AGENTS_MD_MANAGED_ID,\n managedBody,\n );\n merge = 'managed-replaced';\n } else {\n // Auto-adopt: place the managed block at the top so AGENTS.md-aware\n // IDEs preheat skill triggers first, then keep the user's prior\n // content as a non-managed tail. A trailing precedence notice goes\n // immediately after the managed block.\n const wrapped = wrapManagedBlock(managedBody);\n outputContent = `${wrapped}\\n\\n${PRECEDENCE_NOTICE}\\n\\n${existing.trimStart()}`;\n merge = 'managed-prepended';\n }\n } else {\n // overwrite — historical default.\n outputContent = fullTemplate;\n merge = 'overwritten';\n }\n }\n\n await fs.writeFile(target, outputContent, 'utf8');\n return {\n path: target,\n skillCount: ordered.length,\n missingSkillIds,\n backedUp: targetExists,\n merge,\n };\n}\n\nfunction bucketRank(id: string): number {\n if (id.startsWith('teamix-evo-design-')) return 0;\n if (id.startsWith('teamix-evo-code-')) return 1;\n return 2;\n}\n\nasync function renderSkillSection(\n projectRoot: string,\n skillId: string,\n): Promise<{ section: string; missing: boolean }> {\n const skillPath = path.join(\n getSkillsSourceDir(projectRoot, skillId),\n 'SKILL.md',\n );\n const lines: string[] = [];\n lines.push(`### ${skillId}`);\n let parts: SkillDescriptionParts | null = null;\n let missing = false;\n try {\n const raw = await fs.readFile(skillPath, 'utf8');\n parts = extractDescriptionParts(raw);\n } catch {\n // SKILL.md missing — degrade gracefully, AI still gets the location hint.\n missing = true;\n }\n\n if (parts?.capability) {\n lines.push(`- ${parts.capability}`);\n }\n lines.push(\n `- **TRIGGER**: ${\n parts?.trigger ?? '未配置触发条件,需手动激活该 skill。'\n }`,\n );\n lines.push(\n `- **SKIP**: ${parts?.skip ?? '未配置跳过条件,按 TRIGGER 兜底判定。'}`,\n );\n if (parts?.coordinates) {\n lines.push(`- **Coordinates with**: ${parts.coordinates}`);\n }\n lines.push(`- **位置**: \\`.teamix-evo/skills-source/${skillId}/SKILL.md\\``);\n return { section: lines.join('\\n'), missing };\n}\n\nfunction renderAgentsMd(args: { variant: string; sections: string[] }): string {\n const { variant, sections } = args;\n const managedBody = renderManagedBlockBody({ variant, sections });\n const wrapped = wrapManagedBlock(managedBody);\n return `${wrapped}\\n\\n${PRECEDENCE_NOTICE}\\n`;\n}\n\n/**\n * Body of the `teamix-evo-skills` managed region (no enclosing markers).\n * Phase 2.B — isolated so {@link runGenerateAgentsMd} can substitute it via\n * `replaceManagedRegion` when reconciling against a user-edited AGENTS.md.\n *\n * Exported so external tools (e.g. the `teamix-evo-manage` skill) can render\n * a preview without depending on the file write path.\n */\nexport function renderManagedBlockBody(args: {\n variant: string;\n sections: string[];\n}): string {\n const { variant, sections } = args;\n const skillBlock =\n sections.length > 0\n ? sections.join('\\n\\n')\n : '_(本工程未装配工程级 skill。)_';\n return `# AGENTS.md\n\n> 本工程已装配 Teamix Evo AI skills。AI 助手在以下场景下**必须先读对应 skill** 再动手。\n> 本文件由 \\`teamix-evo init\\` / \\`create-teamix-evo\\` 自动生成(regenerable,遵循 ADR 0038),刷新方式见底部。\n\n## 已装 Skills(variant: ${variant})\n\n${skillBlock}\n\n## 触发兜底规则\n\n- 写新 \\`.tsx\\` / \\`.ts\\` 前,对照上述 TRIGGER 判定是否命中\n- 命中则先读对应 \\`SKILL.md\\`,再动手;二者同时命中则两个都读\n- 模糊场景:先按 SKIP 反向排除,剩余唯一 skill 即为入口\n- 生命周期命令(\\`init\\` / \\`update\\` / \\`add\\`)走 \\`teamix-evo-manage\\`(全局 skill,本文件不列)\n- 迁移场景(\"代码迁移\" / \"执行迁移\" / \"旧项目迁移\" / \"重建老工程\")同样走 \\`teamix-evo-manage\\` 场景 6\n\n## UI 组件领地(init 后约束)\n\n- \\`src/components/ui/\\` 由 teamix-evo 接管,禁止手工或通过 shadcn CLI 添加新组件\n- 如需新增 UI 组件,使用 \\`npx teamix-evo ui add <id>\\`\n- \\`src/components/shadcn-ui/\\` 是 init 前 legacy 组件归档,只读;新代码不应再 import\n- 升级 legacy 组件:触发 teamix-evo-upgrade skill\n\n> 刷新本文件:\\`npx teamix-evo skills add\\` 或重跑 \\`npm create teamix-evo\\` / \\`teamix-evo init\\`。`;\n}\n\nfunction wrapManagedBlock(body: string): string {\n return `<!-- teamix-evo:managed:start id=\"${AGENTS_MD_MANAGED_ID}\" -->\\n${body}\\n<!-- teamix-evo:managed:end id=\"${AGENTS_MD_MANAGED_ID}\" -->`;\n}\n\n/**\n * Footer notice (Phase 2.B): when AGENTS.md hosts both managed and\n * user-authored sections, the managed Skills index wins on conflict.\n */\nconst PRECEDENCE_NOTICE = `<!-- teamix-evo:precedence -->\n> 冲突以上方的 **Skills** 索引为准(上游路径与 TRIGGER/SKIP 契约);项目特有的人工细则请写在本处以下、不要覆盖上方 managed 区域。`;\n\n// ─── frontmatter parsing ──────────────────────────────────────────────────────\n\n/**\n * Parse a SKILL.md frontmatter description into capability / TRIGGER / SKIP /\n * Coordinates parts.\n *\n * Why hand-rolled (no gray-matter): we only need the `description: |` block.\n * The full YAML grammar is overkill and adds a runtime dep to a CLI / scaffold\n * tool that should stay zero-cost. ADR 0015 keeps frontmatter shape stable.\n */\nexport function extractDescriptionParts(\n fileContent: string,\n): SkillDescriptionParts | null {\n const description = extractDescriptionBlock(fileContent);\n if (description == null) return null;\n\n // Capability = first line that is not a TRIGGER/SKIP/Coordinates marker.\n const allLines = description\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n let capability = '';\n for (const line of allLines) {\n if (/^(TRIGGER when:|SKIP:|Coordinates with:)/i.test(line)) break;\n capability = capability ? `${capability} ${line}` : line;\n }\n\n return {\n capability: capability.trim(),\n trigger: extractSection(description, 'TRIGGER when:'),\n skip: extractSection(description, 'SKIP:'),\n coordinates: extractSection(description, 'Coordinates with:'),\n };\n}\n\n/**\n * Extract the `description: |` (or `description: >`) block body. Returns null\n * if the field is missing or not a literal/folded block.\n */\nfunction extractDescriptionBlock(fileContent: string): string | null {\n const lines = fileContent.split('\\n');\n\n // Find frontmatter range: first `---`, then matching `---`.\n if (lines[0]?.trim() !== '---') return null;\n let endIdx = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i]?.trim() === '---') {\n endIdx = i;\n break;\n }\n }\n if (endIdx === -1) return null;\n const fmLines = lines.slice(1, endIdx);\n\n // Locate `description:` key.\n let startIdx = -1;\n let inlineValue: string | null = null;\n let blockMode: 'literal' | 'folded' | 'inline' = 'inline';\n for (let i = 0; i < fmLines.length; i++) {\n const m = fmLines[i]?.match(/^description:\\s*(\\|[+-]?|>[+-]?)?\\s*(.*)$/);\n if (m) {\n startIdx = i;\n const indicator = (m[1] ?? '').trim();\n const rest = m[2] ?? '';\n if (indicator.startsWith('|')) blockMode = 'literal';\n else if (indicator.startsWith('>')) blockMode = 'folded';\n else {\n blockMode = 'inline';\n inlineValue = rest;\n }\n break;\n }\n }\n if (startIdx === -1) return null;\n\n if (blockMode === 'inline') {\n return inlineValue ?? '';\n }\n\n // Block mode: collect indented continuation lines.\n const body: string[] = [];\n // Detect the block indent from the first non-empty continuation line.\n let blockIndent = -1;\n for (let i = startIdx + 1; i < fmLines.length; i++) {\n const line = fmLines[i] ?? '';\n if (line.trim() === '') {\n body.push('');\n continue;\n }\n const indentMatch = line.match(/^(\\s+)/);\n const indent = indentMatch ? indentMatch[1]!.length : 0;\n if (indent === 0) break; // back to top-level key\n if (blockIndent === -1) blockIndent = indent;\n if (indent < blockIndent) break;\n body.push(line.slice(blockIndent));\n }\n // Trim trailing empty lines.\n while (body.length > 0 && body[body.length - 1] === '') body.pop();\n return body.join('\\n');\n}\n\n/**\n * Extract the body of a description sub-section starting with the given\n * marker (e.g. \"TRIGGER when:\"). Stops at the next known marker or end of\n * description. Returns the stripped one-line summary (sub-section text with\n * internal newlines collapsed to spaces).\n */\nfunction extractSection(description: string, marker: string): string | null {\n const markers = ['TRIGGER when:', 'SKIP:', 'Coordinates with:'];\n const lines = description.split('\\n');\n let inSection = false;\n const collected: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n const startsWithMarker = trimmed\n .toLowerCase()\n .startsWith(marker.toLowerCase());\n if (!inSection && startsWithMarker) {\n inSection = true;\n collected.push(trimmed.slice(marker.length).trim());\n continue;\n }\n if (inSection) {\n const hitNextMarker = markers.some(\n (m) =>\n m !== marker && trimmed.toLowerCase().startsWith(m.toLowerCase()),\n );\n if (hitNextMarker) break;\n if (trimmed === '') {\n // Allow blank line within section but stop on second consecutive blank.\n if (collected[collected.length - 1] === '') break;\n collected.push('');\n continue;\n }\n collected.push(trimmed);\n }\n }\n if (!inSection) return null;\n const joined = collected\n .filter((l) => l !== '')\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return joined || null;\n}\n","/**\n * npm dependency auto-installer for `teamix-evo init`.\n *\n * After `runUiAdd` completes, this module:\n * 1. Collects `npmDependencies` from the install result\n * 2. Reads the project's `package.json`\n * 3. Writes missing deps into `dependencies`\n * 4. Detects the package manager and runs install\n *\n * See PLAN Task 3.8 (P0).\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { fileExists, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface DepsInstallOptions {\n /** Absolute project root */\n projectRoot: string;\n /** npm dependencies to install (name → semver range) */\n npmDependencies: Record<string, string>;\n /** Skip the actual install command (just patch package.json) */\n skipInstall?: boolean;\n}\n\nexport interface DepsInstallResult {\n /** Deps newly written to package.json */\n added: Record<string, string>;\n /** Deps that already existed (skipped) */\n existed: Record<string, string>;\n /** Whether install command was executed */\n installed: boolean;\n /** Detected package manager */\n packageManager: PackageManager;\n}\n\n// ─── Package manager detection ───────────────────────────────────────────────\n\ntype PackageManager = 'pnpm' | 'yarn' | 'bun' | 'npm';\n\nasync function detectPackageManager(\n projectRoot: string,\n): Promise<PackageManager> {\n if (await fileExists(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await fileExists(path.join(projectRoot, 'pnpm-workspace.yaml')))\n return 'pnpm';\n if (await fileExists(path.join(projectRoot, 'bun.lockb'))) return 'bun';\n if (await fileExists(path.join(projectRoot, 'bun.lock'))) return 'bun';\n if (await fileExists(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn install';\n case 'bun':\n return 'bun install';\n case 'npm':\n return 'npm install';\n }\n}\n\n// ─── Core installer ──────────────────────────────────────────────────────────\n\n/**\n * Patch project `package.json` with missing npm dependencies and optionally\n * run the package manager's install command.\n */\nexport async function installProjectDeps(\n options: DepsInstallOptions,\n): Promise<DepsInstallResult> {\n const { projectRoot, npmDependencies, skipInstall = false } = options;\n\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) {\n throw new Error(\n `package.json not found at ${projectRoot}. Cannot install dependencies.`,\n );\n }\n\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const existingDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n const added: Record<string, string> = {};\n const existed: Record<string, string> = {};\n\n for (const [name, range] of Object.entries(npmDependencies)) {\n if (existingDeps[name]) {\n existed[name] = existingDeps[name]!;\n } else {\n added[name] = range;\n }\n }\n\n // Patch package.json if there are new deps\n if (Object.keys(added).length > 0) {\n if (!pkg.dependencies) pkg.dependencies = {};\n for (const [name, range] of Object.entries(added)) {\n pkg.dependencies[name] = range;\n }\n // Sort dependencies alphabetically\n pkg.dependencies = Object.fromEntries(\n Object.entries(pkg.dependencies).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.info(\n ` patched package.json: +${Object.keys(added).length} dependencies`,\n );\n }\n\n // Detect package manager and run install\n const packageManager = await detectPackageManager(projectRoot);\n let installed = false;\n\n if (!skipInstall && Object.keys(added).length > 0) {\n const cmd = getInstallCommand(packageManager);\n logger.info(` running ${cmd}...`);\n try {\n await execAsync(cmd, { cwd: projectRoot, timeout: 120_000 });\n installed = true;\n logger.info(' install complete');\n } catch (err) {\n logger.warn(\n ` install failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n logger.warn(' please run install manually');\n }\n }\n\n return { added, existed, installed, packageManager };\n}\n","/**\n * Generates the `.teamix-evo/init-checklist.md` content after `teamix-evo init`.\n *\n * Simplified for ADR 0043: only records the 8-step pipeline results.\n * No Phase B — post-init guidance is handled by AI skills at runtime.\n */\n\nimport type { ProjectInitStep } from './project-init.js';\n\n/** Step display metadata. */\nconst STEP_LABELS: Record<string, string> = {\n tokens: 'tokens — design tokens 安装',\n skills: 'skills — AI skills 批量自举',\n 'agents-md': 'agents-md — AGENTS.md 生成',\n 'ui-init': 'ui-init — UI 配置初始化',\n 'ui-add': 'ui-add — UI 组件全量安装',\n 'biz-ui-add': 'biz-ui-add — 业务组件全量安装',\n lint: 'lint — ESLint + Stylelint 配置',\n gitignore: 'gitignore — .gitignore 追加',\n};\n\nexport function renderInitChecklist(args: {\n variant: string;\n status: string;\n steps: ProjectInitStep[];\n timestamp?: string;\n}): string {\n const { variant, status, steps } = args;\n const ts =\n args.timestamp ?? new Date().toISOString().replace('T', ' ').slice(0, 19);\n\n const stepLines = steps\n .map((s) => {\n const label = STEP_LABELS[s.name] ?? s.name;\n const checked = s.status === 'ok' ? 'x' : ' ';\n const suffix =\n s.status === 'ok'\n ? ''\n : s.status === 'skip'\n ? `(跳过${s.detail ? ':' + s.detail : ''})`\n : s.status === 'fail'\n ? `(失败:${s.detail ?? 'unknown'})`\n : '(计划中)';\n return `- [${checked}] ${label}${suffix}`;\n })\n .join('\\n');\n\n return `# teamix-evo init 安装摘要\n\n> 由 \\`teamix-evo init\\` 自动生成 · ${ts}\n> variant: ${variant} · status: ${status}\n\n## 安装步骤\n\n${stepLines}\n\n## 备注\n\n- 失败或跳过的步骤不影响后续步骤独立执行\n- 修复后重跑 \\`teamix-evo init\\`(每步幂等,自动跳过已完成项)\n- 如需全量覆盖:\\`teamix-evo init --force\\`\n`;\n}\n","/**\n * Programmatic orchestrator for `teamix-evo init` (ADR 0043).\n *\n * Drives the 8-step pipeline that installs the full teamix-evo suite into an\n * existing project. Each step is idempotent — re-running `init` picks up from\n * where it left off.\n *\n * Conflict handling is intentionally thin (ADR 0043 §3): detect → terminate →\n * structured output → AI decides. The orchestrator only checks `force` — when\n * true, it skips conflict detection entirely.\n */\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { runTokensInit } from './tokens-init.js';\nimport { runSkillsInit } from './skills-add.js';\nimport { runGenerateAgentsMd } from './agents-md.js';\nimport { runUiInit } from './ui-init.js';\nimport { runUiAdd } from './ui-add.js';\nimport { runBizUiAdd, listBizUiEntries } from './variant-ui-add.js';\nimport { runLintInit } from './lint-init.js';\nimport { installProjectDeps } from './deps-install.js';\nimport { loadUiData } from './ui-client.js';\nimport { renderInitChecklist } from './init-checklist-template.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport { logger } from '../utils/logger.js';\nimport { type FileChange, toRelativePosix } from './file-changes.js';\nimport * as fsNode from 'node:fs/promises';\nimport * as path from 'node:path';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type ProjectInitStepName =\n | 'tokens'\n | 'skills'\n | 'agents-md'\n | 'ui-init'\n | 'ui-add'\n | 'biz-ui-add'\n | 'lint'\n | 'gitignore';\n\nexport type ProjectInitStepStatus = 'ok' | 'skip' | 'fail' | 'planned';\n\nexport interface ProjectInitStep {\n name: ProjectInitStepName;\n status: ProjectInitStepStatus;\n detail?: string;\n /** Files this step touched. */\n changes?: FileChange[];\n}\n\nexport interface ResumeHint {\n failedAt: ProjectInitStepName;\n completed: ProjectInitStepName[];\n failed: ProjectInitStepName[];\n error: string;\n resumeCommand: string;\n}\n\nexport interface RunProjectInitOptions {\n /** Absolute project root (existing repo to adopt teamix-evo into). */\n projectRoot: string;\n /** Tokens variant (e.g. \"opentrek\" / \"uni-manager\"). */\n variant: string;\n /** Target IDEs (at least one). */\n ides: SkillIde[];\n /** Skill install scope. Defaults to 'project'. */\n scope?: SkillScope;\n /**\n * When true, skip conflict detection and overwrite everything.\n * Distinction: init --force = skip conflict check; create --force = overwrite directory.\n */\n force?: boolean;\n /** Skip `npm install` for lint deps. */\n skipInstall?: boolean;\n /** Step-level progress hook. */\n onStep?: (step: ProjectInitStep) => void;\n /** Plan-only mode: compute steps without running sub-commands. */\n dryRun?: boolean;\n}\n\nexport interface RunProjectInitResult {\n status: 'installed' | 'partial' | 'dry-run';\n steps: ProjectInitStep[];\n changes: FileChange[];\n resumeHint?: ResumeHint;\n}\n\n// ─── Constants ──────────────────────────────────────────────────────────────────\n\n/**\n * Steps whose failure aborts subsequent critical steps. Non-critical leaves\n * (agents-md / ui-add / biz-ui-add / lint / gitignore) continue independently.\n */\nconst CRITICAL_STEPS: ReadonlySet<ProjectInitStepName> = new Set([\n 'tokens',\n 'skills',\n 'ui-init',\n]);\n\nconst GITIGNORE_MARKER_START = '# >>> teamix-evo:managed >>>';\nconst GITIGNORE_MARKER_END = '# <<< teamix-evo:managed <<<';\nconst GITIGNORE_RULES = [\n '# Runtime artifacts (regenerable / archives)',\n '.teamix-evo/.snapshots/',\n '.teamix-evo/logs/',\n '.teamix-evo/.backups/',\n '.teamix-evo/.upgrade-staging/',\n '.teamix-evo/.upgrade-hints/',\n];\n\n// ─── Orchestrator ───────────────────────────────────────────────────────────────\n\nexport async function runProjectInit(\n options: RunProjectInitOptions,\n): Promise<RunProjectInitResult> {\n const {\n projectRoot,\n variant,\n ides,\n scope = 'project',\n dryRun = false,\n onStep,\n } = options;\n const ide = ides[0] ?? 'qoder';\n const steps: ProjectInitStep[] = [];\n const allChanges: FileChange[] = [];\n\n let aborted = false;\n const firstFailure: {\n value: { step: ProjectInitStepName; error: string } | null;\n } = { value: null };\n\n function record(step: ProjectInitStep): void {\n steps.push(step);\n onStep?.(step);\n if (step.changes && step.changes.length > 0) {\n allChanges.push(...step.changes);\n }\n }\n\n function recordFailure(name: ProjectInitStepName, err: unknown): void {\n const message = getErrorMessage(err);\n record({ name, status: 'fail', detail: message });\n if (!firstFailure.value)\n firstFailure.value = { step: name, error: message };\n if (CRITICAL_STEPS.has(name)) aborted = true;\n }\n\n // ─── 1. tokens ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'tokens',\n status: 'planned',\n detail: `runTokensInit(variant=${variant})`,\n });\n } else {\n try {\n const result = await runTokensInit({ projectRoot, variant, ide });\n const detail =\n result.status === 'installed'\n ? `${result.packageName}@${result.version} (${result.count} files)`\n : result.status;\n record({\n name: 'tokens',\n status: 'ok',\n detail,\n changes:\n result.status === 'installed'\n ? result.resources.map((r) => ({\n kind: 'created' as const,\n path: toRelativePosix(r.target, projectRoot),\n step: 'tokens',\n detail: r.strategy,\n }))\n : [],\n });\n } catch (err) {\n recordFailure('tokens', err);\n }\n }\n\n // ─── 2. skills init (batch bootstrap) ────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'skills',\n status: 'planned',\n detail: `runSkillsInit(scope=${scope})`,\n });\n } else if (aborted) {\n record({\n name: 'skills',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const result = await runSkillsInit({ projectRoot, ides, scope, ide });\n if (result.status === 'already-initialized') {\n record({ name: 'skills', status: 'ok', detail: 'already-initialized' });\n } else {\n record({\n name: 'skills',\n status: 'ok',\n detail: `${result.skillCount} skills, ${\n result.fileCount\n } files (added: ${result.addedSkillIds.join(', ') || 'none'})`,\n changes: result.addedSkillIds.map((id) => ({\n kind: 'created' as const,\n path: `.teamix-evo/skills/${id}/SKILL.md`,\n step: 'skills',\n detail: 'skill installed',\n })),\n });\n }\n } catch (err) {\n recordFailure('skills', err);\n }\n }\n\n // ─── 3. AGENTS.md ─────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'agents-md',\n status: 'planned',\n detail: 'runGenerateAgentsMd()',\n });\n } else {\n try {\n const result = await runGenerateAgentsMd({\n projectRoot,\n variant,\n skillIds: [\n `teamix-evo-design-${variant}`,\n `teamix-evo-code-${variant}`,\n ],\n mode: 'merge-managed',\n });\n record({\n name: 'agents-md',\n status: 'ok',\n detail: `${result.skillCount} skill index`,\n changes: [\n {\n kind: result.backedUp ? 'modified' : 'created',\n path: toRelativePosix(result.path, projectRoot),\n step: 'agents-md',\n detail: 'skill-trigger fallback (ADR 0038)',\n },\n ],\n });\n } catch (err) {\n recordFailure('agents-md', err);\n }\n }\n\n // ─── 4. ui-init (.teamix-evo/config.json) ──────────────────────────────────────\n if (dryRun) {\n record({ name: 'ui-init', status: 'planned', detail: 'runUiInit()' });\n } else if (aborted) {\n record({\n name: 'ui-init',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const initResult = await runUiInit({ projectRoot, ide });\n record({\n name: 'ui-init',\n status: 'ok',\n detail:\n initResult.status === 'installed'\n ? 'config.json packages.ui written'\n : initResult.status,\n });\n } catch (err) {\n recordFailure('ui-init', err);\n }\n }\n\n // ─── 5. ui add --all (全量 UI 组件源码) ────────────────────────────────────────\n // 收集 ui-add + biz-ui-add 的 npm 依赖,统一在两步之后调用 installProjectDeps。\n const collectedNpmDeps: Record<string, string> = {};\n if (dryRun) {\n const { manifest } = await loadUiData('@teamix-evo/ui').catch(() => ({\n manifest: { entries: [] as Array<{ id: string }> },\n }));\n record({\n name: 'ui-add',\n status: 'planned',\n detail: `runUiAdd(${manifest.entries.length} entries, --all)`,\n });\n } else if (aborted) {\n record({\n name: 'ui-add',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const { manifest } = await loadUiData('@teamix-evo/ui');\n const allIds = manifest.entries.map((e) => e.id);\n const addResult = await runUiAdd({\n projectRoot,\n ids: allIds,\n overwrite: true,\n });\n // slice(-0) === slice(0) 返回全量;written === 0 时显式返回空数组\n const writtenResources =\n addResult.written > 0\n ? addResult.resources.slice(-addResult.written)\n : [];\n record({\n name: 'ui-add',\n status: 'ok',\n detail: `${addResult.orderedIds.length} entries (${addResult.written} written, ${addResult.skipped} skipped)`,\n changes: writtenResources.map((r) => ({\n kind: 'created' as const,\n path: toRelativePosix(r.target, projectRoot),\n step: 'ui-add',\n detail: r.strategy,\n })),\n });\n Object.assign(collectedNpmDeps, addResult.npmDependencies);\n } catch (err) {\n recordFailure('ui-add', err);\n }\n }\n\n // ─── 6. biz-ui add --all (variant 全量业务组件) ─────────────────────────────────\n if (dryRun) {\n try {\n const listing = await listBizUiEntries(variant);\n record({\n name: 'biz-ui-add',\n status: 'planned',\n detail: `runBizUiAdd(variant=${variant}, ${listing.entries.length} entries)`,\n });\n } catch {\n record({\n name: 'biz-ui-add',\n status: 'planned',\n detail: `runBizUiAdd(variant=${variant})`,\n });\n }\n } else if (aborted) {\n record({\n name: 'biz-ui-add',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n try {\n const listing = await listBizUiEntries(variant);\n if (listing.entries.length === 0) {\n record({\n name: 'biz-ui-add',\n status: 'skip',\n detail: `no biz-ui entries for variant \"${variant}\"`,\n });\n } else {\n const allIds = listing.entries.map((e) => e.id);\n const result = await runBizUiAdd({\n projectRoot,\n variant,\n ids: allIds,\n overwrite: true,\n });\n record({\n name: 'biz-ui-add',\n status: 'ok',\n detail: `${result.orderedIds.length} entries (${result.written} written, ${result.skipped} skipped)`,\n });\n if (result.npmDependencies) {\n Object.assign(collectedNpmDeps, result.npmDependencies);\n }\n }\n } catch (err) {\n recordFailure('biz-ui-add', err);\n }\n }\n\n // ─── 6.5 install ui / biz-ui transitive npm dependencies ─────────────────────\n // ui-add / biz-ui-add 复制源码后,需要把它们引用的 npm 依赖(@radix-ui/* / cmdk /\n // recharts 等)写入 package.json 并安装,否则 `npm run dev` 会报模块缺失。\n if (!dryRun && !aborted && Object.keys(collectedNpmDeps).length > 0) {\n try {\n await installProjectDeps({\n projectRoot,\n npmDependencies: collectedNpmDeps,\n skipInstall: options.skipInstall ?? false,\n });\n } catch (err) {\n // Non-critical: 失败不应阻断 lint / gitignore;记录但不计入 critical abort。\n logger.warn(\n `安装 ui/biz-ui 传递依赖失败:${getErrorMessage(\n err,\n )}(可手动运行 \\`npm install\\` 重试)`,\n );\n }\n }\n\n // ─── 7. lint init ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({ name: 'lint', status: 'planned', detail: 'runLintInit()' });\n } else {\n try {\n const result = await runLintInit({\n projectRoot,\n skipInstall: options.skipInstall ?? false,\n eslintStrategy: 'overwrite',\n stylelintStrategy: 'overwrite',\n eslintExistingPaths: [],\n stylelintExistingPaths: [],\n });\n const detailParts: string[] = [];\n if (result.status === 'installed') {\n detailParts.push(\n `eslint=${result.eslint}, stylelint=${result.stylelint}`,\n );\n if (result.packageJsonPatched) detailParts.push('package.json patched');\n } else {\n detailParts.push(result.status);\n }\n record({\n name: 'lint',\n status: 'ok',\n detail: detailParts.join(' / '),\n changes: deriveLintChanges(result),\n });\n } catch (err) {\n recordFailure('lint', err);\n }\n }\n\n // ─── 8. gitignore ──────────────────────────────────────────────────────────────\n if (dryRun) {\n record({\n name: 'gitignore',\n status: 'planned',\n detail: 'append teamix-evo runtime rules',\n });\n } else {\n try {\n let projectRootExists = true;\n try {\n await fsNode.access(projectRoot);\n } catch {\n projectRootExists = false;\n }\n if (!projectRootExists) {\n record({\n name: 'gitignore',\n status: 'skip',\n detail: 'projectRoot does not exist',\n });\n } else {\n const giPath = path.join(projectRoot, '.gitignore');\n let giContent = '';\n try {\n giContent = await fsNode.readFile(giPath, 'utf-8');\n } catch {\n // .gitignore doesn't exist yet — we'll create it\n }\n if (giContent.includes(GITIGNORE_MARKER_START)) {\n record({\n name: 'gitignore',\n status: 'skip',\n detail: 'teamix-evo markers already present',\n });\n } else {\n const block = [\n '',\n GITIGNORE_MARKER_START,\n ...GITIGNORE_RULES,\n GITIGNORE_MARKER_END,\n '',\n ].join('\\n');\n const separator =\n giContent.length > 0 && !giContent.endsWith('\\n') ? '\\n' : '';\n await fsNode.writeFile(\n giPath,\n giContent + separator + block,\n 'utf-8',\n );\n record({\n name: 'gitignore',\n status: 'ok',\n detail: `${GITIGNORE_RULES.filter((r) => r && !r.startsWith('#')).length} rules appended`,\n changes: [\n {\n kind: 'modified',\n path: '.gitignore',\n step: 'gitignore',\n detail: 'teamix-evo runtime artifact rules',\n },\n ],\n });\n }\n }\n } catch (err) {\n recordFailure('gitignore', err);\n }\n }\n\n // ─── Result assembly ──────────────────────────────────────────────────────────\n const status: RunProjectInitResult['status'] = dryRun\n ? 'dry-run'\n : steps.some((s) => s.status === 'fail')\n ? 'partial'\n : 'installed';\n\n const out: RunProjectInitResult = { status, steps, changes: allChanges };\n\n if (firstFailure.value) {\n out.resumeHint = {\n failedAt: firstFailure.value.step,\n completed: steps.filter((s) => s.status === 'ok').map((s) => s.name),\n failed: steps.filter((s) => s.status === 'fail').map((s) => s.name),\n error: firstFailure.value.error,\n resumeCommand: 'teamix-evo init',\n };\n }\n\n // Write install summary (.teamix-evo/init-checklist.md)\n if (!dryRun) {\n try {\n const checklistContent = renderInitChecklist({ variant, status, steps });\n const checklistPath = path.join(\n projectRoot,\n '.teamix-evo',\n 'init-checklist.md',\n );\n await fsNode.mkdir(path.dirname(checklistPath), { recursive: true });\n await fsNode.writeFile(checklistPath, checklistContent, 'utf-8');\n logger.info(' wrote .teamix-evo/init-checklist.md');\n } catch {\n logger.warn(' failed to write init-checklist.md (non-fatal)');\n }\n }\n\n return out;\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────────\n\ntype LintInitResult = Awaited<ReturnType<typeof runLintInit>>;\n\nfunction deriveLintChanges(result: LintInitResult): FileChange[] {\n if (result.status !== 'installed') return [];\n const out: FileChange[] = [];\n if (result.eslint) {\n out.push({\n kind: 'created',\n path: 'eslint.config.js',\n step: 'lint',\n detail: '@teamix-evo/eslint-config',\n });\n }\n if (result.stylelint) {\n out.push({\n kind: 'created',\n path: 'stylelint.config.cjs',\n step: 'lint',\n detail: '@teamix-evo/stylelint-config',\n });\n }\n if (result.packageJsonPatched) {\n out.push({\n kind: 'created',\n path: 'package.json',\n step: 'lint',\n detail: 'scripts.lint / scripts[\"lint:css\"]',\n });\n }\n return out;\n}\n","import * as p from '@clack/prompts';\nimport type { SkillIde } from '@teamix-evo/registry';\nimport { ALL_IDE_KINDS } from '../../ide/index.js';\nimport { listTokenVariants } from '../../core/tokens-init.js';\nimport { CancelledError } from '../../utils/cancelled.js';\n\n/**\n * Simplified wizard answers for the new 8-step init pipeline (ADR 0043).\n * Only variant and IDE selection are interactive — everything else is\n * all-in by default (skill-first: CLI does deterministic execution,\n * decisions happen at the AI layer).\n */\nexport interface InitWizardAnswers {\n variant: string;\n ides: SkillIde[];\n}\n\nexport interface RunInitWizardOptions {\n cwd: string;\n /**\n * Pre-populated variant from `--variant` flag. Skips the variant prompt.\n */\n variant?: string;\n /**\n * If true, accept all defaults without prompting (the user passed `-y`).\n * In -y mode, `variant` MUST be provided (no default fallback).\n */\n acceptDefaults?: boolean;\n /**\n * Force non-interactive mode regardless of TTY detection.\n */\n nonInteractive?: boolean;\n}\n\nfunction ensureNotCancelled<T>(value: T | symbol): T {\n if (p.isCancel(value)) {\n throw new CancelledError();\n }\n return value as T;\n}\n\nasync function listVariantOptions(): Promise<\n Array<{ value: string; label: string; hint?: string }>\n> {\n try {\n const catalog = await listTokenVariants();\n return catalog.variants.map((v) => ({\n value: v.name,\n label: `${v.displayName} (${v.name})`,\n hint: v.description,\n }));\n } catch {\n return [\n { value: 'opentrek', label: 'OpenTrek (opentrek)' },\n { value: 'uni-manager', label: 'Uni-Manager (uni-manager)' },\n ];\n }\n}\n\n/**\n * Run the simplified `teamix-evo init` wizard (ADR 0043).\n *\n * - Interactive: prompts for variant + IDE selection.\n * - Non-interactive (`-y`): requires `--variant`; IDEs default to all.\n */\nexport async function runInitWizard(\n options: RunInitWizardOptions,\n): Promise<InitWizardAnswers> {\n const { cwd } = options;\n const interactive =\n !options.nonInteractive &&\n Boolean(process.stdin.isTTY) &&\n !options.acceptDefaults;\n\n // ─── variant ──────────────────────────────────────────────────────────────\n let variant = options.variant;\n if (!variant) {\n if (!interactive) {\n // 非交互(CI / -y / 非 TTY)下未带 --variant → 报错(不猜测默认值)\n throw new Error(\n '非交互模式(-y / 非 TTY)下必须指定 --variant(例如 --variant opentrek)。',\n );\n }\n const variantOptions = await listVariantOptions();\n p.intro('teamix-evo init');\n p.note(`📦 接入目录:${cwd}`);\n const choice = await p.select<string>({\n message: 'Tokens variant',\n options: variantOptions,\n initialValue: variantOptions[0]?.value ?? 'opentrek',\n });\n variant = ensureNotCancelled(choice);\n }\n\n // ─── ides ─────────────────────────────────────────────────────────────────\n let ides: SkillIde[];\n if (!interactive) {\n ides = [...ALL_IDE_KINDS] as SkillIde[];\n } else {\n const choice = await p.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 ides = ensureNotCancelled(choice) as SkillIde[];\n }\n\n if (interactive) {\n p.outro('准备就绪,开始装机…');\n }\n\n return { variant, ides };\n}\n","/**\n * Shared `step.status → icon` mapping for `teamix-evo init` orchestrator\n * output. The exhaustive `Record<StepStatus, string>` typing fails compilation\n * if the status union changes upstream without updating the icon map.\n *\n * Intentionally lives under `commands/_shared/` (vs `utils/`) because it is\n * a CLI-presentation concern — core orchestrators stay free of icon coupling.\n */\nimport type { ProjectInitStep } from '../../core/project-init.js';\n\nexport type StepStatus = ProjectInitStep['status'];\n\nexport const STEP_ICON = {\n ok: '✔',\n skip: '⊘',\n fail: '✖',\n planned: '·',\n} satisfies Record<StepStatus, string>;\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport {\n listSnapshots,\n restoreSnapshot,\n type SnapshotEntry,\n} from '../../core/snapshot.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface RestoreCmdOptions {\n cwd?: string;\n list?: boolean;\n yes?: boolean;\n}\n\n/**\n * `teamix-evo restore [ts]` — roll back `.teamix-evo/` from a previously\n * captured snapshot ([ADR 0019](../../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n *\n * Modes:\n * - `restore --list` — print the available snapshots (newest first).\n * - `restore <ts>` — restore the named snapshot. Prompts for confirmation\n * unless `-y` (or stdin is non-interactive — CI / AI agent invocation).\n * A pre-restore safety snapshot is captured automatically by\n * `restoreSnapshot` so the operation itself is reversible.\n * - `restore` (no args) — print a short usage hint pointing at `--list`.\n */\n/**\n * Build a fresh `restore` Command instance.\n *\n * commander v12 retains parsed option values across successive\n * `parseAsync` calls on the same instance, which causes state to leak\n * between tests (e.g. `--list` from one test bleeds into the next). The\n * production CLI calls this factory once at startup; tests call it per\n * case.\n */\nexport function createRestoreCommand(): Command {\n return new Command('restore')\n .description(\n '回滚 .teamix-evo/ 到指定 snapshot(init/update 失败时使用 — ADR 0019 §2)',\n )\n .argument('[ts]', '目标 snapshot 时间戳(如 2026-06-11T20-59-03-000Z)')\n .option('--list', '列出可用 snapshot(不做实际回滚)')\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('-y, --yes', '跳过二次确认(destructive,请确认无误)')\n .action(async (ts: string | undefined, opts: RestoreCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n\n try {\n const snapshots = await listSnapshots(cwd);\n\n // ── --list mode ──────────────────────────────────────────────────\n if (opts.list) {\n printSnapshotTable(snapshots);\n return;\n }\n\n // ── No ts and no --list → usage hint ─────────────────────────────\n if (!ts) {\n logger.info('用法:');\n logger.info(\n ' teamix-evo restore --list 列出可用 snapshot',\n );\n logger.info(\n ' teamix-evo restore <ts> [-y] 回滚到指定 snapshot',\n );\n logger.info('');\n if (snapshots.length === 0) {\n logger.warn(\n '当前 .teamix-evo/.snapshots/ 为空(或工程未接入 teamix-evo)。',\n );\n } else {\n logger.info(`当前共 ${snapshots.length} 个可用 snapshot。`);\n }\n process.exitCode = 1;\n return;\n }\n\n // ── Restore mode ─────────────────────────────────────────────────\n const target = snapshots.find((s) => s.ts === ts);\n if (!target) {\n logger.error(`未找到 snapshot:${ts}`);\n logger.info('');\n logger.info(\n '运行 `teamix-evo restore --list` 查看可用 snapshot 列表。',\n );\n process.exitCode = 1;\n return;\n }\n\n // Confirm unless -y / non-TTY (CI / AI agent / piped stdin) — same\n // pattern as init / update / lint init to avoid uv_tty_init crashes.\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n logger.info('');\n logger.info(`即将回滚到 snapshot:${target.ts}`);\n if (target.reason) logger.info(` • 原因:${target.reason}`);\n if (target.isoTs) logger.info(` • 时间:${target.isoTs}`);\n logger.info(\n '该操作会覆盖当前 .teamix-evo/ 内容(除 .snapshots/ 与 logs/ 外)。',\n );\n logger.info(\n '回滚前会自动再做一次 reason=\"restore\" 的安全 snapshot,可二次回滚。',\n );\n const confirmed = await prompts.confirm({\n message: '继续回滚?',\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n logger.info('已取消。');\n return;\n }\n }\n\n await restoreSnapshot(cwd, ts);\n logger.success(`已回滚到 snapshot:${ts}`);\n logger.info(\n '提示:本次操作前的状态已保存为新的 reason=\"restore\" snapshot,如需再次回滚可执行 `teamix-evo restore --list` 查看。',\n );\n } catch (err) {\n const message = getErrorMessage(err);\n logger.error(`restore 失败:${message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n\n/** Module-level singleton consumed by the CLI entry (`src/index.ts`). */\nexport const restoreCommand = createRestoreCommand();\n\n/**\n * Pretty-print the snapshot list. Each row shows ts / reason / iso so the\n * user can copy a ts directly into `teamix-evo restore <ts>`.\n */\nfunction printSnapshotTable(snapshots: SnapshotEntry[]): void {\n if (snapshots.length === 0) {\n logger.warn('未找到可用 snapshot。');\n logger.info('');\n logger.info(\n '提示:snapshot 由 `teamix-evo init` / `teamix-evo update` 在执行前自动生成;',\n );\n logger.info(\n '若工程刚接入或从未运行过这些命令,目录会是空的(这是正常状态)。',\n );\n return;\n }\n\n logger.info(`共 ${snapshots.length} 个 snapshot(最新在前):`);\n logger.info('');\n for (let i = 0; i < snapshots.length; i++) {\n const s = snapshots[i]!;\n const reason = s.reason ?? '(unknown)';\n const iso = s.isoTs ?? '(meta missing)';\n logger.info(` [${i + 1}] ${s.ts}`);\n logger.info(` reason=${reason} iso=${iso}`);\n }\n logger.info('');\n logger.info('回滚命令:teamix-evo restore <ts>');\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { logger } from '../utils/logger.js';\n\n/**\n * `.teamix-evo/` snapshot module — captures the project state directory before\n * any mutating command runs (`init` / `update` / `variant switch`) so that\n * `teamix-evo restore <ts>` can roll back failed migrations\n * ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n *\n * **Storage layout**\n * ```\n * .teamix-evo/\n * └── .snapshots/\n * ├── 2026-06-11T20-59-03-000Z/\n * │ ├── _meta.json # { ts, reason }\n * │ ├── config.json\n * │ ├── manifest.json\n * │ └── … # everything except .snapshots/ and logs/\n * └── …\n * ```\n *\n * **Exclusions**: `.snapshots/` itself (avoid recursive snapshotting) and\n * `logs/` (high-churn telemetry; not part of the recoverable state surface).\n */\n\nconst TEAMIX_DIR = '.teamix-evo';\nconst SNAPSHOTS_DIR = '.snapshots';\nconst LOGS_DIR = 'logs';\nconst META_FILE = '_meta.json';\n/** Default snapshot retention — older snapshots beyond this count are pruned. */\nconst DEFAULT_KEEP = 5;\n\n/** Reason why a snapshot was taken — surfaces in `restore` listing. */\nexport type SnapshotReason =\n | 'init'\n | 'update'\n | 'switch'\n | 'restore'\n | 'manual';\n\n/** Result of `createSnapshot` when a snapshot was actually taken. */\nexport interface SnapshotResult {\n /** Filesystem-safe UTC timestamp identifier (e.g. `2026-06-11T20-59-03-000Z`). */\n ts: string;\n /** Absolute path to the snapshot directory. */\n path: string;\n}\n\nexport interface CreateSnapshotOptions {\n /** Why the snapshot is being taken — recorded in `_meta.json`. */\n reason?: SnapshotReason;\n /** Retention count (default 5). Older snapshots beyond this are pruned. */\n keep?: number;\n /**\n * Snapshot ts that MUST NOT be pruned even if it falls outside the `keep`\n * window. Used by {@link restoreSnapshot} to prevent the snapshot it is\n * about to read from being pruned by the pre-restore safety snapshot's\n * own retention pass — see ADR 0019 §2.\n */\n protectedTs?: string;\n}\n\n/** A listed snapshot entry returned by `listSnapshots`. */\nexport interface SnapshotEntry {\n /** Filesystem-safe ts identifier (the snapshot directory name). */\n ts: string;\n /** Original ISO ts as recorded in `_meta.json` (or null if meta missing). */\n isoTs: string | null;\n /** Reason recorded in `_meta.json` (or null if meta missing). */\n reason: SnapshotReason | null;\n /** Absolute path to the snapshot directory. */\n path: string;\n}\n\n/**\n * Convert an ISO-8601 timestamp into a filesystem-safe directory name by\n * replacing `:` and `.` with `-`. Order-preserving (lexicographic sort still\n * matches chronological order).\n */\nfunction isoToFsSafe(iso: string): string {\n return iso.replace(/[:.]/g, '-');\n}\n\n/**\n * Inverse of {@link isoToFsSafe} — best-effort reconstruction of the original\n * ISO string. Used when `_meta.json` is missing so `listSnapshots` can still\n * surface a reasonable timestamp.\n */\nfunction fsSafeToIso(safe: string): string {\n // 2026-06-11T20-59-03-000Z → 2026-06-11T20:59:03.000Z\n return safe.replace(\n /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})(Z)$/,\n '$1T$2:$3:$4.$5$6',\n );\n}\n\n/**\n * Capture a point-in-time copy of `.teamix-evo/` (excluding `.snapshots/`\n * and `logs/`). Returns `null` when there is nothing to snapshot\n * (`.teamix-evo/` does not yet exist — typical on the very first `init` run).\n *\n * Subsequent calls automatically prune old snapshots beyond `opts.keep`\n * (default 5) so the directory does not grow unbounded.\n */\nexport async function createSnapshot(\n projectRoot: string,\n opts: CreateSnapshotOptions = {},\n): Promise<SnapshotResult | null> {\n const teamixDir = path.join(projectRoot, TEAMIX_DIR);\n try {\n const stat = await fs.stat(teamixDir);\n if (!stat.isDirectory()) return null;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n\n const isoTs = new Date().toISOString();\n const ts = isoToFsSafe(isoTs);\n const snapshotRoot = path.join(teamixDir, SNAPSHOTS_DIR);\n const target = path.join(snapshotRoot, ts);\n await fs.mkdir(target, { recursive: true });\n\n const entries = await fs.readdir(teamixDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === SNAPSHOTS_DIR) continue;\n if (entry.name === LOGS_DIR) continue;\n const src = path.join(teamixDir, entry.name);\n const dst = path.join(target, entry.name);\n await fs.cp(src, dst, { recursive: true });\n }\n\n const meta = {\n ts: isoTs,\n reason: opts.reason ?? 'manual',\n };\n await fs.writeFile(\n path.join(target, META_FILE),\n JSON.stringify(meta, null, 2) + '\\n',\n 'utf-8',\n );\n\n logger.debug(\n `Snapshot created → ${path.relative(projectRoot, target)} (${meta.reason})`,\n );\n\n const keep = opts.keep ?? DEFAULT_KEEP;\n await pruneSnapshots(projectRoot, keep, { protectedTs: opts.protectedTs });\n\n return { ts, path: target };\n}\n\n/**\n * List existing snapshots ordered newest-first. Returns an empty array when\n * `.teamix-evo/.snapshots/` does not exist.\n */\nexport async function listSnapshots(\n projectRoot: string,\n): Promise<SnapshotEntry[]> {\n const snapshotRoot = path.join(projectRoot, TEAMIX_DIR, SNAPSHOTS_DIR);\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(snapshotRoot, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n\n const result: SnapshotEntry[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const dir = path.join(snapshotRoot, entry.name);\n let isoTs: string | null = null;\n let reason: SnapshotReason | null = null;\n try {\n const raw = await fs.readFile(path.join(dir, META_FILE), 'utf-8');\n const parsed = JSON.parse(raw) as {\n ts?: unknown;\n reason?: unknown;\n };\n if (typeof parsed.ts === 'string') isoTs = parsed.ts;\n if (\n typeof parsed.reason === 'string' &&\n ['init', 'update', 'switch', 'restore', 'manual'].includes(\n parsed.reason,\n )\n ) {\n reason = parsed.reason as SnapshotReason;\n }\n } catch {\n // _meta.json missing or unparseable → reconstruct ts from directory name\n isoTs = fsSafeToIso(entry.name);\n }\n result.push({ ts: entry.name, isoTs, reason, path: dir });\n }\n\n // Directory names embed UTC ISO timestamps; lexicographic sort = chronological.\n result.sort((a, b) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0));\n return result;\n}\n\nexport interface PruneSnapshotsOptions {\n /**\n * Snapshot ts that MUST NOT be pruned even if it falls outside the `keep`\n * window. Lets callers (notably `restoreSnapshot`) protect a snapshot they\n * are about to read from concurrent retention.\n */\n protectedTs?: string;\n}\n\n/**\n * Delete snapshots older than the most recent `keep` entries. Returns the\n * list of pruned ts identifiers (oldest first).\n *\n * When `opts.protectedTs` is set, that snapshot is preserved regardless of\n * its position — used to defuse the restore-prune race (ADR 0019 §2).\n */\nexport async function pruneSnapshots(\n projectRoot: string,\n keep: number = DEFAULT_KEEP,\n opts: PruneSnapshotsOptions = {},\n): Promise<string[]> {\n if (keep < 0)\n throw new Error(`pruneSnapshots: keep must be >= 0, got ${keep}`);\n const snapshots = await listSnapshots(projectRoot);\n if (snapshots.length <= keep) return [];\n\n const tail = snapshots.slice(keep); // newest-first → tail is oldest\n const toRemove = opts.protectedTs\n ? tail.filter((s) => s.ts !== opts.protectedTs)\n : tail;\n const removed: string[] = [];\n for (const snap of toRemove) {\n await fs.rm(snap.path, { recursive: true, force: true });\n removed.push(snap.ts);\n logger.debug(`Pruned snapshot ${snap.ts}`);\n }\n // Return oldest-first for ergonomic caller logging.\n return removed.reverse();\n}\n\n/**\n * Restore `.teamix-evo/` from a previously captured snapshot.\n *\n * Behaviour:\n * 1. Verify the requested snapshot exists (throws otherwise).\n * 2. Take a \"pre-restore\" snapshot of the current state so the restore itself\n * is reversible (recorded with `reason: 'restore'`).\n * 3. Delete every entry under `.teamix-evo/` *except* `.snapshots/` and\n * `logs/`.\n * 4. Copy the snapshot's contents (excluding its `_meta.json`) back into\n * `.teamix-evo/`.\n *\n * Throws when the snapshot ts cannot be located so callers can surface a\n * clear message (\"snapshot not found, run `teamix-evo restore --list` to see\n * available timestamps\").\n */\nexport async function restoreSnapshot(\n projectRoot: string,\n ts: string,\n): Promise<void> {\n const snapshotRoot = path.join(projectRoot, TEAMIX_DIR, SNAPSHOTS_DIR);\n const target = path.join(snapshotRoot, ts);\n try {\n const stat = await fs.stat(target);\n if (!stat.isDirectory()) {\n throw new Error(`Snapshot path is not a directory: ${target}`);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Snapshot not found: \"${ts}\". Run \\`teamix-evo restore --list\\` to see available timestamps.`,\n );\n }\n throw err;\n }\n\n // 1. Pre-restore safety snapshot. Pass `protectedTs: ts` so the snapshot we\n // are about to read from is NOT pruned out of the retention window if it\n // happens to fall beyond `keep` (ADR 0019 §2 — restore-prune race).\n await createSnapshot(projectRoot, { reason: 'restore', protectedTs: ts });\n\n // 2. Wipe `.teamix-evo/` (except .snapshots/ and logs/) so leftover files\n // from a half-applied update don't bleed into the restored state.\n const teamixDir = path.join(projectRoot, TEAMIX_DIR);\n const live = await fs.readdir(teamixDir, { withFileTypes: true });\n for (const entry of live) {\n if (entry.name === SNAPSHOTS_DIR) continue;\n if (entry.name === LOGS_DIR) continue;\n await fs.rm(path.join(teamixDir, entry.name), {\n recursive: true,\n force: true,\n });\n }\n\n // 3. Copy snapshot contents back (skip _meta.json — it's snapshot metadata,\n // not part of the recoverable state).\n const snapshotEntries = await fs.readdir(target, { withFileTypes: true });\n for (const entry of snapshotEntries) {\n if (entry.name === META_FILE) continue;\n const src = path.join(target, entry.name);\n const dst = path.join(teamixDir, entry.name);\n await fs.cp(src, dst, { recursive: true });\n }\n\n logger.debug(`Restored .teamix-evo/ from snapshot ${ts}`);\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport {\n runVariantSwitch,\n type VariantSwitchChange,\n} from '../../core/variant-switch.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\n\ninterface SwitchCmdOptions {\n cwd?: string;\n apply?: boolean;\n yes?: boolean;\n}\n\nconst KIND_ICON: Record<VariantSwitchChange['kind'], string> = {\n rewrite: '✎',\n 'managed-update': '⊕',\n preserve: '⊘',\n unchanged: '=',\n};\n\nconst KIND_LABEL: Record<VariantSwitchChange['kind'], string> = {\n rewrite: 'rewrite',\n 'managed-update': 'managed-update',\n preserve: 'preserve',\n unchanged: 'unchanged',\n};\n\n/**\n * Build a fresh `switch` Command. Factory pattern mirrors `restore` so test\n * runs don't leak commander state between invocations (commander v12 keeps\n * parsed options alive across `parseAsync` calls on the same instance).\n *\n * `teamix-evo switch <new-variant>` — variant migration command per\n * [ADR 0019 §D3](../../../../../docs/adr/0019-project-upgrade-flow.md).\n *\n * Defaults to **dry-run**: prints the file-level change plan without writing.\n * Pass `--apply` (and confirm, unless `-y` / non-TTY) to actually mutate the\n * project.\n */\nexport function createSwitchCommand(): Command {\n return new Command('switch')\n .description(\n 'variant 切换:先展示 file-level diff,--apply 才真写(ADR 0019 §D3)',\n )\n .argument('<new-variant>', '目标 variant id(如 opentrek / uni-manager)')\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('--apply', '真正执行切换(默认 dry-run,仅展示计划)')\n .option('-y, --yes', '跳过 --apply 二次确认(destructive,请确认无误)')\n .action(async (newVariant: string, opts: SwitchCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const apply = opts.apply ?? false;\n\n try {\n // First pass — always run as dry-run to surface the plan.\n const plan = await runVariantSwitch({\n projectRoot: cwd,\n newVariant,\n apply: false,\n });\n\n if (plan.status === 'not-initialized') {\n logger.warn(\n '当前目录未检测到 .teamix-evo/ — 该工程尚未接入 teamix-evo。',\n );\n logger.info('请先运行 `npx teamix-evo@latest init` 接入。');\n process.exitCode = 1;\n return;\n }\n\n if (plan.status === 'already-on-variant') {\n logger.success(`当前 variant 已是 \"${plan.variant}\",无需切换。`);\n return;\n }\n\n if (plan.status === 'variant-not-found') {\n logger.error(`未知 variant:\"${plan.requested}\"`);\n logger.info(`可用 variant:${plan.available.join(', ') || '(none)'}`);\n logger.info(\n '运行 `teamix-evo tokens list-variants` 可查看完整列表。',\n );\n process.exitCode = 1;\n return;\n }\n\n // status === 'dry-run'\n printChangePlan(plan.from, plan.to, plan.toVersion, plan.changes);\n\n if (!apply) {\n logger.info('');\n logger.info(\n '以上为 dry-run 计划。如需真正切换,请加 --apply(建议先 commit 当前改动)。',\n );\n return;\n }\n\n // ─── Apply path ─────────────────────────────────────────────────────\n const isInteractive = Boolean(process.stdin.isTTY);\n if (!opts.yes && isInteractive) {\n logger.info('');\n logger.info(\n 'switch --apply 会重写 regenerable 文件并更新 .teamix-evo/ 状态。',\n );\n logger.info(\n '执行前会自动捕获 reason=\"switch\" snapshot,可通过 `teamix-evo restore <ts>` 回滚。',\n );\n const confirmed = await prompts.confirm({\n message: `继续切换至 \"${newVariant}\"?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n logger.info('已取消。');\n return;\n }\n }\n\n const applied = await runVariantSwitch({\n projectRoot: cwd,\n newVariant,\n apply: true,\n });\n\n if (applied.status !== 'switched') {\n // Should not happen — the dry-run pre-check above would have caught\n // not-initialized / already-on-variant / variant-not-found. Surface\n // any unexpected status defensively.\n logger.error(`switch 异常:状态 ${applied.status}`);\n process.exitCode = 1;\n return;\n }\n\n logger.success(\n `已切换至 variant \"${applied.to}\" (v${applied.toVersion})。`,\n );\n if (applied.snapshot) {\n logger.info(\n `💾 snapshot:${applied.snapshot.ts}(回滚:\\`teamix-evo restore ${applied.snapshot.ts}\\`)`,\n );\n } else if (applied.snapshotError) {\n logger.debug(`snapshot 捕获失败:${applied.snapshotError}`);\n }\n if (applied.hintPath) {\n logger.info('');\n logger.info(`💡 token rename hint: ${applied.hintPath}`);\n logger.info(\n ` 检测到 ${applied.renames.length} 个 token rename,建议调用 \\`teamix-evo-upgrade\\` skill 扫 src/** 给 codemod 建议(ADR 0019 §D4)。`,\n );\n } else {\n logger.info(\n '提示:本次切换未检测到 token rename(新 variant 未声明 renames 或 sinceVersion 均在范围外)。',\n );\n }\n } catch (err) {\n const message = getErrorMessage(err);\n logger.error(`switch 失败:${message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n}\n\nexport const switchCommand = createSwitchCommand();\n\nfunction printChangePlan(\n from: string,\n to: string,\n toVersion: string,\n changes: ReadonlyArray<VariantSwitchChange>,\n): void {\n logger.info('');\n logger.info(`variant 切换计划:${from} → ${to} (v${toVersion})`);\n logger.info('');\n if (changes.length === 0) {\n logger.warn(\n '没有可处理的资源(installed manifest 为空)。请先运行 `teamix-evo init`。',\n );\n return;\n }\n for (const change of changes) {\n const icon = KIND_ICON[change.kind];\n const label = KIND_LABEL[change.kind];\n logger.info(\n ` ${icon} [${label}] ${change.target} (${change.strategy}) — ${change.reason}`,\n );\n }\n}\n","/**\n * `teamix-evo switch <new-variant>` programmatic core.\n *\n * Per [ADR 0019 §D3](../../../../docs/adr/0019-project-upgrade-flow.md):\n *\n * 1. Plan: walk every consumer-installed tokens resource → diff against\n * the new variant's upstream payload → produce a file-level change\n * list.\n * 2. By default (no `--apply`) we **only** report the change list —\n * consumer files are not touched. This is the dry-run gate that ADR\n * 0019 §D3 requires (no silent variant migrations).\n * 3. With `apply: true` we capture a `reason: 'switch'` snapshot, rewrite\n * regenerable files, replay managed regions onto consumer files, then\n * bump `config.json` (`packages.tokens.variant` + `priorVariant`),\n * `tokens-lock.json`, and the installed manifest.\n *\n * The switch logic deliberately leaves the **frozen** tier untouched —\n * users own those files (e.g. `tokens/tokens.overrides.css`). Drift hints\n * are surfaced as part of the change list so the user can manually inspect\n * the new upstream values.\n *\n * Token rename hint emission (`.teamix-evo/.upgrade-hints/tokens-<ts>.json`)\n * is the responsibility of batch 5.2 — this module only records the tuple\n * `(fromVariant, toVariant, ts)` into `config.tokenRenameHistory` with an\n * empty `renames: {}` placeholder so consumers can iterate the history.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledResource,\n type TokensPackLock,\n type TokenRenameEntry,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { mergeManagedRegions } from './managed-merge.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport { computeHash } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { createSnapshot, type SnapshotResult } from './snapshot.js';\nimport {\n selectApplicableRenames,\n writeTokensUpgradeHint,\n} from './upgrade-hints.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_BASENAME_BY_UPSTREAM: Record<string, string> = {\n 'theme.css': 'tokens.theme.css',\n 'overrides.css': 'tokens.overrides.css',\n};\n\n/**\n * One diff entry surfaced by the planner. The kinds are intentionally narrow\n * to make the dry-run output glanceable; richer metadata (hash before/after)\n * is omitted today and can be added when `doctor` consumes this.\n */\nexport interface VariantSwitchChange {\n /** Consumer-relative path of the affected file. */\n target: string;\n /** What would happen to the file on `--apply`. */\n kind:\n | 'rewrite' // regenerable resource — content swap\n | 'managed-update' // managed regions replayed; user content outside preserved\n | 'preserve' // frozen / no upstream counterpart — left alone\n | 'unchanged'; // bytes identical between old and new variants\n /** Strategy recorded at install time. */\n strategy: InstalledResource['strategy'];\n /** Short human-readable reason — appears in CLI dry-run table. */\n reason: string;\n}\n\nexport interface RunVariantSwitchOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Variant id to switch to. Validated against the upstream catalog. */\n newVariant: string;\n /**\n * When true, capture a snapshot then mutate consumer files + state. When\n * false (default) the function is read-only and returns a `dry-run` result.\n */\n apply?: boolean;\n /** Override the tokens package name (defaults to `\"@teamix-evo/tokens\"`). */\n packageName?: string;\n /** Override resolution of the upstream tokens package root (testing hook). */\n packageRoot?: string;\n}\n\nexport type RunVariantSwitchResult =\n | { status: 'not-initialized' }\n | { status: 'already-on-variant'; variant: string }\n | {\n status: 'variant-not-found';\n requested: string;\n available: string[];\n }\n | {\n status: 'dry-run';\n from: string;\n to: string;\n toVersion: string;\n changes: VariantSwitchChange[];\n }\n | {\n status: 'switched';\n from: string;\n to: string;\n toVersion: string;\n changes: VariantSwitchChange[];\n snapshot: SnapshotResult | null;\n snapshotError?: string;\n /** Token renames recorded by the new variant up to `toVersion`. */\n renames: TokenRenameEntry[];\n /** Absolute path of the `.teamix-evo/.upgrade-hints/tokens-<ts>.json` file written when `renames` is non-empty. */\n hintPath?: string;\n };\n\nexport async function runVariantSwitch(\n options: RunVariantSwitchOptions,\n): Promise<RunVariantSwitchResult> {\n const { projectRoot, newVariant, apply = false } = 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 if (currentVariant === newVariant) {\n return { status: 'already-on-variant', variant: currentVariant };\n }\n\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, newVariant);\n if (!variantEntry) {\n return {\n status: 'variant-not-found',\n requested: newVariant,\n available: catalog.variants.map((v) => v.name),\n };\n }\n\n // Index upstream files by basename for strategy-driven dispatch.\n const upstreamByBasename = new Map<string, string>();\n for (const fileRel of variantEntry.files) {\n upstreamByBasename.set(\n path.basename(fileRel),\n path.join(packageRoot, fileRel),\n );\n }\n\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const installedIdx = prior.installed.findIndex(\n (p) => p.package === packageName,\n );\n const priorResources: InstalledResource[] =\n installedIdx >= 0 ? prior.installed[installedIdx]!.resources : [];\n // Capture pre-mutation version for the upgrade-hint payload (the\n // installed manifest is rewritten further below).\n const priorVersion =\n installedIdx >= 0 ? prior.installed[installedIdx]!.version : '0.0.0';\n\n // ─── 1. Plan ──────────────────────────────────────────────────────────────\n const changes: VariantSwitchChange[] = [];\n for (const resource of priorResources) {\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'frozen') {\n changes.push({\n target: resource.target,\n kind: 'preserve',\n strategy: 'frozen',\n reason: 'frozen — user-owned, never auto-overwritten',\n });\n continue;\n }\n\n if (!upstreamAbs) {\n changes.push({\n target: resource.target,\n kind: 'preserve',\n strategy: resource.strategy,\n reason: `no upstream counterpart in variant \"${newVariant}\"`,\n });\n continue;\n }\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n\n if (resource.strategy === 'regenerable') {\n const newHash = computeHash(upstreamContent);\n if (newHash === resource.hash) {\n changes.push({\n target: resource.target,\n kind: 'unchanged',\n strategy: 'regenerable',\n reason: 'identical bytes between old and new variant',\n });\n } else {\n changes.push({\n target: resource.target,\n kind: 'rewrite',\n strategy: 'regenerable',\n reason: `regenerable swap (${currentVariant} → ${newVariant})`,\n });\n }\n continue;\n }\n\n // strategy === 'managed'\n changes.push({\n target: resource.target,\n kind: 'managed-update',\n strategy: 'managed',\n reason: 'managed regions replayed; outside content preserved',\n });\n }\n\n // ─── 2. Dry-run gate ──────────────────────────────────────────────────────\n if (!apply) {\n return {\n status: 'dry-run',\n from: currentVariant,\n to: newVariant,\n toVersion: variantEntry.version,\n changes,\n };\n }\n\n // ─── 3. Apply ─────────────────────────────────────────────────────────────\n // Capture a single timestamp for all records written during this apply phase\n // so that lock, config, and manifest entries share the exact same instant.\n const now = new Date().toISOString();\n\n // Best-effort snapshot: never abort the switch on capture failure (mirrors\n // init / update — ADR 0019 §2 best-effort policy).\n let snapshot: SnapshotResult | null = null;\n let snapshotError: string | undefined;\n try {\n logger.debug(\n `[variant-switch] capturing snapshot (reason=switch, from=${currentVariant}, to=${newVariant})`,\n );\n snapshot = await createSnapshot(projectRoot, { reason: 'switch' });\n logger.debug(\n `[variant-switch] snapshot captured: ${snapshot?.ts ?? '(none)'}`,\n );\n } catch (err) {\n snapshotError = getErrorMessage(err);\n logger.debug(`[variant-switch] snapshot capture failed: ${snapshotError}`);\n }\n\n const refreshedResources: InstalledResource[] = [];\n for (const resource of priorResources) {\n const consumerAbs = path.isAbsolute(resource.target)\n ? resource.target\n : path.join(projectRoot, resource.target);\n const consumerBasename = path.basename(resource.target);\n const upstreamBasename = lookupUpstreamBasename(consumerBasename);\n const upstreamAbs = upstreamBasename\n ? upstreamByBasename.get(upstreamBasename)\n : undefined;\n\n if (resource.strategy === 'regenerable' && upstreamAbs) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n await writeFileSafe(consumerAbs, upstreamContent);\n logger.debug(`[variant-switch] rewrite regenerable: ${resource.target}`);\n refreshedResources.push({\n ...resource,\n hash: computeHash(upstreamContent),\n });\n continue;\n }\n\n if (\n resource.strategy === 'managed' &&\n upstreamAbs &&\n (await fileExists(consumerAbs))\n ) {\n const upstreamContent = await fs.readFile(upstreamAbs, 'utf-8');\n const consumerContent = await fs.readFile(consumerAbs, 'utf-8');\n const merged = mergeManagedRegions(upstreamContent, consumerContent);\n if (merged !== consumerContent) {\n await writeFileSafe(consumerAbs, merged);\n logger.debug(`[variant-switch] managed-update: ${resource.target}`);\n } else {\n logger.debug(\n `[variant-switch] managed-update no-op (bytes unchanged): ${resource.target}`,\n );\n }\n refreshedResources.push({\n ...resource,\n hash: computeHash(merged),\n });\n continue;\n }\n\n // frozen / stale — keep prior resource record verbatim.\n refreshedResources.push(resource);\n }\n\n // Persist new lock.\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: now,\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n logger.debug(\n `[variant-switch] tokens-lock.json updated (variant=${newVariant}, version=${variantEntry.version})`,\n );\n\n // Persist new config — record priorVariant + append to tokenRenameHistory.\n // The applicable rename set is computed from the new variant's full rename\n // log (ADR 0019 §D4) and stored both in the in-config history (machine-\n // readable map) and in the on-disk hint file (machine + AI consumer).\n const renames = selectApplicableRenames(\n variantEntry.renames ?? [],\n '0.0.0',\n variantEntry.version,\n );\n const renamesMap: Record<string, string> = {};\n for (const r of renames) renamesMap[r.from] = r.to;\n\n const switchTs = now;\n config.priorVariant = currentVariant;\n config.packages.tokens.variant = newVariant;\n config.packages.tokens.version = variantEntry.version;\n const history = config.tokenRenameHistory ?? [];\n history.push({\n ts: switchTs,\n fromVariant: currentVariant,\n toVariant: newVariant,\n renames: renamesMap,\n });\n config.tokenRenameHistory = history;\n await writeProjectConfig(projectRoot, config);\n logger.debug(\n `[variant-switch] config.json updated (priorVariant=${currentVariant}, variant=${newVariant}, renames=${renames.length})`,\n );\n\n // Persist new installed manifest entry.\n if (installedIdx >= 0) {\n prior.installed[installedIdx] = {\n ...prior.installed[installedIdx]!,\n variant: newVariant,\n version: variantEntry.version,\n installedAt: now,\n resources: refreshedResources,\n };\n await writeInstalledManifest(projectRoot, prior);\n logger.debug(\n `[variant-switch] installed manifest updated (resources=${refreshedResources.length})`,\n );\n }\n\n // Emit `.teamix-evo/.upgrade-hints/tokens-<ts>.json` when the new variant\n // ships any token renames — mirrors the tokens-update pathway. AI / human\n // can scan src/** and propose codemods using the hint payload.\n let hintPath: string | undefined;\n if (renames.length > 0) {\n const hint = await writeTokensUpgradeHint({\n projectRoot,\n trigger: 'switch',\n fromVariant: currentVariant,\n toVariant: newVariant,\n fromVersion: priorVersion,\n toVersion: variantEntry.version,\n renames,\n isoTs: switchTs,\n });\n if (hint) hintPath = hint.path;\n }\n if (hintPath) {\n logger.debug(`[variant-switch] upgrade hint written: ${hintPath}`);\n }\n logger.debug(\n `[variant-switch] apply complete (from=${currentVariant}, to=${newVariant}, toVersion=${variantEntry.version})`,\n );\n\n return {\n status: 'switched',\n from: currentVariant,\n to: newVariant,\n toVersion: variantEntry.version,\n changes,\n snapshot,\n ...(snapshotError ? { snapshotError } : {}),\n renames,\n ...(hintPath ? { hintPath } : {}),\n };\n}\n\nfunction lookupUpstreamBasename(consumerBasename: string): string | undefined {\n for (const [upstream, consumer] of Object.entries(\n CONSUMER_BASENAME_BY_UPSTREAM,\n )) {\n if (consumer === consumerBasename) return upstream;\n }\n return consumerBasename;\n}\n"],"mappings":"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","names":["Command","createRequire","Command","os","path","path","fs","path","rel","path","p","path","fs","require","path","fs","fs","path","fs","createRequire","require","require","stat","rel","targetFile","newContent","exists","written","path","p","DEFAULT_SKILLS_PACKAGE","p","fs","os","path","TEAMIX_DIR","CONFIG_FILE","Command","path","fs","loadTokensPackageManifest","getVariantEntry","path","TEAMIX_DIR","compareSemver","hasManagedRegion","replaceManagedRegion","DEFAULT_TOKENS_PACKAGE","DEFAULT_TOKENS_PACKAGE","loadTokensPackageManifest","getVariantEntry","p","Command","Command","Command","version","p","Command","Command","Command","fs","path","Command","p","confirm","note","Command","fs","path","Command","Command","fs","path","fs","path","Command","Command","fs","path","exec","promisify","execAsync","promisify","exec","p","Command","p","Command","Command","Command","path","exec","promisify","execAsync","normaliseHex","Command","Command","path","Command","Command","Command","Command","prompts","p","initCommand","Command","Command","prompts","Command","resolveIdesAndScope","Command","listCommand","Command","p","Command","createRequire","DEFAULT_SKILLS_PACKAGE","FLAT_VARIANT","entry","p","require","createRequire","SKILLS_PACKAGE","updateCommand","Command","Command","prompts","path","fs","SKILLS_PACKAGE","uninstallCommand","Command","p","confirm","Command","path","fs","createRequire","loadSkillsPackageManifest","require","createRequire","loadSkillsPackageManifest","p","stat","Command","Command","path","fs","dirExists","rel","p","stat","Command","Command","initCommand","listCommand","updateCommand","uninstallCommand","Command","Command","prompts","initCommand","Command","Command","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","quote","p","path","fs","DEFAULT_UI_PACKAGE","rel","p","mergeResources","addCommand","Command","Command","DEFAULT_UI_PACKAGE","p","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","fs","path","p","stat","path","TEAMIX_DIR","PACKAGE_NAME","isoToFsSafe","createRequire","resolvePackageRoot","loadUiPackageManifest","Command","Command","fs","path","fs","path","rel","quote","TEAMIX_DIR","STAGING_DIR","rel","mergeIntoInstalledManifest","posix","TEAMIX_DIR","STAGING_DIR","p","fs","path","p","rel","Command","p","Command","initCommand","addCommand","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","loadVariantUiPackageManifest","require","createRequire","resolvePackageRoot","loadVariantUiPackageManifest","loadUiPackageManifest","p","mergeResources","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","upgradeCommand","Command","addCommand","listCommand","listVariantsCommand","upgradeCommand","Command","Command","p","mergeResources","addCommand","Command","Command","listCommand","Command","upgradeCommand","Command","addCommand","listCommand","upgradeCommand","Command","Command","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","existsSync","resolve","join","join","text","Command","resolve","join","existsSync","Command","existsSync","resolve","join","Command","resolve","join","existsSync","Command","Command","Command","prompts","path","fs","rel","initCommand","Command","Command","initCommand","Command","path","fs","fs","path","hasPackageJson","fs","path","stat","p","rel","fs","path","hasManagedRegion","replaceManagedRegion","hasManagedRegion","replaceManagedRegion","fs","path","exec","promisify","execAsync","promisify","exec","path","initCommand","Command","Command","path","prompts","fs","path","TEAMIX_DIR","isoToFsSafe","stat","Command","Command","path","prompts","path","fs","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","CONSUMER_BASENAME_BY_UPSTREAM","loadTokensPackageManifest","getVariantEntry","p","lookupUpstreamBasename","Command","require","createRequire","Command","initCommand"]}