teamix-evo 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/tokens/index.ts","../src/commands/tokens/init.ts","../src/ide/QoderAdapter.ts","../src/ide/ClaudeAdapter.ts","../src/ide/index.ts","../src/core/tokens-init.ts","../src/utils/fs.ts","../src/utils/logger.ts","../src/utils/hash.ts","../src/core/state.ts","../src/core/skills-client.ts","../src/core/skills-installer.ts","../src/utils/template.ts","../src/utils/path.ts","../src/utils/mcp.ts","../src/core/skills-add.ts","../src/utils/global-root.ts","../src/commands/tokens/update.ts","../src/core/tokens-update.ts","../src/commands/tokens/list.ts","../src/commands/tokens/list-variants.ts","../src/commands/tokens/uninstall.ts","../src/commands/skills/index.ts","../src/commands/skills/init.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/commands/ui/list.ts","../src/core/ui-list.ts","../src/commands/biz-ui/index.ts","../src/commands/biz-ui/add.ts","../src/core/variant-ui-add.ts","../src/commands/biz-ui/list.ts","../src/commands/biz-ui/list-variants.ts","../src/commands/templates/index.ts","../src/commands/templates/add.ts","../src/commands/templates/list.ts","../src/commands/templates/list-variants.ts","../src/commands/logs/index.ts","../src/commands/logs/analyze.ts","../src/commands/logs/trace.ts","../src/commands/lint/index.ts","../src/commands/lint/init.ts","../src/core/lint-init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { tokensCommand } from './commands/tokens/index.js';\nimport { skillsCommand } from './commands/skills/index.js';\nimport { uiCommand } from './commands/ui/index.js';\nimport { bizUiCommand } from './commands/biz-ui/index.js';\nimport { templatesCommand } from './commands/templates/index.js';\nimport { logsCommand } from './commands/logs/index.js';\nimport { lintCommand } from './commands/lint/index.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json') as { version: string };\n\nconst program = new Command();\n\nprogram\n .name('teamix-evo')\n .description('Where ideas evolve. — AI Coding 套件')\n .version(version);\n\nprogram.addCommand(tokensCommand);\nprogram.addCommand(skillsCommand);\nprogram.addCommand(uiCommand);\nprogram.addCommand(bizUiCommand);\nprogram.addCommand(templatesCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(lintCommand);\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';\n\nexport const tokensCommand = new Command('tokens')\n .description('管理 design tokens(变体级 theme.css 等)');\n\ntokensCommand.addCommand(initCommand);\ntokensCommand.addCommand(updateCommand);\ntokensCommand.addCommand(listCommand);\ntokensCommand.addCommand(listVariantsCommand);\ntokensCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensInit } from '../../core/tokens-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const initCommand = new Command('init')\n .description('初始化设计体系资源(必须显式指定业务变体)')\n .argument('<variant>', '业务变体名称(如 \"opentrek\"、\"uni-manager\")')\n .action(async (variant: string) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Refuse to scaffold tokens/ + .teamix-evo/ into a directory that\n // isn't a valid project root.\n if (!hasPackageJson(projectRoot)) {\n logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exit(1);\n }\n\n logger.info(`Initializing design system: variant=\"${variant}\"`);\n logger.debug(`Project root: ${projectRoot}`);\n logger.debug(`IDE: ${ide.name}`);\n\n logger.info(`Loading variant \"${variant}\"...`);\n logger.info('Installing resources...');\n\n const result = await runTokensInit({\n projectRoot,\n variant,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.info(\n `Design system already initialized (variant: ${result.existingVariant}). ` +\n `Use \"teamix-evo tokens update\" to refresh resources.`,\n );\n return;\n }\n\n if (result.status === 'variant-mismatch') {\n logger.error(\n `Cannot switch tokens variant in place. ` +\n `Currently installed: \"${result.existingVariant}\"; requested: \"${result.requestedVariant}\".`,\n );\n logger.info('To switch variants:');\n logger.info(' 1. teamix-evo tokens uninstall --yes');\n logger.info(` 2. teamix-evo tokens init ${result.requestedVariant}`);\n logger.info(\n 'Note: tokens.overrides.css (frozen) is preserved across uninstall/init by default.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.success(\n `Design system initialized: ${result.packageName} (${result.variant} v${result.version})`,\n );\n logger.info(` Variant: ${result.variant}`);\n logger.info(` Tailwind: v4`);\n logger.info(` Resources: ${result.count} files installed`);\n if (result.skills) {\n const { addedSkillIds, skippedSkillIds, missing } = result.skills;\n if (addedSkillIds.length > 0) {\n logger.info(\n ` Skills: auto-installed ${addedSkillIds.join(', ')}`,\n );\n }\n if (skippedSkillIds.length > 0) {\n logger.info(\n ` Skills: already installed (skipped) ${skippedSkillIds.join(', ')}`,\n );\n }\n if (missing.length > 0) {\n logger.info(\n ` Skills: not in manifest (skipped) ${missing.join(', ')}`,\n );\n }\n }\n logger.info('');\n logger.info('Run \"teamix-evo tokens update\" to update resources later.');\n logger.info(\n 'Run \"teamix-evo tokens list-variants\" to see all available variants.',\n );\n } catch (err) {\n logger.error(`Failed to initialize: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SkillScope } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\n\n/**\n * Qoder IDE adapter.\n * Skill paths:\n * - project: <projectRoot>/.qoder/skills/<name>/\n * - global: ~/.qoder/skills/<name>/\n */\nexport class QoderAdapter implements IdeAdapter {\n readonly kind = 'qoder' as const;\n readonly name = 'qoder';\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // MVP: default to true. Future: check environment variables\n return true;\n }\n\n getSkillTargetDir(\n skillName: string,\n scope: SkillScope,\n projectRoot?: string,\n ): string {\n const base =\n scope === 'global'\n ? path.join(os.homedir(), '.qoder')\n : path.join(projectRoot ?? this.getProjectRoot(), '.qoder');\n return path.join(base, 'skills', skillName);\n }\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SkillScope } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\n\n/**\n * Claude Code IDE adapter.\n * Skill paths:\n * - project: <projectRoot>/.claude/skills/<name>/\n * - global: ~/.claude/skills/<name>/\n */\nexport class ClaudeAdapter implements IdeAdapter {\n readonly kind = 'claude' as const;\n readonly name = 'claude';\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // Best-effort: presence of .claude/ in cwd or CLAUDECODE env var.\n return Boolean(process.env.CLAUDECODE);\n }\n\n getSkillTargetDir(\n skillName: string,\n scope: SkillScope,\n projectRoot?: string,\n ): string {\n const base =\n scope === 'global'\n ? path.join(os.homedir(), '.claude')\n : path.join(projectRoot ?? this.getProjectRoot(), '.claude');\n return path.join(base, 'skills', skillName);\n }\n}\n","import type { SkillIde } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\nimport { QoderAdapter } from './QoderAdapter.js';\nimport { ClaudeAdapter } from './ClaudeAdapter.js';\n\nexport type { IdeAdapter } from './IdeAdapter.js';\nexport { QoderAdapter } from './QoderAdapter.js';\nexport { ClaudeAdapter } from './ClaudeAdapter.js';\n\n/** All supported IDE kinds (also default selection set for skills) */\nexport const ALL_IDE_KINDS: readonly SkillIde[] = ['qoder', 'claude'] as const;\n\n/**\n * Get the adapter for a specific IDE kind.\n */\nexport function getAdapter(kind: SkillIde): IdeAdapter {\n switch (kind) {\n case 'qoder':\n return new QoderAdapter();\n case 'claude':\n return new ClaudeAdapter();\n default: {\n const _exhaustive: never = kind;\n throw new Error(`Unsupported IDE kind: ${_exhaustive as string}`);\n }\n }\n}\n\n/**\n * Detect the current IDE environment and return the appropriate adapter.\n * MVP: prefers Qoder; falls back to Claude if CLAUDECODE env is set.\n */\nexport function detectIde(): IdeAdapter {\n const claude = new ClaudeAdapter();\n if (claude.detectIde()) return claude;\n return new QoderAdapter();\n}\n","/**\n * Programmatic tokens init — installs one variant's token files into the\n * consumer's project root `tokens/` directory.\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md)\n * the install model is now a flat copy: each variant in `@teamix-evo/tokens`\n * advertises its files in the package manifest; for each advertised file we\n * copy by basename into `<projectRoot>/tokens/`:\n *\n * variants/<variant>/theme.css → tokens/tokens.theme.css (regenerable)\n * variants/<variant>/base.tokens.json → (kept in package only — reference data)\n *\n * Plus we always ensure `tokens/tokens.overrides.css` exists at the consumer\n * (created empty if absent, frozen thereafter so user edits are preserved\n * across re-installs).\n *\n * No walk-and-merge, no `default` baseline — every variant is a\n * self-contained token set per ADR 0020 §3.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type TokensPackLock,\n type InstalledManifest,\n type InstalledResource,\n type ProjectConfig,\n type UpdateStrategy,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\nimport { runSkillsAdd } from './skills-add.js';\nimport { ensureMcpJson } from '../utils/mcp.js';\nimport { loadSkillsData } from './skills-client.js';\nimport { logger } from '../utils/logger.js';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst DEFAULT_AUTO_SKILL_IDES: SkillIde[] = ['qoder', 'claude'];\nconst DEFAULT_AUTO_SKILL_SCOPE: SkillScope = 'project';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\n\n/** Consumer-side directory where token files land. */\nconst CONSUMER_TOKENS_DIR = 'tokens';\n\n/** Consumer-side filename for the regenerable theme. */\nconst CONSUMER_THEME_FILE = 'tokens.theme.css';\n\n/** Consumer-side filename for the frozen user-owned override. */\nconst CONSUMER_OVERRIDES_FILE = 'tokens.overrides.css';\n\n/** Default empty content for a fresh `tokens.overrides.css`. */\nconst EMPTY_OVERRIDES_TEMPLATE = `/* User-owned token overrides — frozen on subsequent installs. */\n/* See @teamix-evo/tokens variant theme.css for available CSS custom properties. */\n`;\n\nconst require = createRequire(import.meta.url);\n\nexport interface RunTokensInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Tokens variant id (e.g. `\"opentrek\"`, `\"uni-manager\"`). */\n variant: string;\n /** IDE identifier written into config.json (e.g. `\"qoder\"`, `\"claude\"`). */\n ide: string;\n /** Override the tokens package name (defaults to `\"@teamix-evo/tokens\"`). */\n packageName?: string;\n /**\n * Override resolution of the tokens package root. When provided, skips\n * `require.resolve(\"<packageName>/package.json\")`. Useful for tests that\n * want to point at a fixture tree, and for embedding inside `create`\n * where the package may not yet be installed in the consumer.\n */\n packageRoot?: string;\n}\n\n/**\n * Outcome of the post-init skill auto-install step. `attempted` is the variant\n * skill id we tried to install; `addedSkillIds` is what was actually installed\n * (empty if the skill was already present); `missing` lists ids that aren't in\n * the manifest (warned, not fatal). Per ADR / \"skills self-contained\" decision,\n * each variant skill is fully self-contained — no separate baseline skill.\n */\nexport interface SkillsAutoInstallResult {\n attempted: string[];\n addedSkillIds: string[];\n skippedSkillIds: string[];\n missing: string[];\n}\n\nexport type RunTokensInitResult =\n | {\n status: 'installed';\n packageName: string;\n variant: string;\n version: string;\n count: number;\n resources: InstalledResource[];\n /** Result of the auto-install of the matching design skill. */\n skills?: SkillsAutoInstallResult;\n }\n | {\n status: 'already-initialized';\n existingVariant: string;\n }\n | {\n status: 'variant-mismatch';\n existingVariant: string;\n requestedVariant: string;\n };\n\n/**\n * Programmatic equivalent of `teamix-evo tokens init <variant>`.\n *\n * Side effects:\n * - Creates `<projectRoot>/.teamix-evo/`\n * - Copies the variant's `theme.css` to `<projectRoot>/tokens/tokens.theme.css`\n * - Ensures `<projectRoot>/tokens/tokens.overrides.css` exists (frozen)\n * - Writes `tokens-lock.json`, `config.json`, `manifest.json` (installed)\n *\n * No interactive prompts, no `process.exit`. Throws on hard failure (P8).\n */\nexport async function runTokensInit(\n options: RunTokensInitOptions,\n): Promise<RunTokensInitResult> {\n const { projectRoot, variant, ide } = options;\n const packageName = options.packageName ?? DEFAULT_TOKENS_PACKAGE;\n\n await ensureTeamixDir(projectRoot);\n\n // Resolve the catalog up front so variant-name validation runs before any\n // state-driven branching (#P2-3). An unknown variant should produce a\n // clear \"Unknown variant\" error regardless of whether tokens are already\n // installed for the project.\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, variant);\n if (!variantEntry) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Unknown variant \"${variant}\". Available variants: ${\n known || '(none)'\n }.\\nRun \\`teamix-evo tokens list-variants\\` to see all options.`,\n );\n }\n\n // Variant-switching guard: if a different variant is already installed,\n // require the user to explicitly uninstall first (#15). Same-variant re-init\n // is a no-op (already-initialized).\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.tokens) {\n const existingVariant = existingConfig.packages.tokens.variant;\n if (existingVariant === variant) {\n return { status: 'already-initialized', existingVariant };\n }\n return {\n status: 'variant-mismatch',\n existingVariant,\n requestedVariant: variant,\n };\n }\n\n // Install advertised files by basename → consumer tokens/ directory.\n const installed: InstalledResource[] = [];\n for (const fileRel of variantEntry.files) {\n const result = await installVariantFile(fileRel, packageRoot, projectRoot);\n if (result) installed.push(result);\n }\n\n // Always ensure the user-owned overrides file exists (frozen).\n const overridesAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n CONSUMER_OVERRIDES_FILE,\n );\n if (!(await fileExists(overridesAbs))) {\n await writeFileSafe(overridesAbs, EMPTY_OVERRIDES_TEMPLATE);\n }\n const overridesContent = await fs.readFile(overridesAbs, 'utf-8');\n installed.push({\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: path.posix.join(CONSUMER_TOKENS_DIR, CONSUMER_OVERRIDES_FILE),\n hash: computeHash(overridesContent),\n strategy: 'frozen',\n });\n\n // Write consumer-side state files.\n const lock: TokensPackLock = {\n schemaVersion: 1,\n variant: {\n name: variantEntry.name,\n displayName: variantEntry.displayName,\n version: variantEntry.version,\n from: packageName,\n },\n packageVersion: catalog.version,\n linked: variantEntry.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n\n // Merge into existing config so unrelated package entries (skills / ui)\n // aren't clobbered (#18).\n const config: ProjectConfig = {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide: existingConfig?.ide ?? ide,\n packages: {\n ...(existingConfig?.packages ?? {}),\n tokens: {\n variant,\n version: variantEntry.version,\n tailwind: 'v4',\n },\n },\n };\n await writeProjectConfig(projectRoot, config);\n\n // Merge into existing installed manifest so other packages (ui / biz-ui /\n // templates) recorded earlier are preserved.\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const tokensIdx = prior.installed.findIndex((p) => p.package === packageName);\n const tokensEntry = {\n package: packageName,\n variant,\n version: variantEntry.version,\n installedAt: new Date().toISOString(),\n resources: installed,\n };\n if (tokensIdx >= 0) prior.installed[tokensIdx] = tokensEntry;\n else prior.installed.push(tokensEntry);\n await writeInstalledManifest(projectRoot, prior);\n\n // Ensure `.mcp.json` exists for incremental adopters (#BUG-103). Done\n // before the auto-skills install so even if the latter fails the MCP\n // wiring is in place.\n await ensureMcpJson(projectRoot);\n\n // After the lock + manifest are persisted, auto-install matching skills.\n // Failures here do NOT roll back the install — the skill layer is additive,\n // and the user can always re-run `skills 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 (${\n (err as Error).message\n }).`,\n );\n return {\n attempted: [],\n addedSkillIds: [],\n skippedSkillIds: [],\n missing: desired,\n };\n }\n\n const present = desired.filter((id) => manifestSkillIds.has(id));\n const missing = desired.filter((id) => !manifestSkillIds.has(id));\n if (missing.length > 0) {\n logger.warn(\n `Skills auto-install: not found in manifest, skipping: ${missing.join(\n ', ',\n )}.`,\n );\n }\n if (present.length === 0) {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n\n try {\n const result = await runSkillsAdd({\n projectRoot,\n names: present,\n ides: DEFAULT_AUTO_SKILL_IDES,\n scope: DEFAULT_AUTO_SKILL_SCOPE,\n ide,\n });\n if (result.status !== 'installed') {\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: present,\n missing,\n };\n }\n return {\n attempted: desired,\n addedSkillIds: result.addedSkillIds,\n skippedSkillIds: result.skippedSkillIds,\n missing,\n };\n } catch (err) {\n logger.warn(\n `Skills auto-install failed (continuing): ${(err as Error).message}`,\n );\n return {\n attempted: desired,\n addedSkillIds: [],\n skippedSkillIds: [],\n missing,\n };\n }\n}\n\n/**\n * Install one advertised variant file. Mapping by basename:\n *\n * theme.css → consumer `tokens/tokens.theme.css` (regenerable)\n * overrides.css → consumer `tokens/tokens.overrides.css` (frozen, see runTokensInit)\n * anything else → skipped (reference data — kept in npm package only)\n *\n * The `overrides.css` source file is rare today (variants don't ship one),\n * but the mapping is here so authors can opt in. The \"always-create\" path in\n * `runTokensInit` covers the normal case where no source override is present.\n */\nasync function installVariantFile(\n fileRelToPackage: string,\n packageRoot: string,\n projectRoot: string,\n): Promise<InstalledResource | null> {\n const sourceAbs = path.join(packageRoot, fileRelToPackage);\n const base = path.basename(fileRelToPackage);\n\n if (base === 'theme.css') {\n const targetRel = path.posix.join(\n CONSUMER_TOKENS_DIR,\n CONSUMER_THEME_FILE,\n );\n const targetAbs = path.join(projectRoot, targetRel);\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n return {\n id: `tokens:${CONSUMER_THEME_FILE}`,\n target: targetRel,\n hash: computeHash(content),\n strategy: 'regenerable',\n };\n }\n\n if (base === 'overrides.css' || base === 'tokens.overrides.css') {\n const targetRel = path.posix.join(\n CONSUMER_TOKENS_DIR,\n CONSUMER_OVERRIDES_FILE,\n );\n const targetAbs = path.join(projectRoot, targetRel);\n if (await fileExists(targetAbs)) {\n // Frozen — leave the user's customization alone.\n const existing = await fs.readFile(targetAbs, 'utf-8');\n return {\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: targetRel,\n hash: computeHash(existing),\n strategy: 'frozen',\n };\n }\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n return {\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: targetRel,\n hash: computeHash(content),\n strategy: 'frozen',\n };\n }\n\n // Reference data (e.g. base.tokens.json) — kept in the npm package only.\n return null;\n}\n\n/**\n * Resolve the tokens package root via `require.resolve` so the CLI works\n * both inside the workspace (pnpm symlinks) and from a published consumer.\n */\nfunction resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n\n/**\n * List all variants advertised by the top-level tokens catalog. Used by\n * `teamix-evo tokens list-variants`.\n */\nexport interface ListVariantsResult {\n packageName: string;\n packageVersion: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n linked?: { 'biz-ui'?: string; templates?: string };\n }>;\n}\n\nexport async function listTokenVariants(\n packageName: string = DEFAULT_TOKENS_PACKAGE,\n packageRoot?: string,\n): Promise<ListVariantsResult> {\n const root = packageRoot ?? resolveTokensPackageRoot(packageName);\n const catalog = await loadTokensPackageManifest(root);\n return {\n packageName,\n packageVersion: catalog.version,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n linked: v.linked,\n })),\n };\n}\n\n// Re-export the strategy enum constituents so consumers don't have to import\n// from registry separately.\nexport type { UpdateStrategy };\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Recursively create a directory (like mkdir -p).\n */\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Atomic write: write to a .tmp file first, then rename.\n */\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n const tmp = filePath + \".tmp\";\n await fs.writeFile(tmp, content, \"utf-8\");\n await fs.rename(tmp, filePath);\n}\n\n/**\n * Read a file or return null if it doesn't exist.\n */\nexport async function readFileOrNull(\n filePath: string,\n): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\n/**\n * Create a backup of a file under `.teamix-evo/.backups/`.\n */\nexport async function backupFile(\n filePath: string,\n projectRoot: string,\n): Promise<void> {\n const content = await readFileOrNull(filePath);\n if (content === null) {\n logger.debug(`Skip backup: ${filePath} does not exist`);\n return;\n }\n\n const rel = path.relative(projectRoot, filePath);\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(\n projectRoot,\n \".teamix-evo\",\n \".backups\",\n `${rel}.${timestamp}.bak`,\n );\n\n await ensureDir(path.dirname(backupPath));\n await fs.writeFile(backupPath, content, \"utf-8\");\n logger.debug(`Backed up ${rel} → ${path.relative(projectRoot, backupPath)}`);\n}\n\n/**\n * Check whether a file exists.\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { red, yellow, cyan, green, gray } from \"kolorist\";\n\nconst isDebug = process.env.TEAMIX_DEBUG === \"1\";\n\nexport const logger = {\n info(msg: string): void {\n console.log(cyan(\"ℹ\"), msg);\n },\n\n warn(msg: string): void {\n console.warn(yellow(\"⚠\"), msg);\n },\n\n error(msg: string): void {\n console.error(red(\"✖\"), msg);\n },\n\n success(msg: string): void {\n console.log(green(\"✔\"), msg);\n },\n\n debug(msg: string): void {\n if (isDebug) {\n console.log(gray(\"⊡\"), gray(msg));\n }\n },\n};\n","import { createHash } from \"node:crypto\";\n\n/**\n * Compute a SHA-256 hash of the given content.\n * Returns a string in the format \"sha256:<hex>\".\n */\nexport function computeHash(content: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n return `sha256:${hash}`;\n}\n","import * as path from \"node:path\";\nimport type {\n ProjectConfig,\n InstalledManifest,\n SkillsLock,\n TokensPackLock,\n} from \"@teamix-evo/registry\";\nimport {\n validateConfig,\n validateInstalled,\n validateSkillsLock,\n TokensPackLockSchema,\n} from \"@teamix-evo/registry\";\nimport { readFileOrNull, writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst TEAMIX_DIR = \".teamix-evo\";\nconst CONFIG_FILE = \"config.json\";\nconst MANIFEST_FILE = \"manifest.json\";\nconst TOKENS_LOCK_FILE = \"tokens-lock.json\";\nconst SKILLS_DIR = \"skills\";\nconst SKILLS_LOCK_FILE = \"manifest.lock.json\";\n\n/**\n * Get the .teamix-evo directory path for a project.\n */\nexport function getTeamixDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR);\n}\n\n/**\n * Ensure the .teamix-evo directory exists.\n */\nexport async function ensureTeamixDir(projectRoot: string): Promise<string> {\n const dir = getTeamixDir(projectRoot);\n await ensureDir(dir);\n return dir;\n}\n\n/**\n * Read the project config from .teamix-evo/config.json.\n * Returns null if the file does not exist; THROWS on corrupted content\n * so callers don't silently clobber prior config (#32 #18).\n */\nexport async function readProjectConfig(\n projectRoot: string,\n): Promise<ProjectConfig | null> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n const raw = await readFileOrNull(configPath);\n if (raw === null) return null;\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Corrupted config.json (${(err as Error).message}). ` +\n `Fix the JSON manually or remove the file to start fresh; refusing to clobber prior config.`,\n );\n }\n const result = validateConfig(data);\n if (!result.success) {\n throw new Error(\n `Invalid config.json schema: ${result.error}. ` +\n `Fix the file manually or remove it to start fresh.`,\n );\n }\n return result.data;\n}\n\n/**\n * Write the project config to .teamix-evo/config.json.\n */\nexport async function writeProjectConfig(\n projectRoot: string,\n config: ProjectConfig,\n): Promise<void> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n await writeFileSafe(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n logger.debug(`Wrote config → ${configPath}`);\n}\n\n/**\n * Read the installed manifest from .teamix-evo/manifest.json.\n * Returns null if the file does not exist; THROWS on corrupted content so\n * callers don't silently lose prior installs by treating broken JSON as\n * \"fresh install\" (#32 #18). Use `readInstalledManifestOrNull` for the\n * old lenient behavior.\n */\nexport async function readInstalledManifest(\n projectRoot: string,\n): Promise<InstalledManifest | null> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n const raw = await readFileOrNull(manifestPath);\n if (raw === null) return null;\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Corrupted manifest.json (${(err as Error).message}). ` +\n `Fix the JSON manually or remove the file to start fresh; refusing to clobber prior install records.`,\n );\n }\n const result = validateInstalled(data);\n if (!result.success) {\n throw new Error(\n `Invalid manifest.json schema: ${result.error}. ` +\n `Fix the file manually or remove it to start fresh.`,\n );\n }\n return result.data;\n}\n\n/**\n * Write the installed manifest to .teamix-evo/manifest.json.\n */\nexport async function writeInstalledManifest(\n projectRoot: string,\n manifest: InstalledManifest,\n): Promise<void> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n await writeFileSafe(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n logger.debug(`Wrote manifest → ${manifestPath}`);\n}\n\n/**\n * Read .teamix-evo/tokens-lock.json. Returns null if missing or invalid.\n */\nexport async function readTokensLock(\n projectRoot: string,\n): Promise<TokensPackLock | null> {\n const lockPath = path.join(projectRoot, TEAMIX_DIR, TOKENS_LOCK_FILE);\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const parsed = TokensPackLockSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n logger.warn(`Invalid tokens-lock.json: ${parsed.error.message}`);\n return null;\n }\n return parsed.data;\n } catch (err) {\n logger.warn(\n `Failed to parse tokens-lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Convenience: read just the variant id from tokens-lock.json. Returns null\n * when no tokens variant has been installed.\n */\nexport async function readTokensVariant(\n projectRoot: string,\n): Promise<string | null> {\n const lock = await readTokensLock(projectRoot);\n return lock?.variant.name ?? null;\n}\n\n/**\n * Absolute path to the per-skill source directory (consumer-side source).\n * Per ADR 0013, this is the truth source from which IDE mirrors are produced.\n */\nexport function getSkillsSourceDir(\n projectRoot: string,\n skillName?: string,\n): string {\n const base = path.join(projectRoot, TEAMIX_DIR, SKILLS_DIR);\n return skillName ? path.join(base, skillName) : base;\n}\n\n/**\n * Read .teamix-evo/skills/manifest.lock.json. Returns null if missing.\n */\nexport async function readSkillsLock(\n projectRoot: string,\n): Promise<SkillsLock | null> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const data = JSON.parse(raw);\n const result = validateSkillsLock(data);\n if (!result.success) {\n logger.warn(`Invalid skills manifest.lock.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(\n `Failed to parse skills manifest.lock.json: ${(err as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * Write .teamix-evo/skills/manifest.lock.json.\n */\nexport async function writeSkillsLock(\n projectRoot: string,\n lock: SkillsLock,\n): Promise<void> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n await writeFileSafe(lockPath, JSON.stringify(lock, null, 2) + \"\\n\");\n logger.debug(`Wrote skills lock → ${lockPath}`);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { SkillsPackageManifest } from '@teamix-evo/registry';\nimport { loadSkillsPackageManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolve the package root directory for the skills package.\n */\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Load the skills package manifest and optional shared `_data.json`.\n *\n * @param packageName - e.g. \"@teamix-evo/skills\"\n */\nexport async function loadSkillsData(packageName: string): Promise<{\n manifest: SkillsPackageManifest;\n data: Record<string, unknown>;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n\n logger.debug(`Resolved skills package root: ${packageRoot}`);\n\n const manifest = await loadSkillsPackageManifest(packageRoot);\n\n let data: Record<string, unknown> = {};\n const dataPath = path.join(packageRoot, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, packageRoot };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n SkillEntry,\n SkillsPackageManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport {\n replaceManagedRegion,\n hasManagedRegion,\n} from '@teamix-evo/registry';\nimport { getAdapter } from '../ide/index.js';\nimport {\n writeFileSafe,\n readFileOrNull,\n fileExists,\n ensureDir,\n backupFile,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { renderTemplate, loadTemplateFile } from '../utils/template.js';\nimport { logger } from '../utils/logger.js';\nimport { walkDir } from '../utils/path.js';\nimport { getSkillsSourceDir } from './state.js';\n\n/**\n * Source-mirror skills installer (per ADR 0013).\n *\n * Two-stage flow:\n * 1. **writeSkillSources** — render upstream `<packageRoot>/<skill.source>` and\n * write to `<projectRoot>/.teamix-evo/skills/<id>/` (the consumer-side\n * source of truth, regenerable, in git).\n * 2. **syncSkillsToIdes** — pure byte-for-byte copy from source dir to each\n * requested IDE mirror path (`.qoder/skills/<id>/`, `.claude/skills/<id>/`).\n * Mirrors are 100% derived; not subject to managed-region preservation.\n *\n * `installSkills` orchestrates both. `updateSkills` re-renders the source with\n * managed-region preservation against the existing source (NOT the mirrors),\n * then re-syncs.\n */\n\nexport interface SkillInstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** Skills package manifest */\n manifest: SkillsPackageManifest;\n /** Template data */\n data: Record<string, unknown>;\n /** Absolute skills package root */\n packageRoot: string;\n /** IDE kinds to install for (intersection with skill.ides is computed) */\n ides: readonly SkillIde[];\n /** Install scope */\n scope: SkillScope;\n /** Optional: limit to specific skill ids */\n onlyIds?: string[];\n}\n\nexport interface SkillInstallResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Install (or reinstall) all skills declared in the manifest using the\n * source-mirror flow. Returns InstalledResource records for both source files\n * and IDE mirror files.\n */\nexport async function installSkills(\n options: SkillInstallOptions,\n): Promise<SkillInstallResult> {\n const { manifest, ides, scope, onlyIds } = options;\n const installed: InstalledResource[] = [];\n\n const targets = manifest.skills.filter(\n (s) => !onlyIds || onlyIds.includes(s.id),\n );\n\n for (const skill of targets) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) {\n logger.warn(\n `Skill \"${skill.name}\" supports [${skill.ides.join(\n ',',\n )}], no overlap with [${ides.join(',')}]; skipped.`,\n );\n continue;\n }\n\n const sourceRecords = await writeSkillSource(skill, options);\n installed.push(...sourceRecords);\n\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n options.projectRoot,\n );\n installed.push(...mirrorRecords);\n }\n }\n\n return { resources: installed, count: installed.length };\n}\n\n/**\n * Render upstream skill source(s) and write to `.teamix-evo/skills/<id>/`.\n * Returns InstalledResource records (one per file) describing the source files.\n */\nasync function writeSkillSource(\n skill: SkillEntry,\n options: SkillInstallOptions,\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n const records: InstalledResource[] = [];\n\n if (stat.isFile()) {\n const targetFile = path.join(targetDir, 'SKILL.md');\n const content = await renderSkillContent(sourceAbs, skill, data);\n await writeFileSafe(targetFile, content);\n records.push(makeSourceRecord(skill, targetFile, content));\n logger.debug(` Wrote source: ${targetFile}`);\n return records;\n }\n\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n for (const entry of entries) {\n const rel = path.relative(sourceAbs, entry);\n let targetFile = path.join(targetDir, rel);\n if (skill.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\n await writeFileSafe(targetFile, content);\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n logger.debug(` Wrote source: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Mirror an installed skill source to a single IDE path.\n *\n * Per ADR 0013, mirrors are normally pure byte-for-byte copies of source.\n * However, when the existing mirror file already contains managed-region\n * markers that match the skill's declared `managedRegions`, the writer falls\n * back to a managed-region replacement (#BUG-101) so user-authored notes\n * outside the markers are preserved across `skills update` / `skills sync`.\n * If markers are absent, the full source content is written (backward-compat).\n */\nasync function mirrorSkillToIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n projectRoot: string,\n): Promise<InstalledResource[]> {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const records: InstalledResource[] = [];\n\n const sourceFiles = await walkDir(sourceDir);\n await ensureDir(targetDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n records.push(\n makeMirrorRecord(skill, targetFile, writtenContent, ide, scope, rel),\n );\n logger.debug(` Mirrored ${ide}:${scope}: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Write a mirror file with optional managed-region preservation (#BUG-101).\n *\n * Behavior:\n * - Target absent → full write of source.\n * - `managedRegions` empty/undefined OR existing mirror has no matching\n * markers → full overwrite (with drift warning if content differs).\n * - Otherwise → replace each present managed region's content from the\n * source into the existing mirror, preserving content outside markers.\n *\n * Returns the bytes actually written (used for the InstalledResource hash).\n */\nasync function writeMirrorContent(\n targetFile: string,\n sourceContent: string,\n managedRegions: readonly string[] | undefined,\n sourceFile: string,\n): Promise<string> {\n const existing = await readFileOrNull(targetFile);\n\n if (existing === null) {\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n\n const regions = managedRegions ?? [];\n const matchedRegions = regions.filter((id) => hasManagedRegion(existing, id));\n\n if (matchedRegions.length === 0) {\n if (existing !== sourceContent) {\n logger.warn(\n `Mirror drift detected at ${targetFile} — overwriting from source. ` +\n `Edit ${sourceFile} (not the mirror) and re-run \\`teamix-evo skills sync\\`.`,\n );\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n return existing;\n }\n\n let merged = existing;\n for (const id of matchedRegions) {\n const newRegion = extractRegionBody(sourceContent, id);\n if (newRegion === null) continue;\n try {\n merged = replaceManagedRegion(merged, id, newRegion);\n } catch {\n // Region present in existing but pattern failed; skip safely.\n }\n }\n if (merged !== existing) {\n await writeFileSafe(targetFile, merged);\n }\n return merged;\n}\n\nfunction extractRegionBody(content: string, id: string): string | null {\n const re = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(\n id,\n )}\" -->`,\n );\n const m = content.match(re);\n if (!m) return null;\n return m[1]!.replace(/^\\n/, '').replace(/\\n$/, '');\n}\n\nasync function renderSkillContent(\n sourceAbs: string,\n skill: SkillEntry,\n data: Record<string, unknown>,\n): Promise<string> {\n if (skill.template ?? sourceAbs.endsWith('.hbs')) {\n const tpl = await loadTemplateFile(sourceAbs);\n return renderTemplate(tpl, { ...data, skill });\n }\n return fs.readFile(sourceAbs, 'utf-8');\n}\n\nfunction makeSourceRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n rel?: string,\n): InstalledResource {\n const id = rel ? `${skill.id}:source:${rel}` : `${skill.id}:source`;\n return {\n id,\n target: targetAbs,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n };\n}\n\nfunction makeMirrorRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n ide: SkillIde,\n scope: SkillScope,\n rel?: string,\n): InstalledResource {\n const id = rel && rel !== 'SKILL.md' ? `${skill.id}:${rel}` : skill.id;\n return {\n id,\n target: targetAbs,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n ide,\n scope,\n };\n}\n\nexport interface SkillUpdateOptions extends SkillInstallOptions {\n /**\n * Optional: existing installed records (legacy parameter kept for callers that\n * still pass it). The refactored updater consults the file-system source under\n * `.teamix-evo/skills/<id>/` for managed-region preservation, so this is\n * unused by the new flow. Callers should stop passing it.\n */\n installed?: InstalledResource[];\n /**\n * 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(\n skill,\n options,\n summary,\n );\n updated.push(...sourceRecords);\n\n // Mirrors are always overwritten cleanly from the (now updated) source.\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n projectRoot,\n );\n updated.push(...mirrorRecords);\n }\n }\n\n return { resources: updated, summary };\n}\n\nasync function rewriteSkillSource(\n skill: SkillEntry,\n options: SkillUpdateOptions,\n summary: SkillUpdateResult['summary'],\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n\n if (!stat.isFile()) {\n // Directory skills always overwrite source recursively.\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n const records: InstalledResource[] = [];\n for (const entry of entries) {\n const rel = path.relative(sourceAbs, entry);\n let targetFile = path.join(targetDir, rel);\n if (skill.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\n const exists = await fileExists(targetFile);\n if (exists) {\n await backupFile(targetFile, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetFile, content);\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n }\n return records;\n }\n\n // Single-file skill: target = .teamix-evo/skills/<id>/SKILL.md\n const targetFile = path.join(targetDir, 'SKILL.md');\n const newContent = await renderSkillContent(sourceAbs, skill, data);\n const exists = await fileExists(targetFile);\n\n if (skill.updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n const current = (await readFileOrNull(targetFile)) ?? newContent;\n return [makeSourceRecord(skill, targetFile, current)];\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n return [makeSourceRecord(skill, targetFile, newContent)];\n }\n\n if (skill.updateStrategy === 'regenerable' || !exists) {\n if (exists) {\n await backupFile(targetFile, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetFile, newContent);\n return [makeSourceRecord(skill, targetFile, newContent)];\n }\n\n // managed: preserve outside-region content from the existing SOURCE.\n const current = await readFileOrNull(targetFile);\n let merged = current ?? newContent;\n for (const regionId of skill.managedRegions ?? []) {\n const re = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n regionId,\n )}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(\n regionId,\n )}\" -->`,\n );\n const match = newContent.match(re);\n if (match) {\n const region = match[1]!.replace(/^\\n/, '').replace(/\\n$/, '');\n try {\n merged = replaceManagedRegion(merged, regionId, region);\n } catch {\n logger.warn(\n `Managed region \"${regionId}\" not found in ${targetFile}. Skipped.`,\n );\n }\n }\n }\n await backupFile(targetFile, projectRoot);\n await writeFileSafe(targetFile, merged);\n summary.managed++;\n return [makeSourceRecord(skill, targetFile, merged)];\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Sync existing skill sources to the requested IDE mirror paths.\n *\n * Used by:\n * - `skills add` (immediate mirror after source write — handled by installSkills)\n * - `skills sync` (re-mirror after the user adds an IDE or moves machines)\n * - `skills update` (re-mirror after source is rewritten)\n *\n * `onlyIds` lets the caller limit which skills are synced.\n */\nexport interface SkillSyncOptions {\n projectRoot: string;\n /** Skills present in the source dir to mirror (caller derives from lock). */\n skills: ReadonlyArray<{\n id: string;\n name: string;\n updateStrategy: SkillEntry['updateStrategy'];\n /** Managed-region ids for region-aware mirror sync. */\n managedRegions?: readonly string[];\n }>;\n ides: readonly SkillIde[];\n scope: SkillScope;\n onlyIds?: string[];\n}\n\nexport interface SkillSyncResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Mirror existing source dirs (`.teamix-evo/skills/<id>/`) to the given IDE\n * paths. Pure byte-for-byte copy — no rendering, no merge.\n */\nexport async function syncSkillsToIdes(\n options: SkillSyncOptions,\n): Promise<SkillSyncResult> {\n const { projectRoot, skills, ides, scope, onlyIds } = options;\n const out: InstalledResource[] = [];\n\n const targets = skills.filter((s) => !onlyIds || onlyIds.includes(s.id));\n for (const skill of targets) {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n if (!(await fileExists(sourceDir))) {\n logger.warn(\n `Skill \"${skill.id}\" has no source at ${sourceDir}; skipped.`,\n );\n continue;\n }\n for (const ide of ides) {\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(\n skill.name,\n scope,\n projectRoot,\n );\n await ensureDir(targetDir);\n const sourceFiles = await walkDir(sourceDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n // Region-aware mirror write (#BUG-101): keep user content outside\n // managed markers when the mirror already has them; otherwise full\n // overwrite (with drift warning).\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n out.push({\n id: rel === 'SKILL.md' ? skill.id : `${skill.id}:${rel}`,\n target: targetFile,\n hash: computeHash(writtenContent),\n strategy: skill.updateStrategy,\n ide,\n scope,\n });\n }\n }\n }\n return { resources: out, count: out.length };\n}\n\n/**\n * Remove all installed skill files. Returns the absolute paths removed.\n * After files are unlinked, walks up the directory tree pruning empty dirs\n * until a non-empty ancestor is reached (#33).\n */\nexport async function removeSkillFiles(\n records: InstalledResource[],\n): Promise<string[]> {\n const removed: string[] = [];\n for (const r of records) {\n try {\n await fs.unlink(r.target);\n removed.push(r.target);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(`Failed to remove ${r.target}: ${(err as Error).message}`);\n }\n }\n }\n // Walk-up empty-dir prune. Collect immediate parents, then for each, walk\n // up the tree calling rmdir as long as the dir is empty. Bound the walk\n // to a small depth to prevent runaway in pathological filesystems.\n const startDirs = new Set(records.map((r) => path.dirname(r.target)));\n for (const startDir of startDirs) {\n let dir = startDir;\n for (let depth = 0; depth < 8; depth++) {\n try {\n const entries = await fs.readdir(dir);\n if (entries.length !== 0) break;\n await fs.rmdir(dir);\n } catch {\n break;\n }\n dir = path.dirname(dir);\n }\n }\n return removed;\n}\n","import Handlebars from 'handlebars';\nimport * as fs from 'node:fs/promises';\n\n// Register custom helpers\nHandlebars.registerHelper('lowercase', (str: unknown) => {\n return typeof str === 'string'\n ? str.toLowerCase()\n : String(str ?? '').toLowerCase();\n});\n\n/** LRU-style compilation cache to avoid recompiling the same template */\nconst compiledCache = new Map<string, HandlebarsTemplateDelegate>();\nconst MAX_CACHE_SIZE = 64;\n\nfunction getCompiledTemplate(\n templateContent: string,\n): HandlebarsTemplateDelegate {\n let compiled = compiledCache.get(templateContent);\n if (!compiled) {\n if (compiledCache.size >= MAX_CACHE_SIZE) {\n // Evict oldest entry\n const firstKey = compiledCache.keys().next().value!;\n compiledCache.delete(firstKey);\n }\n compiled = Handlebars.compile(templateContent, { noEscape: true });\n compiledCache.set(templateContent, compiled);\n }\n return compiled;\n}\n\n/**\n * Render a Handlebars template string with the given data.\n */\nexport function renderTemplate(\n templateContent: string,\n data: Record<string, unknown>,\n): string {\n const compiled = getCompiledTemplate(templateContent);\n return compiled(data);\n}\n\n/**\n * Load template file content from disk.\n */\nexport async function loadTemplateFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\n\n/**\n * Resolve a source path — handles _template/ prefix by resolving from packageRoot.\n */\nexport function resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith('_template/')) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nexport async function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import * as path from 'node:path';\nimport { writeFileSafe, fileExists } from './fs.js';\nimport { logger } from './logger.js';\n\n/**\n * `.mcp.json` content launched by Cursor / Claude Code / Cline.\n *\n * Kept in sync with the scaffold writer in `@teamix-evo/create`. Any change\n * here MUST be mirrored there (see `packages/create/src/orchestrator.ts`).\n */\nconst MCP_JSON_CONTENT = {\n mcpServers: {\n 'teamix-evo': {\n command: 'npx',\n args: ['-y', '@teamix-evo/mcp'],\n },\n },\n} as const;\n\n/**\n * Ensure that `<projectRoot>/.mcp.json` exists.\n *\n * This is called from the incremental entry points (`tokens init`, `skills\n * add`, `ui init`) so projects that adopted teamix-evo without `create` still\n * get the MCP wiring (#BUG-103). Existing files are never overwritten — users\n * may have customised them.\n *\n * Returns `'created'` on first write, `'exists'` if a file is already present,\n * `'failed'` if writing failed (logged as a warning; never throws).\n */\nexport async function ensureMcpJson(\n projectRoot: string,\n): Promise<'created' | 'exists' | 'failed'> {\n const mcpPath = path.join(projectRoot, '.mcp.json');\n if (await fileExists(mcpPath)) return 'exists';\n try {\n await writeFileSafe(mcpPath, JSON.stringify(MCP_JSON_CONTENT, null, 2) + '\\n');\n logger.debug(`Wrote .mcp.json → ${mcpPath}`);\n return 'created';\n } catch (err) {\n logger.warn(`Failed to write .mcp.json: ${(err as Error).message}`);\n return 'failed';\n }\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n SkillsLock,\n SkillsPackageManifest,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport { installSkills } from './skills-installer.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n readTokensVariant,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\nimport { ensureMcpJson } from '../utils/mcp.js';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\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 | {\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 const skippedSkillIds = candidateIds.filter((id) =>\n existing.skillIds.has(id),\n );\n const onlyIds = candidateIds.filter((id) => !existing.skillIds.has(id));\n\n if (existingSkillsCfg && onlyIds.length === 0) {\n return { status: 'already-initialized' };\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 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\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 /** Skill ids that were requested but already installed; skipped. */\n skippedSkillIds: string[];\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 const skippedSkillIds = requestedNames.filter((n) =>\n existing.skillIds.has(n),\n );\n const onlyIds = requestedNames.filter((n) => !existing.skillIds.has(n));\n\n // Incremental fast path: nothing new to install.\n if (onlyIds.length === 0) {\n return {\n status: 'installed',\n packageName,\n version: existingSkillsCfg?.version ?? manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n };\n }\n\n 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 existing,\n existingConfig,\n });\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 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}> {\n const {\n projectRoot,\n packageName,\n ideIdent,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\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/v1.json',\n schemaVersion: 1,\n ide: ideIdent,\n packages: {},\n };\n config.packages.skills = {\n variant: FLAT_VARIANT,\n version: manifest.version,\n ides,\n scope,\n };\n await writeProjectConfig(projectRoot, config);\n\n const installedAt = new Date().toISOString();\n const installedManifest: InstalledManifest = 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 return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: onlyIds.length,\n fileCount: result.count,\n resources: result.resources,\n addedSkillIds: onlyIds,\n skippedSkillIds,\n };\n}\n\nfunction mergeInstalledResources(\n existing: InstalledResource[],\n next: InstalledResource[],\n): InstalledResource[] {\n const map = new Map<string, InstalledResource>();\n const key = (r: InstalledResource): string =>\n `${r.id}|${r.ide ?? ''}|${r.scope ?? ''}`;\n for (const r of existing) map.set(key(r), r);\n for (const r of next) map.set(key(r), r);\n return [...map.values()];\n}\n","import { existsSync } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nconst GLOBAL_META_DIR = '.teamix-evo-global';\nconst TEAMIX_DIR = '.teamix-evo';\nconst CONFIG_FILE = 'config.json';\n\nexport function getGlobalMetaRoot(): string {\n return path.join(os.homedir(), GLOBAL_META_DIR);\n}\n\nexport function isTeamixEvoProject(dir: string): boolean {\n return existsSync(path.join(dir, TEAMIX_DIR, CONFIG_FILE));\n}\n\nexport async function ensureGlobalMetaRoot(): Promise<string> {\n const root = getGlobalMetaRoot();\n await fs.mkdir(root, { recursive: true });\n return root;\n}\n\n/**\n * Quick guard for project-scope commands (`tokens init`, `ui init`,\n * `skills 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 regenerable tokens in place.\n *\n * Replaces the v0.3 placeholder that just printed \"not implemented\".\n * Per ADR 0003: regenerable files rewritten, frozen preserved (#12).\n */\nimport { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensUpdate } from '../../core/tokens-update.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const updateCommand = new Command('update')\n .description(\n '刷新 design tokens(regenerable 覆盖、frozen 保留 — ADR 0003 三态)',\n )\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const result = await runTokensUpdate({ projectRoot });\n\n if (result.status === 'not-initialized') {\n logger.error(\n 'No tokens variant installed. Run `teamix-evo tokens init <variant>` first.',\n );\n process.exitCode = 1;\n return;\n }\n\n if (result.status === 'up-to-date') {\n logger.success(\n `Already at latest: ${result.packageName} (${result.variant} v${result.version})`,\n );\n logger.info(\n ' Regenerable files refreshed in case of manual edits.',\n );\n return;\n }\n\n logger.success(\n `Updated ${result.packageName} (${result.variant}): v${result.from} → v${result.to}`,\n );\n if (result.rewritten.length > 0) {\n logger.info(` Rewrote: ${result.rewritten.join(', ')}`);\n }\n if (result.preserved.length > 0) {\n logger.info(\n ` Preserved: ${result.preserved.join(', ')} (frozen — your customizations kept)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to update tokens: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo tokens update` — refresh regenerable token files in place.\n *\n * Per ADR 0003 三态:\n * - `tokens.theme.css` (regenerable) → overwritten with latest upstream\n * - `tokens.overrides.css` (frozen) → preserved (user-owned)\n * - `tokens-lock.json` (regenerable) → version + installedAt refreshed\n * - `config.json` (managed) → only `packages.tokens.version` bumped\n *\n * Variant switching is NOT performed here — use `tokens uninstall` then\n * `tokens init <other-variant>`. This command is for in-place version bumps.\n *\n * Implements #12. ADR 0019 is updated to reflect the v0.4 design.\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n type InstalledManifest,\n type InstalledResource,\n type TokensPackLock,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst CONSUMER_TOKENS_DIR = 'tokens';\nconst CONSUMER_THEME_FILE = 'tokens.theme.css';\n\nconst require = createRequire(import.meta.url);\n\nexport interface RunTokensUpdateOptions {\n projectRoot: string;\n packageName?: string;\n /** Override resolution of the upstream tokens package root. */\n packageRoot?: string;\n}\n\nexport type RunTokensUpdateResult =\n | {\n status: 'updated';\n packageName: string;\n variant: string;\n from: string;\n to: string;\n rewritten: string[];\n preserved: string[];\n }\n | {\n status: 'not-initialized';\n }\n | {\n status: 'up-to-date';\n packageName: string;\n variant: string;\n version: string;\n };\n\nexport async function runTokensUpdate(\n options: RunTokensUpdateOptions,\n): Promise<RunTokensUpdateResult> {\n const { projectRoot } = options;\n const packageName = options.packageName ?? DEFAULT_TOKENS_PACKAGE;\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.tokens) {\n return { status: 'not-initialized' };\n }\n const currentVariant = config.packages.tokens.variant;\n const currentVersion = config.packages.tokens.version;\n\n const packageRoot =\n options.packageRoot ?? resolveTokensPackageRoot(packageName);\n\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, currentVariant);\n if (!variantEntry) {\n throw new Error(\n `Currently installed variant \"${currentVariant}\" no longer exists in ${packageName}@${catalog.version}. ` +\n `Available: ${catalog.variants.map((v) => v.name).join(', ')}. ` +\n `Run \\`teamix-evo tokens uninstall\\` then \\`teamix-evo tokens init <variant>\\` to switch.`,\n );\n }\n\n if (variantEntry.version === currentVersion) {\n // Same version — refresh resources anyway so manual edits to regenerable\n // files revert, but report up-to-date for clarity.\n await rewriteRegenerableFiles(variantEntry.files, packageRoot, projectRoot);\n return {\n status: 'up-to-date',\n packageName,\n variant: currentVariant,\n version: currentVersion,\n };\n }\n\n const rewritten = await rewriteRegenerableFiles(\n variantEntry.files,\n packageRoot,\n projectRoot,\n );\n\n const preserved: string[] = [];\n const overridesAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n 'tokens.overrides.css',\n );\n if (await fileExists(overridesAbs)) preserved.push('tokens.overrides.css');\n\n // Update lock.json\n const lock: TokensPackLock = {\n schemaVersion: 1,\n variant: {\n name: variantEntry.name,\n displayName: variantEntry.displayName,\n version: variantEntry.version,\n from: packageName,\n },\n packageVersion: catalog.version,\n linked: variantEntry.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n\n // Bump version in config.json (preserve everything else — fixes #18)\n config.packages.tokens.version = variantEntry.version;\n await writeProjectConfig(projectRoot, config);\n\n // Update installed manifest entry (preserve other packages)\n const prior = (await readInstalledManifest(projectRoot)) ?? {\n schemaVersion: 1 as const,\n installed: [],\n };\n const idx = prior.installed.findIndex((p) => p.package === packageName);\n if (idx >= 0) {\n prior.installed[idx]!.version = variantEntry.version;\n prior.installed[idx]!.installedAt = new Date().toISOString();\n // Recompute hashes for rewritten files\n for (const r of prior.installed[idx]!.resources) {\n if (r.strategy === 'regenerable') {\n const abs = path.isAbsolute(r.target)\n ? r.target\n : path.join(projectRoot, r.target);\n if (await fileExists(abs)) {\n r.hash = computeHash(await fs.readFile(abs, 'utf-8'));\n }\n }\n }\n await writeInstalledManifest(projectRoot, prior);\n }\n\n return {\n status: 'updated',\n packageName,\n variant: currentVariant,\n from: currentVersion,\n to: variantEntry.version,\n rewritten,\n preserved,\n };\n}\n\nasync function rewriteRegenerableFiles(\n files: readonly string[],\n packageRoot: string,\n projectRoot: string,\n): Promise<string[]> {\n const written: string[] = [];\n for (const fileRel of files) {\n const base = path.basename(fileRel);\n if (base !== 'theme.css') continue; // only theme.css is regenerable in v0.4\n const sourceAbs = path.join(packageRoot, fileRel);\n const targetAbs = path.join(\n projectRoot,\n CONSUMER_TOKENS_DIR,\n CONSUMER_THEME_FILE,\n );\n const content = await fs.readFile(sourceAbs, 'utf-8');\n await writeFileSafe(targetAbs, content);\n written.push(CONSUMER_THEME_FILE);\n }\n return written;\n}\n\nfunction resolveTokensPackageRoot(packageName: string): string {\n const pkgJson = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJson);\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { readProjectConfig, readInstalledManifest } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出已安装的设计变体')\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.tokens) {\n logger.info('No tokens variant installed.');\n logger.info('Run \"teamix-evo tokens init [variant]\" to get started.');\n return;\n }\n\n const { variant, version } = config.packages.tokens;\n\n logger.info('Installed tokens variant:');\n logger.info(` Package: @teamix-evo/tokens`);\n logger.info(` Variant: ${variant}`);\n logger.info(` Version: ${version}`);\n logger.info(` IDE: ${config.ide}`);\n\n // Show resource count from installed manifest\n const manifest = await readInstalledManifest(projectRoot);\n if (manifest) {\n const pkg = manifest.installed.find(\n (p) => p.package === '@teamix-evo/tokens' && p.variant === variant,\n );\n if (pkg) {\n logger.info(` Resources: ${pkg.resources.length} files`);\n logger.info(\n ` Installed: ${new Date(pkg.installedAt).toLocaleString()}`,\n );\n }\n }\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo tokens list-variants` — list AVAILABLE variants in the\n * `@teamix-evo/tokens` catalog (vs `tokens list` which lists what's\n * INSTALLED in the consumer project).\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md).\n */\nimport { Command } from 'commander';\nimport { listTokenVariants } from '../../core/tokens-init.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/tokens 包内提供的所有变体')\n .action(async () => {\n try {\n const result = await listTokenVariants();\n\n logger.info(\n `Available variants in ${result.packageName} v${result.packageVersion}:`,\n );\n logger.info('');\n\n if (result.variants.length === 0) {\n logger.info(' (no variants advertised in manifest.json)');\n return;\n }\n\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n if (v.linked) {\n const links: string[] = [];\n if (v.linked['biz-ui']) links.push(`biz-ui: ${v.linked['biz-ui']}`);\n if (v.linked.templates)\n links.push(`templates: ${v.linked.templates}`);\n if (links.length) logger.info(` linked: ${links.join(' / ')}`);\n }\n logger.info('');\n }\n\n logger.info('Install a variant: teamix-evo tokens init <name>');\n } catch (err) {\n logger.error(`Failed to list variants: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport { detectIde } from '../../ide/index.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nconst TOKENS_PACKAGE = '@teamix-evo/tokens';\n\ninterface UninstallOptions {\n yes?: boolean;\n keepFiles?: boolean;\n purge?: boolean;\n}\n\nexport const uninstallCommand = new Command('uninstall')\n .description(\n '卸载已装的 tokens 变体(默认保留 frozen 文件如 tokens.overrides.css;--purge 才一并删)',\n )\n .option('-y, --yes', '跳过确认')\n .option(\n '--keep-files',\n '仅清理 .teamix-evo 中的记账信息,不删除任何落地资源文件',\n )\n .option(\n '--purge',\n '同时删除 frozen 文件(默认 frozen / managed 都保留 — ADR 0003)',\n )\n .action(async (opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.tokens) {\n logger.info('No tokens variant installed. Nothing to do.');\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === TOKENS_PACKAGE,\n );\n const resources = pkg?.resources ?? [];\n\n // Per ADR 0003 三态: by default keep both frozen (user-owned, immutable\n // across upgrades) and managed (user-edited region). Only regenerable\n // files are removed. `--purge` opts into removing frozen too.\n const removable = opts.keepFiles\n ? []\n : opts.purge\n ? resources.filter((r) => r.strategy !== 'managed')\n : resources.filter((r) => r.strategy === 'regenerable');\n const kept = resources.length - removable.length;\n\n logger.info(\n `Will remove ${removable.length} file(s); keep ${kept} managed file(s).`,\n );\n\n if (!opts.yes) {\n const confirm = await prompts.confirm({\n message: '确认卸载 tokens 变体?',\n initialValue: false,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // 1. Remove files\n let removed = 0;\n for (const r of removable) {\n const target = path.isAbsolute(r.target)\n ? r.target\n : path.join(projectRoot, r.target);\n try {\n await fs.unlink(target);\n removed++;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(\n `Failed to remove ${target}: ${(err as Error).message}`,\n );\n }\n }\n }\n\n // 2. Update installed manifest\n if (installedManifest) {\n installedManifest.installed = installedManifest.installed.filter(\n (p) => p.package !== TOKENS_PACKAGE,\n );\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n // 3. Update config (preserve other packages — fixes #18 regression)\n delete config.packages.tokens;\n await writeProjectConfig(projectRoot, config);\n\n // 4. Remove tokens-lock.json (state file, regenerable)\n const lockPath = path.join(\n projectRoot,\n '.teamix-evo',\n 'tokens-lock.json',\n );\n try {\n await fs.unlink(lockPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(\n `Failed to remove tokens-lock.json: ${(err as Error).message}`,\n );\n }\n }\n\n logger.success(`Uninstalled ${TOKENS_PACKAGE}`);\n logger.info(` Removed: ${removed} files`);\n if (kept > 0) {\n const note = opts.purge\n ? 'managed (you may delete manually)'\n : 'frozen / managed (preserved — ADR 0003; --purge to force)';\n logger.info(` Kept: ${kept} files — ${note}`);\n }\n } catch (err) {\n logger.error(`Failed to uninstall: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { 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';\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.exit(1);\n }\n\n logger.info(\n `Initializing skills (bulk): ides=[${ides.join(',')}], 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 \"teamix-evo skills add <name>\" to add specific skills, ` +\n `\"teamix-evo skills update\" to refresh, or \"teamix-evo skills uninstall\" to remove.`,\n );\n return;\n }\n\n 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 logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info('Run \"teamix-evo skills list\" to see installed skills.');\n } catch (err) {\n logger.error(`Failed to init skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: 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 Error('Cancelled by user.');\n }\n\n const scopeAns = await prompts.select<SkillScope>({\n message: '安装范围?',\n options: [\n { value: 'project', label: '项目级(.qoder/.claude 在当前项目)' },\n { value: 'global', label: '全局(~/.qoder/~/.claude)' },\n ],\n initialValue: 'project',\n });\n if (prompts.isCancel(scopeAns)) {\n throw new Error('Cancelled by user.');\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\n}\n\nfunction parseIdeList(input: string): SkillIde[] {\n const parts = input\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const result: SkillIde[] = [];\n for (const p of parts) {\n if (p === 'qoder' || p === 'claude') {\n if (!result.includes(p)) result.push(p);\n } else {\n throw new Error(`Unknown IDE: \"${p}\". Expected qoder | claude.`);\n }\n }\n return result;\n}\n\nfunction parseScope(input: string | undefined): SkillScope {\n const v = (input ?? 'project').toLowerCase();\n if (v === 'project' || v === 'global') return v;\n throw new Error(`Invalid --scope: \"${input}\". Expected project | global.`);\n}\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { runSkillsAdd } from '../../core/skills-add.js';\nimport { readProjectConfig } from '../../core/state.js';\nimport {\n ensureGlobalMetaRoot,\n hasPackageJson,\n isTeamixEvoProject,\n} from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface AddOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const addCommand = new Command('add')\n .description(\n '增量添加 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.exit(1);\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 if (\n result.addedSkillIds.length === 0 &&\n result.skippedSkillIds.length > 0\n ) {\n logger.warn(\n `已存在,无需添加:${result.skippedSkillIds.join(\n ', ',\n )}。如需刷新内容请运行 \"teamix-evo skills update\"。`,\n );\n return;\n }\n\n logger.success(`Skills added: ${result.skillCount} skill(s)`);\n logger.info(` IDEs: ${result.ides.join(', ')}`);\n logger.info(` Scope: ${result.scope}`);\n if (result.addedSkillIds.length > 0) {\n logger.info(` Added: ${result.addedSkillIds.join(', ')}`);\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (already added)`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info('Run \"teamix-evo skills list\" to see installed skills.');\n } catch (err) {\n logger.error(`Failed to add skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: AddOptions;\n projectRoot: string;\n}): 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 Error('Cancelled by user.');\n }\n\n const scopeAns = await prompts.select<SkillScope>({\n message: '安装范围?',\n options: [\n { value: 'project', label: '项目级(.qoder/.claude 在当前项目)' },\n { value: 'global', label: '全局(~/.qoder/~/.claude)' },\n ],\n initialValue: 'project',\n });\n if (prompts.isCancel(scopeAns)) {\n throw new Error('Cancelled by user.');\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\n}\n\nfunction parseIdeList(input: string): SkillIde[] {\n const parts = input\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const result: SkillIde[] = [];\n for (const p of parts) {\n if (p === 'qoder' || p === 'claude') {\n if (!result.includes(p)) result.push(p);\n } else {\n throw new Error(`Unknown IDE: \"${p}\". Expected qoder | claude.`);\n }\n }\n return result;\n}\n\nfunction parseScope(input: string | undefined): SkillScope {\n const v = (input ?? 'project').toLowerCase();\n if (v === 'project' || v === 'global') return v;\n throw new Error(`Invalid --scope: \"${input}\". Expected project | global.`);\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n readSkillsLock,\n} from '../../core/state.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface ListOptions {\n installed?: boolean;\n}\n\nexport const listCommand = new Command('list')\n .alias('ls')\n .description(\n '列出 teamix-evo skills(默认展示全部 skill 并标注已装/未装;--installed 仅看已装)',\n )\n .option('--installed', '仅展示已安装的 skill(隐藏未安装项)')\n .action(async (opts: ListOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const config = await readProjectConfig(projectRoot);\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === SKILLS_PACKAGE,\n );\n const skillsLock = await readSkillsLock(projectRoot);\n\n // Group installed resources by skill id (resource id is \"<skillId>\" or\n // \"<skillId>:<rel>\"). When manifest is stale or missing, fall back to\n // the skills lock — both add+sync update the lock, so it's the most\n // reliable indicator of \"is this skill installed?\" (#19 #35).\n const installedBySkill = new Map<string, number>();\n for (const r of pkg?.resources ?? []) {\n const skillId = r.id.split(':')[0]!;\n installedBySkill.set(skillId, (installedBySkill.get(skillId) ?? 0) + 1);\n }\n for (const skillId of Object.keys(skillsLock?.skills ?? {})) {\n if (!installedBySkill.has(skillId)) {\n installedBySkill.set(skillId, 1); // minimum signal: lock says it's installed\n }\n }\n\n // --installed: legacy behavior, only show installed skills.\n if (opts.installed) {\n if (!config?.packages?.skills || !pkg) {\n logger.info('No skills installed.');\n logger.info('Run \"teamix-evo skills init\" to get started.');\n return;\n }\n printInstalledHeader(config.packages.skills, pkg.installedAt);\n logger.info('');\n logger.info('Installed skills:');\n for (const [skillId, count] of installedBySkill) {\n logger.info(` ✓ ${skillId} (${count} file${count > 1 ? 's' : ''})`);\n }\n logger.info('');\n logger.info(\n ` Total: ${pkg.resources.length} files (${installedBySkill.size} skills × ides × scope)`,\n );\n return;\n }\n\n // Default: list all available skills from the manifest, mark installed/not.\n const { manifest } = await loadSkillsData(SKILLS_PACKAGE);\n const skills = [...manifest.skills].sort((a, b) =>\n a.id.localeCompare(b.id),\n );\n // installedBySkill is the truth — consult lock + manifest both (#19).\n const isInstalled = installedBySkill.size > 0;\n\n if (isInstalled && config?.packages?.skills && pkg) {\n printInstalledHeader(config.packages.skills, pkg.installedAt);\n } else if (isInstalled) {\n logger.info(\n `Installed (${installedBySkill.size} skill(s)) — config or manifest record missing; run \"teamix-evo skills doctor\" to repair.`,\n );\n } else {\n logger.info('Skills package not yet added.');\n logger.info(\n 'Run \"teamix-evo skills init\" to bootstrap, or \"teamix-evo skills add <id...>\" for specific skills.',\n );\n }\n logger.info('');\n logger.info(`Available skills (${SKILLS_PACKAGE}@${manifest.version}):`);\n let installedCount = 0;\n for (const s of skills) {\n const fileCount = installedBySkill.get(s.id);\n const installed = fileCount !== undefined;\n if (installed) installedCount++;\n const mark = installed ? '✓' : '○';\n const tail = installed\n ? `[installed, ${fileCount} file${fileCount > 1 ? 's' : ''}]`\n : `[not installed — run \"teamix-evo skills add ${s.id}\"]`;\n logger.info(` ${mark} ${s.id}@${s.version} ${tail}`);\n if (s.description) {\n logger.info(` ${s.description}`);\n }\n }\n logger.info('');\n logger.info(\n ` Total: ${skills.length} skill(s) — ${installedCount} installed, ${\n skills.length - installedCount\n } available`,\n );\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n\nfunction printInstalledHeader(\n cfg: { version?: string; ides?: readonly string[]; scope?: string },\n installedAt: string,\n): void {\n logger.info('Installed skills package:');\n logger.info(` Package: ${SKILLS_PACKAGE}`);\n logger.info(` Version: ${cfg.version ?? '(unknown)'}`);\n logger.info(` IDEs: ${(cfg.ides ?? []).join(', ') || '(unknown)'}`);\n logger.info(` Scope: ${cfg.scope ?? '(unknown)'}`);\n logger.info(` Installed: ${new Date(installedAt).toLocaleString()}`);\n}\n","import { Command } from 'commander';\nimport { 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 { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface UpdateOptions {\n dryRun?: boolean;\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 .action(async (names: string[], opts: UpdateOptions) => {\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 // 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 \"teamix-evo 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(\n ` Updated: ${result.updatedSkillIds.join(', ')}`,\n );\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (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: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\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 {\n detectIde,\n getAdapter,\n ALL_IDE_KINDS,\n} from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n getSkillsSourceDir,\n} from '../../core/state.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface UninstallOptions {\n yes?: boolean;\n}\n\nexport const uninstallCommand = new Command('uninstall')\n .description(\n '卸载已安装的 teamix-evo skills;不传 ids 则卸载整包,传 ids 则按 skill 删除',\n )\n .argument(\n '[ids...]',\n '可选:仅卸载指定 skill id;省略则卸载整个 skills 包',\n )\n .option('-y, --yes', '跳过确认')\n .action(async (ids: string[], opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.skills) {\n logger.info('Skills are not installed. Nothing to do.');\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === SKILLS_PACKAGE,\n );\n const resources = pkg?.resources ?? [];\n\n if (ids.length === 0) {\n await runFullUninstall({\n projectRoot,\n config,\n installedManifest,\n pkg,\n resources,\n opts,\n });\n return;\n }\n\n await runPartialUninstall({\n projectRoot,\n installedManifest,\n pkg,\n resources,\n ids,\n opts,\n });\n } catch (err) {\n logger.error(`Failed to uninstall: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\ninterface FullUninstallArgs {\n projectRoot: string;\n config: NonNullable<Awaited<ReturnType<typeof readProjectConfig>>>;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n opts: UninstallOptions;\n}\n\nasync function runFullUninstall(args: FullUninstallArgs): Promise<void> {\n const { projectRoot, config, installedManifest, pkg, resources, opts } = args;\n\n logger.info(\n `Will remove ${resources.length} skill file(s) installed by ${SKILLS_PACKAGE}.`,\n );\n\n if (!opts.yes) {\n const confirm = await prompts.confirm({\n message: '确认卸载?此操作会删除上述文件。',\n initialValue: false,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n const removed = await removeSkillFiles(resources);\n logger.debug(`Removed ${removed.length} files`);\n\n // Per ADR 0013, wipe the source dir entirely on full uninstall.\n const skillsRoot = getSkillsSourceDir(projectRoot);\n const sourceSkillNames = await listSkillSourceNames(skillsRoot);\n try {\n await fs.rm(skillsRoot, { recursive: true, force: true });\n logger.debug(`Removed source dir ${skillsRoot}`);\n } catch (err) {\n logger.warn(\n `Failed to remove ${skillsRoot}: ${(err as Error).message}`,\n );\n }\n\n // BUG-105: also wipe the IDE mirror directories so a fresh install can\n // re-populate them cleanly. `removeSkillFiles` deletes per-file records\n // but legacy installs (and partial migrations) sometimes leave an empty\n // `.qoder/skills/<name>/` dir behind; nuke them explicitly.\n const skillNames = collectSkillNames({\n fromSources: sourceSkillNames,\n fromConfig: config,\n fromResources: resources,\n });\n const cleanedMirrorDirs = await removeMirrorDirs(\n projectRoot,\n config?.packages?.skills?.scope,\n config?.packages?.skills?.ides,\n skillNames,\n );\n\n if (installedManifest && pkg) {\n installedManifest.installed = installedManifest.installed.filter(\n (p) => p.package !== SKILLS_PACKAGE,\n );\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n delete config.packages.skills;\n await writeProjectConfig(projectRoot, config);\n\n logger.success(`Uninstalled ${SKILLS_PACKAGE}`);\n logger.info(` Removed: ${removed.length} files`);\n logger.info(` Source: ${path.relative(projectRoot, skillsRoot)} (cleaned)`);\n if (cleanedMirrorDirs.length > 0) {\n logger.info(\n ` Mirrors: ${cleanedMirrorDirs\n .map((d) => path.relative(projectRoot, d))\n .join(', ')} (cleaned)`,\n );\n }\n}\n\ninterface PartialUninstallArgs {\n projectRoot: string;\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>;\n pkg: ReturnType<typeof findSkillsPkg>;\n resources: InstalledResource[];\n ids: string[];\n opts: UninstallOptions;\n}\n\nasync function runPartialUninstall(args: PartialUninstallArgs): Promise<void> {\n const { projectRoot, installedManifest, pkg, resources, ids, opts } = args;\n\n const grouped = groupBySkillId(resources);\n const requested = dedupe(ids);\n const matched = requested.filter((id) => grouped.has(id));\n const missing = requested.filter((id) => !grouped.has(id));\n\n if (missing.length > 0) {\n logger.warn(`Not installed (skipped): ${missing.join(', ')}`);\n }\n if (matched.length === 0) {\n logger.info('Nothing to remove.');\n return;\n }\n\n const toRemove: InstalledResource[] = matched.flatMap(\n (id) => grouped.get(id) ?? [],\n );\n\n logger.info(\n `Will remove ${matched.length} skill(s): ${matched.join(', ')} ` +\n `(${toRemove.length} file(s)).`,\n );\n\n if (!opts.yes) {\n const confirm = await prompts.confirm({\n message: '确认卸载?此操作会删除上述文件。',\n initialValue: false,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // 1. Remove mirror + source files recorded in the manifest.\n const removed = await removeSkillFiles(toRemove);\n logger.debug(`Removed ${removed.length} files`);\n\n // 2. Remove each skill's source dir (may contain non-manifest files like attachments).\n for (const id of matched) {\n const dir = getSkillsSourceDir(projectRoot, id);\n try {\n await fs.rm(dir, { recursive: true, force: true });\n logger.debug(`Removed source dir ${dir}`);\n } catch (err) {\n logger.warn(`Failed to remove ${dir}: ${(err as Error).message}`);\n }\n }\n\n // 2b. BUG-105: also wipe each skill's IDE mirror directories so the\n // `.qoder/skills/<name>` and `.claude/skills/<name>` paths don't linger.\n const config = await readProjectConfig(projectRoot);\n const cleanedMirrorDirs = await removeMirrorDirs(\n projectRoot,\n config?.packages?.skills?.scope,\n config?.packages?.skills?.ides,\n matched,\n );\n\n // 3. Prune lock entries so `skills sync` won't re-mirror them.\n const lock = await readSkillsLock(projectRoot);\n if (lock) {\n for (const id of matched) delete lock.skills[id];\n await writeSkillsLock(projectRoot, lock);\n }\n\n // 4. Drop matched resources from the package's installed manifest entry.\n // Keep the package entry itself — the rest is still installed.\n if (installedManifest && pkg) {\n pkg.resources = resources.filter((r) => !matched.includes(skillIdOf(r)));\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n logger.success(\n `Removed ${matched.length} skill(s): ${matched.join(', ')}`,\n );\n logger.info(` Files: ${removed.length}`);\n if (cleanedMirrorDirs.length > 0) {\n logger.info(\n ` Mirrors: ${cleanedMirrorDirs\n .map((d) => path.relative(projectRoot, d))\n .join(', ')} (cleaned)`,\n );\n }\n if (missing.length > 0) {\n logger.info(` Skipped: ${missing.join(', ')} (not installed)`);\n }\n}\n\n/**\n * BUG-105: list child directory names under the skill-source root so we can\n * map them onto IDE mirror paths. Returns an empty array if the directory is\n * absent.\n */\nasync function listSkillSourceNames(skillsRoot: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(skillsRoot, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Collect the union of skill names (= mirror dir basenames) across the\n * source dir, the project config, and the manifest resources. The manifest\n * may carry `<skillId>:<sub>` ids; we strip the suffix.\n */\nfunction collectSkillNames(args: {\n fromSources: string[];\n fromConfig: { ide?: string; packages?: Record<string, unknown> } | null;\n fromResources: InstalledResource[];\n}): string[] {\n const set = new Set<string>(args.fromSources);\n for (const r of args.fromResources) {\n set.add(r.id.split(':')[0]!);\n }\n return [...set];\n}\n\n/**\n * BUG-105: remove `.qoder/skills/<name>` / `.claude/skills/<name>` for every\n * skill name we know about. Falls back to all IDE kinds when the project\n * config doesn't pin a subset. Returns the absolute mirror dirs that were\n * actually removed (for the success summary).\n */\nasync function removeMirrorDirs(\n projectRoot: string,\n scope: SkillScope | string | undefined,\n ides: readonly string[] | undefined,\n skillNames: readonly string[],\n): Promise<string[]> {\n if (skillNames.length === 0) return [];\n const targetIdes: SkillIde[] = (\n ides && ides.length > 0\n ? (ides.filter((i): i is SkillIde => i === 'qoder' || i === 'claude'))\n : [...ALL_IDE_KINDS]\n ) as SkillIde[];\n const targetScope: SkillScope =\n scope === 'global' ? 'global' : 'project';\n\n const removed: string[] = [];\n for (const ide of targetIdes) {\n const adapter = getAdapter(ide);\n for (const name of skillNames) {\n const dir = adapter.getSkillTargetDir(name, targetScope, projectRoot);\n let existed = true;\n try {\n await fs.access(dir);\n } catch {\n existed = false;\n }\n if (!existed) continue;\n try {\n await fs.rm(dir, { recursive: true, force: true });\n removed.push(dir);\n logger.debug(`Removed mirror dir ${dir}`);\n } catch (err) {\n logger.warn(`Failed to remove ${dir}: ${(err as Error).message}`);\n }\n }\n // Try to clean up the now-empty `<ideRoot>/skills` parent so we don't\n // leak an empty dir into the project tree. Best-effort; ignore failure.\n if (removed.length > 0) {\n const skillsParent = path.dirname(\n adapter.getSkillTargetDir('placeholder', targetScope, projectRoot),\n );\n try {\n const remaining = await fs.readdir(skillsParent);\n if (remaining.length === 0) {\n await fs.rmdir(skillsParent);\n }\n } catch {\n // ignored\n }\n }\n }\n return removed;\n}\n\nfunction findSkillsPkg(\n installedManifest: Awaited<ReturnType<typeof readInstalledManifest>>,\n) {\n return installedManifest?.installed.find((p) => p.package === SKILLS_PACKAGE);\n}\n\nfunction skillIdOf(r: InstalledResource): string {\n return r.id.split(':')[0]!;\n}\n\nfunction groupBySkillId(\n records: InstalledResource[],\n): Map<string, InstalledResource[]> {\n const map = new Map<string, InstalledResource[]>();\n for (const r of records) {\n const id = skillIdOf(r);\n const bucket = map.get(id);\n if (bucket) bucket.push(r);\n else map.set(id, [r]);\n }\n return map;\n}\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { Command } from 'commander';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { runSkillsSync } from '../../core/skills-sync.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface SyncOptions {\n ide?: string;\n scope?: string;\n}\n\nexport const syncCommand = new Command('sync')\n .description(\n '把 .teamix-evo/skills/ 下的源重新镜像到 IDE 路径(.qoder / .claude)',\n )\n .argument(\n '[names...]',\n '可选:仅同步指定 skill id;省略则同步全部已记录在 lock 内的 skill',\n )\n .option(\n '--ide <list>',\n '逗号分隔的 IDE 列表(覆盖 lock 中记录的 mirroredTo)',\n )\n .option(\n '--scope <scope>',\n 'project | global(覆盖 lock 中记录的 scope)',\n )\n .action(async (names: string[], opts: SyncOptions) => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const ides = opts.ide ? parseIdeList(opts.ide) : undefined;\n const scope = opts.scope ? parseScope(opts.scope) : undefined;\n\n const result = await runSkillsSync({\n projectRoot,\n ides,\n scope,\n names: names.length > 0 ? names : undefined,\n });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded in .teamix-evo/skills/manifest.lock.json. Nothing to sync.',\n );\n return;\n }\n\n logger.success(\n `Synced ${result.syncedSkillIds.length} skill(s) → ${result.fileCount} file(s)`,\n );\n if (result.syncedSkillIds.length > 0) {\n logger.info(` Skills: ${result.syncedSkillIds.join(', ')}`);\n }\n if (result.missingSourceIds.length > 0) {\n logger.warn(\n ` Missing source: ${result.missingSourceIds.join(\n ', ',\n )} (run \"skills add <id>\" to (re)install)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to sync skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nfunction parseIdeList(input: string): SkillIde[] {\n const parts = input\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const result: SkillIde[] = [];\n for (const p of parts) {\n if (p === 'qoder' || p === 'claude') {\n if (!result.includes(p)) result.push(p);\n } else {\n throw new Error(\n `Unknown IDE: \"${p}\". Expected one of: ${ALL_IDE_KINDS.join(', ')}.`,\n );\n }\n }\n return result;\n}\n\nfunction parseScope(input: string): SkillScope {\n const v = input.toLowerCase();\n if (v === 'project' || v === 'global') return v;\n throw new Error(`Invalid --scope: \"${input}\". Expected project | global.`);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type {\n InstalledManifest,\n InstalledResource,\n SkillEntry,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport { loadSkillsPackageManifest } from '@teamix-evo/registry';\nimport { syncSkillsToIdes } from './skills-installer.js';\nimport {\n readSkillsLock,\n writeSkillsLock,\n readInstalledManifest,\n writeInstalledManifest,\n getSkillsSourceDir,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Look up updateStrategy + managedRegions from the upstream @teamix-evo/skills\n * package manifest. Returns null if the package isn't resolvable (e.g. the\n * project never installed it; or skill was added pre-managedRegions schema).\n */\nasync function readSkillMetaFromUpstream(\n skillId: string,\n): Promise<\n | {\n updateStrategy: SkillEntry['updateStrategy'];\n managedRegions?: readonly string[];\n }\n | null\n> {\n try {\n const pkgJson = require.resolve('@teamix-evo/skills/package.json');\n const packageRoot = path.dirname(pkgJson);\n const manifest = await loadSkillsPackageManifest(packageRoot);\n const entry = manifest.skills.find((s) => s.id === skillId);\n if (!entry) return null;\n return {\n updateStrategy: entry.updateStrategy,\n managedRegions: entry.managedRegions,\n };\n } catch {\n return null;\n }\n}\n\nconst SKILLS_PACKAGE_DEFAULT = '@teamix-evo/skills';\n\nexport interface RunSkillsSyncOptions {\n projectRoot: string;\n /** Override IDE list. Defaults to lock-recorded mirrors per skill. */\n ides?: readonly SkillIde[];\n /** Override scope. Defaults to lock-recorded scope per skill. */\n scope?: SkillScope;\n /** Limit to specific skill ids; otherwise sync all in lock. */\n names?: readonly string[];\n}\n\nexport interface RunSkillsSyncResult {\n status: 'synced' | 'no-skills';\n syncedSkillIds: string[];\n fileCount: number;\n resources: InstalledResource[];\n /** Skills that were in the lock but had no source dir on disk (warned, skipped). */\n missingSourceIds: string[];\n}\n\n/**\n * Re-mirror existing source dirs (`.teamix-evo/skills/<id>/`) to IDE paths.\n * The lock file (`.teamix-evo/skills/manifest.lock.json`) drives WHICH skills\n * to sync and (by default) WHERE — caller can override ide/scope.\n *\n * Per ADR 0013, this is idempotent and safe to re-run; mirrors are 100%\n * regenerable so any drift in IDE paths is overwritten cleanly.\n */\nexport async function runSkillsSync(\n options: RunSkillsSyncOptions,\n): Promise<RunSkillsSyncResult> {\n const { projectRoot, names } = options;\n\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return {\n status: 'no-skills',\n syncedSkillIds: [],\n fileCount: 0,\n resources: [],\n missingSourceIds: [],\n };\n }\n\n const skillIds = Object.keys(lock.skills);\n const targets = names ? skillIds.filter((id) => names.includes(id)) : skillIds;\n\n // Group sync by (scope, ides) — ADR 0013 doesn't constrain consumers from\n // mixing scopes per skill; we honor whatever the lock recorded unless caller\n // overrides both.\n const allResources: InstalledResource[] = [];\n const synced: string[] = [];\n const missing: string[] = [];\n\n for (const skillId of targets) {\n const lockEntry = lock.skills[skillId];\n if (!lockEntry) continue; // never happens (skillId came from lock.skills keys), but TS narrows\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n logger.warn(`Skill \"${skillId}\" has no source at ${sourceDir}; skipped.`);\n missing.push(skillId);\n continue;\n }\n\n const ides = (options.ides ?? lockEntry.mirroredTo) as SkillIde[];\n const scope = options.scope ?? lockEntry.scope;\n if (ides.length === 0) {\n logger.warn(`Skill \"${skillId}\" has no IDE mirror targets; skipped.`);\n continue;\n }\n\n // updateStrategy + managedRegions aren't tracked in the lock — read from\n // the upstream skills manifest if available so sync honors the managed\n // contract instead of clobbering user edits (#13). Defaults: regenerable,\n // no managed regions (= legacy clobber semantics).\n const upstreamMeta = await readSkillMetaFromUpstream(skillId);\n const result = await syncSkillsToIdes({\n projectRoot,\n skills: [\n {\n id: skillId,\n name: skillId,\n updateStrategy: upstreamMeta?.updateStrategy ?? 'regenerable',\n managedRegions: upstreamMeta?.managedRegions,\n },\n ],\n ides,\n scope,\n });\n allResources.push(...result.resources);\n synced.push(skillId);\n\n // Update the lock entry mirror list / installedAt timestamp.\n lock.skills[skillId] = {\n ...lockEntry,\n mirroredTo: ides,\n scope,\n installedAt: new Date().toISOString(),\n };\n }\n\n await writeSkillsLock(projectRoot, lock);\n\n // Refresh manifest.json mirror records (preserve source records as-is).\n await refreshMirrorRecords(projectRoot, allResources);\n\n return {\n status: 'synced',\n syncedSkillIds: synced,\n fileCount: allResources.length,\n resources: allResources,\n missingSourceIds: missing,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function refreshMirrorRecords(\n projectRoot: string,\n newMirrorRecords: InstalledResource[],\n): Promise<void> {\n const installed = await readInstalledManifest(projectRoot);\n if (!installed) return;\n const pkg = installed.installed.find((p) => p.package === SKILLS_PACKAGE_DEFAULT);\n if (!pkg) return;\n\n // Drop existing mirror records (those with `ide` set) and re-insert fresh ones.\n // Preserve source records (no `ide`).\n const sourceOnly = pkg.resources.filter((r) => r.ide === undefined);\n pkg.resources = [...sourceOnly, ...newMirrorRecords];\n pkg.installedAt = new Date().toISOString();\n await writeInstalledManifest(projectRoot, installed);\n}\n\n// re-export so commands can route through one module\nexport type { InstalledManifest };\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runSkillsDoctor } from '../../core/skills-doctor.js';\nimport { resolveSkillsMaintenanceRoot } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const doctorCommand = new Command('doctor')\n .description(\n '检查 .teamix-evo/skills/ 源与 IDE 镜像是否漂移;提示如何修复',\n )\n .action(async () => {\n try {\n const ide = detectIde();\n const cwd = ide.getProjectRoot();\n const projectRoot = resolveSkillsMaintenanceRoot(cwd);\n if (projectRoot !== cwd) {\n logger.info(`Using global skills meta root: ${projectRoot}`);\n }\n\n const result = await runSkillsDoctor({ projectRoot });\n\n if (result.status === 'no-skills') {\n logger.info(\n 'No skills recorded. Run \"teamix-evo skills 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 \"teamix-evo skills sync\" to repair mirrors.`,\n );\n for (const f of result.findings) {\n const idePart = f.ide ? ` [${f.ide}]` : '';\n logger.info(` - ${f.kind}${idePart}: ${f.skillId}`);\n logger.info(` ${f.path}`);\n if (f.detail) logger.info(` ${f.detail}`);\n }\n process.exitCode = 1;\n } catch (err) {\n logger.error(`Failed to run doctor: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { getAdapter } from '../ide/index.js';\nimport { computeHash } from '../utils/hash.js';\nimport { walkDir } from '../utils/path.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readSkillsLock, getSkillsSourceDir } from './state.js';\n\n/**\n * Drift detection per ADR 0013 §4 `skills doctor`.\n *\n * Reports:\n * - \"missing-source\" — lock entry exists but `.teamix-evo/skills/<id>/` is gone\n * - \"missing-mirror\" — source exists, but mirror under `.<ide>/skills/<id>/` missing\n * - \"mirror-drift\" — mirror file content ≠ source file content (user or IDE\n * wrote into the mirror; sync will overwrite)\n *\n * Source-vs-upstream drift is intentionally not in this report — that's\n * `skills update`'s job (it diffs against upstream). doctor only audits the\n * source→mirror leg.\n */\nexport type SkillDriftKind =\n | 'missing-source'\n | 'missing-mirror'\n | 'mirror-drift';\n\nexport interface SkillDriftFinding {\n kind: SkillDriftKind;\n skillId: string;\n ide?: SkillIde;\n scope?: SkillScope;\n /** Absolute path to the file or dir that's drifted/missing. */\n path: string;\n detail?: string;\n}\n\nexport interface RunSkillsDoctorOptions {\n projectRoot: string;\n}\n\nexport interface RunSkillsDoctorResult {\n status: 'clean' | 'drift' | 'no-skills';\n findings: SkillDriftFinding[];\n}\n\nexport async function runSkillsDoctor(\n options: RunSkillsDoctorOptions,\n): Promise<RunSkillsDoctorResult> {\n const { projectRoot } = options;\n const lock = await readSkillsLock(projectRoot);\n if (!lock || Object.keys(lock.skills).length === 0) {\n return { status: 'no-skills', findings: [] };\n }\n\n const findings: SkillDriftFinding[] = [];\n\n for (const [skillId, entry] of Object.entries(lock.skills)) {\n const sourceDir = getSkillsSourceDir(projectRoot, skillId);\n if (!(await dirExists(sourceDir))) {\n findings.push({\n kind: 'missing-source',\n skillId,\n path: sourceDir,\n detail: 'Run \"teamix-evo skills 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 \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n for (const [rel, sourceContent] of sourceContents.entries()) {\n const mirrorFile = path.join(mirrorDir, rel);\n if (!(await fileExists(mirrorFile))) {\n findings.push({\n kind: 'missing-mirror',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail: 'Run \"teamix-evo skills sync\" to re-mirror.',\n });\n continue;\n }\n const mirrorContent = await fs.readFile(mirrorFile, 'utf-8');\n if (computeHash(mirrorContent) !== computeHash(sourceContent)) {\n findings.push({\n kind: 'mirror-drift',\n skillId,\n ide,\n scope: entry.scope,\n path: mirrorFile,\n detail:\n 'Mirror differs from source. Re-run \"teamix-evo skills sync\" to overwrite.',\n });\n }\n }\n }\n }\n\n return {\n status: findings.length === 0 ? 'clean' : 'drift',\n findings,\n };\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\n\nexport const uiCommand = new Command('ui').description(\n '管理 teamix-evo ui 组件(源码注入式安装,shadcn 风格)',\n);\n\nuiCommand.addCommand(initCommand);\nuiCommand.addCommand(addCommand);\nuiCommand.addCommand(listCommand);\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport type { UiAliases } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiInit, DEFAULT_UI_ALIASES } from '../../core/ui-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface InitOptions {\n yes?: boolean;\n components?: string;\n hooks?: string;\n utils?: string;\n lib?: string;\n iconLibrary?: string;\n tsx?: boolean;\n rsc?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '初始化 teamix-evo ui 配置(询问 aliases / iconLibrary / tsx / rsc)',\n )\n .option('-y, --yes', '使用默认值,跳过交互')\n .option(\n '--components <path>',\n '组件 alias 路径',\n DEFAULT_UI_ALIASES.components,\n )\n .option('--hooks <path>', 'hooks alias 路径', DEFAULT_UI_ALIASES.hooks)\n .option('--utils <path>', 'utils alias 路径', DEFAULT_UI_ALIASES.utils)\n .option('--lib <path>', 'lib alias 路径', DEFAULT_UI_ALIASES.lib)\n .option('--icon-library <name>', '默认 icon 库(声明性)', 'lucide')\n .option('--tsx', '使用 TSX', true)\n .option('--rsc', '使用 React Server Components')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Refuse to scaffold UI config into a directory that isn't a real\n // project root.\n if (!hasPackageJson(projectRoot)) {\n logger.error(\n 'No package.json found in current directory. Please run this command in a valid project root.',\n );\n process.exit(1);\n }\n\n const cfg = await resolveConfig(opts);\n\n const result = await runUiInit({\n projectRoot,\n aliases: cfg.aliases,\n iconLibrary: cfg.iconLibrary,\n tsx: cfg.tsx,\n rsc: cfg.rsc,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n 'UI already initialized. Edit `.teamix-evo/config.json` directly to change aliases, or run `teamix-evo ui list`.',\n );\n return;\n }\n\n logger.success('UI initialized.');\n logger.info(` components: ${result.aliases.components}`);\n logger.info(` hooks: ${result.aliases.hooks}`);\n logger.info(` utils: ${result.aliases.utils}`);\n logger.info(` lib: ${result.aliases.lib}`);\n logger.info(` iconLibrary: ${result.iconLibrary}`);\n logger.info(` tsx: ${result.tsx}, rsc: ${result.rsc}`);\n logger.info('');\n logger.info('Next: `npx teamix-evo ui add button`');\n } catch (err) {\n logger.error(`Failed to initialize ui: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\ninterface ResolvedUiInit {\n aliases: UiAliases;\n iconLibrary: string;\n tsx: boolean;\n rsc: boolean;\n}\n\nasync function resolveConfig(opts: InitOptions): Promise<ResolvedUiInit> {\n // 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 templates: DEFAULT_UI_ALIASES.templates,\n },\n iconLibrary: opts.iconLibrary ?? 'lucide',\n tsx: opts.tsx ?? true,\n rsc: opts.rsc ?? false,\n };\n }\n\n const components = await prompts.text({\n message: 'components 路径(注入按钮等组件源码的目录)',\n initialValue: opts.components ?? DEFAULT_UI_ALIASES.components,\n });\n if (prompts.isCancel(components)) throw new Error('Cancelled by user.');\n\n const hooks = await prompts.text({\n message: 'hooks 路径',\n initialValue: opts.hooks ?? DEFAULT_UI_ALIASES.hooks,\n });\n if (prompts.isCancel(hooks)) throw new Error('Cancelled by user.');\n\n const utils = await prompts.text({\n message: 'utils 路径(cn 等工具)',\n initialValue: opts.utils ?? DEFAULT_UI_ALIASES.utils,\n });\n if (prompts.isCancel(utils)) throw new Error('Cancelled by user.');\n\n const lib = await prompts.text({\n message: 'lib 路径(共享代码根)',\n initialValue: opts.lib ?? DEFAULT_UI_ALIASES.lib,\n });\n if (prompts.isCancel(lib)) throw new Error('Cancelled by user.');\n\n const iconLibrary = await prompts.text({\n message: 'icon 库(声明性,组件源码已 hardcode lucide-react)',\n initialValue: opts.iconLibrary ?? 'lucide',\n });\n if (prompts.isCancel(iconLibrary)) throw new Error('Cancelled by user.');\n\n const tsxAns = await prompts.confirm({\n message: '使用 TSX?',\n initialValue: opts.tsx ?? true,\n });\n if (prompts.isCancel(tsxAns)) throw new Error('Cancelled by user.');\n\n const rscAns = await prompts.confirm({\n message: '使用 React Server Components?',\n initialValue: opts.rsc ?? false,\n });\n if (prompts.isCancel(rscAns)) throw new Error('Cancelled by user.');\n\n return {\n aliases: {\n components,\n hooks,\n utils,\n lib,\n business: DEFAULT_UI_ALIASES.business,\n templates: DEFAULT_UI_ALIASES.templates,\n },\n iconLibrary,\n tsx: tsxAns,\n rsc: rscAns,\n };\n}\n","import type { ProjectConfig, UiAliases } from '@teamix-evo/registry';\nimport { ensureMcpJson } from '../utils/mcp.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n} from './state.js';\n\nexport const DEFAULT_UI_ALIASES: UiAliases = {\n components: 'src/components/ui',\n hooks: 'src/hooks',\n utils: 'src/lib/utils',\n lib: 'src/lib',\n business: 'src/components/business',\n templates: 'src/templates',\n};\n\nexport const DEFAULT_UI_ICON_LIBRARY = 'lucide';\n\nexport interface RunUiInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Component aliases. Falls back to {@link DEFAULT_UI_ALIASES}. */\n aliases?: Partial<UiAliases>;\n /** Declared icon library (does not trigger code rewrite). Defaults to \"lucide\". */\n iconLibrary?: string;\n /** Whether the project uses TSX (true) or JSX (false). Defaults to true. */\n tsx?: boolean;\n /** Whether the project emits React Server Components markers. Defaults to false. */\n rsc?: boolean;\n /** IDE identifier written into config.ide when bootstrapping a fresh config (defaults to \"qoder\"). */\n ide?: string;\n}\n\nexport type RunUiInitResult =\n | {\n status: 'installed';\n aliases: UiAliases;\n iconLibrary: string;\n tsx: boolean;\n rsc: boolean;\n }\n | {\n status: 'already-initialized';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo ui init`.\n *\n * Writes `packages.ui` into `.teamix-evo/config.json` only — no resource files\n * are touched. Use {@link runUiAdd} afterwards to install component sources.\n */\nexport async function runUiInit(\n options: RunUiInitOptions,\n): Promise<RunUiInitResult> {\n const { projectRoot } = options;\n const ideIdent = options.ide ?? 'qoder';\n\n await ensureTeamixDir(projectRoot);\n\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.ui) {\n return { status: 'already-initialized' };\n }\n\n const aliases: UiAliases = {\n components: options.aliases?.components ?? DEFAULT_UI_ALIASES.components,\n hooks: options.aliases?.hooks ?? DEFAULT_UI_ALIASES.hooks,\n utils: options.aliases?.utils ?? DEFAULT_UI_ALIASES.utils,\n lib: options.aliases?.lib ?? DEFAULT_UI_ALIASES.lib,\n business: options.aliases?.business ?? DEFAULT_UI_ALIASES.business,\n templates: options.aliases?.templates ?? DEFAULT_UI_ALIASES.templates,\n };\n const iconLibrary = options.iconLibrary ?? DEFAULT_UI_ICON_LIBRARY;\n const tsx = options.tsx ?? true;\n const rsc = options.rsc ?? false;\n\n const config: ProjectConfig = existingConfig ?? {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide: ideIdent,\n packages: {},\n };\n config.packages.ui = {\n variant: '_flat',\n version: '0.0.0',\n aliases,\n iconLibrary,\n tsx,\n rsc,\n };\n await writeProjectConfig(projectRoot, config);\n\n // Ensure `.mcp.json` exists so editors auto-launch the MCP server even\n // when the user adopted teamix-evo without the create scaffold (#BUG-103).\n await ensureMcpJson(projectRoot);\n\n return {\n status: 'installed',\n aliases,\n iconLibrary,\n tsx,\n rsc,\n };\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiAdd } from '../../core/ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个 ui entry(按 id,自动展开 registryDependencies)',\n )\n .argument('<ids...>', 'entry id 列表,如 \"button\" \"dialog\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .option(\n '--include-deprecated',\n '允许安装已归档的 deprecated entry(仅迁移 / 审计场景,ADR 0028)',\n )\n .action(\n async (\n ids: string[],\n opts: { overwrite?: boolean; includeDeprecated?: boolean },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Installing entries: ${ids.join(', ')}`);\n\n const result = await runUiAdd({\n projectRoot,\n ids,\n overwrite: opts.overwrite,\n includeDeprecated: opts.includeDeprecated,\n });\n\n logger.success(\n `UI add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Resolved order: ${result.orderedIds.join(' → ')}`);\n\n const npmDeps = Object.entries(result.npmDependencies);\n if (npmDeps.length > 0) {\n logger.info('');\n logger.info('Install npm dependencies in your project:');\n const installCmd = npmDeps\n .map(([name, range]) => `${name}@${range}`)\n .join(' ');\n logger.info(` pnpm add ${installCmd}`);\n logger.info(` # or: npm install ${installCmd}`);\n }\n } catch (err) {\n const message = (err as Error).message;\n // Preserve the friendlier wording from the previous CLI for the\n // \"ui not initialized\" case.\n if (message.startsWith('UI not initialized')) {\n logger.error(\n 'UI not initialized. Run `npx teamix-evo ui init` first.',\n );\n } else {\n logger.error(`Failed to add ui entries: ${message}`);\n }\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { UiPackageManifest } from '@teamix-evo/registry';\nimport { loadUiPackageManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Load the ui package manifest and optional shared `_data.json`.\n *\n * @param packageName - e.g. \"@teamix-evo/ui\"\n */\nexport async function loadUiData(packageName: string): Promise<{\n manifest: UiPackageManifest;\n data: Record<string, unknown>;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n\n logger.debug(`Resolved ui package root: ${packageRoot}`);\n\n const manifest = await loadUiPackageManifest(packageRoot);\n\n let data: Record<string, unknown> = {};\n const dataPath = path.join(packageRoot, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, packageRoot };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n UiEntry,\n UiPackageManifest,\n UiAliases,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { resolveUiEntryOrder } from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface UiInstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** UI package manifest */\n manifest: UiPackageManifest;\n /** Absolute ui package root (used to resolve entry source paths) */\n packageRoot: string;\n /**\n * Optional per-entry package root override. When set, entries in the map\n * resolve their `file.source` against the mapped root instead of `packageRoot`.\n * Used by variant-aware packages (biz-ui / templates) that pull in\n * @teamix-evo/ui transitive deps — each entry resolves from its source package.\n */\n entryPackageRoot?: Map<string, string>;\n /** Aliases configured in `packages.ui.aliases` */\n aliases: UiAliases;\n /** Entry ids the user explicitly requested to add */\n requested: string[];\n /** When true, skip writing entries whose target file already exists (frozen-on-add). */\n skipExisting?: boolean;\n}\n\nexport interface UiInstallResult {\n /** Ordered list of entry ids that were processed (deps + requested) */\n orderedIds: string[];\n /** Per-file install records (for InstalledManifest) */\n resources: InstalledResource[];\n /** Aggregate npm dependencies across the installed entries */\n npmDependencies: Record<string, string>;\n /** Number of files written */\n written: number;\n /** Number of files skipped because they already exist (frozen) */\n skipped: number;\n}\n\n/**\n * Install the requested ui entries (transitively resolving registryDependencies).\n * For frozen entries that already exist on disk, the write is skipped — shadcn-style.\n */\nexport async function installUiEntries(\n options: UiInstallOptions,\n): Promise<UiInstallResult> {\n const {\n projectRoot,\n manifest,\n packageRoot,\n entryPackageRoot,\n aliases,\n requested,\n skipExisting = true,\n } = options;\n\n const orderedIds = resolveUiEntryOrder(manifest.entries, requested);\n const idToEntry = new Map(manifest.entries.map((e) => [e.id, e]));\n\n const resources: InstalledResource[] = [];\n const npmDeps: Record<string, string> = {};\n let written = 0;\n let skipped = 0;\n\n for (const id of orderedIds) {\n const entry = idToEntry.get(id);\n if (!entry) continue;\n\n // Aggregate npm deps regardless of whether files were written — the user\n // may have manually deleted node_modules; we want to surface the full set.\n if (entry.dependencies) {\n for (const [name, range] of Object.entries(entry.dependencies)) {\n npmDeps[name] = range;\n }\n }\n\n for (const file of entry.files) {\n const targetAbs = resolveTargetPath(projectRoot, aliases, entry, file);\n const exists = await fileExists(targetAbs);\n\n if (\n exists &&\n skipExisting &&\n (entry.updateStrategy ?? 'frozen') === 'frozen'\n ) {\n logger.info(` skip (frozen, exists): ${rel(projectRoot, targetAbs)}`);\n skipped++;\n continue;\n }\n\n const rootForEntry = entryPackageRoot?.get(entry.id) ?? packageRoot;\n const sourceAbs = path.resolve(rootForEntry, file.source);\n const raw = await fs.readFile(sourceAbs, 'utf-8');\n const transformed = rewriteImports(raw, aliases);\n await writeFileSafe(targetAbs, transformed);\n written++;\n logger.info(` write: ${rel(projectRoot, targetAbs)}`);\n\n resources.push({\n id: `${entry.id}:${file.targetName}`,\n target: targetAbs,\n hash: computeHash(transformed),\n strategy: entry.updateStrategy ?? 'frozen',\n });\n }\n\n }\n\n return {\n orderedIds,\n resources,\n npmDependencies: npmDeps,\n written,\n skipped,\n };\n}\n\nfunction resolveTargetPath(\n projectRoot: string,\n aliases: UiAliases,\n entry: UiEntry,\n file: { targetAlias: string; targetName: string },\n): string {\n const aliasDir = aliases[file.targetAlias as keyof UiAliases];\n if (!aliasDir) {\n throw new Error(\n `Entry \"${entry.id}\" requires alias \"${file.targetAlias}\" but it is not configured.`,\n );\n }\n return path.join(projectRoot, aliasDir, file.targetName);\n}\n\nfunction rel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs);\n}\n\n/**\n * Remove all installed ui resource files and prune empty parent directories.\n */\nexport async function removeUiFiles(\n records: InstalledResource[],\n): Promise<string[]> {\n const removed: string[] = [];\n for (const r of records) {\n try {\n await fs.unlink(r.target);\n removed.push(r.target);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(`Failed to remove ${r.target}: ${(err as Error).message}`);\n }\n }\n }\n const parents = new Set(records.map((r) => path.dirname(r.target)));\n for (const dir of parents) {\n try {\n const entries = await fs.readdir(dir);\n if (entries.length === 0) await fs.rmdir(dir);\n } catch {\n /* ignore */\n }\n }\n return removed;\n}\n","import type { UiAliases } from '@teamix-evo/registry';\n\n/**\n * Map between the ui package's \"developer-time\" import roots and the user's\n * configured aliases. The keys are the source roots used inside ui source\n * files (e.g. `@/utils/cn` references `src/utils/`).\n */\nconst SOURCE_ROOT_TO_ALIAS_KEY: Record<string, keyof UiAliases> = {\n components: 'components',\n hooks: 'hooks',\n utils: 'utils',\n lib: 'lib',\n};\n\n/**\n * Rewrite import specifiers in a UI source file so that the developer-time\n * placeholders (e.g. `@/utils/cn`) resolve to the user's configured aliases\n * (e.g. `@/lib/utils/cn` when `aliases.utils === \"src/lib/utils\"`).\n *\n * Matches both static imports and dynamic imports of the form `@/<root>/<rest>`.\n * Bare `@/` (no segment) and unknown segments are left untouched.\n *\n * The rewrite uses each user alias verbatim. If the user alias begins with\n * `src/`, that prefix is stripped because TypeScript-style `@/*` → `src/*`\n * mappings expect paths relative to `src`.\n */\nexport function rewriteImports(source: string, aliases: UiAliases): string {\n return source.replace(\n /(['\"])@\\/([a-z][a-z0-9-]*)(\\/[^'\"]*)?\\1/g,\n (full, quote: string, root: string, rest: string | undefined) => {\n const aliasKey = SOURCE_ROOT_TO_ALIAS_KEY[root];\n if (!aliasKey) return full;\n const alias = aliases[aliasKey];\n const normalized = aliasToImportPath(alias);\n // Flatten per-entry directory paths. In the source tree, cross-entry\n // references use `@/<root>/<entry-dir>/<file>` (e.g.\n // `@/components/skeleton/skeleton`), but after install files land flat\n // in the alias directory (`@/components/ui/skeleton`). Strip the\n // intermediate directory when rest has exactly two segments.\n const flatRest = flattenRestPath(rest);\n return `${quote}${normalized}${flatRest}${quote}`;\n },\n );\n}\n\n/**\n * Flatten a source-tree relative path for the installed (flat) layout.\n *\n * In the UI source tree, files live in per-entry directories:\n * `@/components/skeleton/skeleton` → rest = `/skeleton/skeleton`\n * After install, they are placed flat in the alias directory:\n * `@/components/ui/skeleton` → rest = `/skeleton`\n *\n * When rest has exactly two path segments (`/dir/file`), the first segment\n * (the entry directory) is stripped, leaving only the file reference.\n * Single-segment paths (e.g. `/cn`) pass through unchanged.\n */\nfunction flattenRestPath(rest: string | undefined): string {\n if (!rest) return '';\n // Split: \"/skeleton/skeleton\" → [\"\", \"skeleton\", \"skeleton\"]\n const segments = rest.split('/');\n if (segments.length === 3) {\n // Two real segments: /dir/file → /file\n return `/${segments[2]}`;\n }\n return rest;\n}\n\n/**\n * Convert an alias path (relative to the project root, e.g. `src/lib/utils`)\n * into an import-path prefix (`@/lib/utils`).\n *\n * Strips a leading `src/` so the path matches the convention of a `@/*` →\n * `src/*` tsconfig mapping. If the alias has a different prefix (for projects\n * that don't put code under `src/`), we keep it verbatim with `@/` prepended.\n */\nfunction aliasToImportPath(alias: string): string {\n const trimmed = alias.replace(/^\\.\\//, '').replace(/\\/$/, '');\n if (trimmed.startsWith('src/')) {\n return `@/${trimmed.slice('src/'.length)}`;\n }\n return `@/${trimmed}`;\n}\n","import type {\n InstalledManifest,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\nexport interface RunUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Entry ids to install (registry dependencies are resolved transitively). */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n /**\n * When true, allow installing entries that live in `manifest.deprecatedEntries`\n * (ADR 0028). Default: false — deprecated ids are treated as unknown and the\n * call errors with a hint pointing the user at the active replacement.\n */\n includeDeprecated?: boolean;\n}\n\nexport interface RunUiAddResult {\n packageName: string;\n /** Registered ids in install order (deps + requested). */\n orderedIds: string[];\n /** Number of files written. */\n written: number;\n /** Number of files skipped due to frozen + exists. */\n skipped: number;\n /** Aggregate npm dependencies of the installed entries. */\n npmDependencies: Record<string, string>;\n /** Per-file install records merged into the installed manifest. */\n resources: InstalledResource[];\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui add <ids...>`.\n *\n * Requires `packages.ui` to already exist in `.teamix-evo/config.json`\n * (i.e. {@link runUiInit} was called earlier).\n */\nexport async function runUiAdd(\n options: RunUiAddOptions,\n): Promise<RunUiAddResult> {\n const { projectRoot, ids, overwrite, includeDeprecated } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\n\n if (ids.length === 0) {\n throw new Error('At least one entry id must be provided.');\n }\n\n const config = await readProjectConfig(projectRoot);\n const uiCfg = config?.packages?.ui;\n if (!config || !uiCfg?.aliases) {\n throw new Error(\n 'UI not initialized. Run `runUiInit` (or `teamix-evo ui init`) first.',\n );\n }\n\n const { manifest, packageRoot } = await loadUiData(packageName);\n\n // Per ADR 0028: deprecated entries are archived in `deprecatedEntries`\n // and not exposed by default. When the caller opts in, we splice them\n // back into the active list so dependency resolution and install work\n // exactly as for active entries.\n const archived = manifest.deprecatedEntries ?? [];\n const archivedIds = new Set(archived.map((e) => e.id));\n const activeIds = new Set(manifest.entries.map((e) => e.id));\n\n const requestedDeprecated = ids.filter((id) => archivedIds.has(id));\n if (requestedDeprecated.length > 0 && !includeDeprecated) {\n const list = requestedDeprecated.map((s) => `\"${s}\"`).join(', ');\n throw new Error(\n `Refusing to install deprecated entr${\n requestedDeprecated.length === 1 ? 'y' : 'ies'\n } ${list}. ` +\n 'These entries are archived and not part of the active distribution (ADR 0028). ' +\n 'Pass `--include-deprecated` to override (e.g. for migration tooling).',\n );\n }\n\n const effectiveManifest = includeDeprecated\n ? { ...manifest, entries: [...manifest.entries, ...archived] }\n : manifest;\n\n const knownIds = new Set([\n ...activeIds,\n ...(includeDeprecated ? archivedIds : []),\n ]);\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown entry id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ui list\\` to see options.`,\n );\n }\n\n const result = await installUiEntries({\n projectRoot,\n manifest: effectiveManifest,\n packageRoot,\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex((p) => p.package === packageName);\n const prior = idx >= 0 ? installed.installed[idx] : null;\n const mergedResources = mergeResources(\n prior?.resources ?? [],\n result.resources,\n );\n\n const entry = {\n package: packageName,\n variant: '_flat',\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: mergedResources,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n await writeInstalledManifest(projectRoot, installed);\n\n if (uiCfg.version !== manifest.version) {\n uiCfg.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n }\n\n return {\n packageName,\n orderedIds: result.orderedIds,\n written: result.written,\n skipped: result.skipped,\n npmDependencies: result.npmDependencies,\n resources: result.resources,\n };\n}\n\nfunction mergeResources<T extends { id: string }>(prior: T[], next: T[]): T[] {\n const merged = new Map<string, T>();\n for (const r of prior) merged.set(r.id, r);\n for (const r of next) merged.set(r.id, r);\n return Array.from(merged.values());\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiList } from '../../core/ui-list.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出 @teamix-evo/ui 的所有 entry 及已安装状态')\n .option('--installed', '仅展示已安装的 entry')\n .option(\n '--include-deprecated',\n '同时列出已归档的 deprecated entry(默认隐藏,ADR 0028)',\n )\n .action(\n async (opts: { installed?: boolean; includeDeprecated?: boolean }) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const { entries, total, installedCount } = await runUiList({\n projectRoot,\n installedOnly: opts.installed,\n includeDeprecated: opts.includeDeprecated,\n });\n\n if (entries.length === 0) {\n logger.info(\n opts.installed\n ? 'No ui entries installed.'\n : 'No ui entries available.',\n );\n return;\n }\n\n const idWidth = Math.max(...entries.map((e) => e.id.length), 4);\n const typeWidth = Math.max(...entries.map((e) => e.type.length), 4);\n\n logger.info(\n `${'ID'.padEnd(idWidth)} ${'TYPE'.padEnd(\n typeWidth,\n )} STATUS DESCRIPTION`,\n );\n logger.info(\n `${'─'.repeat(idWidth)} ${'─'.repeat(\n typeWidth,\n )} ────────── ───────────`,\n );\n\n for (const e of entries) {\n // STATUS column packs install + deprecation in 10 chars wide field.\n const status = e.deprecated\n ? e.installed\n ? 'INST/DEPR'\n : 'DEPRECATED'\n : e.installed\n ? 'INSTALLED'\n : '–';\n logger.info(\n `${e.id.padEnd(idWidth)} ${e.type.padEnd(\n typeWidth,\n )} ${status.padEnd(10)} ${e.description}`,\n );\n }\n\n logger.info('');\n logger.info(\n `Total: ${total} entr${\n total === 1 ? 'y' : 'ies'\n }, ${installedCount} installed.`,\n );\n } catch (err) {\n logger.error(`Failed to list ui entries: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import type { UiEntry } from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { readInstalledManifest } from './state.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\nexport interface RunUiListOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** When true, only return entries that are already installed. */\n installedOnly?: boolean;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n /**\n * When true, also include archived entries from `manifest.deprecatedEntries`\n * (ADR 0028). They are flagged with `deprecated: true` in the result.\n */\n includeDeprecated?: boolean;\n}\n\nexport interface UiEntryListItem {\n id: string;\n type: UiEntry['type'];\n description: string;\n installed: boolean;\n /** True when the entry comes from `manifest.deprecatedEntries` (ADR 0028). */\n deprecated: boolean;\n}\n\nexport interface RunUiListResult {\n packageName: string;\n /** Total number of entries declared by the package manifest. */\n total: number;\n /** Number of installed entries (based on the project's installed manifest). */\n installedCount: number;\n /** Filtered + decorated entries. */\n entries: UiEntryListItem[];\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui list`.\n *\n * Returns structured data; the CLI command formats it for terminal output.\n */\nexport async function runUiList(\n options: RunUiListOptions,\n): Promise<RunUiListResult> {\n const { projectRoot, installedOnly, includeDeprecated } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\n\n const { manifest } = await loadUiData(packageName);\n const installedManifest = await readInstalledManifest(projectRoot);\n\n const installedIds = new Set<string>();\n const uiPkg = installedManifest?.installed.find(\n (p) => p.package === packageName,\n );\n for (const r of uiPkg?.resources ?? []) {\n const colon = r.id.indexOf(':');\n installedIds.add(colon >= 0 ? r.id.slice(0, colon) : r.id);\n }\n\n const archived = manifest.deprecatedEntries ?? [];\n const pool = includeDeprecated\n ? [\n ...manifest.entries.map((e) => ({ entry: e, deprecated: false })),\n ...archived.map((e) => ({ entry: e, deprecated: true })),\n ]\n : manifest.entries.map((e) => ({ entry: e, deprecated: false }));\n\n const entries: UiEntryListItem[] = pool\n .filter(({ entry }) => !installedOnly || installedIds.has(entry.id))\n .map(({ entry, deprecated }) => ({\n id: entry.id,\n type: entry.type,\n description: entry.description,\n installed: installedIds.has(entry.id),\n deprecated,\n }));\n\n return {\n packageName,\n total: manifest.entries.length + (includeDeprecated ? archived.length : 0),\n installedCount: installedIds.size,\n entries,\n };\n}\n","/**\n * `teamix-evo biz-ui` — variant-aware business UI subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const bizUiCommand = new Command('biz-ui').description(\n '管理业务 UI 组件(变体感知 — 与 design / templates 同变体名空间)',\n);\n\nbizUiCommand.addCommand(addCommand);\nbizUiCommand.addCommand(listCommand);\nbizUiCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runBizUiAdd } from '../../core/variant-ui-add.js';\nimport { readTokensVariant } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个业务 UI 组件(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '组件 id 列表,如 \"tenant-switcher\" \"org-picker\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n // (Future) auto-detect from .teamix-evo/tokens-lock.json variant.\n // For now require explicit --variant.\n throw new Error(\n '--variant <name> is required. Run `teamix-evo biz-ui list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Cross-variant install guard (#BUG-104): if the project is locked\n // to a different variant via tokens-lock.json, fail fast with a\n // clear remediation hint instead of letting the resolver throw an\n // opaque \"Unknown entry id\" later.\n const projectVariant = await readTokensVariant(projectRoot);\n if (projectVariant && projectVariant !== opts.variant) {\n throw new Error(\n `Variant mismatch \\u2014 project is locked to \"${projectVariant}\" but you requested \"${opts.variant}\". ` +\n `Fix: run \\`teamix-evo tokens uninstall -y\\` then ` +\n `\\`teamix-evo tokens init ${opts.variant}\\` to switch, ` +\n `or re-run with \\`--variant ${projectVariant}\\` to install for the current variant.`,\n );\n }\n\n logger.info(\n `Installing biz-ui entries from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runBizUiAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `biz-ui add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\n logger.info(`Resolved order: ${result.orderedIds.join(' → ')}`);\n\n const npmDeps = Object.entries(result.npmDependencies);\n if (npmDeps.length > 0) {\n logger.info('');\n logger.info('Install npm dependencies in your project:');\n const installCmd = npmDeps\n .map(([name, range]) => `${name}@${range}`)\n .join(' ');\n logger.info(` pnpm add ${installCmd}`);\n }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","/**\n * Programmatic install for variant-aware UI packages — biz-ui & templates.\n *\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md), these\n * two packages share the variant-aware shape: top-level catalog + per-variant\n * manifest. The install logic is the same as `runUiAdd` (registry dependency\n * resolution + frozen-on-add + import rewrite) — only differences are:\n *\n * 1. The package source is `<pkg>/variants/<variant>/` rather than `<pkg>/`\n * 2. A `--variant` selector picks which variant to install from\n * 3. The installed manifest entry records `variant: \"<name>\"` rather than\n * `_flat`\n *\n * This module exposes a single shared implementation parametrized by\n * `packageName` (`@teamix-evo/biz-ui` or `@teamix-evo/templates`) and is\n * surfaced via `runBizUiAdd` / `runTemplatesAdd` thin wrappers.\n */\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport type {\n InstalledManifest,\n InstalledResource,\n UiEntry,\n UiPackageManifest,\n VariantUiPackageName,\n} from '@teamix-evo/registry';\nimport {\n loadUiPackageManifest,\n loadVariantUiPackageCatalog,\n loadVariantUiPackageManifest,\n} from '@teamix-evo/registry';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\nexport interface RunVariantUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Variant id (e.g. `\"opentrek\"`). */\n variant: string;\n /** Entry ids to install. */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the package name. */\n packageName?: string;\n /**\n * Override resolution of the package root. When set, skips\n * `require.resolve(\"<packageName>/package.json\")`.\n */\n packageRoot?: string;\n}\n\nexport interface RunVariantUiAddResult {\n packageName: string;\n variant: string;\n orderedIds: string[];\n written: number;\n skipped: number;\n npmDependencies: Record<string, string>;\n resources: InstalledResource[];\n}\n\nasync function runVariantUiAdd(\n packageName: VariantUiPackageName,\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n const { projectRoot, variant, ids, overwrite } = options;\n const fullPackageName = options.packageName ?? `@teamix-evo/${packageName}`;\n\n if (ids.length === 0) {\n throw new Error('At least one entry id must be provided.');\n }\n\n const config = await readProjectConfig(projectRoot);\n const uiCfg = config?.packages?.ui;\n if (!config || !uiCfg?.aliases) {\n throw new Error(\n `UI not initialized. Run \\`teamix-evo ui init\\` first — \\`${packageName} add\\` writes into the same alias map (business / templates).`,\n );\n }\n\n const packageRoot =\n options.packageRoot ?? resolvePackageRoot(fullPackageName);\n\n // Validate that this variant exists in the catalog (clear error if not).\n const catalog = await loadVariantUiPackageCatalog(packageRoot);\n if (!catalog.variants.some((v) => v.name === variant)) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Variant \"${variant}\" not found in ${fullPackageName}. Known variants: ${known}. Hint: \\`teamix-evo ${packageName} list-variants\\` shows all.`,\n );\n }\n\n // Load the per-variant manifest from packages/<pkg>/variants/<variant>/.\n const variantDir = path.join(packageRoot, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n\n // Validate requested ids (must be defined in this variant package, not in ui)\n const knownIds = new Set(variantManifest.entries.map((e) => e.id));\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown entry id(s) in ${packageName}#${variant}: ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ${packageName} list-variants\\` to see this package's variants, or \\`teamix-evo ${packageName} list --variant ${variant}\\` for its entries.`,\n );\n }\n\n // Cross-package dependency resolution (fixes #22).\n // variant-aware entries (biz-ui / templates) reference @teamix-evo/ui entries\n // by id via `registryDependencies` (e.g. tenant-switcher → popover/button/cn).\n // Merge ui package's entries into the dep graph so the resolver can find\n // them. The installer's skipExisting=frozen guard means already-installed ui\n // entries are not rewritten.\n const uiPackageRoot = resolvePackageRoot('@teamix-evo/ui');\n const uiManifest = await loadUiPackageManifest(uiPackageRoot);\n\n // Resolve each entry's true package root for source file paths. Entries from\n // the variant package live under variantDir; entries from @teamix-evo/ui live\n // under uiPackageRoot.\n const entryPackageRoot = new Map<string, string>();\n const mergedEntries: UiEntry[] = [];\n for (const e of variantManifest.entries) {\n entryPackageRoot.set(e.id, variantDir);\n mergedEntries.push(e);\n }\n for (const e of uiManifest.entries) {\n // variant entry id wins over ui entry of same id (rare/illegal but safe).\n if (entryPackageRoot.has(e.id)) continue;\n entryPackageRoot.set(e.id, uiPackageRoot);\n mergedEntries.push(e);\n }\n\n const adaptedManifest: UiPackageManifest = {\n schemaVersion: 1,\n package: 'ui',\n version: variantManifest.version,\n engines: variantManifest.engines,\n entries: mergedEntries,\n };\n\n const result = await installUiEntries({\n projectRoot,\n manifest: adaptedManifest,\n packageRoot: variantDir, // default for variant entries\n entryPackageRoot, // ui entries resolve from uiPackageRoot\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n // Update installed manifest, keyed by (package, variant). Multiple variants\n // of the same package can co-exist (rare but legal).\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex(\n (p) => p.package === fullPackageName && p.variant === variant,\n );\n const prior = idx >= 0 ? installed.installed[idx] : null;\n const mergedResources = mergeResources(\n prior?.resources ?? [],\n result.resources,\n );\n\n const entry = {\n package: fullPackageName,\n variant,\n version: variantManifest.version,\n installedAt: new Date().toISOString(),\n resources: mergedResources,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n await writeInstalledManifest(projectRoot, installed);\n\n return {\n packageName: fullPackageName,\n variant,\n orderedIds: result.orderedIds,\n written: result.written,\n skipped: result.skipped,\n npmDependencies: result.npmDependencies,\n resources: result.resources,\n };\n}\n\nfunction mergeResources<T extends { id: string }>(prior: T[], next: T[]): T[] {\n const merged = new Map<string, T>();\n for (const r of prior) merged.set(r.id, r);\n for (const r of next) merged.set(r.id, r);\n return Array.from(merged.values());\n}\n\n/** `teamix-evo biz-ui add <ids...> --variant <name>`. */\nexport async function runBizUiAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('biz-ui', options);\n}\n\n/** `teamix-evo templates add <ids...> --variant <name>`. */\nexport async function runTemplatesAdd(\n options: RunVariantUiAddOptions,\n): Promise<RunVariantUiAddResult> {\n return runVariantUiAdd('templates', options);\n}\n\n// ─── List variants ───────────────────────────────────────────────────────────\n\nexport interface ListVariantUiResult {\n packageName: string;\n variants: Array<{\n name: string;\n displayName: string;\n version: string;\n description?: string;\n }>;\n}\n\nasync function listVariantUi(\n packageName: VariantUiPackageName,\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n const fullPackageName = `@teamix-evo/${packageName}`;\n const root = packageRoot ?? resolvePackageRoot(fullPackageName);\n const catalog = await loadVariantUiPackageCatalog(root);\n return {\n packageName: fullPackageName,\n variants: catalog.variants.map((v) => ({\n name: v.name,\n displayName: v.displayName,\n version: v.version,\n description: v.description,\n })),\n };\n}\n\nexport async function listBizUiVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('biz-ui', packageRoot);\n}\n\nexport async function listTemplatesVariants(\n packageRoot?: string,\n): Promise<ListVariantUiResult> {\n return listVariantUi('templates', packageRoot);\n}\n\n// ─── List entries inside a variant ───────────────────────────────────────────\n\nexport interface ListVariantUiEntriesResult {\n packageName: string;\n variant: string;\n entries: Array<{\n id: string;\n name: string;\n type: string;\n description?: string;\n registryDependencies: string[];\n }>;\n}\n\nasync function listVariantUiEntries(\n packageName: VariantUiPackageName,\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n const fullPackageName = `@teamix-evo/${packageName}`;\n const root = packageRoot ?? resolvePackageRoot(fullPackageName);\n const catalog = await loadVariantUiPackageCatalog(root);\n if (!catalog.variants.some((v) => v.name === variant)) {\n const known = catalog.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Variant \"${variant}\" not found in ${fullPackageName}. Known: ${known}.`,\n );\n }\n const variantDir = path.join(root, 'variants', variant);\n const variantManifest = await loadVariantUiPackageManifest(variantDir);\n return {\n packageName: fullPackageName,\n variant,\n entries: variantManifest.entries.map((e) => ({\n id: e.id,\n name: e.name,\n type: e.type,\n description: e.description,\n registryDependencies: e.registryDependencies ?? [],\n })),\n };\n}\n\nexport async function listBizUiEntries(\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n return listVariantUiEntries('biz-ui', variant, packageRoot);\n}\n\nexport async function listTemplatesEntries(\n variant: string,\n packageRoot?: string,\n): Promise<ListVariantUiEntriesResult> {\n return listVariantUiEntries('templates', variant, packageRoot);\n}\n","import { Command } from 'commander';\nimport { listBizUiEntries } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出指定变体下的 biz-ui entries')\n .requiredOption('--variant <name>', '变体名(如 opentrek / uni-manager)')\n .action(async (opts: { variant: string }) => {\n try {\n const result = await listBizUiEntries(opts.variant);\n logger.info(`${result.packageName}#${result.variant} entries:`);\n logger.info('');\n if (result.entries.length === 0) {\n logger.info(' (no entries — variant skeleton, awaiting components)');\n return;\n }\n for (const e of result.entries) {\n const deps = e.registryDependencies.length\n ? ` [deps: ${e.registryDependencies.join(', ')}]`\n : '';\n logger.info(` ${e.id} (${e.type})${deps}`);\n if (e.description) logger.info(` ${e.description}`);\n logger.info('');\n }\n logger.info(\n `Install: teamix-evo biz-ui add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { listBizUiVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/biz-ui 包内提供的所有业务变体')\n .action(async () => {\n try {\n const result = await listBizUiVariants();\n logger.info(`Available biz-ui variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo biz-ui add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","/**\n * `teamix-evo templates` — variant-aware page template subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const templatesCommand = new Command('templates').description(\n '管理页面模板(变体感知 — 与 design / biz-ui 同变体名空间)',\n);\n\ntemplatesCommand.addCommand(addCommand);\ntemplatesCommand.addCommand(listCommand);\ntemplatesCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTemplatesAdd } from '../../core/variant-ui-add.js';\nimport { readTokensVariant } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个页面模板(按 id,自动展开 ui 包的 registryDependencies)',\n )\n .argument('<ids...>', '模板 id 列表,如 \"list-detail-page\"')\n .option('--variant <name>', '变体 id(必填,如 \"opentrek\"、\"uni-manager\")')\n .option('--overwrite', '即使目标文件已存在也覆盖')\n .action(\n async (\n ids: string[],\n opts: { variant?: string; overwrite?: boolean },\n ) => {\n try {\n if (!opts.variant) {\n throw new Error(\n '--variant <name> is required. Run `teamix-evo templates list-variants` to see available variants.',\n );\n }\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n // Cross-variant install guard (#BUG-104): refuse to install templates\n // from a variant other than the one the project is locked to.\n const projectVariant = await readTokensVariant(projectRoot);\n if (projectVariant && projectVariant !== opts.variant) {\n throw new Error(\n `Variant mismatch \\u2014 project is locked to \"${projectVariant}\" but you requested \"${opts.variant}\". ` +\n `Fix: run \\`teamix-evo tokens uninstall -y\\` then ` +\n `\\`teamix-evo tokens init ${opts.variant}\\` to switch, ` +\n `or re-run with \\`--variant ${projectVariant}\\` to install for the current variant.`,\n );\n }\n\n logger.info(\n `Installing templates from variant \"${opts.variant}\": ${ids.join(', ')}`,\n );\n\n const result = await runTemplatesAdd({\n projectRoot,\n variant: opts.variant,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `templates add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Variant: ${result.variant}`);\n logger.info(`Resolved order: ${result.orderedIds.join(' → ')}`);\n\n const npmDeps = Object.entries(result.npmDependencies);\n if (npmDeps.length > 0) {\n logger.info('');\n logger.info('Install npm dependencies in your project:');\n const installCmd = npmDeps\n .map(([name, range]) => `${name}@${range}`)\n .join(' ');\n logger.info(` pnpm add ${installCmd}`);\n }\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n },\n );\n","import { Command } from 'commander';\nimport { listTemplatesEntries } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出指定变体下的 templates entries')\n .requiredOption('--variant <name>', '变体名(如 opentrek / uni-manager)')\n .action(async (opts: { variant: string }) => {\n try {\n const result = await listTemplatesEntries(opts.variant);\n logger.info(`${result.packageName}#${result.variant} entries:`);\n logger.info('');\n if (result.entries.length === 0) {\n logger.info(' (no entries — variant skeleton, awaiting templates)');\n return;\n }\n for (const e of result.entries) {\n const deps = e.registryDependencies.length\n ? ` [deps: ${e.registryDependencies.join(', ')}]`\n : '';\n logger.info(` ${e.id} (${e.type})${deps}`);\n if (e.description) logger.info(` ${e.description}`);\n logger.info('');\n }\n logger.info(\n `Install: teamix-evo templates add <id> --variant ${result.variant}`,\n );\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { listTemplatesVariants } from '../../core/variant-ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listVariantsCommand = new Command('list-variants')\n .description('列出 @teamix-evo/templates 包内提供的所有页面模板变体')\n .action(async () => {\n try {\n const result = await listTemplatesVariants();\n logger.info(`Available templates variants in ${result.packageName}:`);\n logger.info('');\n if (result.variants.length === 0) {\n logger.info(' (no variants yet)');\n return;\n }\n for (const v of result.variants) {\n logger.info(` ${v.name} (${v.displayName}) — v${v.version}`);\n if (v.description) logger.info(` ${v.description}`);\n logger.info('');\n }\n logger.info('Install from a variant: teamix-evo templates add <id> --variant <name>');\n } catch (err) {\n logger.error(`Failed: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { logsAnalyzeCommand } from './analyze.js';\nimport { logsTraceCommand } from './trace.js';\n\nexport const logsCommand = new Command('logs').description(\n '查询 vibe-logger 输出 (.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 { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\n\ninterface AnalyzeOptions {\n dir?: string;\n days?: string;\n top?: string;\n json?: boolean;\n}\n\nexport interface LogRecord {\n ts: string;\n agent: string;\n event: string;\n session: string;\n tool?: string;\n file?: string;\n tags?: string[];\n duration_ms?: number;\n error?: boolean;\n mcpArgs?: string[];\n prompt?: string;\n cwd?: string;\n}\n\nexport interface AnalyzeReport {\n range: { from: string | null; to: string | null };\n totals: {\n records: number;\n sessions: number;\n errors: number;\n files: number;\n };\n byAgent: Record<string, number>;\n byEvent: Record<string, number>;\n topTools: Array<{ tool: string; count: number }>;\n topTags: Array<{ tag: string; count: number }>;\n topMcp: Array<{ name: string; count: number; argKeys: string[] }>;\n recentErrors: Array<{\n ts: string;\n tool?: string;\n file?: string;\n session: string;\n }>;\n}\n\nconst DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const logsAnalyzeCommand = new Command('analyze')\n .description(\n '汇总 vibe-logger 输出 (.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 dayDirs = readdirSync(baseDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && DATE_DIR_RE.test(e.name))\n .map((e) => e.name)\n .sort()\n .reverse();\n const selected =\n dayLimit !== undefined ? dayDirs.slice(0, dayLimit) : dayDirs;\n\n const records: LogRecord[] = [];\n for (const day of selected) {\n const dayPath = join(baseDir, day);\n let entries: string[];\n try {\n entries = readdirSync(dayPath);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n const fp = join(dayPath, entry);\n try {\n if (!statSync(fp).isFile()) continue;\n } catch {\n continue;\n }\n const text = readFileSync(fp, 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n records.push(JSON.parse(line) as LogRecord);\n } catch {\n // Skip malformed lines silently — vibe-logger always emits valid\n // JSON, but partial writes mid-flush could leave a torn last line.\n }\n }\n }\n }\n\n const report = buildReport(records, top);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n printReport(baseDir, selected.length, report);\n });\n\nexport function buildReport(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 dayCount: number,\n r: AnalyzeReport,\n): void {\n logger.info(`vibe-logger 分析报告`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 天数: ${dayCount}`);\n logger.info(` 时间: ${r.range.from ?? '-'} → ${r.range.to ?? '-'}`);\n logger.info('');\n logger.info(\n `Totals records=${r.totals.records} sessions=${r.totals.sessions} errors=${r.totals.errors} files=${r.totals.files}`,\n );\n logger.info(`By agent ${formatKv(r.byAgent)}`);\n logger.info(`By event ${formatKv(r.byEvent)}`);\n logger.info('');\n logger.info('Top tools:');\n for (const { tool, count } of r.topTools) {\n logger.info(` ${pad(count, 5)} ${tool}`);\n }\n if (r.topTags.length) {\n logger.info('');\n logger.info('Top package tags (which package the AI touched):');\n for (const { tag, count } of r.topTags) {\n logger.info(` ${pad(count, 5)} ${tag}`);\n }\n }\n if (r.topMcp.length) {\n logger.info('');\n logger.info('Top MCP tools:');\n for (const { name, count, argKeys } of r.topMcp) {\n const keys = argKeys.length ? ` args: ${argKeys.join(', ')}` : '';\n logger.info(` ${pad(count, 5)} ${name}${keys}`);\n }\n }\n if (r.recentErrors.length) {\n logger.info('');\n logger.info(`Recent errors (last ${r.recentErrors.length}):`);\n for (const e of r.recentErrors) {\n logger.info(\n ` ${e.ts} session=${e.session} tool=${e.tool ?? '-'} file=${\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\nfunction parseIntOrUndef(v: string | undefined): number | undefined {\n if (v === undefined) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n","/**\n * `teamix-evo logs trace` — session-level chain trace of vibe-logger output.\n *\n * Reads the same JSONL stream as `logs analyze`, then groups records by\n * `session` and rebuilds, for each user prompt, the chain of tool calls that\n * followed it (up to the next prompt or `Stop`). This turns the raw event\n * stream into a \"what did the AI actually do for this request?\" view.\n *\n * Filters:\n * --prompt <keyword> case-insensitive substring match on UserPromptSubmit\n * --session <id> prefix match on session id\n * --days <n> limit to last N day-directories (same as analyze)\n * --dir <path> override log root (default <project>/.log/ai)\n * --json machine-readable output for CI / dashboards\n */\nimport { Command } from 'commander';\nimport { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { logger } from '../../utils/logger.js';\nimport type { LogRecord } from './analyze.js';\n\ninterface TraceOptions {\n dir?: string;\n days?: string;\n prompt?: string;\n session?: string;\n json?: boolean;\n}\n\nexport interface TraceStep {\n ts: string;\n event: string;\n tool?: string;\n file?: string;\n tags?: string[];\n duration_ms?: number;\n error?: boolean;\n}\n\nexport interface TraceChain {\n prompt: string;\n promptTs: string;\n steps: TraceStep[];\n}\n\nexport interface TraceSession {\n id: string;\n agent: string;\n chains: TraceChain[];\n}\n\nexport interface TraceReport {\n sessions: TraceSession[];\n}\n\nconst DATE_DIR_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const logsTraceCommand = new Command('trace')\n .description(\n '按会话还原 AI 调用链路:从用户 prompt 起始,串联后续 PreToolUse/PostToolUse 直到下一个 prompt 或 Stop',\n )\n .option('--prompt <keyword>', '按用户输入关键字过滤 (子串匹配,不区分大小写)')\n .option('--session <id>', '指定会话 ID (前缀匹配)')\n .option('--days <n>', '只看最近 N 天的目录 (默认 7)', '7')\n .option('--dir <path>', 'log 目录 (默认 <project>/.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\nfunction readRecords(baseDir: string, dayLimit: number): LogRecord[] {\n const dayDirs = readdirSync(baseDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && DATE_DIR_RE.test(e.name))\n .map((e) => e.name)\n .sort()\n .reverse();\n const selected = dayDirs.slice(0, dayLimit);\n\n const records: LogRecord[] = [];\n for (const day of selected) {\n const dayPath = join(baseDir, day);\n let entries: string[];\n try {\n entries = readdirSync(dayPath);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n const fp = join(dayPath, entry);\n try {\n if (!statSync(fp).isFile()) continue;\n } catch {\n continue;\n }\n const text = readFileSync(fp, 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n records.push(JSON.parse(line) as LogRecord);\n } catch {\n // Skip malformed lines silently (consistent with analyze).\n }\n }\n }\n }\n return records;\n}\n\nexport function buildTrace(\n records: LogRecord[],\n filter: { prompt?: string; session?: string } = {},\n): TraceReport {\n // 1. Group by session id.\n const groups = new Map<string, LogRecord[]>();\n for (const r of records) {\n if (!r.session) continue;\n const arr = groups.get(r.session) ?? [];\n arr.push(r);\n groups.set(r.session, arr);\n }\n\n const promptNeedle = filter.prompt?.toLowerCase();\n const sessionPrefix = filter.session;\n\n const sessions: TraceSession[] = [];\n\n for (const [sessionId, items] of groups.entries()) {\n if (sessionPrefix && !sessionId.startsWith(sessionPrefix)) continue;\n\n // 2. Sort within session by timestamp.\n items.sort((a, b) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0));\n\n // 3. Walk records: each UserPromptSubmit opens a chain; PreToolUse pushes\n // a step, PostToolUse merges duration/error into the matching pre by\n // tool name (FIFO of unmatched). Stop or next prompt closes the chain.\n const chains: TraceChain[] = [];\n let current: TraceChain | null = null;\n let pending: Map<string, number[]> = new Map();\n\n const closeCurrent = () => {\n if (current) chains.push(current);\n current = null;\n pending = new Map();\n };\n\n for (const r of items) {\n if (r.event === 'UserPromptSubmit') {\n if (current) closeCurrent();\n current = { prompt: r.prompt ?? '', promptTs: r.ts, steps: [] };\n pending = new Map();\n continue;\n }\n if (r.event === 'Stop') {\n if (current) closeCurrent();\n continue;\n }\n if (!current) continue; // Skip events before any prompt.\n\n if (r.event === 'PreToolUse') {\n const idx = current.steps.length;\n current.steps.push({\n ts: r.ts,\n event: 'PreToolUse',\n tool: r.tool,\n file: r.file,\n tags: r.tags,\n duration_ms: r.duration_ms,\n error: r.error ?? false,\n });\n if (r.tool) {\n const list = pending.get(r.tool) ?? [];\n list.push(idx);\n pending.set(r.tool, list);\n }\n } else if (r.event === 'PostToolUse') {\n const list = r.tool ? pending.get(r.tool) : undefined;\n if (list && list.length > 0) {\n const idx = list.shift()!;\n if (list.length === 0 && r.tool) pending.delete(r.tool);\n const step = current.steps[idx]!;\n if (r.duration_ms !== undefined) step.duration_ms = r.duration_ms;\n if (r.error !== undefined) step.error = r.error;\n if (!step.file && r.file) step.file = r.file;\n if ((!step.tags || step.tags.length === 0) && r.tags)\n step.tags = r.tags;\n } else {\n // Orphan post (pre clipped or in another file) — record as-is.\n current.steps.push({\n ts: r.ts,\n event: 'PostToolUse',\n tool: r.tool,\n file: r.file,\n tags: r.tags,\n duration_ms: r.duration_ms,\n error: r.error ?? false,\n });\n }\n }\n }\n if (current) closeCurrent();\n\n // 4. Apply prompt filter; drop sessions with no surviving chain.\n const filteredChains = promptNeedle\n ? chains.filter((c) => c.prompt.toLowerCase().includes(promptNeedle))\n : chains;\n if (filteredChains.length === 0) continue;\n\n sessions.push({\n id: sessionId,\n agent: items[0]?.agent ?? 'unknown',\n chains: filteredChains,\n });\n }\n\n // Newest first feels more useful for interactive triage.\n sessions.sort((a, b) => {\n const ta = a.chains[0]?.promptTs ?? '';\n const tb = b.chains[0]?.promptTs ?? '';\n return tb.localeCompare(ta);\n });\n\n return { sessions };\n}\n\nfunction printTrace(baseDir: string, r: TraceReport): void {\n logger.info(`vibe-logger 链路追踪`);\n logger.info(` 目录: ${baseDir}`);\n logger.info(` 会话: ${r.sessions.length}`);\n logger.info('');\n\n if (r.sessions.length === 0) {\n logger.info('未找到匹配的会话/提示。');\n return;\n }\n\n for (const s of r.sessions) {\n logger.info(`━━━ Session: ${s.id} (${s.agent}) ━━━`);\n logger.info('');\n for (const c of s.chains) {\n logger.info(\n `[${formatTime(c.promptTs)}] 💬 Prompt: ${quote(\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\nfunction parseIntOrUndef(v: string | undefined): number | undefined {\n if (v === undefined) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n","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';\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.exit(1);\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: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { execa } from 'execa';\nimport { fileExists, readFileOrNull, writeFileSafe } 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\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\nexport type RunLintInitResult =\n | {\n status: 'installed';\n eslint: boolean;\n stylelint: 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 { projectRoot, skipInstall } = options;\n\n const eslintConfigPath = path.join(projectRoot, 'eslint.config.js');\n const stylelintConfigPath = path.join(projectRoot, 'stylelint.config.cjs');\n\n const eslintExists = await fileExists(eslintConfigPath);\n const stylelintExists = await fileExists(stylelintConfigPath);\n\n if (eslintExists && stylelintExists) {\n return { status: 'already-initialized' };\n }\n\n // ─── Install dependencies ──────────────────────────────────────────────\n if (!skipInstall) {\n const depsToInstall = [\n ...(eslintExists ? [] : ESLINT_DEPS),\n ...(stylelintExists ? [] : 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 // ─── Write config files ────────────────────────────────────────────────\n let wroteEslint = false;\n let wroteStylelint = false;\n\n if (!eslintExists) {\n await writeFileSafe(eslintConfigPath, ESLINT_CONFIG_CONTENT);\n logger.debug(`Wrote eslint.config.js → ${eslintConfigPath}`);\n wroteEslint = true;\n }\n\n if (!stylelintExists) {\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 await patchPackageJsonScripts(projectRoot);\n\n return {\n status: 'installed',\n eslint: wroteEslint,\n stylelint: wroteStylelint,\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 */\nasync function patchPackageJsonScripts(projectRoot: string): Promise<void> {\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) return;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw);\n } catch {\n return;\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 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}\n"],"mappings":"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","names":["Command","createRequire","Command","os","path","path","fs","createRequire","path","rel","path","path","fs","require","path","fs","fs","path","fs","stat","rel","targetFile","exists","current","path","DEFAULT_SKILLS_PACKAGE","require","createRequire","fs","os","path","TEAMIX_DIR","CONFIG_FILE","Command","path","fs","createRequire","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","CONSUMER_TOKENS_DIR","CONSUMER_THEME_FILE","require","createRequire","resolveTokensPackageRoot","loadTokensPackageManifest","getVariantEntry","Command","Command","Command","version","Command","Command","Command","fs","path","Command","confirm","Command","Command","Command","prompts","initCommand","Command","Command","prompts","Command","resolveIdesAndScope","parseIdeList","parseScope","Command","listCommand","Command","Command","createRequire","DEFAULT_SKILLS_PACKAGE","FLAT_VARIANT","entry","require","createRequire","SKILLS_PACKAGE","updateCommand","Command","Command","prompts","path","fs","SKILLS_PACKAGE","uninstallCommand","Command","confirm","Command","path","fs","createRequire","loadSkillsPackageManifest","require","createRequire","loadSkillsPackageManifest","stat","Command","parseIdeList","parseScope","Command","path","fs","dirExists","rel","stat","Command","Command","initCommand","listCommand","updateCommand","uninstallCommand","Command","Command","prompts","initCommand","Command","Command","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","quote","addCommand","Command","Command","DEFAULT_UI_PACKAGE","listCommand","Command","Command","initCommand","addCommand","listCommand","Command","Command","path","createRequire","loadUiPackageManifest","require","createRequire","resolvePackageRoot","loadUiPackageManifest","mergeResources","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","addCommand","Command","Command","listCommand","Command","Command","listVariantsCommand","Command","Command","addCommand","listCommand","listVariantsCommand","Command","Command","existsSync","resolve","join","Command","resolve","join","existsSync","text","Command","readFileSync","readdirSync","existsSync","statSync","resolve","join","DATE_DIR_RE","Command","resolve","join","existsSync","parseIntOrUndef","readdirSync","statSync","text","readFileSync","Command","Command","Command","prompts","path","fs","initCommand","Command","Command","initCommand","require","createRequire","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/tokens/index.ts","../src/commands/tokens/init.ts","../src/ide/QoderAdapter.ts","../src/ide/ClaudeAdapter.ts","../src/ide/index.ts","../src/core/tokens-init.ts","../src/utils/fs.ts","../src/utils/logger.ts","../src/utils/hash.ts","../src/core/state.ts","../src/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/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/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/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/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/legacy-tokens-migrate.ts","../src/core/agents-md.ts","../src/core/snapshot.ts","../src/core/project-init.ts","../src/commands/init/wizard.ts","../src/commands/_shared/step-icon.ts","../src/commands/update/index.ts","../src/core/project-update.ts","../src/commands/restore/index.ts","../src/commands/switch/index.ts","../src/core/variant-switch.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { tokensCommand } from './commands/tokens/index.js';\nimport { skillsCommand } from './commands/skills/index.js';\nimport { uiCommand } from './commands/ui/index.js';\nimport { bizUiCommand } from './commands/biz-ui/index.js';\nimport { templatesCommand } from './commands/templates/index.js';\nimport { logsCommand } from './commands/logs/index.js';\nimport { lintCommand } from './commands/lint/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { updateCommand } from './commands/update/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(templatesCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(lintCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(updateCommand);\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';\n\nexport const tokensCommand = new Command('tokens')\n .description('管理 design tokens(变体级 theme.css 等)');\n\ntokensCommand.addCommand(initCommand);\ntokensCommand.addCommand(updateCommand);\ntokensCommand.addCommand(listCommand);\ntokensCommand.addCommand(listVariantsCommand);\ntokensCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTokensInit } from '../../core/tokens-init.js';\nimport { hasPackageJson } from '../../utils/global-root.js';\nimport { logger } from '../../utils/logger.js';\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 { 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 const overridesContent = await fs.readFile(overridesAbs, 'utf-8');\n installed.push({\n id: `tokens:${CONSUMER_OVERRIDES_FILE}`,\n target: path.posix.join(CONSUMER_TOKENS_DIR, CONSUMER_OVERRIDES_FILE),\n hash: computeHash(overridesContent),\n strategy: 'frozen',\n });\n\n // Write consumer-side state files.\n const lock: TokensPackLock = {\n schemaVersion: 1,\n variant: {\n name: variantEntry.name,\n displayName: variantEntry.displayName,\n version: variantEntry.version,\n from: packageName,\n },\n packageVersion: catalog.version,\n linked: variantEntry.linked,\n installedAt: new Date().toISOString(),\n };\n await writeFileSafe(\n path.join(projectRoot, '.teamix-evo', 'tokens-lock.json'),\n JSON.stringify(lock, null, 2) + '\\n',\n );\n\n // Merge into existing config so unrelated package entries (skills / ui)\n // aren't clobbered (#18).\n const config: ProjectConfig = {\n $schema: 'https://teamix-evo.dev/schema/config/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 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';\nconst SKILLS_DIR = 'skills';\nconst SKILLS_LOCK_FILE = 'manifest.lock.json';\n\n/**\n * Get the .teamix-evo directory path for a project.\n */\nexport function getTeamixDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR);\n}\n\n/**\n * Ensure the .teamix-evo directory exists.\n */\nexport async function ensureTeamixDir(projectRoot: string): Promise<string> {\n const dir = getTeamixDir(projectRoot);\n await ensureDir(dir);\n return dir;\n}\n\n/**\n * Read the project config from .teamix-evo/config.json.\n * Returns null if the file does not exist; THROWS on corrupted content\n * so callers don't silently clobber prior config (#32 #18).\n */\nexport async function readProjectConfig(\n projectRoot: string,\n): Promise<ProjectConfig | null> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n const raw = await readFileOrNull(configPath);\n if (raw === null) return null;\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Corrupted config.json (${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 */\nexport function getSkillsSourceDir(\n projectRoot: string,\n skillName?: string,\n): string {\n const base = path.join(projectRoot, TEAMIX_DIR, SKILLS_DIR);\n return skillName ? path.join(base, skillName) : base;\n}\n\n/**\n * Read .teamix-evo/skills/manifest.lock.json. Returns null if missing.\n */\nexport async function readSkillsLock(\n projectRoot: string,\n): Promise<SkillsLock | null> {\n const lockPath = path.join(\n projectRoot,\n TEAMIX_DIR,\n SKILLS_DIR,\n SKILLS_LOCK_FILE,\n );\n const raw = await readFileOrNull(lockPath);\n if (raw === null) return null;\n try {\n const data = JSON.parse(raw);\n const result = validateSkillsLock(data);\n if (!result.success) {\n logger.warn(`Invalid skills manifest.lock.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(\n `Failed to parse skills manifest.lock.json: ${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 { getSkillsSourceDir } from './state.js';\n\n/**\n * Source-mirror skills installer (per ADR 0013).\n *\n * Two-stage flow:\n * 1. **writeSkillSources** — render upstream `<packageRoot>/<skill.source>` and\n * write to `<projectRoot>/.teamix-evo/skills/<id>/` (the consumer-side\n * source of truth, regenerable, in git).\n * 2. **syncSkillsToIdes** — pure byte-for-byte copy from source dir to each\n * requested IDE mirror path (`.qoder/skills/<id>/`, `.claude/skills/<id>/`).\n * Mirrors are 100% derived; not subject to managed-region preservation.\n *\n * `installSkills` orchestrates both. `updateSkills` re-renders the source with\n * managed-region preservation against the existing source (NOT the mirrors),\n * then re-syncs.\n */\n\nexport interface SkillInstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** Skills package manifest */\n manifest: SkillsPackageManifest;\n /** Template data */\n data: Record<string, unknown>;\n /** Absolute skills package root */\n packageRoot: string;\n /** IDE kinds to install for (intersection with skill.ides is computed) */\n ides: readonly SkillIde[];\n /** Install scope */\n scope: SkillScope;\n /** Optional: limit to specific skill ids */\n onlyIds?: string[];\n}\n\nexport interface SkillInstallResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Install (or reinstall) all skills declared in the manifest using the\n * source-mirror flow. Returns InstalledResource records for both source files\n * and IDE mirror files.\n */\nexport async function installSkills(\n options: SkillInstallOptions,\n): Promise<SkillInstallResult> {\n const { manifest, ides, scope, onlyIds } = options;\n const installed: InstalledResource[] = [];\n\n const targets = manifest.skills.filter(\n (s) => !onlyIds || onlyIds.includes(s.id),\n );\n\n for (const skill of targets) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) {\n logger.warn(\n `Skill \"${skill.name}\" supports [${skill.ides.join(\n ',',\n )}], no overlap with [${ides.join(',')}]; skipped.`,\n );\n continue;\n }\n\n const sourceRecords = await writeSkillSource(skill, options);\n installed.push(...sourceRecords);\n\n for (const ide of skillIdes) {\n const mirrorRecords = await mirrorSkillToIde(\n skill,\n ide,\n scope,\n options.projectRoot,\n );\n installed.push(...mirrorRecords);\n }\n }\n\n return { resources: installed, count: installed.length };\n}\n\n/**\n * Render upstream skill source(s) and write to `.teamix-evo/skills/<id>/`.\n * Returns InstalledResource records (one per file) describing the source files.\n */\nasync function writeSkillSource(\n skill: SkillEntry,\n options: SkillInstallOptions,\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const targetDir = getSkillsSourceDir(projectRoot, skill.name);\n const stat = await fs.stat(sourceAbs);\n const records: InstalledResource[] = [];\n\n if (stat.isFile()) {\n const targetFile = path.join(targetDir, 'SKILL.md');\n const content = await renderSkillContent(sourceAbs, skill, data);\n await writeFileSafe(targetFile, content);\n records.push(makeSourceRecord(skill, targetFile, content));\n logger.debug(` Wrote source: ${targetFile}`);\n return records;\n }\n\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n for (const entry of entries) {\n const rel = path.relative(sourceAbs, entry);\n let targetFile = path.join(targetDir, rel);\n if (skill.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n const content =\n skill.template && entry.endsWith('.hbs')\n ? renderTemplate(await loadTemplateFile(entry), { ...data, skill })\n : await fs.readFile(entry, 'utf-8');\n await writeFileSafe(targetFile, content);\n const relWritten = path.relative(targetDir, targetFile);\n records.push(makeSourceRecord(skill, targetFile, content, relWritten));\n logger.debug(` Wrote source: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Mirror an installed skill source to a single IDE path.\n *\n * Per ADR 0013, mirrors are normally pure byte-for-byte copies of source.\n * However, when the existing mirror file already contains managed-region\n * markers that match the skill's declared `managedRegions`, the writer falls\n * back to a managed-region replacement (#BUG-101) so user-authored notes\n * outside the markers are preserved across `skills update` / `skills sync`.\n * If markers are absent, the full source content is written (backward-compat).\n */\nasync function mirrorSkillToIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n projectRoot: string,\n): Promise<InstalledResource[]> {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const records: InstalledResource[] = [];\n\n const sourceFiles = await walkDir(sourceDir);\n await ensureDir(targetDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n records.push(\n makeMirrorRecord(skill, targetFile, writtenContent, ide, scope, rel),\n );\n logger.debug(` Mirrored ${ide}:${scope}: ${targetFile}`);\n }\n return records;\n}\n\n/**\n * Write a mirror file with optional managed-region preservation (#BUG-101).\n *\n * Behavior:\n * - Target absent → full write of source.\n * - `managedRegions` empty/undefined OR existing mirror has no matching\n * markers → full overwrite (with drift warning if content differs).\n * - Otherwise → replace each present managed region's content from the\n * source into the existing mirror, preserving content outside markers.\n *\n * Returns the bytes actually written (used for the InstalledResource hash).\n */\nasync function writeMirrorContent(\n targetFile: string,\n sourceContent: string,\n managedRegions: readonly string[] | undefined,\n sourceFile: string,\n): Promise<string> {\n const existing = await readFileOrNull(targetFile);\n\n if (existing === null) {\n await writeFileSafe(targetFile, sourceContent);\n return sourceContent;\n }\n\n const regions = managedRegions ?? [];\n const matchedRegions = regions.filter((id) => hasManagedRegion(existing, id));\n\n if (matchedRegions.length === 0) {\n if (existing !== sourceContent) {\n logger.warn(\n `Mirror drift detected at ${targetFile} — overwriting from source. ` +\n `Edit ${sourceFile} (not the mirror) and re-run \\`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 const { projectRoot, skills, ides, scope, onlyIds } = options;\n const out: InstalledResource[] = [];\n\n const targets = skills.filter((s) => !onlyIds || onlyIds.includes(s.id));\n for (const skill of targets) {\n const sourceDir = getSkillsSourceDir(projectRoot, skill.name);\n if (!(await fileExists(sourceDir))) {\n logger.warn(\n `Skill \"${skill.id}\" has no source at ${sourceDir}; skipped.`,\n );\n continue;\n }\n for (const ide of ides) {\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(\n skill.name,\n scope,\n projectRoot,\n );\n await ensureDir(targetDir);\n const sourceFiles = await walkDir(sourceDir);\n for (const src of sourceFiles) {\n const rel = path.relative(sourceDir, src);\n const targetFile = path.join(targetDir, rel);\n const sourceContent = await fs.readFile(src, 'utf-8');\n\n // Region-aware mirror write (#BUG-101): keep user content outside\n // managed markers when the mirror already has them; otherwise full\n // overwrite (with drift warning).\n const writtenContent = await writeMirrorContent(\n targetFile,\n sourceContent,\n skill.managedRegions,\n src,\n );\n out.push({\n id: rel === 'SKILL.md' ? skill.id : `${skill.id}:${rel}`,\n target: targetFile,\n hash: computeHash(writtenContent),\n strategy: skill.updateStrategy,\n ide,\n scope,\n });\n }\n }\n }\n return { resources: out, count: out.length };\n}\n\n/**\n * Remove all installed skill files. Returns the absolute paths removed.\n * After files are unlinked, walks up the directory tree pruning empty dirs\n * until a non-empty ancestor is reached (#33).\n */\nexport async function removeSkillFiles(\n records: InstalledResource[],\n): Promise<string[]> {\n const removed: string[] = [];\n for (const r of records) {\n try {\n await fs.unlink(r.target);\n removed.push(r.target);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(`Failed to remove ${r.target}: ${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 * Recursively walk a directory and return all file paths.\n */\nexport async function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\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 { installSkills } from './skills-installer.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n readSkillsLock,\n writeSkillsLock,\n readTokensVariant,\n} from './state.js';\nimport { logger } from '../utils/logger.js';\nimport { ensureMcpJson } from '../utils/mcp.js';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\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 | {\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 const skippedSkillIds = candidateIds.filter((id) =>\n existing.skillIds.has(id),\n );\n const onlyIds = candidateIds.filter((id) => !existing.skillIds.has(id));\n\n if (existingSkillsCfg && onlyIds.length === 0) {\n return { status: 'already-initialized' };\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 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\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 /** Skill ids that were requested but already installed; skipped. */\n skippedSkillIds: string[];\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 const skippedSkillIds = requestedNames.filter((n) =>\n existing.skillIds.has(n),\n );\n const onlyIds = requestedNames.filter((n) => !existing.skillIds.has(n));\n\n // Incremental fast path: nothing new to install.\n if (onlyIds.length === 0) {\n return {\n status: 'installed',\n packageName,\n version: existingSkillsCfg?.version ?? manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n };\n }\n\n 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 existing,\n existingConfig,\n });\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 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}> {\n const {\n projectRoot,\n packageName,\n ideIdent,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n skippedSkillIds,\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 return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: onlyIds.length,\n fileCount: result.count,\n resources: result.resources,\n addedSkillIds: onlyIds,\n skippedSkillIds,\n };\n}\n\nfunction mergeInstalledResources(\n existing: InstalledResource[],\n next: InstalledResource[],\n): InstalledResource[] {\n const map = new Map<string, InstalledResource>();\n const key = (r: InstalledResource): string =>\n `${r.id}|${r.ide ?? ''}|${r.scope ?? ''}`;\n for (const r of existing) map.set(key(r), r);\n for (const r of next) map.set(key(r), r);\n return [...map.values()];\n}\n","import { existsSync } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nconst GLOBAL_META_DIR = '.teamix-evo-global';\nconst TEAMIX_DIR = '.teamix-evo';\nconst CONFIG_FILE = 'config.json';\n\nexport function getGlobalMetaRoot(): string {\n return path.join(os.homedir(), GLOBAL_META_DIR);\n}\n\nexport function isTeamixEvoProject(dir: string): boolean {\n return existsSync(path.join(dir, TEAMIX_DIR, CONFIG_FILE));\n}\n\nexport async function ensureGlobalMetaRoot(): Promise<string> {\n const root = getGlobalMetaRoot();\n await fs.mkdir(root, { recursive: true });\n return root;\n}\n\n/**\n * Quick guard for project-scope commands (`tokens init`, `ui init`,\n * `skills 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 { 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 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 if (\n result.addedSkillIds.length === 0 &&\n result.skippedSkillIds.length > 0\n ) {\n logger.warn(\n `已存在,无需添加:${result.skippedSkillIds.join(\n ', ',\n )}。如需刷新内容请运行 \"npx teamix-evo@latest skills update\"。`,\n );\n return;\n }\n\n logger.success(`Skills added: ${result.skillCount} skill(s)`);\n logger.info(` IDEs: ${result.ides.join(', ')}`);\n logger.info(` Scope: ${result.scope}`);\n if (result.addedSkillIds.length > 0) {\n logger.info(` Added: ${result.addedSkillIds.join(', ')}`);\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (already added)`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info(\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/ 下的源重新镜像到 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/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('检查 .teamix-evo/skills/ 源与 IDE 镜像是否漂移;提示如何修复')\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';\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);\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 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 templates: DEFAULT_UI_ALIASES.templates,\n },\n iconLibrary,\n tsx: tsxAns,\n rsc: rscAns,\n };\n}\n","import type { ProjectConfig, UiAliases } from '@teamix-evo/registry';\nimport { ensureMcpJson } from '../utils/mcp.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n} from './state.js';\n\nexport const DEFAULT_UI_ALIASES: UiAliases = {\n components: 'src/components/ui',\n hooks: 'src/hooks',\n utils: 'src/lib/utils',\n lib: 'src/lib',\n business: 'src/components/business',\n templates: 'src/templates',\n};\n\nexport const DEFAULT_UI_ICON_LIBRARY = 'lucide';\n\nexport interface RunUiInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Component aliases. Falls back to {@link DEFAULT_UI_ALIASES}. */\n aliases?: Partial<UiAliases>;\n /** Declared icon library (does not trigger code rewrite). Defaults to \"lucide\". */\n iconLibrary?: string;\n /** Whether the project uses TSX (true) or JSX (false). Defaults to true. */\n tsx?: boolean;\n /** Whether the project emits React Server Components markers. Defaults to false. */\n rsc?: boolean;\n /** IDE identifier written into config.ide when bootstrapping a fresh config (defaults to \"qoder\"). */\n ide?: string;\n}\n\nexport type RunUiInitResult =\n | {\n status: 'installed';\n aliases: UiAliases;\n iconLibrary: string;\n tsx: boolean;\n rsc: boolean;\n }\n | {\n status: 'already-initialized';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo ui init`.\n *\n * Writes `packages.ui` into `.teamix-evo/config.json` only — no resource files\n * are touched. Use {@link runUiAdd} afterwards to install component sources.\n */\nexport async function runUiInit(\n options: RunUiInitOptions,\n): Promise<RunUiInitResult> {\n const { projectRoot } = options;\n const ideIdent = options.ide ?? 'qoder';\n\n await ensureTeamixDir(projectRoot);\n\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.ui) {\n return { status: 'already-initialized' };\n }\n\n const aliases: UiAliases = {\n components: options.aliases?.components ?? DEFAULT_UI_ALIASES.components,\n hooks: options.aliases?.hooks ?? DEFAULT_UI_ALIASES.hooks,\n utils: options.aliases?.utils ?? DEFAULT_UI_ALIASES.utils,\n lib: options.aliases?.lib ?? DEFAULT_UI_ALIASES.lib,\n business: options.aliases?.business ?? DEFAULT_UI_ALIASES.business,\n templates: options.aliases?.templates ?? DEFAULT_UI_ALIASES.templates,\n };\n const iconLibrary = options.iconLibrary ?? DEFAULT_UI_ICON_LIBRARY;\n const tsx = options.tsx ?? true;\n const rsc = options.rsc ?? false;\n\n const config: ProjectConfig = existingConfig ?? {\n $schema: 'https://teamix-evo.dev/schema/config/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 { 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 .argument('<ids...>', 'entry id 列表,如 \"button\" \"dialog\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .option(\n '--include-deprecated',\n '允许安装已归档的 deprecated entry(仅迁移 / 审计场景,ADR 0028)',\n )\n .action(\n async (\n ids: string[],\n opts: { overwrite?: boolean; includeDeprecated?: boolean },\n ) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Installing entries: ${ids.join(', ')}`);\n\n const result = await runUiAdd({\n projectRoot,\n ids,\n overwrite: opts.overwrite,\n includeDeprecated: opts.includeDeprecated,\n });\n\n logger.success(\n `UI add complete: ${result.written} written, ${result.skipped} skipped.`,\n );\n logger.info('');\n logger.info(`Resolved order: ${result.orderedIds.join(' → ')}`);\n\n const npmDeps = Object.entries(result.npmDependencies);\n if (npmDeps.length > 0) {\n logger.info('');\n logger.info('Install npm dependencies in your project:');\n const installCmd = npmDeps\n .map(([name, range]) => `${name}@${range}`)\n .join(' ');\n logger.info(` pnpm add ${installCmd}`);\n logger.info(` # or: npm install ${installCmd}`);\n }\n } catch (err) {\n const message = 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","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { UiPackageManifest } from '@teamix-evo/registry';\nimport { loadUiPackageManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Load the ui package manifest and optional shared `_data.json`.\n *\n * @param packageName - e.g. \"@teamix-evo/ui\"\n */\nexport async function loadUiData(packageName: string): Promise<{\n manifest: UiPackageManifest;\n data: Record<string, unknown>;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n\n logger.debug(`Resolved ui package root: ${packageRoot}`);\n\n const manifest = await loadUiPackageManifest(packageRoot);\n\n let data: Record<string, unknown> = {};\n const dataPath = path.join(packageRoot, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, packageRoot };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n UiEntry,\n UiPackageManifest,\n UiAliases,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { resolveUiEntryOrder } from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport { logger } from '../utils/logger.js';\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}\n\nexport interface UiInstallResult {\n /** Ordered list of entry ids that were processed (deps + requested) */\n orderedIds: string[];\n /** Per-file install records (for InstalledManifest) */\n resources: InstalledResource[];\n /** Aggregate npm dependencies across the installed entries */\n npmDependencies: Record<string, string>;\n /** Number of files written */\n written: number;\n /** Number of files skipped because they already exist (frozen) */\n skipped: number;\n}\n\n/**\n * Install the requested ui entries (transitively resolving registryDependencies).\n * For frozen entries that already exist on disk, the write is skipped — shadcn-style.\n */\nexport async function installUiEntries(\n options: UiInstallOptions,\n): Promise<UiInstallResult> {\n const {\n projectRoot,\n manifest,\n packageRoot,\n entryPackageRoot,\n aliases,\n requested,\n skipExisting = true,\n } = options;\n\n const orderedIds = resolveUiEntryOrder(manifest.entries, requested);\n const idToEntry = new Map(manifest.entries.map((e) => [e.id, e]));\n\n const resources: InstalledResource[] = [];\n const npmDeps: Record<string, string> = {};\n let written = 0;\n let skipped = 0;\n\n for (const id of orderedIds) {\n const entry = idToEntry.get(id);\n if (!entry) continue;\n\n // Aggregate npm deps regardless of whether files were written — the user\n // may have manually deleted node_modules; we want to surface the full set.\n if (entry.dependencies) {\n for (const [name, range] of Object.entries(entry.dependencies)) {\n npmDeps[name] = range;\n }\n }\n\n for (const file of entry.files) {\n const targetAbs = resolveTargetPath(projectRoot, aliases, entry, file);\n const exists = await fileExists(targetAbs);\n\n if (\n exists &&\n skipExisting &&\n (entry.updateStrategy ?? 'frozen') === 'frozen'\n ) {\n logger.info(` skip (frozen, exists): ${rel(projectRoot, targetAbs)}`);\n skipped++;\n continue;\n }\n\n const rootForEntry = entryPackageRoot?.get(entry.id) ?? packageRoot;\n const sourceAbs = path.resolve(rootForEntry, file.source);\n const raw = await fs.readFile(sourceAbs, 'utf-8');\n const transformed = rewriteImports(raw, aliases);\n await writeFileSafe(targetAbs, transformed);\n written++;\n logger.info(` write: ${rel(projectRoot, targetAbs)}`);\n\n resources.push({\n id: `${entry.id}:${file.targetName}`,\n target: targetAbs,\n hash: computeHash(transformed),\n strategy: entry.updateStrategy ?? 'frozen',\n });\n }\n }\n\n 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};\n\n/**\n * Rewrite import specifiers in a UI source file so that the developer-time\n * placeholders (e.g. `@/utils/cn`) resolve to the user's configured aliases\n * (e.g. `@/lib/utils/cn` when `aliases.utils === \"src/lib/utils\"`).\n *\n * Matches both static imports and dynamic imports of the form `@/<root>/<rest>`.\n * Bare `@/` (no segment) and unknown segments are left untouched.\n *\n * The rewrite uses each user alias verbatim. If the user alias begins with\n * `src/`, that prefix is stripped because TypeScript-style `@/*` → `src/*`\n * mappings expect paths relative to `src`.\n */\nexport function rewriteImports(source: string, aliases: UiAliases): string {\n return source.replace(\n /(['\"])@\\/([a-z][a-z0-9-]*)(\\/[^'\"]*)?\\1/g,\n (full, quote: string, root: string, rest: string | undefined) => {\n const aliasKey = SOURCE_ROOT_TO_ALIAS_KEY[root];\n if (!aliasKey) return full;\n const alias = aliases[aliasKey];\n const normalized = aliasToImportPath(alias);\n // Flatten per-entry directory paths. In the source tree, cross-entry\n // references use `@/<root>/<entry-dir>/<file>` (e.g.\n // `@/components/skeleton/skeleton`), but after install files land flat\n // in the alias directory (`@/components/ui/skeleton`). Strip the\n // intermediate directory when rest has exactly two segments.\n const flatRest = flattenRestPath(rest);\n return `${quote}${normalized}${flatRest}${quote}`;\n },\n );\n}\n\n/**\n * Flatten a source-tree relative path for the installed (flat) layout.\n *\n * In the UI source tree, files live in per-entry directories:\n * `@/components/skeleton/skeleton` → rest = `/skeleton/skeleton`\n * After install, they are placed flat in the alias directory:\n * `@/components/ui/skeleton` → rest = `/skeleton`\n *\n * When rest has exactly two path segments (`/dir/file`), the first segment\n * (the entry directory) is stripped, leaving only the file reference.\n * Single-segment paths (e.g. `/cn`) pass through unchanged.\n */\nfunction flattenRestPath(rest: string | undefined): string {\n if (!rest) return '';\n // Split: \"/skeleton/skeleton\" → [\"\", \"skeleton\", \"skeleton\"]\n const segments = rest.split('/');\n if (segments.length === 3) {\n // Two real segments: /dir/file → /file\n return `/${segments[2]}`;\n }\n return rest;\n}\n\n/**\n * Convert an alias path (relative to the project root, e.g. `src/lib/utils`)\n * into an import-path prefix (`@/lib/utils`).\n *\n * Strips a leading `src/` so the path matches the convention of a `@/*` →\n * `src/*` tsconfig mapping. If the alias has a different prefix (for projects\n * that don't put code under `src/`), we keep it verbatim with `@/` prepended.\n */\nfunction aliasToImportPath(alias: string): string {\n const trimmed = alias.replace(/^\\.\\//, '').replace(/\\/$/, '');\n if (trimmed.startsWith('src/')) {\n return `@/${trimmed.slice('src/'.length)}`;\n }\n return `@/${trimmed}`;\n}\n","import type {\n InstalledManifest,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\nexport interface RunUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Entry ids to install (registry dependencies are resolved transitively). */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n /**\n * When true, allow installing entries that live in `manifest.deprecatedEntries`\n * (ADR 0028). Default: false — deprecated ids are treated as unknown and the\n * call errors with a hint pointing the user at the active replacement.\n */\n includeDeprecated?: boolean;\n}\n\nexport interface RunUiAddResult {\n packageName: string;\n /** Registered ids in install order (deps + requested). */\n orderedIds: string[];\n /** Number of files written. */\n written: number;\n /** Number of files skipped due to frozen + exists. */\n skipped: number;\n /** Aggregate npm dependencies of the installed entries. */\n npmDependencies: Record<string, string>;\n /** Per-file install records merged into the installed manifest. */\n resources: InstalledResource[];\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui add <ids...>`.\n *\n * Requires `packages.ui` to already exist in `.teamix-evo/config.json`\n * (i.e. {@link runUiInit} was called earlier).\n */\nexport async function runUiAdd(\n options: RunUiAddOptions,\n): Promise<RunUiAddResult> {\n const { projectRoot, ids, overwrite, includeDeprecated } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\n\n if (ids.length === 0) {\n throw new Error('At least one entry id must be provided.');\n }\n\n const config = await readProjectConfig(projectRoot);\n const uiCfg = config?.packages?.ui;\n if (!config || !uiCfg?.aliases) {\n throw new Error(\n 'UI not initialized. Run `runUiInit` (or `teamix-evo ui init`) first.',\n );\n }\n\n const { manifest, packageRoot } = await loadUiData(packageName);\n\n // Per ADR 0028: deprecated entries are archived in `deprecatedEntries`\n // and not exposed by default. When the caller opts in, we splice them\n // back into the active list so dependency resolution and install work\n // exactly as for active entries.\n const archived = manifest.deprecatedEntries ?? [];\n const archivedIds = new Set(archived.map((e) => e.id));\n const activeIds = new Set(manifest.entries.map((e) => e.id));\n\n const requestedDeprecated = ids.filter((id) => archivedIds.has(id));\n if (requestedDeprecated.length > 0 && !includeDeprecated) {\n const list = requestedDeprecated.map((s) => `\"${s}\"`).join(', ');\n throw new Error(\n `Refusing to install deprecated entr${\n requestedDeprecated.length === 1 ? 'y' : 'ies'\n } ${list}. ` +\n 'These entries are archived and not part of the active distribution (ADR 0028). ' +\n 'Pass `--include-deprecated` to override (e.g. for migration tooling).',\n );\n }\n\n const effectiveManifest = includeDeprecated\n ? { ...manifest, entries: [...manifest.entries, ...archived] }\n : manifest;\n\n const knownIds = new Set([\n ...activeIds,\n ...(includeDeprecated ? archivedIds : []),\n ]);\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown entry id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ui list\\` to see options.`,\n );\n }\n\n const result = await installUiEntries({\n projectRoot,\n manifest: effectiveManifest,\n packageRoot,\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex((p) => p.package === packageName);\n const prior = idx >= 0 ? installed.installed[idx] : null;\n const mergedResources = mergeResources(\n prior?.resources ?? [],\n result.resources,\n );\n\n const entry = {\n package: packageName,\n variant: '_flat',\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: mergedResources,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n await writeInstalledManifest(projectRoot, installed);\n\n if (uiCfg.version !== manifest.version) {\n uiCfg.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n }\n\n return {\n packageName,\n orderedIds: result.orderedIds,\n written: result.written,\n skipped: result.skipped,\n npmDependencies: result.npmDependencies,\n resources: result.resources,\n };\n}\n\nfunction mergeResources<T extends { id: string }>(prior: T[], next: T[]): T[] {\n const merged = new Map<string, T>();\n for (const r of prior) merged.set(r.id, r);\n for (const r of next) merged.set(r.id, r);\n return Array.from(merged.values());\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiList } from '../../core/ui-list.js';\nimport { logger } from '../../utils/logger.js';\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: 'src/components/ui' | 'src/components/business';\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';\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};\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 === '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}\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 === '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';\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};\n\nconst ALIAS_KEY: Record<ComponentCategory, keyof UiAliases> = {\n ui: 'components',\n 'biz-ui': 'business',\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 onDiskIds = installDirExists\n ? await listComponentIds(installDirAbs)\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. Strips the file extension; skips `index.{ts,tsx}`\n * and any nested directories (entry sources are flattened by ui-installer).\n */\nasync function listComponentIds(installDirAbs: string): Promise<string[]> {\n const entries = await fs.readdir(installDirAbs, { withFileTypes: true });\n const ids: string[] = [];\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 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 UiAliases,\n UiEntry,\n UiPackageManifest,\n UpgradeRiskLevel,\n UpgradeStagingDiff,\n UpgradeStagingEntry,\n UpgradeStagingManifest,\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};\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 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 };\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 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 * `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","/**\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","/**\n * `teamix-evo templates` — variant-aware page template subcommands.\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nimport { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { listVariantsCommand } from './list-variants.js';\n\nexport const templatesCommand = new Command('templates').description(\n '管理页面模板(变体感知 — 与 design / biz-ui 同变体名空间)',\n);\n\ntemplatesCommand.addCommand(addCommand);\ntemplatesCommand.addCommand(listCommand);\ntemplatesCommand.addCommand(listVariantsCommand);\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runTemplatesAdd } from '../../core/variant-ui-add.js';\nimport { readTokensVariant } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\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 { fileExists, readFileOrNull, writeFileSafe } 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\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\nexport type RunLintInitResult =\n | {\n status: 'installed';\n eslint: boolean;\n stylelint: 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 { projectRoot, skipInstall } = options;\n\n const eslintConfigPath = path.join(projectRoot, 'eslint.config.js');\n const stylelintConfigPath = path.join(projectRoot, 'stylelint.config.cjs');\n\n const eslintExists = await fileExists(eslintConfigPath);\n const stylelintExists = await fileExists(stylelintConfigPath);\n\n if (eslintExists && stylelintExists) {\n return { status: 'already-initialized' };\n }\n\n // ─── Install dependencies ──────────────────────────────────────────────\n if (!skipInstall) {\n const depsToInstall = [\n ...(eslintExists ? [] : ESLINT_DEPS),\n ...(stylelintExists ? [] : 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 // ─── Write config files ────────────────────────────────────────────────\n let wroteEslint = false;\n let wroteStylelint = false;\n\n if (!eslintExists) {\n await writeFileSafe(eslintConfigPath, ESLINT_CONFIG_CONTENT);\n logger.debug(`Wrote eslint.config.js → ${eslintConfigPath}`);\n wroteEslint = true;\n }\n\n if (!stylelintExists) {\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 await patchPackageJsonScripts(projectRoot);\n\n return {\n status: 'installed',\n eslint: wroteEslint,\n stylelint: wroteStylelint,\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 */\nasync function patchPackageJsonScripts(projectRoot: string): Promise<void> {\n const pkgPath = path.join(projectRoot, 'package.json');\n const raw = await readFileOrNull(pkgPath);\n if (!raw) return;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw);\n } catch {\n return;\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 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}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { detectProjectState } from '../../core/init-detect.js';\nimport { detectConflicts } from '../../core/init-conflicts.js';\nimport { runProjectInit } from '../../core/project-init.js';\nimport { runInitWizard } from './wizard.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { CancelledError } from '../../utils/cancelled.js';\nimport { STEP_ICON } from '../_shared/step-icon.js';\n\ninterface InitCmdOptions {\n cwd?: string;\n yes?: boolean;\n dryRun?: boolean;\n variant?: string;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '把 teamix-evo AI 套件接入已有工程(普通版接入:检测冲突 → 引导 wizard → 静默落地)',\n )\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('-y, --yes', '跳过交互,全部使用推荐默认值')\n .option('--dry-run', '只输出执行计划,不写任何文件')\n .option('--variant <name>', 'tokens variant(覆盖 wizard 询问)')\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`(提供 base 模板 + variant overlay + 默认页面骨架)。',\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('请使用:');\n logger.info(' • `teamix-evo update` 升级 / 同步资源(managed 区块)');\n logger.info(' • `teamix-evo doctor` 诊断当前安装状态');\n logger.info(' • `teamix-evo skills uninstall <id>` 卸载指定资源');\n return;\n }\n if (!state.hasPackageJson) {\n logger.error(\n '当前目录非 teamix-evo 工程且无 package.json — 请在工程根目录执行,或先 `npm init -y`。',\n );\n process.exitCode = 1;\n return;\n }\n\n // ─── 2. detect conflicts ───────────────────────────────────────────\n const conflicts = await detectConflicts(cwd);\n\n // ─── 3. run wizard ─────────────────────────────────────────────────\n const isInteractive = Boolean(process.stdin.isTTY);\n const answers = await runInitWizard({\n cwd,\n conflicts,\n seed: opts.variant ? { variant: opts.variant } : undefined,\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 // Pull legacy token paths off the conflict report so the orchestrator\n // can run W1.4 migrate when the user picks `tokens` strategy = `migrate`.\n // We exclude any path already inside `tokens/` (the new standard layout)\n // — those aren't legacy single-files and shouldn't be appended to\n // `tokens/tokens.overrides.css`.\n const legacyTokensPaths = (\n conflicts.items.find((it) => it.key === 'tokens')?.paths ?? []\n ).filter((p) => !p.startsWith('tokens/'));\n\n const result = await runProjectInit({\n projectRoot: cwd,\n answers,\n dryRun,\n legacyTokensPaths,\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 if (result.snapshot) {\n logger.info(\n ` • 完全回滚:\\`teamix-evo restore ${result.snapshot.ts}\\`(撤销本次 init 写入 — ADR 0019 §2)`,\n );\n }\n }\n process.exitCode = 1;\n } else {\n logger.success(`teamix-evo 已接入 ${cwd}`);\n if (result.snapshot) {\n logger.info(\n `💾 已捕获 snapshot:${result.snapshot.ts}(如需完全撤销:\\`teamix-evo restore ${result.snapshot.ts}\\`)`,\n );\n } else if (result.snapshotError) {\n logger.debug(`snapshot 捕获失败:${result.snapshotError}`);\n }\n }\n\n if (result.pendingConflictWork.length > 0) {\n logger.info('');\n logger.warn(\n `以下冲突策略需要 managed-region 引擎(批次 4 落地后可用 \\`teamix-evo conflict resolve\\` 完成):`,\n );\n for (const w of result.pendingConflictWork) {\n logger.info(` • ${w.key} → ${w.strategy}`);\n }\n }\n\n if (result.status === 'installed') {\n logger.info('');\n logger.info('Next steps:');\n logger.info(' • 启动 dev server 验证:`npm run dev`');\n if (answers.withLint) {\n logger.info(' • lint 检查:`npm run lint` / `npm run lint:css`');\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 6 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\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\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 6 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// ─── 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 6 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 ]);\n return {\n cwd: absCwd,\n items,\n hasAnyConflict: items.some((i) => i.exists),\n };\n}\n","/**\n * Legacy tokens migration — append legacy token CSS files into the new\n * standard location `tokens/tokens.overrides.css`, then back up and remove\n * the legacy files.\n *\n * Triggered when the user picks the `migrate` strategy in\n * [`init-conflicts`](./init-conflicts.ts) for the `tokens` conflict key.\n *\n * Design (per ADR 0020 + W1.4 of the manage-entry plan):\n *\n * 1. New layout owns the regenerable theme: `tokens/tokens.theme.css` is\n * written by [`runTokensInit`](./tokens-init.ts) and re-derived on every\n * install. We never migrate into the theme file.\n * 2. User-authored content from legacy single-file layouts (e.g.\n * `src/design-tokens.css`, `src/styles/design-tokens.css`,\n * `src/styles/tokens.css`) is appended to `tokens/tokens.overrides.css`\n * (frozen, user-owned) — preserving any custom CSS variables, layer\n * rules, or selectors that lived alongside the old token file.\n * 3. Every migrated source is backed up to\n * `.teamix-evo/.backups/<rel>.<iso-ts>.bak` so `restore` / manual rollback\n * can recover the pre-migration state without depending on git.\n * 4. After backup, the legacy file is removed so consumers don't keep\n * importing the stale path.\n * 5. `dryRun: true` produces the same `MigrateLegacyTokensResult` shape but\n * does not touch the filesystem — used by wizard preview & `init --dry-run`.\n *\n * The orchestrator (`project-init.ts`) calls this **after** `runTokensInit`\n * succeeds (so `tokens/tokens.overrides.css` is guaranteed to exist) and\n * **only** when the wizard returned `tokens` decision = `'migrate'` plus\n * a non-empty `legacyTokensPaths` list (the orchestrator filters out paths\n * inside `tokens/` itself before passing in).\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { ensureDir, fileExists, readFileOrNull } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\n/** Consumer-side directory where token files land (mirrors tokens-init.ts). */\nconst CONSUMER_TOKENS_DIR = 'tokens';\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 MigrateLegacyTokensOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Legacy token CSS file paths relative to `projectRoot`.\n * Caller is responsible for filtering out paths inside `tokens/` itself.\n */\n legacyPaths: string[];\n /** When true, returns the plan without touching the filesystem. */\n dryRun?: boolean;\n}\n\nexport interface MigratedLegacyToken {\n /** Source legacy path (relative to projectRoot). */\n from: string;\n /**\n * Backup destination (relative to projectRoot).\n * `null` when `dryRun: true` — the actual path is computed at write time\n * from a fresh timestamp.\n */\n backupTo: string | null;\n /** Bytes appended to `tokens/tokens.overrides.css` (UTF-8). */\n bytesAppended: number;\n}\n\nexport interface SkippedLegacyToken {\n /** Source legacy path (relative to projectRoot). */\n from: string;\n reason: 'not-found' | 'empty';\n}\n\nexport interface MigrateLegacyTokensResult {\n /** Files whose content was appended to overrides. */\n migrated: MigratedLegacyToken[];\n /** Files that were detected but had no useful content. */\n skipped: SkippedLegacyToken[];\n /** Path to the overrides file (relative to projectRoot). */\n overridesPath: string;\n /**\n * `true` when the overrides file did not exist before this migration and\n * was created with the empty template. `false` when we appended to an\n * existing file.\n */\n overridesCreated: boolean;\n /** When `true`, no filesystem writes were performed. */\n dryRun: boolean;\n}\n\n/**\n * Format the banner that separates each migrated block inside the overrides\n * file. Kept as a free function so tests can compare exact output.\n */\nfunction buildMigrationBanner(legacyRel: string, isoTimestamp: string): string {\n return `/* === Migrated from ${legacyRel} on ${isoTimestamp} === */\\n`;\n}\n\n/**\n * Compute the backup destination (relative to `projectRoot`) for a legacy\n * file, using the same convention as [`backupFile`](../utils/fs.ts).\n */\nfunction computeBackupRel(legacyRel: string, isoTimestamp: string): string {\n const tsSafe = isoTimestamp.replace(/[:.]/g, '-');\n return path.posix.join(\n '.teamix-evo',\n '.backups',\n `${legacyRel}.${tsSafe}.bak`,\n );\n}\n\n/**\n * Perform the migration. See module-level docstring for the full contract.\n */\nexport async function migrateLegacyTokens(\n options: MigrateLegacyTokensOptions,\n): Promise<MigrateLegacyTokensResult> {\n const { projectRoot, legacyPaths, dryRun = false } = options;\n\n // De-duplicate while preserving order; normalize to forward slashes so\n // the result is stable across platforms (the rel paths come from\n // init-conflicts which already uses forward slashes).\n const seen = new Set<string>();\n const uniqueLegacy: string[] = [];\n for (const raw of legacyPaths) {\n const norm = raw.split(path.sep).join('/');\n if (!seen.has(norm)) {\n seen.add(norm);\n uniqueLegacy.push(norm);\n }\n }\n\n const overridesRel = path.posix.join(\n CONSUMER_TOKENS_DIR,\n CONSUMER_OVERRIDES_FILE,\n );\n const overridesAbs = path.join(projectRoot, overridesRel);\n\n // Read existing overrides (or seed with empty template).\n const existingOverrides = await readFileOrNull(overridesAbs);\n const overridesCreated = existingOverrides === null;\n const baseContent =\n existingOverrides === null ? EMPTY_OVERRIDES_TEMPLATE : existingOverrides;\n\n const migrated: MigratedLegacyToken[] = [];\n const skipped: SkippedLegacyToken[] = [];\n\n // Build the appended payload while collecting per-file outcomes.\n const isoTimestamp = new Date().toISOString();\n let appendedPayload = '';\n\n for (const legacyRel of uniqueLegacy) {\n const legacyAbs = path.join(projectRoot, legacyRel);\n const content = await readFileOrNull(legacyAbs);\n if (content === null) {\n skipped.push({ from: legacyRel, reason: 'not-found' });\n continue;\n }\n if (content.trim() === '') {\n skipped.push({ from: legacyRel, reason: 'empty' });\n continue;\n }\n\n const banner = buildMigrationBanner(legacyRel, isoTimestamp);\n // Ensure separation from prior content with a blank line.\n const separator =\n appendedPayload === '' && baseContent.endsWith('\\n\\n') ? '' : '\\n';\n const block = `${separator}${banner}${content}${\n content.endsWith('\\n') ? '' : '\\n'\n }`;\n appendedPayload += block;\n\n const backupRel = dryRun ? null : computeBackupRel(legacyRel, isoTimestamp);\n migrated.push({\n from: legacyRel,\n backupTo: backupRel,\n bytesAppended: Buffer.byteLength(block, 'utf-8'),\n });\n }\n\n if (dryRun || migrated.length === 0) {\n // Even with no migrated files, still report whether overrides would be\n // created so callers can show an accurate plan; in non-dry-run with no\n // migrated content we don't materialize an empty overrides here — that\n // job belongs to runTokensInit (which always seeds it).\n return {\n migrated,\n skipped,\n overridesPath: overridesRel,\n overridesCreated: dryRun ? overridesCreated : false,\n dryRun,\n };\n }\n\n // Write merged overrides (atomic via temp + rename).\n await ensureDir(path.dirname(overridesAbs));\n const merged = baseContent + appendedPayload;\n const tmp = overridesAbs + '.tmp';\n await fs.writeFile(tmp, merged, 'utf-8');\n await fs.rename(tmp, overridesAbs);\n\n // Backup + remove each successfully migrated legacy file.\n for (const entry of migrated) {\n const legacyAbs = path.join(projectRoot, entry.from);\n const backupAbs = path.join(projectRoot, entry.backupTo!);\n await ensureDir(path.dirname(backupAbs));\n // Re-read source content for the backup write (could differ if the file\n // was concurrently mutated, though that's not a supported case).\n const srcContent = await readFileOrNull(legacyAbs);\n if (srcContent === null) {\n // Vanished between read and backup — skip removal silently.\n logger.debug(\n `legacy-tokens-migrate: source disappeared before backup: ${entry.from}`,\n );\n continue;\n }\n await fs.writeFile(backupAbs, srcContent, 'utf-8');\n if (await fileExists(legacyAbs)) {\n await fs.unlink(legacyAbs);\n }\n logger.debug(\n `legacy-tokens-migrate: ${entry.from} → ${overridesRel} (backup: ${entry.backupTo})`,\n );\n }\n\n return {\n migrated,\n skipped,\n overridesPath: overridesRel,\n overridesCreated,\n dryRun: false,\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\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\nexport interface RunGenerateAgentsMdResult {\n /** Absolute path of the written `AGENTS.md`. */\n path: string;\n /** Number of skill sections rendered (excludes 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\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. Idempotent — repeated invocations\n * fully overwrite the file (regenerable per ADR 0038 §4).\n */\nexport async function runGenerateAgentsMd(\n options: RunGenerateAgentsMdOptions,\n): Promise<RunGenerateAgentsMdResult> {\n const { projectRoot, variant, skillIds } = options;\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 body = renderAgentsMd({ variant, sections });\n const target = path.join(projectRoot, 'AGENTS.md');\n await fs.writeFile(target, body, 'utf8');\n return {\n path: target,\n skillCount: ordered.length,\n missingSkillIds,\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 projectRoot,\n '.teamix-evo',\n 'skills',\n 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/${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 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](https://github.com/teamix-evo/teamix-evo/blob/main/docs/adr/0038-create-agents-md-skill-trigger-fallback.md)),刷新方式见底部。\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> 刷新本文件:\\`npx teamix-evo skills add\\` 或重跑 \\`npm create teamix-evo\\` / \\`teamix-evo init\\`。\n`;\n}\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","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","/**\n * Programmatic orchestrator for `teamix-evo init` (existing-project adoption).\n *\n * Consumes {@link InitWizardAnswers} produced by `runInitWizard` and drives\n * the existing core sub-commands (`runTokensInit`, `runSkillsAdd`,\n * `runGenerateAgentsMd`, `runUiInit`, `runUiAdd`, `runLintInit`) in a fixed\n * order. Sub-commands are invoked silently — no interactive prompts here.\n *\n * Conflict handling:\n * - `conflictDecisions[key] === 'skip'` skips the corresponding step entirely.\n * - `'overwrite'` is the trivial path (the underlying core APIs already write).\n * - `'merge-managed'` (agents-md) is implemented today via\n * `runGenerateAgentsMd` which writes managed regions natively.\n * - `'skip-existing'` (shadcn-source) maps to `runUiAdd({ overwrite: false })`,\n * the existing default.\n * - All other strategies (`diff-prompt`, `backup-overwrite`, `migrate`,\n * `coexist`, `append`, `per-file-prompt`) require the managed-region engine\n * from batch 4 — they are recorded to `pendingConflictWork` so the CLI\n * surface can guide the user to the followup `teamix-evo conflict resolve`\n * step (post-batch-4).\n *\n * No interactive prompts, no `process.exit`. Throws on hard failure (P8).\n */\nimport type { InitWizardAnswers } from '../commands/init/wizard.js';\nimport type { ConflictKey, ConflictStrategy } from './init-conflicts.js';\nimport type { SkillIde } from '@teamix-evo/registry';\nimport { runTokensInit } from './tokens-init.js';\nimport { migrateLegacyTokens } from './legacy-tokens-migrate.js';\nimport { runSkillsAdd } from './skills-add.js';\nimport { runGenerateAgentsMd } from './agents-md.js';\nimport { runUiInit } from './ui-init.js';\nimport { runUiAdd } from './ui-add.js';\nimport { runLintInit } from './lint-init.js';\nimport { loadUiData } from './ui-client.js';\nimport { createSnapshot, type SnapshotResult } from './snapshot.js';\nimport { getErrorMessage } from '../utils/error.js';\n\n/**\n * Baseline UI component subset for `uiSelection === 'baseline'`. Mirrors the\n * opentrek / uni-manager preset baseline (kept in sync intentionally so the\n * existing-project init produces the same starter shape as `npm create\n * teamix-evo`). Variants pull additional pieces via `bizUi` later.\n */\nconst BASELINE_UI_ENTRIES = [\n 'button',\n 'button-group',\n 'input',\n 'form',\n 'card',\n 'collapsible',\n 'dialog',\n 'dropdown-menu',\n 'tabs',\n 'table',\n 'sidebar',\n 'page-shell',\n 'page-header',\n] as const;\n\nexport type ProjectInitStepName =\n | 'tokens'\n | 'skills'\n | 'agents-md'\n | 'ui-init'\n | 'ui-add'\n | 'lint';\n\nexport type ProjectInitStepStatus = 'ok' | 'skip' | 'fail' | 'planned';\n\nexport interface ProjectInitStep {\n name: ProjectInitStepName;\n status: ProjectInitStepStatus;\n detail?: string;\n}\n\nexport interface PendingConflictWork {\n key: ConflictKey;\n strategy: ConflictStrategy;\n reason: string;\n}\n\nexport interface ResumeHint {\n /** The first step that failed (caller resumes from here). */\n failedAt: ProjectInitStepName;\n /** Steps already finished (status === 'ok'); will short-circuit on resume. */\n completed: ProjectInitStepName[];\n /** All steps that ended in fail status. */\n failed: ProjectInitStepName[];\n /** Human-readable error from the first failed step. */\n error: string;\n /**\n * Suggested CLI command to resume. Today this is just `teamix-evo init`\n * itself — every sub-step is idempotent (returns `already-initialized`\n * when the matching state file already exists), so a re-run continues\n * from the failure point automatically. Future batches may grow a\n * dedicated `--resume` flag with a richer recovery model (batch 3).\n */\n resumeCommand: string;\n}\n\nexport interface RunProjectInitOptions {\n /** Absolute project root (existing repo to adopt teamix-evo into). */\n projectRoot: string;\n /** Wizard outcome (single source of truth for every silent sub-command). */\n answers: InitWizardAnswers;\n /**\n * Override the resolved UI entry list. When provided, replaces the\n * `answers.uiSelection`-driven list (`'baseline'` / `'all'`). Useful for\n * tests and for callers that want to install a custom subset.\n */\n uiEntries?: string[];\n /**\n * If true, skip `npm install` for lint deps. Defaults to `false` so lint\n * works out of the box; pass `true` from the create scaffold which installs\n * everything in one batch.\n */\n skipInstall?: boolean;\n /**\n * Legacy token CSS files (paths relative to `projectRoot`) detected by\n * `detectConflicts` for the `tokens` key. When `conflictDecisions.tokens`\n * is `'migrate'` and this list is non-empty, the orchestrator appends\n * each file's content into `tokens/tokens.overrides.css` and backs the\n * legacy files up to `.teamix-evo/.backups/` (W1.4 of the manage-entry\n * plan; see [`legacy-tokens-migrate`](./legacy-tokens-migrate.ts)).\n *\n * Ignored for any other `tokens` decision. The caller (init command) is\n * responsible for filtering out paths already inside `tokens/`.\n */\n legacyTokensPaths?: string[];\n /** Step-level progress hook (caller controls presentation). */\n onStep?: (step: ProjectInitStep) => void;\n /**\n * If true, plan-only mode: compute the full step list without running any\n * sub-command. Returns each step with `status: 'planned'`.\n */\n dryRun?: boolean;\n}\n\nexport interface RunProjectInitResult {\n status: 'installed' | 'partial' | 'dry-run';\n steps: ProjectInitStep[];\n /** Conflicts whose strategy needs the post-batch-4 managed-region engine. */\n pendingConflictWork: PendingConflictWork[];\n /**\n * Present when at least one step ended in `fail`. Lets the CLI surface a\n * structured recovery message instead of just a stack-trace, and gives\n * programmatic consumers a deterministic field to branch on.\n */\n resumeHint?: ResumeHint;\n /**\n * Pre-init snapshot of `.teamix-evo/`, captured automatically before any\n * file is written ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n *\n * - `null` on first-ever init (`.teamix-evo/` did not yet exist) and on\n * `dryRun`.\n * - Failure to capture a snapshot is **non-fatal** — surfaced via\n * {@link snapshotError} so the CLI can warn the user. The init pipeline\n * itself still runs.\n */\n snapshot?: SnapshotResult | null;\n /** Reason a snapshot capture failed (best-effort — never blocks init). */\n snapshotError?: string;\n}\n\n/**\n * Steps whose failure must abort the pipeline (downstream steps depend on\n * the state they write). Non-critical steps record `fail` and continue, so\n * the user gets as much done as possible in one pass.\n *\n * - `tokens` writes `.teamix-evo/tokens-lock.json` + `config.json` (skills /\n * ui depend on the variant + config existing).\n * - `skills` records the project's IDE registration; agents-md reads back\n * the manifest.\n * - `ui-init` writes `packages.ui` config (ui-add asserts on it).\n *\n * `agents-md`, `ui-add`, `lint` are independent leaves: any can fail without\n * blocking the others.\n */\nconst CRITICAL_STEPS: ReadonlySet<ProjectInitStepName> = new Set([\n 'tokens',\n 'skills',\n 'ui-init',\n]);\n\n/**\n * Strategies that are fully implementable in the current orchestrator (no\n * managed-region engine required). Anything outside this set is recorded as\n * `pendingConflictWork`.\n */\nconst IMPLEMENTED_STRATEGIES: Record<ConflictKey, ConflictStrategy[]> = {\n 'agents-md': ['merge-managed', 'overwrite', 'skip'],\n tokens: ['migrate', 'overwrite', 'skip'],\n 'components-json': ['overwrite', 'skip'],\n 'shadcn-source': ['overwrite', 'skip-existing', 'skip'],\n 'tailwind-config': ['skip'],\n 'index-css': ['skip'],\n};\n\nfunction pickIde(ides: readonly SkillIde[]): string {\n return ides[0] ?? 'qoder';\n}\n\nfunction strategyImplemented(\n key: ConflictKey,\n strategy: ConflictStrategy,\n): boolean {\n return IMPLEMENTED_STRATEGIES[key]?.includes(strategy) ?? false;\n}\n\nasync function resolveUiEntries(\n options: RunProjectInitOptions,\n): Promise<string[]> {\n if (options.uiEntries && options.uiEntries.length > 0) {\n return [...options.uiEntries];\n }\n if (options.answers.uiSelection === 'all') {\n const { manifest } = await loadUiData('@teamix-evo/ui');\n return manifest.entries.map((e) => e.id);\n }\n return [...BASELINE_UI_ENTRIES];\n}\n\n/**\n * Existing-project init pipeline.\n *\n * Order:\n * 1. tokens init (auto-installs `teamix-evo-design-${variant}` skill)\n * 2. skills add (`teamix-evo-code-${variant}`; entry skill is global, ADR 0033)\n * 3. AGENTS.md (skill trigger fallback, ADR 0038)\n * 4. ui init + ui add (gated by `withUi`)\n * 5. lint init (gated by `withLint`)\n */\nexport async function runProjectInit(\n options: RunProjectInitOptions,\n): Promise<RunProjectInitResult> {\n const { projectRoot, answers, dryRun = false, onStep } = options;\n const ide = pickIde(answers.ides);\n const steps: ProjectInitStep[] = [];\n const pending: PendingConflictWork[] = [];\n\n // ─── Pre-flight: snapshot `.teamix-evo/` so a partial / failed init can be\n // rolled back via `teamix-evo restore <ts>` (ADR 0019 §2). Best-effort:\n // dry-run skips, fresh installs return null (nothing to snapshot), I/O\n // errors are surfaced but never abort the pipeline.\n let snapshot: SnapshotResult | null = null;\n let snapshotError: string | undefined;\n if (!dryRun) {\n try {\n snapshot = await createSnapshot(projectRoot, { reason: 'init' });\n } catch (err) {\n snapshotError = getErrorMessage(err);\n }\n }\n /**\n * Set to `true` once a critical step (tokens / skills / ui-init) has\n * failed; subsequent critical steps short-circuit to `skip` so we never\n * cascade onto unsatisfied state. Non-critical leaves (agents-md / ui-add\n * / lint) keep running so the user gets as much done as possible per pass.\n */\n let aborted = false;\n /**\n * First failed step — powers the recovery summary in `resumeHint`.\n * Wrapped in an object so closures (`recordFailure`) can mutate the field\n * without TypeScript narrowing the binding to `never` after the closing\n * `if (firstFailure.value)` guard.\n */\n const firstFailure: {\n value: { step: ProjectInitStepName; error: string } | null;\n } = {\n value: null,\n };\n\n function record(step: ProjectInitStep): void {\n steps.push(step);\n onStep?.(step);\n }\n\n function recordPending(key: ConflictKey): void {\n const strategy = answers.conflictDecisions[key];\n if (!strategy) return;\n if (strategyImplemented(key, strategy)) return;\n pending.push({\n key,\n strategy,\n reason: `Strategy \"${strategy}\" requires the managed-region engine (batch 4); recorded for follow-up.`,\n });\n }\n\n /** Record a step failure; flag abort if the step is critical. */\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 const tokensDecision = answers.conflictDecisions.tokens;\n const legacyTokensPaths = options.legacyTokensPaths ?? [];\n const wantMigrate =\n tokensDecision === 'migrate' && legacyTokensPaths.length > 0;\n if (tokensDecision === 'skip') {\n record({\n name: 'tokens',\n status: 'skip',\n detail: 'conflict strategy = skip',\n });\n } else if (dryRun) {\n const planDetail = wantMigrate\n ? `runTokensInit(variant=${answers.variant}); migrateLegacyTokens(${\n legacyTokensPaths.length\n } file${legacyTokensPaths.length === 1 ? '' : 's'})`\n : `runTokensInit(variant=${answers.variant})`;\n record({\n name: 'tokens',\n status: 'planned',\n detail: planDetail,\n });\n } else {\n try {\n const result = await runTokensInit({\n projectRoot,\n variant: answers.variant,\n ide,\n });\n let detail =\n result.status === 'installed'\n ? `${result.packageName}@${result.version} (${result.count} files)`\n : result.status;\n if (wantMigrate) {\n // Migrate is best-effort: a failure here doesn't invalidate the\n // tokens install itself (theme + overrides are already in place),\n // it just leaves the legacy files alone for the user to handle.\n // We surface the outcome via the step's `detail` so the CLI prints\n // it without inventing a new step name.\n try {\n const m = await migrateLegacyTokens({\n projectRoot,\n legacyPaths: legacyTokensPaths,\n });\n detail += `; migrated ${m.migrated.length}/${\n legacyTokensPaths.length\n } legacy file${legacyTokensPaths.length === 1 ? '' : 's'} → ${\n m.overridesPath\n }`;\n if (m.skipped.length > 0) {\n detail += ` (skipped ${m.skipped.length})`;\n }\n } catch (err) {\n detail += `; migrate failed: ${getErrorMessage(err)}`;\n }\n }\n record({\n name: 'tokens',\n status: 'ok',\n detail,\n });\n } catch (err) {\n recordFailure('tokens', err);\n }\n }\n recordPending('tokens');\n\n // ─── 2. skills (code-${variant} only — manage is global, design auto-installed by tokens) ──\n const codeSkillId = `teamix-evo-code-${answers.variant}`;\n if (dryRun) {\n record({\n name: 'skills',\n status: 'planned',\n detail: `runSkillsAdd(${codeSkillId})`,\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 runSkillsAdd({\n projectRoot,\n names: [codeSkillId],\n ides: answers.ides,\n scope: answers.scope,\n ide,\n });\n record({\n name: 'skills',\n status: 'ok',\n detail:\n result.status === 'installed'\n ? `added: ${result.addedSkillIds.join(', ') || 'none'}; existing: ${\n result.skippedSkillIds.join(', ') || 'none'\n }`\n : result.status,\n });\n } catch (err) {\n recordFailure('skills', err);\n }\n }\n\n // ─── 3. AGENTS.md ──────────────────────────────────────────────────────\n const agentsMdDecision = answers.conflictDecisions['agents-md'];\n const agentsMdSkillIds = [\n `teamix-evo-design-${answers.variant}`,\n codeSkillId,\n ];\n if (agentsMdDecision === 'skip') {\n record({\n name: 'agents-md',\n status: 'skip',\n detail: 'conflict strategy = skip',\n });\n } else if (dryRun) {\n record({\n name: 'agents-md',\n status: 'planned',\n detail: `runGenerateAgentsMd(${agentsMdSkillIds.length} skills)`,\n });\n } else {\n try {\n const result = await runGenerateAgentsMd({\n projectRoot,\n variant: answers.variant,\n skillIds: agentsMdSkillIds,\n });\n record({\n name: 'agents-md',\n status: 'ok',\n detail: `${result.skillCount} skill index${\n result.missingSkillIds.length > 0\n ? ` (missing SKILL.md: ${result.missingSkillIds.join(', ')})`\n : ''\n }`,\n });\n } catch (err) {\n recordFailure('agents-md', err);\n }\n }\n recordPending('agents-md');\n\n // ─── 4. ui init + ui add ────────────────────────────────────────────────\n const componentsJsonDecision = answers.conflictDecisions['components-json'];\n const shadcnDecision = answers.conflictDecisions['shadcn-source'];\n const skipUiInit = !answers.withUi || componentsJsonDecision === 'skip';\n\n if (skipUiInit) {\n record({\n name: 'ui-init',\n status: 'skip',\n detail: !answers.withUi\n ? 'withUi = false'\n : 'components.json conflict strategy = skip',\n });\n record({\n name: 'ui-add',\n status: 'skip',\n detail: !answers.withUi\n ? 'withUi = false'\n : 'components.json conflict strategy = skip',\n });\n } else if (dryRun) {\n record({\n name: 'ui-init',\n status: 'planned',\n detail: 'runUiInit()',\n });\n const entries = await resolveUiEntries(options).catch(() => [\n ...BASELINE_UI_ENTRIES,\n ]);\n record({\n name: 'ui-add',\n status: 'planned',\n detail: `runUiAdd(${entries.length} entries: ${entries\n .slice(0, 3)\n .join(', ')}${entries.length > 3 ? '…' : ''})`,\n });\n } else {\n if (aborted) {\n record({\n name: 'ui-init',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n record({\n name: 'ui-add',\n status: 'skip',\n detail: 'aborted: earlier critical step failed',\n });\n } else {\n let uiInitOk = false;\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 uiInitOk = true;\n } catch (err) {\n recordFailure('ui-init', err);\n }\n\n if (!uiInitOk) {\n record({\n name: 'ui-add',\n status: 'skip',\n detail: 'aborted: ui-init failed',\n });\n } else if (shadcnDecision === 'skip') {\n record({\n name: 'ui-add',\n status: 'skip',\n detail: 'shadcn-source conflict strategy = skip',\n });\n } else {\n try {\n const entries = await resolveUiEntries(options);\n const addResult = await runUiAdd({\n projectRoot,\n ids: entries,\n // 'overwrite' strategy → overwrite=true; everything else (incl.\n // 'skip-existing' which is the default) → overwrite=false.\n overwrite: shadcnDecision === 'overwrite',\n });\n record({\n name: 'ui-add',\n status: 'ok',\n detail: `${addResult.orderedIds.length} entries (${addResult.written} written, ${addResult.skipped} skipped)`,\n });\n } catch (err) {\n recordFailure('ui-add', err);\n }\n }\n }\n }\n recordPending('components-json');\n recordPending('shadcn-source');\n\n // ─── 5. lint ────────────────────────────────────────────────────────────\n if (!answers.withLint) {\n record({\n name: 'lint',\n status: 'skip',\n detail: 'withLint = false',\n });\n } else if (dryRun) {\n record({\n name: 'lint',\n status: 'planned',\n detail: 'runLintInit()',\n });\n } else {\n try {\n const result = await runLintInit({\n projectRoot,\n skipInstall: options.skipInstall ?? false,\n });\n record({\n name: 'lint',\n status: 'ok',\n detail:\n result.status === 'installed'\n ? `eslint=${result.eslint}, stylelint=${result.stylelint}`\n : result.status,\n });\n } catch (err) {\n recordFailure('lint', err);\n }\n }\n\n // ─── tailwind-config / index-css are always pending today (batch 4) ────\n recordPending('tailwind-config');\n recordPending('index-css');\n\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 = {\n status,\n steps,\n pendingConflictWork: pending,\n snapshot,\n };\n if (snapshotError) out.snapshotError = snapshotError;\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 // Every sub-step is idempotent (returns `already-initialized` when its\n // state file already exists), so a plain re-run resumes from the\n // failed step. A richer --resume model lands with batch 3 (lock\n // snapshot + restore).\n resumeCommand: 'teamix-evo init',\n };\n }\n\n return out;\n}\n","import * as p from '@clack/prompts';\nimport type { SkillIde, SkillScope } 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';\nimport type {\n ConflictItem,\n ConflictKey,\n ConflictReport,\n ConflictStrategy,\n} from '../../core/init-conflicts.js';\n\n/**\n * Final answers produced by the init wizard. Every consumer of `teamix-evo\n * init` (orchestrator + later sub-commands) reads from this object exclusively\n * — flags / prompts must not be re-evaluated downstream (silent sub-commands).\n */\nexport interface InitWizardAnswers {\n variant: string;\n ides: SkillIde[];\n scope: SkillScope;\n withLint: boolean;\n withUi: boolean;\n /** 'baseline' = preset 推荐组件子集;'all' = 全量装 */\n uiSelection: 'baseline' | 'all';\n withBizUi: boolean;\n /**\n * 每类冲突文件的最终策略。键是 6 类 ConflictKey,值是 user-chosen\n * `ConflictStrategy`。当对应 ConflictItem.exists === false 时,值默认为\n * `'overwrite'`(即首次写入)。\n */\n conflictDecisions: Record<ConflictKey, ConflictStrategy>;\n}\n\n/**\n * Pre-populated values from CLI flags. Any field present here will skip the\n * corresponding prompt — enabling fully-flag-driven non-interactive init.\n */\nexport interface WizardSeed {\n variant?: string;\n ides?: SkillIde[];\n scope?: SkillScope;\n withLint?: boolean;\n withUi?: boolean;\n uiSelection?: 'baseline' | 'all';\n withBizUi?: boolean;\n /** Override any subset of conflict strategies; missing keys still fall through to per-item recommendation. */\n conflictDecisions?: Partial<Record<ConflictKey, ConflictStrategy>>;\n}\n\nexport interface RunInitWizardOptions {\n cwd: string;\n conflicts: ConflictReport;\n seed?: WizardSeed;\n /**\n * If true, accept all defaults without prompting (the user passed `-y`).\n * Defaults to `false`. Independent from TTY detection.\n */\n acceptDefaults?: boolean;\n /**\n * If true, force non-interactive mode regardless of `process.stdin.isTTY`.\n * Used by tests and CI. Defaults to `!process.stdin.isTTY`.\n */\n nonInteractive?: boolean;\n}\n\nconst FRIENDLY_KEY: Record<ConflictKey, string> = {\n 'agents-md': 'AGENTS.md',\n 'components-json': 'components.json',\n 'tailwind-config': 'tailwind.config.*',\n tokens: 'tokens / src/design-tokens.css',\n 'index-css': 'src/index.css',\n 'shadcn-source': 'src/lib/utils.ts + src/components/ui/',\n};\n\nconst STRATEGY_LABEL = {\n overwrite: '覆盖(写入新文件)',\n 'merge-managed': '合并到 <!-- teamix-evo:managed --> 块(推荐)',\n skip: '跳过(保留现状)',\n 'diff-prompt': '展示 diff 后逐项决定',\n 'backup-overwrite': '备份后重写(推荐)',\n migrate: '迁移到 tokens/ 标准位(推荐)',\n coexist: '共存(仅写 overrides,不覆盖现有)',\n append: '追加 @import 行 + managed 标记(推荐)',\n 'skip-existing': '跳过同名文件,仅装新增(推荐)',\n 'per-file-prompt': '逐文件询问',\n} satisfies Record<ConflictStrategy, string>;\n\nfunction strategyLabel(s: ConflictStrategy): string {\n return STRATEGY_LABEL[s];\n}\n\nfunction defaultConflictDecisions(\n conflicts: ConflictReport,\n override: Partial<Record<ConflictKey, ConflictStrategy>> = {},\n): Record<ConflictKey, ConflictStrategy> {\n const out = {} as Record<ConflictKey, ConflictStrategy>;\n for (const item of conflicts.items) {\n out[item.key] =\n override[item.key] ??\n (item.exists ? item.recommendedStrategy : 'overwrite');\n }\n return out;\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 `teamix-evo init` wizard.\n *\n * Behavior contract:\n * - Every field in `seed` skips its corresponding prompt.\n * - When `acceptDefaults` or `nonInteractive` is true, all unanswered\n * fields fall through to deterministic defaults (variant defaults to the\n * first catalog entry; conflict strategies use `recommendedStrategy`).\n * - In interactive mode, only `existing` conflict files trigger a strategy\n * prompt; non-existing categories silently default to `'overwrite'`.\n * - On cancel: throws `CancelledError`. Never calls `process.exit`.\n */\nexport async function runInitWizard(\n options: RunInitWizardOptions,\n): Promise<InitWizardAnswers> {\n const { cwd, conflicts, seed = {} } = options;\n const interactive =\n !options.nonInteractive &&\n Boolean(process.stdin.isTTY) &&\n !options.acceptDefaults;\n\n // ─── variant ─────────────────────────────────────────────────────────────\n let variant = seed.variant;\n if (!variant) {\n const variantOptions = await listVariantOptions();\n if (!interactive) {\n variant = variantOptions[0]?.value ?? 'opentrek';\n } else {\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\n // ─── ides ────────────────────────────────────────────────────────────────\n let ides = seed.ides;\n if (!ides || ides.length === 0) {\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\n // ─── scope ──────────────────────────────────────────────────────────────\n // 普通版接入默认 project(cwd 已有 package.json)。\n // 仍允许 seed/-y 改写;交互时不再问以减小 wizard 长度。\n const scope: SkillScope = seed.scope ?? 'project';\n\n // ─── lint ───────────────────────────────────────────────────────────────\n let withLint = seed.withLint;\n if (withLint === undefined) {\n if (!interactive) {\n withLint = true;\n } else {\n const ans = await p.confirm({\n message: '安装 ESLint + Stylelint token-discipline 规则?',\n initialValue: true,\n });\n withLint = ensureNotCancelled(ans) as boolean;\n }\n }\n\n // ─── ui + biz-ui ─────────────────────────────────────────────────────────\n let withUi = seed.withUi;\n if (withUi === undefined) {\n if (!interactive) {\n withUi = true;\n } else {\n const ans = await p.confirm({\n message: '安装 @teamix-evo/ui 组件源码?',\n initialValue: true,\n });\n withUi = ensureNotCancelled(ans) as boolean;\n }\n }\n\n let uiSelection = seed.uiSelection;\n if (withUi && !uiSelection) {\n if (!interactive) {\n uiSelection = 'baseline';\n } else {\n const ans = await p.select<'baseline' | 'all'>({\n message: 'UI 组件清单',\n options: [\n {\n value: 'baseline',\n label: 'Baseline(推荐:button / input / dialog 等核心 ~20 个)',\n },\n { value: 'all', label: '全量装机(80+ 组件源码)' },\n ],\n initialValue: 'baseline',\n });\n uiSelection = ensureNotCancelled(ans) as 'baseline' | 'all';\n }\n }\n uiSelection ??= 'baseline';\n\n let withBizUi = seed.withBizUi;\n if (withBizUi === undefined) {\n if (!interactive) {\n withBizUi = false;\n } else {\n const ans = await p.confirm({\n message:\n '安装 @teamix-evo/biz-ui 业务组件?(可稍后用 teamix-evo biz-ui add 增装)',\n initialValue: false,\n });\n withBizUi = ensureNotCancelled(ans) as boolean;\n }\n }\n\n // ─── 6 conflict-file strategies ─────────────────────────────────────────\n const conflictDecisions = defaultConflictDecisions(\n conflicts,\n seed.conflictDecisions,\n );\n if (interactive && conflicts.hasAnyConflict) {\n p.note(\n '检测到与 teamix-evo 写入路径冲突的现有文件,请逐项确认处理策略。\\n' +\n '默认策略已根据内容启发式推荐(最安全的方案)。',\n '⚠ 接入冲突',\n );\n for (const item of conflicts.items) {\n if (!item.exists) continue;\n // Skip if user explicitly seeded a decision for this key.\n if (seed.conflictDecisions?.[item.key]) continue;\n const ans = await p.select<ConflictStrategy>({\n message: `${FRIENDLY_KEY[item.key]} ${describeMatched(item)}`,\n options: item.availableStrategies.map((s) => ({\n value: s,\n label: strategyLabel(s),\n })),\n initialValue: item.recommendedStrategy,\n });\n conflictDecisions[item.key] = ensureNotCancelled(ans);\n }\n }\n\n if (interactive) {\n p.outro('准备就绪,开始装机…');\n }\n\n return {\n variant,\n ides,\n scope,\n withLint,\n withUi,\n uiSelection,\n withBizUi,\n conflictDecisions,\n };\n}\n\nfunction describeMatched(item: ConflictItem): string {\n if (item.paths.length === 0) return '';\n const head = item.paths.slice(0, 2).join(', ');\n const more = item.paths.length > 2 ? ` +${item.paths.length - 2}` : '';\n return `(命中:${head}${more})`;\n}\n","/**\n * Shared `step.status → icon` mapping for both `teamix-evo init` and\n * `teamix-evo update` orchestrator output. Centralised so adding a new step\n * status (e.g. `'warn'`) keeps both commands in lockstep — and the\n * exhaustive `Record<StepStatus, string>` typing fails compilation if the\n * 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';\nimport type { ProjectUpdateStep } from '../../core/project-update.js';\n\n/**\n * Status union shared by `ProjectInitStep` and `ProjectUpdateStep`. We\n * declare it locally (vs re-exporting from core) so the two step types stay\n * decoupled at compile time — they only have to agree on this status union.\n */\nexport type StepStatus = ProjectInitStep['status'] & ProjectUpdateStep['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 { runProjectUpdate } from '../../core/project-update.js';\nimport { logger } from '../../utils/logger.js';\nimport { getErrorMessage } from '../../utils/error.js';\nimport { STEP_ICON } from '../_shared/step-icon.js';\n\ninterface UpdateCmdOptions {\n cwd?: string;\n dryRun?: boolean;\n}\n\nexport const updateCommand = new Command('update')\n .description(\n '一键升级 teamix-evo 已装资源(regenerable 覆盖、frozen 保留、managed 合并 — ADR 0003 三态)',\n )\n .option('--cwd <dir>', '指定工程根目录(默认:当前目录)')\n .option('--dry-run', '只输出升级计划,不写任何文件')\n .action(async (opts: UpdateCmdOptions) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const dryRun = opts.dryRun ?? false;\n\n try {\n if (dryRun) {\n logger.info('');\n logger.info('📋 dry-run 模式:以下计划不会写入任何文件');\n }\n\n const result = await runProjectUpdate({\n projectRoot: cwd,\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 logger.info('');\n if (result.status === 'not-initialized') {\n logger.warn(\n '当前目录未检测到 .teamix-evo/ — 该工程尚未接入 teamix-evo。',\n );\n logger.info('');\n logger.info('请使用:');\n logger.info(\n ' • `npx teamix-evo@latest init` 普通版接入(已有 npm 工程)',\n );\n logger.info(\n ' • `npm create teamix-evo@latest` 完整版脚手架(空目录)',\n );\n process.exitCode = 1;\n return;\n }\n\n if (result.status === 'dry-run') {\n logger.success('dry-run 完成。移除 --dry-run 即可实际执行。');\n return;\n }\n\n if (result.status === 'partial') {\n logger.warn('update 部分完成(含失败步骤)。详见上方步骤明细。');\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}\\`(每个子步骤幂等,version-diff 短路)`,\n );\n if (result.snapshot) {\n logger.info(\n ` • 完全回滚:\\`teamix-evo restore ${result.snapshot.ts}\\`(撤销本次 update 写入 — ADR 0019 §2)`,\n );\n }\n }\n process.exitCode = 1;\n return;\n }\n\n if (result.status === 'up-to-date') {\n logger.success('已是最新版本,无需升级。');\n return;\n }\n\n // result.status === 'updated'\n logger.success('teamix-evo 已升级到最新版本。');\n if (result.snapshot) {\n logger.info(\n `💾 已捕获 snapshot:${result.snapshot.ts}(如需完全撤销:\\`teamix-evo restore ${result.snapshot.ts}\\`)`,\n );\n } else if (result.snapshotError) {\n logger.debug(`snapshot 捕获失败:${result.snapshotError}`);\n }\n } catch (err) {\n const message = getErrorMessage(err);\n logger.error(`update 失败:${message}`);\n logger.debug(err instanceof Error ? err.stack ?? '' : '');\n process.exitCode = 1;\n }\n });\n","/**\n * Programmatic orchestrator for `teamix-evo update` (post-init refresh).\n *\n * Drives the existing per-package update sub-commands (`runTokensUpdate`,\n * `runSkillsUpdate`) in a fixed order, with the same step-by-step reporting\n * + failure-recovery contract used by {@link runProjectInit} (batch 1.2f):\n *\n * - **Critical** steps (`tokens`) abort downstream work on failure — the\n * skills update reads back the project's tokens variant from `config.json`,\n * so a broken tokens update would propagate.\n * - **Non-critical** steps (`skills`) record `fail` but do not block earlier\n * already-completed steps.\n * - On any failure the result includes a {@link ProjectUpdateResumeHint} so\n * the CLI can render a structured recovery message and the caller can\n * re-run `teamix-evo update` (every sub-step is idempotent — version-diff\n * short-circuits when up-to-date).\n *\n * Pre-flight: the project MUST already be teamix-evo-installed (i.e. have\n * `.teamix-evo/config.json`). Empty / non-evo dirs return `not-initialized`\n * so the CLI can route the user to `teamix-evo init` instead.\n *\n * `ui` is intentionally NOT auto-applied by this orchestrator — UI components\n * are frozen (ADR 0019). Per ADR 0040 we DO produce a staging dir under\n * `.teamix-evo/.upgrade-staging/<category>-<ts>/` so the\n * `teamix-evo-upgrade` skill can drive per-file apply later.\n *\n * `ui` / `biz-ui` source-layer upgrades (ADR 0040): produce STAGING ONLY into\n * `.teamix-evo/.upgrade-staging/<category>-<ts>/` — never write into\n * `src/components/{ui,business}/**` (frozen boundary). The `teamix-evo-upgrade`\n * skill consumes the staging and applies per-file with user consent.\n *\n * No interactive prompts, no `process.exit`. Throws on unexpected I/O errors\n * outside the per-step try/catch (P8).\n */\nimport * as path from 'node:path';\nimport {\n loadTokensPackageManifest,\n getVariantEntry,\n} from '@teamix-evo/registry';\nimport type { ProjectConfig, UiAliases } from '@teamix-evo/registry';\nimport { resolveTokensPackageRoot } from '../utils/path.js';\nimport { getErrorMessage } from '../utils/error.js';\nimport { runTokensUpdate } from './tokens-update.js';\nimport { runSkillsUpdate } from './skills-update.js';\nimport { readProjectConfig } from './state.js';\nimport { createSnapshot, type SnapshotResult } from './snapshot.js';\nimport {\n detectComponentLineage,\n type ComponentCategory,\n type ComponentLineageReport,\n} from './ui-upgrade-detector.js';\nimport { buildStaging } from './ui-upgrade.js';\n\nconst DEFAULT_TOKENS_PACKAGE = '@teamix-evo/tokens';\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\n\nexport type ProjectUpdateStepName = 'tokens' | 'skills' | 'ui' | 'biz-ui';\n\nexport type ProjectUpdateStepStatus = 'ok' | 'skip' | 'fail' | 'planned';\n\nexport interface ProjectUpdateStep {\n name: ProjectUpdateStepName;\n status: ProjectUpdateStepStatus;\n detail?: string;\n}\n\nexport interface ProjectUpdateResumeHint {\n /** The first step that failed (caller resumes from here). */\n failedAt: ProjectUpdateStepName;\n /** Steps already finished (status === 'ok'); will short-circuit on resume. */\n completed: ProjectUpdateStepName[];\n /** All steps that ended in fail status. */\n failed: ProjectUpdateStepName[];\n /** Human-readable error from the first failed step. */\n error: string;\n /**\n * Suggested CLI command to resume. Today this is just `teamix-evo update`\n * itself — every sub-step is idempotent (version-diff short-circuits when\n * up-to-date), so a re-run continues from the failure point automatically.\n */\n resumeCommand: string;\n}\n\nexport interface RunProjectUpdateOptions {\n /** Absolute project root (must already be teamix-evo-installed). */\n projectRoot: string;\n /**\n * If true, plan-only mode: compute version deltas without writing any\n * file. Returns each step with `status: 'planned'`.\n */\n dryRun?: boolean;\n /** Step-level progress hook (caller controls presentation). */\n onStep?: (step: ProjectUpdateStep) => void;\n /** Override the tokens package name (defaults to `@teamix-evo/tokens`). */\n tokensPackageName?: string;\n /** Override the skills package name (defaults to `@teamix-evo/skills`). */\n skillsPackageName?: string;\n}\n\nexport type RunProjectUpdateResult =\n | { status: 'not-initialized' }\n | {\n status: 'up-to-date' | 'updated' | 'partial' | 'dry-run';\n steps: ProjectUpdateStep[];\n resumeHint?: ProjectUpdateResumeHint;\n /**\n * Pre-update snapshot of `.teamix-evo/` ([ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §2).\n * `null` on `dryRun`. Best-effort — capture failures surface via\n * {@link snapshotError} but never abort the pipeline.\n */\n snapshot?: SnapshotResult | null;\n /** Reason a snapshot capture failed (best-effort — never blocks update). */\n snapshotError?: string;\n };\n\n/**\n * Steps whose failure must abort the pipeline (downstream steps depend on\n * the state they write). `tokens` is critical because skills update reads\n * back the variant from `config.json` written by tokens init/update.\n */\nconst CRITICAL_STEPS: ReadonlySet<ProjectUpdateStepName> = new Set(['tokens']);\n\n/**\n * Post-init refresh pipeline.\n *\n * Order:\n * 1. tokens update (regenerable rewrite + frozen preserved — ADR 0003 三态)\n * 2. skills update (lock ∩ scope ∩ version-diff short-circuit — ADR 0035)\n *\n * Re-runs are safe: each sub-step short-circuits when already at latest.\n */\nexport async function runProjectUpdate(\n options: RunProjectUpdateOptions,\n): Promise<RunProjectUpdateResult> {\n const { projectRoot, dryRun = false, onStep } = options;\n const tokensPackage = options.tokensPackageName ?? DEFAULT_TOKENS_PACKAGE;\n const skillsPackage = options.skillsPackageName ?? DEFAULT_SKILLS_PACKAGE;\n\n // ─── Pre-flight ────────────────────────────────────────────────────────\n const config = await readProjectConfig(projectRoot);\n if (!config) {\n return { status: 'not-initialized' };\n }\n\n // ─── Capture pre-update snapshot (ADR 0019 §2) — best-effort ──────────\n // dry-run 不写盘也不拍 snapshot;capture 失败只记录 snapshotError,不 abort 主流程。\n let snapshot: SnapshotResult | null = null;\n let snapshotError: string | undefined;\n if (!dryRun) {\n try {\n snapshot = await createSnapshot(projectRoot, { reason: 'update' });\n } catch (err) {\n snapshotError = getErrorMessage(err);\n }\n }\n\n const steps: ProjectUpdateStep[] = [];\n let aborted = false;\n const firstFailure: {\n value: { step: ProjectUpdateStepName; error: string } | null;\n } = { value: null };\n\n function record(step: ProjectUpdateStep): void {\n steps.push(step);\n onStep?.(step);\n }\n\n function recordFailure(name: ProjectUpdateStepName, 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 }\n if (CRITICAL_STEPS.has(name)) aborted = true;\n }\n\n // `anyChanged` only tracks tokens / skills mutations — the two steps that\n // mutate consumer source. ui / biz-ui run in **staging-only** mode (ADR\n // 0040): they emit a dry-run staging dir for the `teamix-evo-upgrade` skill\n // to apply with explicit per-file consent, and intentionally do NOT flip\n // `anyChanged` even when the staging is non-empty. So a run that only\n // produced staging (with tokens / skills already up-to-date) correctly\n // reports `up-to-date` at the project level.\n let anyChanged = false;\n\n // ─── Step 1: tokens ────────────────────────────────────────────────────\n if (!config.packages?.tokens) {\n record({\n name: 'tokens',\n status: 'skip',\n detail: 'tokens not installed',\n });\n } else if (dryRun) {\n try {\n const plan = await planTokensUpdate(tokensPackage, config);\n record({ name: 'tokens', status: 'planned', detail: plan });\n } catch (err) {\n recordFailure('tokens', err);\n }\n } else {\n try {\n const result = await runTokensUpdate({\n projectRoot,\n packageName: tokensPackage,\n });\n if (result.status === 'not-initialized') {\n record({\n name: 'tokens',\n status: 'skip',\n detail: 'tokens not installed',\n });\n } else if (result.status === 'up-to-date') {\n const driftSuffix =\n result.frozenDrift.length > 0\n ? `, frozen drift: ${result.frozenDrift.length}`\n : '';\n record({\n name: 'tokens',\n status: 'ok',\n detail: `up-to-date (${result.variant} v${result.version}${driftSuffix})`,\n });\n } else {\n anyChanged = true;\n const extras: string[] = [];\n if (result.managedReplaced.length > 0)\n extras.push(`managed: ${result.managedReplaced.length}`);\n if (result.frozenDrift.length > 0)\n extras.push(`frozen drift: ${result.frozenDrift.length}`);\n const suffix = extras.length > 0 ? ` [${extras.join(', ')}]` : '';\n record({\n name: 'tokens',\n status: 'ok',\n detail: `${result.variant} v${result.from} → v${result.to}${suffix}`,\n });\n }\n } catch (err) {\n recordFailure('tokens', err);\n }\n }\n\n // ─── Step 2: skills ────────────────────────────────────────────────────\n if (!config.packages?.skills) {\n record({\n name: 'skills',\n status: 'skip',\n detail: 'skills not installed',\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 runSkillsUpdate({\n projectRoot,\n dryRun,\n packageName: skillsPackage,\n });\n if (result.status === 'no-skills') {\n record({\n name: 'skills',\n status: 'skip',\n detail: 'no skills locked',\n });\n } else if (result.status === 'no-changes') {\n record({\n name: 'skills',\n status: 'ok',\n detail: `up-to-date (${result.checkedSkillIds.length} skill(s) at v${result.version})`,\n });\n } else if (result.status === 'dry-run') {\n const bumps = result.plan.filter((p) => p.action === 'version-bump');\n const detail =\n bumps.length === 0\n ? `up-to-date (${result.plan.length} skill(s) checked at v${result.currentVersion})`\n : `${bumps.length} skill(s) would update: ${result.currentVersion} → ${result.availableVersion}`;\n record({ name: 'skills', status: 'planned', detail });\n } else {\n // result.status === 'updated'\n anyChanged = true;\n const summary =\n result.updatedSkillIds.length > 0\n ? `updated: ${result.updatedSkillIds.join(', ')} (v${\n result.version\n })`\n : `refreshed at v${result.version}`;\n record({ name: 'skills', status: 'ok', detail: summary });\n }\n } catch (err) {\n recordFailure('skills', err);\n }\n }\n\n // ─── Step 3: ui (component-source staging — ADR 0040) ───────────────────\n await runComponentSourceStep('ui', {\n projectRoot,\n config,\n dryRun,\n record,\n recordFailure,\n });\n\n // ─── Step 4: biz-ui (component-source staging — ADR 0040) ───────────────\n await runComponentSourceStep('biz-ui', {\n projectRoot,\n config,\n dryRun,\n record,\n recordFailure,\n });\n\n // ─── Build result ──────────────────────────────────────────────────────\n const out: RunProjectUpdateResult = (() => {\n if (firstFailure.value) {\n return {\n status: 'partial' as const,\n steps,\n 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 update',\n },\n snapshot,\n ...(snapshotError ? { snapshotError } : {}),\n };\n }\n if (dryRun) return { status: 'dry-run' as const, steps, snapshot: null };\n if (anyChanged)\n return {\n status: 'updated' as const,\n steps,\n snapshot,\n ...(snapshotError ? { snapshotError } : {}),\n };\n return {\n status: 'up-to-date' as const,\n steps,\n snapshot,\n ...(snapshotError ? { snapshotError } : {}),\n };\n })();\n\n return out;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────\n\n/**\n * Component-source staging step (ADR 0040). Always emits a step record:\n * - `skip` when the package isn't configured / no aliases / lineage absent\n * - `planned` (dry-run) reports what WOULD be staged — no I/O\n * - `ok` writes the staging dir and reports counts\n * - `fail` is non-critical: the upstream pipeline isn't aborted\n *\n * Detect failures → logged as skip (warn-and-skip per plan); only staging\n * write failures escalate to fail.\n */\nasync function runComponentSourceStep(\n category: ComponentCategory,\n args: {\n projectRoot: string;\n config: ProjectConfig;\n dryRun: boolean;\n record: (step: ProjectUpdateStep) => void;\n recordFailure: (name: ProjectUpdateStepName, err: unknown) => void;\n },\n): Promise<void> {\n const { projectRoot, config, dryRun, record, recordFailure } = args;\n const cfgKey = category === 'ui' ? 'ui' : 'biz-ui';\n\n if (!config.packages?.[cfgKey]) {\n record({\n name: category,\n status: 'skip',\n detail: `${category} not installed`,\n });\n return;\n }\n\n // Aliases (UI map) live under packages.ui per ADR 0014; biz-ui shares the\n // same map. Either source is acceptable, ui takes precedence.\n const aliases =\n config.packages.ui?.aliases ??\n (config.packages['biz-ui']?.aliases as UiAliases | undefined);\n if (!aliases) {\n record({\n name: category,\n status: 'skip',\n detail: `${category} aliases not configured`,\n });\n return;\n }\n\n let report: ComponentLineageReport;\n try {\n report = await detectComponentLineage({\n projectRoot,\n category,\n config,\n });\n } catch (err) {\n // Detect failures are warn-and-skip (per plan): keep the orchestrator\n // moving even when the lineage probe trips on disk-state corner cases.\n record({\n name: category,\n status: 'skip',\n detail: `lineage detect failed: ${getErrorMessage(err)}`,\n });\n return;\n }\n\n if (report.lineage !== 'teamix-evo' && report.lineage !== 'mixed') {\n record({\n name: category,\n status: 'skip',\n detail: `lineage=${report.lineage}; nothing to stage`,\n });\n return;\n }\n\n if (dryRun) {\n const total = report.registeredIds.length + report.unregisteredIds.length;\n record({\n name: category,\n status: 'planned',\n detail:\n total === 0\n ? 'no components to stage'\n : `${total} component(s) to stage (lineage=${report.lineage})`,\n });\n return;\n }\n\n try {\n const built = await buildStaging({\n category,\n projectRoot,\n aliases,\n lineageReport: report,\n trigger: 'update',\n onlyIds: [],\n });\n if (built === null) {\n record({\n name: category,\n status: 'skip',\n detail: 'no entries to stage',\n });\n return;\n }\n const stagingRel = path.relative(projectRoot, built.stagingDir);\n const summary = summarizeStagingRisk(built.manifest.summary.byRisk);\n record({\n name: category,\n status: 'ok',\n detail: `${built.manifest.summary.total} component(s) staged${\n summary ? ` (${summary})` : ''\n }, see ${stagingRel}`,\n });\n } catch (err) {\n // Non-critical: doesn't affect tokens / skills already done.\n recordFailure(category, err);\n }\n}\n\nfunction summarizeStagingRisk(byRisk: Record<string, number>): string {\n const order = [\n 'risky',\n 'breaking',\n 'foreign',\n 'upgradable-medium',\n 'upgradable-low',\n 'unchanged',\n ];\n const parts: string[] = [];\n for (const k of order) {\n const v = byRisk[k];\n if (v && v > 0) parts.push(`${v} ${k}`);\n }\n return parts.join(', ');\n}\n\n/**\n * Compute a human-readable plan string for tokens dry-run by comparing the\n * installed version against the upstream catalog. We deliberately do NOT\n * call `runTokensUpdate` here — it lacks a dryRun mode and would write\n * files. The version comparison covers the only thing the user cares about:\n * \"is there a new version, and from where to where\".\n */\nasync function planTokensUpdate(\n tokensPackage: string,\n config: NonNullable<Awaited<ReturnType<typeof readProjectConfig>>>,\n): Promise<string> {\n const tokensCfg = config.packages?.tokens;\n if (!tokensCfg) return 'tokens not installed';\n const packageRoot = resolveTokensPackageRoot(tokensPackage);\n const catalog = await loadTokensPackageManifest(packageRoot);\n const variantEntry = getVariantEntry(catalog, tokensCfg.variant);\n if (!variantEntry) {\n return `variant \"${tokensCfg.variant}\" no longer in ${tokensPackage}@${catalog.version} — uninstall + re-init to switch`;\n }\n if (variantEntry.version === tokensCfg.version) {\n return `up-to-date (${tokensCfg.variant} v${tokensCfg.version})`;\n }\n return `${tokensCfg.variant} v${tokensCfg.version} → v${variantEntry.version}`;\n}\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 { 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","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","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","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","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","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","initCommand","Command","Command","initCommand","Command","path","fs","path","hasPackageJson","fs","path","stat","p","rel","path","fs","CONSUMER_TOKENS_DIR","CONSUMER_OVERRIDES_FILE","EMPTY_OVERRIDES_TEMPLATE","fs","path","fs","path","TEAMIX_DIR","isoToFsSafe","stat","initCommand","Command","p","Command","path","path","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","DEFAULT_SKILLS_PACKAGE","CRITICAL_STEPS","p","loadTokensPackageManifest","getVariantEntry","updateCommand","Command","Command","path","prompts","Command","Command","path","prompts","path","fs","loadTokensPackageManifest","getVariantEntry","DEFAULT_TOKENS_PACKAGE","CONSUMER_BASENAME_BY_UPSTREAM","loadTokensPackageManifest","getVariantEntry","p","lookupUpstreamBasename","Command","require","createRequire","Command","initCommand","updateCommand"]}