@nick848/ft 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -106
- package/cursor-commands-templates/ft-archive.md +11 -0
- package/cursor-commands-templates/ft-build.md +44 -0
- package/cursor-commands-templates/ft-design.md +11 -0
- package/cursor-commands-templates/ft-fill-context.md +13 -0
- package/cursor-commands-templates/ft-hotfix.md +33 -0
- package/cursor-commands-templates/ft-open.md +11 -0
- package/cursor-commands-templates/ft-sync-cursor-commands.md +11 -0
- package/cursor-commands-templates/ft-tweak.md +36 -0
- package/cursor-commands-templates/ft-verify.md +43 -0
- package/cursor-commands-templates/ft-visual-tools-install.md +26 -0
- package/dist/index.js +1109 -304
- package/dist/index.js.map +1 -1
- package/locales/en.json +95 -16
- package/locales/zh-CN.json +95 -16
- package/package.json +5 -4
- package/scripts/visual-diff.mjs +193 -0
- package/skills-templates/visual-fidelity/SKILL.md +77 -0
- package/skills-templates/visual-fidelity/checklist-schema.md +33 -0
- package/templates/AGENTS.md.en.hbs +5 -3
- package/templates/AGENTS.md.zh.hbs +5 -3
- package/templates/visual-spec.md +25 -0
- package/templates/visual-verify.json +14 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/core/detector.ts","../src/core/paths.ts","../src/core/config.ts","../src/core/agents.ts","../src/core/template.ts","../src/core/i18n.ts","../src/adapters/index.ts","../src/adapters/mcp-setup.ts","../src/cli/commands/update.ts","../src/cli/commands/version.ts","../src/cli/commands/help.ts","../src/cli/commands/slash.ts","../src/slash/fill-context.ts","../src/core/rtk-bridge.ts","../src/core/rtk.ts","../src/slash/comet-passthrough.ts","../src/slash/graph-setup.ts","../src/slash/graph-init.ts","../src/slash/graph-refresh.ts","../src/slash/graph-handoff.ts","../src/slash/graph-status.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runInit } from './commands/init.js';\nimport { runUpdate } from './commands/update.js';\nimport { runVersion } from './commands/version.js';\nimport { printHelp } from './commands/help.js';\nimport { runSlash } from './commands/slash.js';\n\nconst program = new Command();\n\nprogram\n .name('ft')\n .description('Frontend Toolkit — orchestration layer for Comet and GitNexus')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Full project initialization pipeline')\n .option('--lang <lang>', 'Language: zh-CN or en')\n .action(async (options: { lang?: string }) => {\n await runInit({ lang: options.lang });\n });\n\nprogram\n .command('update')\n .description('Update @nick848/ft globally')\n .action(async () => {\n await runUpdate();\n });\n\nprogram\n .command('version')\n .description('Show FT, Comet, and GitNexus versions')\n .action(async () => {\n await runVersion();\n });\n\nprogram\n .command('help')\n .description('Show help')\n .action(() => {\n printHelp();\n });\n\nprogram\n .command('slash')\n .description('Run IDE slash command')\n .argument('<command>', 'Slash subcommand name')\n .argument('[args...]', 'Additional arguments')\n .action(async (command: string, args: string[]) => {\n await runSlash(command, args);\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { execa } from 'execa';\nimport type { PlatformId } from '../../types/index.js';\nimport {\n detectComet,\n detectKarpathyRules,\n detectGitNexus,\n detectPlatformsInProject,\n detectProjectMeta,\n} from '../../core/detector.js';\nimport {\n loadConfig,\n resolveLanguage,\n writeDefaultConfig,\n mergeConfig,\n} from '../../core/config.js';\nimport { generateAgentsMd } from '../../core/agents.js';\nimport { t, tf } from '../../core/i18n.js';\nimport { getAdaptersForPlatforms } from '../../adapters/index.js';\nimport { configureMcpForAdapters } from '../../adapters/mcp-setup.js';\n\ntype InjectMode = 'manual' | 'auto' | 'all';\n\nasync function selectPlatforms(mode: InjectMode, lang: 'zh-CN' | 'en'): Promise<PlatformId[]> {\n if (mode === 'all') {\n return ['cursor', 'codex', 'opencode'];\n }\n\n if (mode === 'auto') {\n const detected = detectPlatformsInProject();\n if (detected.length > 0) return detected;\n return ['cursor', 'codex', 'opencode'];\n }\n\n const { platforms } = await inquirer.prompt<{ platforms: PlatformId[] }>([\n {\n type: 'checkbox',\n name: 'platforms',\n message: t('init.selectPlatforms', lang),\n choices: [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Codex', value: 'codex' },\n { name: 'OpenCode', value: 'opencode' },\n ],\n validate: (v) => (v.length > 0 ? true : t('init.selectAtLeastOne', lang)),\n },\n ]);\n return platforms;\n}\n\nasync function selectInjectMode(lang: 'zh-CN' | 'en'): Promise<InjectMode> {\n const { mode } = await inquirer.prompt<{ mode: InjectMode }>([\n {\n type: 'list',\n name: 'mode',\n message: t('init.injectModeQuestion', lang),\n choices: [\n { name: t('init.injectModeManual', lang), value: 'manual' },\n { name: t('init.injectModeAuto', lang), value: 'auto' },\n { name: t('init.injectModeAll', lang), value: 'all' },\n ],\n },\n ]);\n return mode;\n}\n\nexport async function runInit(options: { lang?: string }): Promise<void> {\n const projectRoot = process.cwd();\n const existingConfig = await loadConfig(projectRoot);\n const language = resolveLanguage(options.lang, existingConfig.language);\n\n // Stage 4.1: mandatory dependencies\n const cometVersion = await detectComet();\n if (!cometVersion) {\n console.error(chalk.red(t('error.cometMissing', language)));\n process.exit(1);\n }\n\n if (!detectKarpathyRules(projectRoot)) {\n console.error(chalk.red(t('error.karpathyMissing', language)));\n process.exit(1);\n }\n\n // Stage 4.2: optional GitNexus\n const gitnexusVersion = await detectGitNexus();\n const gitnexusInstalled = Boolean(gitnexusVersion);\n if (!gitnexusInstalled) {\n console.log(chalk.gray(t('hint.gitnexusOptional', language)));\n }\n\n // Stage 4.3: interactive tool selection\n const injectMode = await selectInjectMode(language);\n const selectedPlatforms = await selectPlatforms(injectMode, language);\n\n // Stage 4.4: rules injection\n const adapterList = getAdaptersForPlatforms(selectedPlatforms);\n for (const adapter of adapterList) {\n adapter.injectRules(projectRoot);\n console.log(chalk.green(tf('init.rulesInjected', language, { path: adapter.rulesTargetPath })));\n }\n\n // Stage 4.5: MCP config (only if gitnexus installed)\n if (gitnexusInstalled) {\n await configureMcpForAdapters(adapterList, language);\n }\n\n // Stage 4.6: AGENTS.md\n const meta = detectProjectMeta(projectRoot);\n generateAgentsMd(meta, language, projectRoot);\n console.log(chalk.green(t('init.agentsGenerated', language)));\n\n const config = mergeConfig({\n ...existingConfig,\n language,\n tools: selectedPlatforms,\n });\n writeDefaultConfig(projectRoot, config);\n\n // Stage 4.7: comet init (TTY interactive)\n console.log(chalk.blue(t('init.runningComet', language)));\n await execa('comet', ['init'], { stdio: 'inherit', cwd: projectRoot });\n\n // Stage 4.8: done\n console.log(chalk.green.bold(t('init.success', language)));\n console.log(chalk.cyan(t('init.nextStep', language)));\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport type { PlatformId, ProjectMeta } from '../types/index.js';\n\nimport { getRulesTemplatesDir } from './paths.js';\n\nconst KARPATHY_PATHS = [\n '.cursor/rules/karpathy-guidelines.mdc',\n '.codex/rules/karpathy-guidelines.md',\n '.opencode/rules/karpathy-guidelines.md',\n] as const;\n\nconst PLATFORM_DIRS: Record<PlatformId, string> = {\n cursor: '.cursor',\n codex: '.codex',\n opencode: '.opencode',\n};\n\nexport async function detectComet(): Promise<string | null> {\n try {\n const { stdout } = await execa('comet', ['--version']);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport function detectKarpathyRules(projectRoot: string = process.cwd()): boolean {\n if (KARPATHY_PATHS.some((p) => existsSync(path.join(projectRoot, p)))) {\n return true;\n }\n const templatesDir = getRulesTemplatesDir();\n return existsSync(path.join(templatesDir, 'cursor.mdc'));\n}\n\nexport async function detectGitNexus(): Promise<string | null> {\n try {\n const { stdout } = await execa('gitnexus', ['--version']);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport function detectPlatformsInProject(projectRoot: string = process.cwd()): PlatformId[] {\n const found: PlatformId[] = [];\n for (const [id, dir] of Object.entries(PLATFORM_DIRS)) {\n if (existsSync(path.join(projectRoot, dir))) {\n found.push(id as PlatformId);\n }\n }\n return found;\n}\n\nexport function detectPackageManager(projectRoot: string = process.cwd()): string {\n if (existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n if (\n existsSync(path.join(projectRoot, 'bun.lockb')) ||\n existsSync(path.join(projectRoot, 'bun.lock'))\n ) {\n return 'bun';\n }\n if (existsSync(path.join(projectRoot, 'package-lock.json'))) return 'npm';\n return 'npm';\n}\n\nexport function detectProjectMeta(projectRoot: string = process.cwd()): ProjectMeta {\n const pkgPath = path.join(projectRoot, 'package.json');\n let name = path.basename(projectRoot);\n let scripts = '[NEEDS LLM INPUT]';\n let workspaces = '[NEEDS LLM INPUT]';\n let framework = 'unknown';\n let language = 'JavaScript';\n let monorepo = '否';\n\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n name?: string;\n scripts?: Record<string, string>;\n workspaces?: string[] | Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n name = pkg.name ?? name;\n if (pkg.scripts) {\n scripts = Object.entries(pkg.scripts)\n .map(([k, v]) => `- \\`${k}\\`: ${v}`)\n .join('\\n');\n }\n if (pkg.workspaces) {\n monorepo = '是';\n workspaces =\n Array.isArray(pkg.workspaces)\n ? pkg.workspaces.join(', ')\n : JSON.stringify(pkg.workspaces);\n }\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps['next']) framework = 'Next.js';\n else if (deps['nuxt']) framework = 'Nuxt';\n else if (deps['vue']) framework = 'Vue';\n else if (deps['react']) framework = 'React';\n else if (deps['@angular/core']) framework = 'Angular';\n else if (deps['svelte']) framework = 'Svelte';\n if (deps['typescript'] || existsSync(path.join(projectRoot, 'tsconfig.json'))) {\n language = 'TypeScript';\n }\n }\n\n return {\n name,\n packageManager: detectPackageManager(projectRoot),\n framework,\n language,\n monorepo,\n workspaces,\n scripts,\n };\n}\n\nexport function isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function isStdoutTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\nexport function agentsMdHasPendingPlaceholders(projectRoot: string = process.cwd()): boolean {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) return true;\n const content = readFileSync(agentsPath, 'utf-8');\n return content.includes('[NEEDS LLM INPUT]');\n}\n\nexport function gitNexusGraphExists(projectRoot: string = process.cwd()): boolean {\n const graphDir = path.join(projectRoot, '.gitnexus');\n return existsSync(graphDir);\n}\n\nexport function countGitNexusIndexFiles(projectRoot: string = process.cwd()): number {\n const graphDir = path.join(projectRoot, '.gitnexus');\n if (!existsSync(graphDir)) return 0;\n try {\n return readdirSync(graphDir).length;\n } catch {\n return 0;\n }\n}\n","import { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nexport function getPackageRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n\n while (dir !== path.dirname(dir)) {\n const pkgPath = path.join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string };\n if (pkg.name === '@nick848/ft') {\n return dir;\n }\n } catch {\n // continue walking\n }\n }\n dir = path.dirname(dir);\n }\n\n return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');\n}\n\nexport function getTemplatesDir(): string {\n return path.join(getPackageRoot(), 'templates');\n}\n\nexport function getRulesTemplatesDir(): string {\n return path.join(getPackageRoot(), 'rules-templates');\n}\n\nexport function getLocalesDir(): string {\n return path.join(getPackageRoot(), 'locales');\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport type { FtConfig, Language } from '../types/index.js';\n\nconst MODULE_NAME = 'ft';\n\nconst DEFAULT_CONFIG: FtConfig = {\n language: 'zh-CN',\n rtk: {\n enabled: true,\n auto_trigger_lines: 500,\n exclude_patterns: ['--json', '--format json', '--xml'],\n },\n tools: ['cursor', 'codex', 'opencode'],\n gitnexus: {\n graph_path: '.gitnexus/',\n auto_prompt_in_agents: true,\n },\n};\n\nexport function mergeConfig(partial?: Partial<FtConfig>): FtConfig {\n return {\n ...DEFAULT_CONFIG,\n ...partial,\n rtk: { ...DEFAULT_CONFIG.rtk, ...partial?.rtk },\n gitnexus: { ...DEFAULT_CONFIG.gitnexus, ...partial?.gitnexus },\n tools: partial?.tools ?? DEFAULT_CONFIG.tools,\n };\n}\n\nexport async function loadConfig(projectRoot: string = process.cwd()): Promise<FtConfig> {\n const explorer = cosmiconfig(MODULE_NAME, {\n searchPlaces: [\n '.ft/config.yaml',\n '.ft/config.yml',\n '.ft/config.json',\n 'ft.config.yaml',\n 'ft.config.json',\n ],\n });\n\n const result = await explorer.search(projectRoot);\n if (!result?.config) {\n return { ...DEFAULT_CONFIG };\n }\n\n return mergeConfig(result.config as Partial<FtConfig>);\n}\n\nexport function resolveLanguage(\n cliLang?: string,\n configLang?: Language,\n): Language {\n if (cliLang === 'en' || cliLang === 'zh-CN') {\n return cliLang;\n }\n if (configLang) {\n return configLang;\n }\n return 'zh-CN';\n}\n\nexport function writeDefaultConfig(projectRoot: string, config: FtConfig): void {\n const ftDir = path.join(projectRoot, '.ft');\n if (!existsSync(ftDir)) {\n mkdirSync(ftDir, { recursive: true });\n }\n const configPath = path.join(ftDir, 'config.yaml');\n writeFileSync(configPath, YAML.stringify(config), 'utf-8');\n}\n\nexport function readConfigFile(projectRoot: string): FtConfig | null {\n const configPath = path.join(projectRoot, '.ft', 'config.yaml');\n if (!existsSync(configPath)) {\n return null;\n }\n const raw = readFileSync(configPath, 'utf-8');\n return mergeConfig(YAML.parse(raw) as Partial<FtConfig>);\n}\n","import Handlebars from 'handlebars';\nimport { readFileSync, writeFileSync, renameSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getTemplatesDir } from './paths.js';\nimport { buildAgentsTemplateData } from './template.js';\nimport type { ProjectMeta } from '../types/index.js';\n\nexport function renderAgentsMd(\n meta: ProjectMeta,\n lang: Language,\n): string {\n const templateName = lang === 'en' ? 'AGENTS.md.en.hbs' : 'AGENTS.md.zh.hbs';\n const templatePath = path.join(getTemplatesDir(), templateName);\n const source = readFileSync(templatePath, 'utf-8');\n const template = Handlebars.compile(source);\n const data = buildAgentsTemplateData(meta, lang);\n return template(data);\n}\n\nexport function generateAgentsMd(\n meta: ProjectMeta,\n lang: Language,\n projectRoot: string = process.cwd(),\n): void {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n\n if (existsSync(agentsPath)) {\n renameSync(agentsPath, backupPath);\n }\n\n const content = renderAgentsMd(meta, lang);\n writeFileSync(agentsPath, content, 'utf-8');\n}\n\nexport function updateGraphTimestampInAgents(\n projectRoot: string = process.cwd(),\n timestamp?: string,\n): void {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) return;\n\n const ts = timestamp ?? new Date().toISOString();\n let content = readFileSync(agentsPath, 'utf-8');\n const marker = '图谱最后刷新时间';\n const enMarker = 'Graph last refreshed';\n const isEnglish = content.includes('## AI Working Guide');\n const line = isEnglish\n ? `- ${enMarker}: ${ts}`\n : `- ${marker}: ${ts}`;\n\n const regex = /- (图谱最后刷新时间|Graph last refreshed): .+/;\n if (regex.test(content)) {\n content = content.replace(regex, line);\n } else if (content.includes('## AI 工作指南') || isEnglish) {\n const sectionRegex = /(## AI (工作指南|Working Guide)\\n)/;\n content = content.replace(sectionRegex, `$1${line}\\n`);\n } else {\n content += `\\n## AI 工作指南\\n${line}\\n`;\n }\n\n writeFileSync(agentsPath, content, 'utf-8');\n}\n","import type { Language, ProjectMeta } from '../types/index.js';\n\nexport function getGitNexusCondition(lang: Language): string {\n if (lang === 'en') {\n return 'If GitNexus is installed in this project, AI **must prioritize** GitNexus MCP tools (e.g. `gitnexus_get_symbol`) for code scanning and dependency analysis. If not installed, ignore this rule.';\n }\n return '如果当前工程已安装 GitNexus,AI 在进行代码扫描和分析时**必须优先使用** GitNexus MCP 工具(如 `gitnexus_get_symbol`)获取符号级依赖关系。若未安装,请忽略此条。';\n}\n\nexport interface AgentsTemplateData {\n projectName: string;\n packageManager: string;\n framework: string;\n language: string;\n monorepo: string;\n workspaces: string;\n scripts: string;\n gitnexus_condition: string;\n}\n\nexport function buildAgentsTemplateData(\n meta: ProjectMeta,\n lang: Language,\n): AgentsTemplateData {\n return {\n projectName: meta.name,\n packageManager: meta.packageManager,\n framework: meta.framework,\n language: meta.language,\n monorepo: meta.monorepo,\n workspaces: meta.workspaces,\n scripts: meta.scripts,\n gitnexus_condition: getGitNexusCondition(lang),\n };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getLocalesDir } from './paths.js';\n\ntype LocaleMap = Record<string, string>;\n\nconst cache: Partial<Record<Language, LocaleMap>> = {};\n\nfunction loadLocale(lang: Language): LocaleMap {\n if (cache[lang]) return cache[lang]!;\n const filePath = path.join(getLocalesDir(), `${lang}.json`);\n if (!existsSync(filePath)) {\n return {};\n }\n cache[lang] = JSON.parse(readFileSync(filePath, 'utf-8')) as LocaleMap;\n return cache[lang]!;\n}\n\nexport function t(key: string, lang: Language = 'zh-CN'): string {\n const locale = loadLocale(lang);\n return locale[key] ?? key;\n}\n\nexport function tf(key: string, lang: Language, vars?: Record<string, string>): string {\n let text = t(key, lang);\n if (!vars) return text;\n for (const [k, v] of Object.entries(vars)) {\n text = text.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), v);\n }\n return text;\n}\n","import { homedir } from 'node:os';\nimport path from 'node:path';\nimport {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n copyFileSync,\n} from 'node:fs';\nimport deepmerge from 'deepmerge';\nimport type { PlatformId } from '../types/index.js';\nimport { getRulesTemplatesDir } from '../core/paths.js';\n\nexport interface PlatformAdapter {\n id: PlatformId;\n rulesTargetPath: string;\n rulesTemplateName: string;\n mcpConfigPath: string;\n getGitNexusMcpEntry(): Record<string, unknown>;\n mergeGitNexusMcp(config: Record<string, unknown>): Record<string, unknown>;\n hasGitNexusMcp(config: Record<string, unknown>): boolean;\n injectRules(projectRoot: string): void;\n configureMcp(): Promise<{ success: boolean; path: string; snippet: string }>;\n}\n\nconst GITNEXUS_SNIPPET = {\n gitnexus: {\n command: 'gitnexus',\n args: ['mcp'],\n disabled: false,\n },\n};\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n if (!existsSync(filePath)) {\n return { mcpServers: {} };\n }\n const raw = readFileSync(filePath, 'utf-8');\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return { mcpServers: {} };\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n const dir = path.dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n}\n\nfunction ensureMcpServersShape(config: Record<string, unknown>): Record<string, unknown> {\n if (!config.mcpServers || typeof config.mcpServers !== 'object') {\n config.mcpServers = {};\n }\n return config;\n}\n\nfunction createAdapter(\n id: PlatformId,\n rulesTargetPath: string,\n rulesTemplateName: string,\n mcpConfigPath: string,\n): PlatformAdapter {\n return {\n id,\n rulesTargetPath,\n rulesTemplateName,\n mcpConfigPath,\n getGitNexusMcpEntry() {\n return { ...GITNEXUS_SNIPPET };\n },\n mergeGitNexusMcp(config) {\n const base = ensureMcpServersShape({ ...config });\n const servers = base.mcpServers as Record<string, unknown>;\n if (servers.gitnexus) {\n return base;\n }\n return deepmerge(base, { mcpServers: GITNEXUS_SNIPPET });\n },\n hasGitNexusMcp(config) {\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n return Boolean(servers?.gitnexus);\n },\n injectRules(projectRoot) {\n const target = path.join(projectRoot, rulesTargetPath);\n const source = path.join(getRulesTemplatesDir(), rulesTemplateName);\n const dir = path.dirname(target);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n copyFileSync(source, target);\n },\n async configureMcp() {\n const configPath = mcpConfigPath;\n const snippet = JSON.stringify(GITNEXUS_SNIPPET, null, 2);\n try {\n const existing = readJsonFile(configPath);\n if (this.hasGitNexusMcp(existing)) {\n return { success: true, path: configPath, snippet };\n }\n const merged = this.mergeGitNexusMcp(existing);\n writeJsonFile(configPath, merged);\n return { success: true, path: configPath, snippet };\n } catch {\n return { success: false, path: configPath, snippet };\n }\n },\n };\n}\n\nexport const cursorAdapter = createAdapter(\n 'cursor',\n '.cursor/rules/karpathy-guidelines.mdc',\n 'cursor.mdc',\n path.join(homedir(), '.cursor', 'mcp.json'),\n);\n\nexport const codexAdapter = createAdapter(\n 'codex',\n '.codex/rules/karpathy-guidelines.md',\n 'codex.md',\n path.join(homedir(), '.codex', 'mcp.json'),\n);\n\nexport const opencodeAdapter = createAdapter(\n 'opencode',\n '.opencode/rules/karpathy-guidelines.md',\n 'opencode.md',\n path.join(homedir(), '.config', 'opencode', 'mcp.json'),\n);\n\nexport const adapters: Record<PlatformId, PlatformAdapter> = {\n cursor: cursorAdapter,\n codex: codexAdapter,\n opencode: opencodeAdapter,\n};\n\nexport function getAdaptersForPlatforms(platforms: PlatformId[]): PlatformAdapter[] {\n return platforms.map((p) => adapters[p]);\n}\n","import chalk from 'chalk';\nimport readline from 'node:readline';\nimport type { PlatformAdapter } from './index.js';\nimport { tf } from '../core/i18n.js';\nimport type { Language } from '../types/index.js';\n\nexport async function configureMcpForAdapters(\n adapterList: PlatformAdapter[],\n lang: Language,\n): Promise<void> {\n for (const adapter of adapterList) {\n const result = await adapter.configureMcp();\n if (result.success) {\n console.log(chalk.green(tf('mcp.writeSuccess', lang, { path: result.path })));\n } else {\n await promptManualMcpConfig(adapter, lang, result.path, result.snippet);\n }\n }\n}\n\nasync function promptManualMcpConfig(\n _adapter: PlatformAdapter,\n lang: Language,\n configPath: string,\n snippet: string,\n): Promise<void> {\n const border = '═'.repeat(60);\n console.log(chalk.yellow(`\\n${border}`));\n console.log(chalk.yellow.bold(tf('mcp.manualTitle', lang, { path: configPath })));\n console.log(chalk.cyan(snippet));\n console.log(chalk.yellow(`${border}\\n`));\n console.log(chalk.gray(tf('mcp.pressKey', lang)));\n\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdin.setRawMode?.(true);\n process.stdin.resume();\n process.stdin.once('data', () => {\n rl.close();\n process.stdin.setRawMode?.(false);\n resolve();\n });\n });\n}\n","import { execa } from 'execa';\n\nexport async function runUpdate(): Promise<void> {\n await execa('npm', ['update', '-g', '@nick848/ft'], { stdio: 'inherit' });\n}\n","import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n detectComet,\n detectGitNexus,\n} from '../../core/detector.js';\nimport { getPackageRoot } from '../../core/paths.js';\n\nfunction getFtVersion(): string {\n try {\n const pkgPath = path.join(getPackageRoot(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version?: string };\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport async function runVersion(): Promise<void> {\n const ftVersion = getFtVersion();\n const cometVersion = await detectComet();\n const gitnexusVersion = await detectGitNexus();\n\n console.log(`FT: ${ftVersion}`);\n console.log(`Comet: ${cometVersion ?? 'not installed'}`);\n console.log(`GitNexus: ${gitnexusVersion ?? 'not installed'}`);\n}\n","export function printHelp(): void {\n console.log(`\nFT (Frontend Toolkit) — CLI orchestration for Comet, Karpathy rules, and GitNexus\n\nUsage:\n ft init [--lang en|zh-CN] Full project initialization pipeline\n ft update Update @nick848/ft globally\n ft version Show FT, Comet, and GitNexus versions\n ft help Show this help\n ft slash <command> [args] Run IDE slash command (internal)\n\nSlash commands (use via IDE, maps to ft slash):\n fill-context Output prompt recipe to fill AGENTS.md\n open Comet open (passthrough)\n design Comet design (passthrough)\n build Comet build (passthrough)\n verify Comet verify (passthrough)\n archive Comet archive (passthrough)\n hotfix Comet hotfix (passthrough)\n tweak Comet tweak (passthrough)\n graph-setup GitNexus install guide + MCP retry\n graph-init gitnexus analyze\n graph-refresh gitnexus analyze --force\n graph-handoff Graph summary + prompt + AGENTS timestamp\n graph-status Check GitNexus installation and graph state\n`);\n}\n","import chalk from 'chalk';\nimport type { SlashCommand } from '../../types/index.js';\nimport { loadConfig } from '../../core/config.js';\nimport { agentsMdHasPendingPlaceholders } from '../../core/detector.js';\nimport { t } from '../../core/i18n.js';\nimport { runFillContext } from '../../slash/fill-context.js';\nimport { runCometSlash } from '../../slash/comet-passthrough.js';\nimport { runGraphSetup } from '../../slash/graph-setup.js';\nimport { runGraphInit } from '../../slash/graph-init.js';\nimport { runGraphRefresh } from '../../slash/graph-refresh.js';\nimport { runGraphHandoff } from '../../slash/graph-handoff.js';\nimport { runGraphStatus } from '../../slash/graph-status.js';\n\nconst COMET_COMMANDS: SlashCommand[] = [\n 'open',\n 'design',\n 'build',\n 'verify',\n 'archive',\n 'hotfix',\n 'tweak',\n];\n\nconst GRAPH_COMMANDS: SlashCommand[] = [\n 'graph-setup',\n 'graph-init',\n 'graph-refresh',\n 'graph-handoff',\n 'graph-status',\n];\n\nconst ALL_COMMANDS: SlashCommand[] = [\n 'fill-context',\n ...COMET_COMMANDS,\n ...GRAPH_COMMANDS,\n];\n\nfunction gateCometCommands(projectRoot: string, lang: 'zh-CN' | 'en'): void {\n if (agentsMdHasPendingPlaceholders(projectRoot)) {\n console.error(chalk.yellow(t('gate.fillContextFirst', lang)));\n process.exit(1);\n }\n}\n\nexport async function runSlash(command: string, args: string[]): Promise<void> {\n if (!ALL_COMMANDS.includes(command as SlashCommand)) {\n console.error(chalk.red(`Unknown slash command: ${command}`));\n process.exit(1);\n }\n\n const projectRoot = process.cwd();\n const config = await loadConfig(projectRoot);\n const lang = config.language;\n const slashCmd = command as SlashCommand;\n\n if (COMET_COMMANDS.includes(slashCmd)) {\n gateCometCommands(projectRoot, lang);\n const exitCode = await runCometSlash(slashCmd, args, config);\n process.exit(exitCode);\n }\n\n switch (slashCmd) {\n case 'fill-context':\n await runFillContext(config);\n break;\n case 'graph-setup':\n await runGraphSetup(config);\n break;\n case 'graph-init':\n await runGraphInit(config);\n break;\n case 'graph-refresh':\n await runGraphRefresh(config);\n break;\n case 'graph-handoff':\n await runGraphHandoff(config);\n break;\n case 'graph-status':\n await runGraphStatus(config);\n break;\n default:\n process.exit(1);\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { FtConfig } from '../types/index.js';\nimport { t } from '../core/i18n.js';\n\nconst PLACEHOLDER = '[NEEDS LLM INPUT]';\n\nconst SECTION_HINTS: Record<string, { zh: string; en: string }> = {\n '结构': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n 'Structure': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n '规范': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n 'Conventions': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n '路由': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n 'Routing': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n};\n\nfunction extractSections(content: string): Array<{ section: string; line: number }> {\n const lines = content.split('\\n');\n const results: Array<{ section: string; line: number }> = [];\n let currentSection = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('## ')) {\n currentSection = line.replace(/^##\\s+/, '').trim();\n }\n if (line.includes(PLACEHOLDER)) {\n results.push({ section: currentSection, line: i + 1 });\n }\n }\n return results;\n}\n\nfunction findSectionInBackup(section: string, backup: string): string {\n if (!section) return '';\n const regex = new RegExp(`## ${section}[\\\\s\\\\n]+([\\\\s\\\\S]*?)(?=\\\\n## |$)`, 'm');\n const match = backup.match(regex);\n return match?.[1]?.trim() ?? '';\n}\n\nexport async function runFillContext(config: FtConfig): Promise<void> {\n const projectRoot = process.cwd();\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const lang = config.language;\n\n if (!existsSync(agentsPath)) {\n console.log(t('fillContext.noAgents', lang));\n return;\n }\n\n const agentsContent = readFileSync(agentsPath, 'utf-8');\n const placeholders = extractSections(agentsContent);\n\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n const backupContent = existsSync(backupPath)\n ? readFileSync(backupPath, 'utf-8')\n : '';\n\n const langLabel = lang === 'en' ? 'English' : '简体中文';\n\n console.log(`# ${t('fillContext.title', lang)}\\n`);\n console.log(t('fillContext.goal', lang));\n console.log(`\\n**${t('fillContext.langConstraint', lang)}**: ${langLabel}\\n`);\n\n if (placeholders.length === 0) {\n console.log(t('fillContext.noPlaceholders', lang));\n return;\n }\n\n console.log(`## ${t('fillContext.taskList', lang)}\\n`);\n\n for (const { section, line } of placeholders) {\n const hint = SECTION_HINTS[section];\n const guide =\n lang === 'en'\n ? hint?.en ?? 'Replace placeholder with accurate project-specific content'\n : hint?.zh ?? '将占位符替换为准确的项目相关内容';\n\n console.log(`### ${section || 'General'} (line ${line})`);\n console.log(`- **${t('fillContext.placeholder', lang)}**: ${PLACEHOLDER}`);\n console.log(`- **${t('fillContext.guide', lang)}**: ${guide}`);\n\n if (backupContent && section) {\n const ref = findSectionInBackup(section, backupContent);\n if (ref) {\n console.log(`- **${t('fillContext.reference', lang)}**:\\n`);\n console.log(ref);\n }\n }\n console.log('');\n }\n\n if (backupContent) {\n console.log(`## ${t('fillContext.backupNote', lang)}\\n`);\n console.log(t('fillContext.backupMerge', lang));\n }\n}\n","import { execa, type ExecaError } from 'execa';\nimport type { FtConfig } from '../types/index.js';\nimport { shouldBypassRtk, compressOutputIfNeeded } from './rtk.js';\nimport { isStdoutTTY } from './detector.js';\n\nexport interface RunWithRtkOptions {\n cwd?: string;\n rtkDisabled?: boolean;\n inheritStdio?: boolean;\n}\n\nexport async function runWithRtk(\n command: string,\n args: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const bypass = shouldBypassRtk(args, config);\n const ttyPassthrough = options.inheritStdio ?? false;\n const rtkOff = options.rtkDisabled || bypass || ttyPassthrough;\n\n if (ttyPassthrough) {\n const subprocess = execa(command, args, {\n cwd: options.cwd,\n stdio: 'inherit',\n reject: false,\n });\n const result = await subprocess;\n return {\n stdout: '',\n stderr: '',\n exitCode: result.exitCode ?? (result.failed ? 1 : 0),\n };\n }\n\n const result = await execa(command, args, {\n cwd: options.cwd,\n reject: false,\n all: true,\n });\n\n const combined = result.all ?? `${result.stdout}\\n${result.stderr}`;\n const processed = compressOutputIfNeeded(combined, config, rtkOff);\n\n if (processed !== combined) {\n process.stdout.write(processed);\n if (!processed.endsWith('\\n')) process.stdout.write('\\n');\n } else {\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n }\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 1,\n };\n}\n\nexport async function runCometPassthrough(\n subcommand: string,\n extraArgs: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<number> {\n const args = [subcommand, ...extraArgs];\n const isTTY = isStdoutTTY() && isStdinTTY();\n\n if (isTTY) {\n const result = await runWithRtk('comet', args, config, {\n ...options,\n inheritStdio: true,\n rtkDisabled: true,\n });\n return result.exitCode;\n }\n\n const withNonInteractive = ['--non-interactive', ...args];\n try {\n const result = await runWithRtk('comet', withNonInteractive, config, options);\n if (result.exitCode === 0) return 0;\n\n const retry = await runWithRtk('comet', args, config, options);\n if (retry.exitCode !== 0) {\n throw new Error('NON_INTERACTIVE_FAILED');\n }\n return 0;\n } catch (err) {\n if ((err as ExecaError).message?.includes('ENOENT')) {\n throw new Error('COMET_NOT_FOUND');\n }\n throw err;\n }\n}\n\nfunction isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n","import type { FtConfig } from '../types/index.js';\n\nconst HEAD_LINES = 200;\nconst TAIL_LINES = 100;\n\nexport function shouldBypassRtk(\n commandArgs: string[],\n config: FtConfig,\n): boolean {\n const joined = commandArgs.join(' ');\n return config.rtk.exclude_patterns.some((pattern) => joined.includes(pattern));\n}\n\nexport function truncateMiddle(\n text: string,\n headLines = HEAD_LINES,\n tailLines = TAIL_LINES,\n): string {\n const lines = text.split('\\n');\n const total = lines.length;\n const threshold = headLines + tailLines;\n\n if (total <= threshold) {\n return text;\n }\n\n const omitted = total - headLines - tailLines;\n const head = lines.slice(0, headLines);\n const tail = lines.slice(-tailLines);\n const marker = `...... (已省略 ${omitted} 行) ......`;\n\n return [...head, marker, ...tail].join('\\n');\n}\n\nexport function compressOutputIfNeeded(\n text: string,\n config: FtConfig,\n rtkDisabled: boolean,\n): string {\n if (rtkDisabled) return text;\n\n const lines = text.split('\\n');\n const shouldCompress =\n config.rtk.enabled || lines.length > config.rtk.auto_trigger_lines;\n\n if (!shouldCompress) return text;\n\n return truncateMiddle(text);\n}\n","import { runCometPassthrough } from '../core/rtk-bridge.js';\nimport type { FtConfig } from '../types/index.js';\nimport type { CometSubcommand } from '../types/index.js';\nimport chalk from 'chalk';\nimport { t } from '../core/i18n.js';\n\nconst COMET_MAP: Record<string, CometSubcommand> = {\n open: 'open',\n design: 'design',\n build: 'build',\n verify: 'verify',\n archive: 'archive',\n hotfix: 'hotfix',\n tweak: 'tweak',\n};\n\nexport async function runCometSlash(\n subcommand: string,\n args: string[],\n config: FtConfig,\n): Promise<number> {\n const mapped = COMET_MAP[subcommand];\n if (!mapped) return 1;\n\n try {\n return await runCometPassthrough(mapped, args, config);\n } catch (err) {\n const message = (err as Error).message;\n if (message === 'NON_INTERACTIVE_FAILED') {\n console.error(chalk.red(t('error.cometNonInteractive', config.language)));\n console.error(chalk.yellow(t('error.cometUseTerminal', config.language)));\n return 1;\n }\n console.error(chalk.red(String(err)));\n return 1;\n }\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport { detectGitNexus } from '../core/detector.js';\nimport { t } from '../core/i18n.js';\nimport { getAdaptersForPlatforms } from '../adapters/index.js';\nimport { configureMcpForAdapters } from '../adapters/mcp-setup.js';\n\nexport async function runGraphSetup(config: FtConfig): Promise<void> {\n const lang = config.language;\n const installed = await detectGitNexus();\n\n if (!installed) {\n console.log(chalk.yellow(t('graph.setupGuide', lang)));\n console.log(chalk.cyan('npm install -g gitnexus'));\n } else {\n console.log(chalk.green(t('graph.alreadyInstalled', lang)));\n }\n\n const adapterList = getAdaptersForPlatforms(config.tools);\n await configureMcpForAdapters(adapterList, lang);\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\n\nexport async function runGraphInit(config: FtConfig): Promise<void> {\n const result = await runWithRtk('gitnexus', ['analyze'], config);\n process.exit(result.exitCode);\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\n\nexport async function runGraphRefresh(config: FtConfig): Promise<void> {\n const result = await runWithRtk('gitnexus', ['analyze', '--force'], config);\n process.exit(result.exitCode);\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\nimport { updateGraphTimestampInAgents } from '../core/agents.js';\nimport { t } from '../core/i18n.js';\n\nexport async function runGraphHandoff(config: FtConfig): Promise<void> {\n const lang = config.language;\n\n console.log(chalk.bold(`## A. ${t('graph.handoffSummary', lang)}\\n`));\n const summary = await runWithRtk('gitnexus', ['query', '--summary'], config);\n if (summary.exitCode !== 0) {\n console.log(chalk.yellow(t('graph.summaryFailed', lang)));\n }\n\n console.log(chalk.bold(`\\n## B. ${t('graph.handoffPrompt', lang)}\\n`));\n console.log(t('graph.handoffPromptBody', lang));\n\n console.log(chalk.bold(`\\n## C. ${t('graph.handoffTimestamp', lang)}\\n`));\n updateGraphTimestampInAgents();\n console.log(chalk.green(t('graph.timestampUpdated', lang)));\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport {\n detectGitNexus,\n gitNexusGraphExists,\n countGitNexusIndexFiles,\n} from '../core/detector.js';\nimport { t } from '../core/i18n.js';\n\nexport async function runGraphStatus(config: FtConfig): Promise<void> {\n const lang = config.language;\n const version = await detectGitNexus();\n const graphExists = gitNexusGraphExists();\n const indexCount = countGitNexusIndexFiles();\n\n console.log(chalk.bold(t('graph.statusTitle', lang)));\n console.log(`${t('graph.statusInstalled', lang)}: ${version ? chalk.green(version) : chalk.red('no')}`);\n console.log(`${t('graph.statusGraph', lang)}: ${graphExists ? chalk.green('yes') : chalk.yellow('no')}`);\n console.log(`${t('graph.statusIndexFiles', lang)}: ${indexCount}`);\n}\n"],"mappings":"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","names":["chalk","execa","readFileSync","existsSync","path","existsSync","path","readFileSync","path","existsSync","readFileSync","readFileSync","existsSync","path","readFileSync","writeFileSync","existsSync","path","path","readFileSync","existsSync","writeFileSync","readFileSync","existsSync","path","path","existsSync","readFileSync","path","readFileSync","writeFileSync","mkdirSync","existsSync","existsSync","readFileSync","path","mkdirSync","writeFileSync","chalk","execa","execa","readFileSync","path","path","readFileSync","chalk","readFileSync","existsSync","path","path","existsSync","readFileSync","execa","execa","result","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/core/detector.ts","../src/core/paths.ts","../src/core/config.ts","../src/core/agents.ts","../src/core/template.ts","../src/core/i18n.ts","../src/adapters/index.ts","../src/adapters/cursor-commands.ts","../src/adapters/visual-skills.ts","../src/core/visual-spec.ts","../src/core/visual-verify.ts","../src/adapters/figma-mcp.ts","../src/cli/commands/update.ts","../src/cli/commands/version.ts","../src/cli/commands/help.ts","../src/cli/commands/slash.ts","../src/slash/fill-context.ts","../src/slash/build.ts","../src/adapters/figma-api.ts","../src/slash/visual-regression-prep.ts","../src/slash/tweak.ts","../src/slash/hotfix.ts","../src/slash/verify.ts","../src/core/rtk-bridge.ts","../src/core/rtk.ts","../src/slash/comet-passthrough.ts","../src/slash/sync-cursor-commands.ts","../src/slash/visual-tools-install.ts","../src/core/visual-tools.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runInit } from './commands/init.js';\nimport { runUpdate } from './commands/update.js';\nimport { runVersion } from './commands/version.js';\nimport { printHelp } from './commands/help.js';\nimport { runSlash } from './commands/slash.js';\n\nconst program = new Command();\n\nprogram\n .name('ft')\n .description('Frontend Toolkit — orchestration layer for Comet and Karpathy rules')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Full project initialization pipeline')\n .option('--lang <lang>', 'Language: zh-CN or en')\n .action(async (options: { lang?: string }) => {\n await runInit({ lang: options.lang });\n });\n\nprogram\n .command('update')\n .description('Update @nick848/ft globally')\n .action(async () => {\n await runUpdate();\n });\n\nprogram\n .command('version')\n .description('Show FT and Comet versions')\n .action(async () => {\n await runVersion();\n });\n\nprogram\n .command('help')\n .description('Show help')\n .action(() => {\n printHelp();\n });\n\nprogram\n .command('slash')\n .description('Run IDE slash command')\n .argument('<command>', 'Slash subcommand name')\n .argument('[args...]', 'Additional arguments')\n .action(async (command: string, args: string[]) => {\n await runSlash(command, args);\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { execa } from 'execa';\nimport type { PlatformId } from '../../types/index.js';\nimport {\n detectComet,\n detectKarpathyRules,\n detectPlatformsInProject,\n detectProjectMeta,\n} from '../../core/detector.js';\nimport {\n loadConfig,\n resolveLanguage,\n writeDefaultConfig,\n mergeConfig,\n} from '../../core/config.js';\nimport { generateAgentsMd } from '../../core/agents.js';\nimport { t, tf } from '../../core/i18n.js';\nimport { getAdaptersForPlatforms } from '../../adapters/index.js';\nimport { injectCursorSlashCommands } from '../../adapters/cursor-commands.js';\nimport { injectVisualFidelitySkill } from '../../adapters/visual-skills.js';\nimport { ensureVisualSpec } from '../../core/visual-spec.js';\nimport { ensureVisualVerifyConfig } from '../../core/visual-verify.js';\nimport { setupFigmaMcp, isFigmaMcpConfigured } from '../../adapters/figma-mcp.js';\n\ntype InjectMode = 'manual' | 'auto' | 'all';\n\nasync function selectPlatforms(mode: InjectMode, lang: 'zh-CN' | 'en'): Promise<PlatformId[]> {\n if (mode === 'all') {\n return ['cursor', 'codex', 'opencode'];\n }\n\n if (mode === 'auto') {\n const detected = detectPlatformsInProject();\n if (detected.length > 0) return detected;\n return ['cursor', 'codex', 'opencode'];\n }\n\n const { platforms } = await inquirer.prompt<{ platforms: PlatformId[] }>([\n {\n type: 'checkbox',\n name: 'platforms',\n message: t('init.selectPlatforms', lang),\n choices: [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Codex', value: 'codex' },\n { name: 'OpenCode', value: 'opencode' },\n ],\n validate: (v) => (v.length > 0 ? true : t('init.selectAtLeastOne', lang)),\n },\n ]);\n return platforms;\n}\n\nasync function selectInjectMode(lang: 'zh-CN' | 'en'): Promise<InjectMode> {\n const { mode } = await inquirer.prompt<{ mode: InjectMode }>([\n {\n type: 'list',\n name: 'mode',\n message: t('init.injectModeQuestion', lang),\n choices: [\n { name: t('init.injectModeManual', lang), value: 'manual' },\n { name: t('init.injectModeAuto', lang), value: 'auto' },\n { name: t('init.injectModeAll', lang), value: 'all' },\n ],\n },\n ]);\n return mode;\n}\n\nexport async function runInit(options: { lang?: string }): Promise<void> {\n const projectRoot = process.cwd();\n const existingConfig = await loadConfig(projectRoot);\n const language = resolveLanguage(options.lang, existingConfig.language);\n\n const cometVersion = await detectComet();\n if (!cometVersion) {\n console.error(chalk.red(t('error.cometMissing', language)));\n process.exit(1);\n }\n\n if (!detectKarpathyRules(projectRoot)) {\n console.error(chalk.red(t('error.karpathyMissing', language)));\n process.exit(1);\n }\n\n const injectMode = await selectInjectMode(language);\n const selectedPlatforms = await selectPlatforms(injectMode, language);\n\n const adapterList = getAdaptersForPlatforms(selectedPlatforms);\n for (const adapter of adapterList) {\n adapter.injectRules(projectRoot);\n console.log(chalk.green(tf('init.rulesInjected', language, { path: adapter.rulesTargetPath })));\n }\n\n if (selectedPlatforms.includes('cursor')) {\n const commandCount = injectCursorSlashCommands(projectRoot);\n console.log(\n chalk.green(tf('init.cursorCommandsInjected', language, { count: String(commandCount) })),\n );\n\n const skillFileCount = injectVisualFidelitySkill(projectRoot);\n console.log(\n chalk.green(tf('init.visualSkillInjected', language, { count: String(skillFileCount) })),\n );\n\n ensureVisualSpec(projectRoot, language, '');\n ensureVisualVerifyConfig(projectRoot);\n console.log(chalk.green(t('init.visualSpecScaffolded', language)));\n }\n\n let figmaConfig = existingConfig.figma ?? { enabled: false, configured: false };\n if (selectedPlatforms.includes('cursor')) {\n if (isFigmaMcpConfigured(projectRoot)) {\n figmaConfig = { enabled: true, configured: true };\n } else {\n figmaConfig = await setupFigmaMcp(projectRoot, language);\n }\n }\n\n const meta = detectProjectMeta(projectRoot);\n generateAgentsMd(meta, language, projectRoot);\n console.log(chalk.green(t('init.agentsGenerated', language)));\n\n const config = mergeConfig({\n ...existingConfig,\n language,\n figma: figmaConfig,\n tools: selectedPlatforms,\n });\n writeDefaultConfig(projectRoot, config);\n\n console.log(chalk.blue(t('init.runningComet', language)));\n await execa('comet', ['init'], { stdio: 'inherit', cwd: projectRoot });\n\n console.log(chalk.green.bold(t('init.success', language)));\n console.log(chalk.cyan(t('init.nextStep', language)));\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport type { PlatformId, ProjectMeta } from '../types/index.js';\n\nimport { getRulesTemplatesDir } from './paths.js';\n\nconst KARPATHY_PATHS = [\n '.cursor/rules/karpathy-guidelines.mdc',\n '.codex/rules/karpathy-guidelines.md',\n '.opencode/rules/karpathy-guidelines.md',\n] as const;\n\nconst PLATFORM_DIRS: Record<PlatformId, string> = {\n cursor: '.cursor',\n codex: '.codex',\n opencode: '.opencode',\n};\n\nexport async function detectComet(): Promise<string | null> {\n try {\n const { stdout } = await execa('comet', ['--version']);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport function detectKarpathyRules(projectRoot: string = process.cwd()): boolean {\n if (KARPATHY_PATHS.some((p) => existsSync(path.join(projectRoot, p)))) {\n return true;\n }\n const templatesDir = getRulesTemplatesDir();\n return existsSync(path.join(templatesDir, 'cursor.mdc'));\n}\n\nexport function detectPlatformsInProject(projectRoot: string = process.cwd()): PlatformId[] {\n const found: PlatformId[] = [];\n for (const [id, dir] of Object.entries(PLATFORM_DIRS)) {\n if (existsSync(path.join(projectRoot, dir))) {\n found.push(id as PlatformId);\n }\n }\n return found;\n}\n\nexport function detectPackageManager(projectRoot: string = process.cwd()): string {\n if (existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n if (\n existsSync(path.join(projectRoot, 'bun.lockb')) ||\n existsSync(path.join(projectRoot, 'bun.lock'))\n ) {\n return 'bun';\n }\n if (existsSync(path.join(projectRoot, 'package-lock.json'))) return 'npm';\n return 'npm';\n}\n\nexport function detectProjectMeta(projectRoot: string = process.cwd()): ProjectMeta {\n const pkgPath = path.join(projectRoot, 'package.json');\n let name = path.basename(projectRoot);\n let scripts = '[NEEDS LLM INPUT]';\n let workspaces = '[NEEDS LLM INPUT]';\n let framework = 'unknown';\n let language = 'JavaScript';\n let monorepo = '否';\n\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n name?: string;\n scripts?: Record<string, string>;\n workspaces?: string[] | Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n name = pkg.name ?? name;\n if (pkg.scripts) {\n scripts = Object.entries(pkg.scripts)\n .map(([k, v]) => `- \\`${k}\\`: ${v}`)\n .join('\\n');\n }\n if (pkg.workspaces) {\n monorepo = '是';\n workspaces =\n Array.isArray(pkg.workspaces)\n ? pkg.workspaces.join(', ')\n : JSON.stringify(pkg.workspaces);\n }\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps['next']) framework = 'Next.js';\n else if (deps['nuxt']) framework = 'Nuxt';\n else if (deps['vue']) framework = 'Vue';\n else if (deps['react']) framework = 'React';\n else if (deps['@angular/core']) framework = 'Angular';\n else if (deps['svelte']) framework = 'Svelte';\n if (deps['typescript'] || existsSync(path.join(projectRoot, 'tsconfig.json'))) {\n language = 'TypeScript';\n }\n }\n\n return {\n name,\n packageManager: detectPackageManager(projectRoot),\n framework,\n language,\n monorepo,\n workspaces,\n scripts,\n };\n}\n\nexport function isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function isStdoutTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\nexport function agentsMdHasPendingPlaceholders(projectRoot: string = process.cwd()): boolean {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) return true;\n const content = readFileSync(agentsPath, 'utf-8');\n return content.includes('[NEEDS LLM INPUT]');\n}\n","import { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nexport function getPackageRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n\n while (dir !== path.dirname(dir)) {\n const pkgPath = path.join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string };\n if (pkg.name === '@nick848/ft') {\n return dir;\n }\n } catch {\n // continue walking\n }\n }\n dir = path.dirname(dir);\n }\n\n return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');\n}\n\nexport function getTemplatesDir(): string {\n return path.join(getPackageRoot(), 'templates');\n}\n\nexport function getRulesTemplatesDir(): string {\n return path.join(getPackageRoot(), 'rules-templates');\n}\n\nexport function getLocalesDir(): string {\n return path.join(getPackageRoot(), 'locales');\n}\n\nexport function getCursorCommandsTemplatesDir(): string {\n return path.join(getPackageRoot(), 'cursor-commands-templates');\n}\n\nexport function getSkillsTemplatesDir(): string {\n return path.join(getPackageRoot(), 'skills-templates');\n}\n\nexport function getScriptsDir(): string {\n return path.join(getPackageRoot(), 'scripts');\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport type { FtConfig, Language } from '../types/index.js';\n\nconst MODULE_NAME = 'ft';\n\nconst DEFAULT_CONFIG: FtConfig = {\n language: 'zh-CN',\n rtk: {\n enabled: true,\n auto_trigger_lines: 500,\n exclude_patterns: ['--json', '--format json', '--xml'],\n },\n figma: {\n enabled: false,\n configured: false,\n },\n tools: ['cursor', 'codex', 'opencode'],\n};\n\nexport function mergeConfig(partial?: Partial<FtConfig>): FtConfig {\n return {\n ...DEFAULT_CONFIG,\n ...partial,\n rtk: { ...DEFAULT_CONFIG.rtk, ...partial?.rtk },\n figma: { ...DEFAULT_CONFIG.figma, ...partial?.figma },\n tools: partial?.tools ?? DEFAULT_CONFIG.tools,\n };\n}\n\nexport async function loadConfig(projectRoot: string = process.cwd()): Promise<FtConfig> {\n const explorer = cosmiconfig(MODULE_NAME, {\n searchPlaces: [\n '.ft/config.yaml',\n '.ft/config.yml',\n '.ft/config.json',\n 'ft.config.yaml',\n 'ft.config.json',\n ],\n });\n\n const result = await explorer.search(projectRoot);\n if (!result?.config) {\n return { ...DEFAULT_CONFIG };\n }\n\n return mergeConfig(result.config as Partial<FtConfig>);\n}\n\nexport function resolveLanguage(\n cliLang?: string,\n configLang?: Language,\n): Language {\n if (cliLang === 'en' || cliLang === 'zh-CN') {\n return cliLang;\n }\n if (configLang) {\n return configLang;\n }\n return 'zh-CN';\n}\n\nexport function writeDefaultConfig(projectRoot: string, config: FtConfig): void {\n const ftDir = path.join(projectRoot, '.ft');\n if (!existsSync(ftDir)) {\n mkdirSync(ftDir, { recursive: true });\n }\n const configPath = path.join(ftDir, 'config.yaml');\n writeFileSync(configPath, YAML.stringify(config), 'utf-8');\n}\n\nexport function readConfigFile(projectRoot: string): FtConfig | null {\n const configPath = path.join(projectRoot, '.ft', 'config.yaml');\n if (!existsSync(configPath)) {\n return null;\n }\n const raw = readFileSync(configPath, 'utf-8');\n return mergeConfig(YAML.parse(raw) as Partial<FtConfig>);\n}\n","import Handlebars from 'handlebars';\nimport { readFileSync, writeFileSync, renameSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getTemplatesDir } from './paths.js';\nimport { buildAgentsTemplateData } from './template.js';\nimport type { ProjectMeta } from '../types/index.js';\n\nexport function renderAgentsMd(meta: ProjectMeta, lang: Language): string {\n const templateName = lang === 'en' ? 'AGENTS.md.en.hbs' : 'AGENTS.md.zh.hbs';\n const templatePath = path.join(getTemplatesDir(), templateName);\n const source = readFileSync(templatePath, 'utf-8');\n const template = Handlebars.compile(source);\n const data = buildAgentsTemplateData(meta);\n return template(data);\n}\n\nexport function generateAgentsMd(\n meta: ProjectMeta,\n lang: Language,\n projectRoot: string = process.cwd(),\n): void {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n\n if (existsSync(agentsPath)) {\n renameSync(agentsPath, backupPath);\n }\n\n const content = renderAgentsMd(meta, lang);\n writeFileSync(agentsPath, content, 'utf-8');\n}\n","import type { ProjectMeta } from '../types/index.js';\n\nexport interface AgentsTemplateData {\n projectName: string;\n packageManager: string;\n framework: string;\n language: string;\n monorepo: string;\n workspaces: string;\n scripts: string;\n}\n\nexport function buildAgentsTemplateData(meta: ProjectMeta): AgentsTemplateData {\n return {\n projectName: meta.name,\n packageManager: meta.packageManager,\n framework: meta.framework,\n language: meta.language,\n monorepo: meta.monorepo,\n workspaces: meta.workspaces,\n scripts: meta.scripts,\n };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getLocalesDir } from './paths.js';\n\ntype LocaleMap = Record<string, string>;\n\nconst cache: Partial<Record<Language, LocaleMap>> = {};\n\nfunction loadLocale(lang: Language): LocaleMap {\n if (cache[lang]) return cache[lang]!;\n const filePath = path.join(getLocalesDir(), `${lang}.json`);\n if (!existsSync(filePath)) {\n return {};\n }\n cache[lang] = JSON.parse(readFileSync(filePath, 'utf-8')) as LocaleMap;\n return cache[lang]!;\n}\n\nexport function t(key: string, lang: Language = 'zh-CN'): string {\n const locale = loadLocale(lang);\n return locale[key] ?? key;\n}\n\nexport function tf(key: string, lang: Language, vars?: Record<string, string>): string {\n let text = t(key, lang);\n if (!vars) return text;\n for (const [k, v] of Object.entries(vars)) {\n text = text.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), v);\n }\n return text;\n}\n","import path from 'node:path';\nimport { mkdirSync, existsSync, copyFileSync } from 'node:fs';\nimport type { PlatformId } from '../types/index.js';\nimport { getRulesTemplatesDir } from '../core/paths.js';\n\nexport interface PlatformAdapter {\n id: PlatformId;\n rulesTargetPath: string;\n rulesTemplateName: string;\n injectRules(projectRoot: string): void;\n}\n\nfunction createAdapter(\n id: PlatformId,\n rulesTargetPath: string,\n rulesTemplateName: string,\n): PlatformAdapter {\n return {\n id,\n rulesTargetPath,\n rulesTemplateName,\n injectRules(projectRoot) {\n const target = path.join(projectRoot, rulesTargetPath);\n const source = path.join(getRulesTemplatesDir(), rulesTemplateName);\n const dir = path.dirname(target);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n copyFileSync(source, target);\n },\n };\n}\n\nexport const cursorAdapter = createAdapter(\n 'cursor',\n '.cursor/rules/karpathy-guidelines.mdc',\n 'cursor.mdc',\n);\n\nexport const codexAdapter = createAdapter(\n 'codex',\n '.codex/rules/karpathy-guidelines.md',\n 'codex.md',\n);\n\nexport const opencodeAdapter = createAdapter(\n 'opencode',\n '.opencode/rules/karpathy-guidelines.md',\n 'opencode.md',\n);\n\nexport const adapters: Record<PlatformId, PlatformAdapter> = {\n cursor: cursorAdapter,\n codex: codexAdapter,\n opencode: opencodeAdapter,\n};\n\nexport function getAdaptersForPlatforms(platforms: PlatformId[]): PlatformAdapter[] {\n return platforms.map((p) => adapters[p]);\n}\n","import {\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport { getCursorCommandsTemplatesDir } from '../core/paths.js';\n\nexport function injectCursorSlashCommands(projectRoot: string = process.cwd()): number {\n const sourceDir = getCursorCommandsTemplatesDir();\n const targetDir = path.join(projectRoot, '.cursor', 'commands');\n\n if (!existsSync(sourceDir)) {\n throw new Error(`Cursor command templates not found: ${sourceDir}`);\n }\n\n mkdirSync(targetDir, { recursive: true });\n\n const files = readdirSync(sourceDir).filter((f) => f.endsWith('.md'));\n for (const file of files) {\n copyFileSync(path.join(sourceDir, file), path.join(targetDir, file));\n }\n\n return files.length;\n}\n","import {\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n statSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport { getSkillsTemplatesDir } from '../core/paths.js';\n\nconst SKILL_NAME = 'visual-fidelity';\n\nfunction copyDirRecursive(source: string, target: string): number {\n mkdirSync(target, { recursive: true });\n let count = 0;\n\n for (const entry of readdirSync(source)) {\n const srcPath = path.join(source, entry);\n const destPath = path.join(target, entry);\n if (statSync(srcPath).isDirectory()) {\n count += copyDirRecursive(srcPath, destPath);\n } else {\n copyFileSync(srcPath, destPath);\n count += 1;\n }\n }\n\n return count;\n}\n\nexport function injectVisualFidelitySkill(projectRoot: string = process.cwd()): number {\n const sourceDir = path.join(getSkillsTemplatesDir(), SKILL_NAME);\n const targetDir = path.join(projectRoot, '.cursor', 'skills', SKILL_NAME);\n\n if (!existsSync(sourceDir)) {\n throw new Error(`Visual fidelity skill templates not found: ${sourceDir}`);\n }\n\n return copyDirRecursive(sourceDir, targetDir);\n}\n\nexport function getVisualFidelitySkillPath(projectRoot: string): string {\n return path.join(projectRoot, '.cursor', 'skills', SKILL_NAME, 'SKILL.md');\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getTemplatesDir } from './paths.js';\nimport type { DesignToken, VisualChecklist } from '../types/visual.js';\n\nexport interface FigmaLink {\n url: string;\n fileKey?: string;\n nodeId?: string;\n label?: string;\n}\n\nexport function parseFigmaUrl(url: string): { fileKey: string; nodeId?: string } | null {\n const normalized = url.trim();\n const match =\n /figma\\.com\\/(?:file|design)\\/([a-zA-Z0-9]+)/i.exec(normalized) ??\n /figma\\.com\\/(?:file|design)\\/([a-zA-Z0-9]+)/i.exec(normalized);\n if (!match?.[1]) return null;\n\n const fileKey = match[1];\n const nodeParam = /[?&]node-id=([^&\\s)]+)/i.exec(normalized);\n const nodeId = nodeParam?.[1]?.replace(/-/g, ':');\n return nodeId ? { fileKey, nodeId } : { fileKey };\n}\n\nexport function extractFigmaLinks(text: string): FigmaLink[] {\n const links: FigmaLink[] = [];\n const seen = new Set<string>();\n\n for (const line of text.split('\\n')) {\n const urlMatch = /(https?:\\/\\/[^\\s)]+)/g;\n let m: RegExpExecArray | null;\n while ((m = urlMatch.exec(line)) !== null) {\n const url = m[1];\n if (!url.includes('figma.com')) continue;\n if (seen.has(url)) continue;\n seen.add(url);\n\n const parsed = parseFigmaUrl(url);\n const label = line.replace(url, '').replace(/^[-*•\\s]+/, '').trim();\n links.push({\n url,\n fileKey: parsed?.fileKey,\n nodeId: parsed?.nodeId,\n label: label || undefined,\n });\n }\n }\n\n return links;\n}\n\nexport function extractVisualDesignSection(agentsContent: string, lang: Language): string {\n const headings = lang === 'en' ? ['Visual Design', 'Design'] : ['视觉稿', '设计稿'];\n for (const heading of headings) {\n const regex = new RegExp(`## ${heading}[\\\\s\\\\n]+([\\\\s\\\\S]*?)(?=\\\\n## |$)`, 'm');\n const match = agentsContent.match(regex);\n const section = match?.[1]?.trim() ?? '';\n if (section && !section.includes('[NEEDS LLM INPUT]')) {\n return section;\n }\n }\n return '';\n}\n\nexport function getFtDir(projectRoot: string): string {\n return path.join(projectRoot, '.ft');\n}\n\nexport function getVisualSpecPath(projectRoot: string): string {\n return path.join(getFtDir(projectRoot), 'visual-spec.md');\n}\n\nexport function getVisualChecklistPath(projectRoot: string): string {\n return path.join(getFtDir(projectRoot), 'visual-checklist.json');\n}\n\nfunction loadVisualSpecTemplate(): string {\n const templatePath = path.join(getTemplatesDir(), 'visual-spec.md');\n return readFileSync(templatePath, 'utf-8');\n}\n\nfunction defaultChecklist(frame = 'TBD'): VisualChecklist {\n return {\n version: 1,\n frame,\n items: [],\n };\n}\n\nexport function readVisualChecklist(projectRoot: string): VisualChecklist {\n const checklistPath = getVisualChecklistPath(projectRoot);\n if (!existsSync(checklistPath)) {\n return defaultChecklist();\n }\n try {\n return JSON.parse(readFileSync(checklistPath, 'utf-8')) as VisualChecklist;\n } catch {\n return defaultChecklist();\n }\n}\n\nexport function writeVisualChecklist(projectRoot: string, checklist: VisualChecklist): void {\n const ftDir = getFtDir(projectRoot);\n mkdirSync(ftDir, { recursive: true });\n writeFileSync(\n getVisualChecklistPath(projectRoot),\n `${JSON.stringify(checklist, null, 2)}\\n`,\n 'utf-8',\n );\n}\n\nfunction tokenToChecklistItem(token: DesignToken): VisualChecklist['items'][number] {\n return {\n id: token.id,\n category: token.category,\n description: token.description,\n designValue: token.value,\n cssVariable: token.cssVariable,\n status: 'pending',\n };\n}\n\nfunction mergeTokensIntoChecklist(\n checklist: VisualChecklist,\n tokens: DesignToken[],\n frame?: string,\n nodeId?: string,\n): VisualChecklist {\n const existingById = new Map(checklist.items.map((item) => [item.id, item]));\n const mergedItems = tokens.map((token) => {\n const existing = existingById.get(token.id);\n if (existing?.status === 'passed') {\n return existing;\n }\n return tokenToChecklistItem(token);\n });\n\n for (const item of checklist.items) {\n if (!mergedItems.some((m) => m.id === item.id)) {\n mergedItems.push(item);\n }\n }\n\n return {\n ...checklist,\n frame: frame ?? checklist.frame,\n figmaNodeId: nodeId ?? checklist.figmaNodeId,\n items: mergedItems,\n };\n}\n\nfunction renderTokenRows(tokens: DesignToken[]): string {\n if (tokens.length === 0) {\n return '| TBD | TBD | TBD | TBD |';\n }\n return tokens\n .map(\n (t) =>\n `| ${t.id} | ${t.value} | ${t.cssVariable ?? '—'} | ${t.source ?? 'figma'} |`,\n )\n .join('\\n');\n}\n\nfunction renderDesignSources(links: FigmaLink[], lang: Language): string {\n if (links.length === 0) {\n return lang === 'en'\n ? '- TBD — add Figma/Lanhu links to AGENTS.md Visual Design section'\n : '- TBD — 请在 AGENTS.md「视觉稿」章节补充 Figma / 蓝湖链接';\n }\n return links\n .map((link) => {\n const parts = [link.url];\n if (link.fileKey) parts.push(`fileKey: \\`${link.fileKey}\\``);\n if (link.nodeId) parts.push(`nodeId: \\`${link.nodeId}\\``);\n if (link.label) parts.unshift(`**${link.label}** —`);\n return `- ${parts.join(' · ')}`;\n })\n .join('\\n');\n}\n\nexport function writeVisualSpec(\n projectRoot: string,\n links: FigmaLink[],\n tokens: DesignToken[],\n lang: Language,\n): void {\n const ftDir = getFtDir(projectRoot);\n mkdirSync(ftDir, { recursive: true });\n\n const template = loadVisualSpecTemplate();\n const content = template\n .replace('{{designSources}}', renderDesignSources(links, lang))\n .replace('{{tokenRows}}', renderTokenRows(tokens));\n\n writeFileSync(getVisualSpecPath(projectRoot), content, 'utf-8');\n}\n\nexport interface EnsureVisualSpecResult {\n specPath: string;\n checklistPath: string;\n created: boolean;\n tokenCount: number;\n linkCount: number;\n}\n\nexport function ensureVisualSpec(\n projectRoot: string,\n lang: Language,\n designSection: string,\n tokens: DesignToken[] = [],\n primaryLink?: FigmaLink,\n): EnsureVisualSpecResult {\n const links = extractFigmaLinks(designSection);\n const specExists = existsSync(getVisualSpecPath(projectRoot));\n const checklist = readVisualChecklist(projectRoot);\n\n const frameName = primaryLink?.label ?? primaryLink?.nodeId ?? checklist.frame ?? 'TBD';\n const mergedChecklist = mergeTokensIntoChecklist(\n checklist,\n tokens,\n frameName,\n primaryLink?.nodeId,\n );\n\n writeVisualSpec(projectRoot, links, tokens, lang);\n writeVisualChecklist(projectRoot, mergedChecklist);\n\n return {\n specPath: getVisualSpecPath(projectRoot),\n checklistPath: getVisualChecklistPath(projectRoot),\n created: !specExists,\n tokenCount: tokens.length,\n linkCount: links.length,\n };\n}\n\nexport function countChecklistByStatus(\n checklist: VisualChecklist,\n): { passed: number; pending: number; failed: number; total: number } {\n const passed = checklist.items.filter((i) => i.status === 'passed').length;\n const failed = checklist.items.filter((i) => i.status === 'failed').length;\n const pending = checklist.items.filter((i) => i.status === 'pending').length;\n return { passed, pending, failed, total: checklist.items.length };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport type { Language } from '../types/index.js';\nimport type { VisualDiffReport, VisualVerifyConfig } from '../types/visual-verify.js';\nimport { getFtDir } from './visual-spec.js';\nimport { getScriptsDir, getTemplatesDir } from './paths.js';\n\nconst DEFAULT_VIEWPORT = { width: 1280, height: 720 };\n\nexport function getVisualVerifyConfigPath(projectRoot: string): string {\n return path.join(getFtDir(projectRoot), 'visual-verify.json');\n}\n\nexport function getVisualBaselinesDir(projectRoot: string): string {\n return path.join(getFtDir(projectRoot), 'visual-baselines');\n}\n\nexport function readVisualVerifyConfig(projectRoot: string): VisualVerifyConfig | null {\n const configPath = getVisualVerifyConfigPath(projectRoot);\n if (!existsSync(configPath)) return null;\n\n try {\n return JSON.parse(readFileSync(configPath, 'utf-8')) as VisualVerifyConfig;\n } catch {\n return null;\n }\n}\n\nexport function ensureVisualVerifyConfig(projectRoot: string): string {\n const ftDir = getFtDir(projectRoot);\n mkdirSync(ftDir, { recursive: true });\n mkdirSync(getVisualBaselinesDir(projectRoot), { recursive: true });\n\n const configPath = getVisualVerifyConfigPath(projectRoot);\n if (!existsSync(configPath)) {\n const templatePath = path.join(getTemplatesDir(), 'visual-verify.json');\n writeFileSync(configPath, readFileSync(templatePath, 'utf-8'), 'utf-8');\n }\n\n return configPath;\n}\n\nexport function resolveProjectDependency(\n projectRoot: string,\n packageName: string,\n): string | null {\n const pkgPath = path.join(projectRoot, 'node_modules', packageName, 'package.json');\n return existsSync(pkgPath) ? path.join(projectRoot, 'node_modules', packageName) : null;\n}\n\nexport function hasVisualDiffDependencies(projectRoot: string): boolean {\n return (\n resolveProjectDependency(projectRoot, 'playwright') !== null &&\n resolveProjectDependency(projectRoot, 'pixelmatch') !== null &&\n resolveProjectDependency(projectRoot, 'pngjs') !== null\n );\n}\n\nexport async function runVisualDiff(\n projectRoot: string,\n): Promise<{ exitCode: number; report: VisualDiffReport | null; stdout: string }> {\n const scriptPath = path.join(getScriptsDir(), 'visual-diff.mjs');\n if (!existsSync(scriptPath)) {\n return { exitCode: 1, report: null, stdout: '' };\n }\n\n const result = await execa('node', [scriptPath], {\n cwd: projectRoot,\n reject: false,\n });\n\n let report: VisualDiffReport | null = null;\n const jsonLine = result.stdout\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('{') && line.includes('\"results\"'));\n\n if (jsonLine) {\n try {\n report = JSON.parse(jsonLine) as VisualDiffReport;\n } catch {\n report = null;\n }\n }\n\n return {\n exitCode: result.exitCode ?? 1,\n report,\n stdout: [result.stdout, result.stderr].filter(Boolean).join('\\n'),\n };\n}\n\nexport function formatVerifyConfigSummary(\n config: VisualVerifyConfig,\n lang: Language,\n): string {\n const lines = config.screens.map(\n (s) =>\n ` - ${s.id}: ${config.baseUrl}${s.path} ↔ ${s.baseline} (${s.viewport?.width ?? DEFAULT_VIEWPORT.width}×${s.viewport?.height ?? DEFAULT_VIEWPORT.height})`,\n );\n return lines.join('\\n') || (lang === 'en' ? ' (no screens configured)' : ' (未配置页面)');\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport type { FigmaMcpConfig, Language } from '../types/index.js';\nimport { t, tf } from '../core/i18n.js';\n\nconst FIGMA_SERVER_ID = 'figma-developer-mcp';\nconst FIGMA_DOCS_URL =\n 'https://www.figma.com/developers/api#access-tokens';\n\ntype McpJson = {\n mcpServers?: Record<string, McpServerEntry>;\n servers?: Record<string, McpServerEntry>;\n};\n\ntype McpServerEntry = {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n type?: string;\n};\n\nfunction getMcpPath(projectRoot: string): string {\n return path.join(projectRoot, '.cursor', 'mcp.json');\n}\n\nfunction readMcpJson(projectRoot: string): McpJson {\n const mcpPath = getMcpPath(projectRoot);\n if (!existsSync(mcpPath)) {\n return { mcpServers: {} };\n }\n\n try {\n return JSON.parse(readFileSync(mcpPath, 'utf-8')) as McpJson;\n } catch {\n return { mcpServers: {} };\n }\n}\n\nfunction writeMcpJson(projectRoot: string, config: McpJson): void {\n const cursorDir = path.join(projectRoot, '.cursor');\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(getMcpPath(projectRoot), `${JSON.stringify(config, null, 2)}\\n`, 'utf-8');\n}\n\nexport function buildFigmaMcpServerEntry(apiKey: string): McpServerEntry {\n const args = ['-y', 'figma-developer-mcp', '--stdio'];\n const env = { FIGMA_API_KEY: apiKey };\n\n if (process.platform === 'win32') {\n return {\n command: 'cmd',\n args: ['/c', 'npx', ...args],\n env,\n };\n }\n\n return {\n command: 'npx',\n args,\n env,\n };\n}\n\nexport function mergeFigmaMcpConfig(projectRoot: string, apiKey: string): void {\n const existing = readMcpJson(projectRoot);\n const servers = existing.mcpServers ?? existing.servers ?? {};\n const entry = buildFigmaMcpServerEntry(apiKey);\n\n const next: McpJson = {\n ...existing,\n mcpServers: {\n ...servers,\n [FIGMA_SERVER_ID]: entry,\n },\n };\n delete next.servers;\n\n writeMcpJson(projectRoot, next);\n}\n\nexport function isFigmaMcpConfigured(projectRoot: string = process.cwd()): boolean {\n const mcpPath = getMcpPath(projectRoot);\n if (!existsSync(mcpPath)) {\n return false;\n }\n\n const content = readFileSync(mcpPath, 'utf-8');\n return (\n content.includes(FIGMA_SERVER_ID) ||\n content.includes('figma-developer-mcp') ||\n content.includes('FIGMA_API_KEY')\n );\n}\n\nexport async function setupFigmaMcp(\n projectRoot: string,\n lang: Language,\n): Promise<FigmaMcpConfig> {\n console.log('');\n console.log(t('init.figmaIntro', lang));\n console.log(t('init.figmaDocsHint', lang));\n console.log(` ${FIGMA_DOCS_URL}`);\n console.log('');\n\n const { configure } = await inquirer.prompt<{ configure: boolean }>([\n {\n type: 'confirm',\n name: 'configure',\n message: t('init.figmaConfigureQuestion', lang),\n default: true,\n },\n ]);\n\n if (!configure) {\n console.log(chalk.yellow(t('init.figmaSkipped', lang)));\n return { enabled: false, configured: false };\n }\n\n const { apiKey } = await inquirer.prompt<{ apiKey: string }>([\n {\n type: 'password',\n name: 'apiKey',\n message: t('init.figmaApiKeyQuestion', lang),\n mask: '*',\n validate: (value) =>\n value.trim().length > 0 ? true : t('init.figmaApiKeyRequired', lang),\n },\n ]);\n\n mergeFigmaMcpConfig(projectRoot, apiKey.trim());\n console.log(chalk.green(tf('init.figmaConfigured', lang, { path: '.cursor/mcp.json' })));\n console.log(chalk.yellow(t('init.figmaGitignoreHint', lang)));\n\n return { enabled: true, configured: true };\n}\n","import { execa } from 'execa';\n\nexport async function runUpdate(): Promise<void> {\n await execa('npm', ['update', '-g', '@nick848/ft'], { stdio: 'inherit' });\n}\n","import { detectComet } from '../../core/detector.js';\nimport { getPackageRoot } from '../../core/paths.js';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nfunction getFtVersion(): string {\n try {\n const pkgPath = path.join(getPackageRoot(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version?: string };\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport async function runVersion(): Promise<void> {\n const ftVersion = getFtVersion();\n const cometVersion = await detectComet();\n\n console.log(`FT: ${ftVersion}`);\n console.log(`Comet: ${cometVersion ?? 'not installed'}`);\n}\n","export function printHelp(): void {\n console.log(`\nFT (Frontend Toolkit) — CLI orchestration for Comet and Karpathy rules\n\nUsage:\n ft init [--lang en|zh-CN] Full project initialization pipeline\n ft update Update @nick848/ft globally\n ft version Show FT and Comet versions\n ft help Show this help\n ft slash <command> [args] Run IDE slash command (internal)\n\nSlash commands (use via IDE, maps to ft slash):\n fill-context Output prompt recipe to fill AGENTS.md\n open Comet open (passthrough)\n design Comet design (passthrough)\n build Comet build (passthrough)\n verify Comet verify (passthrough)\n archive Comet archive (passthrough)\n hotfix Comet hotfix (passthrough)\n tweak Comet tweak (passthrough)\n sync-cursor-commands Reinstall Cursor slash commands\n visual-tools-install Install playwright, pixelmatch, pngjs for pixel diff\n`);\n}\n","import chalk from 'chalk';\nimport type { SlashCommand } from '../../types/index.js';\nimport { loadConfig, mergeConfig, writeDefaultConfig } from '../../core/config.js';\nimport { agentsMdHasPendingPlaceholders } from '../../core/detector.js';\nimport { t } from '../../core/i18n.js';\nimport { runFillContext } from '../../slash/fill-context.js';\nimport { runBuildPrep } from '../../slash/build.js';\nimport { runTweakPrep } from '../../slash/tweak.js';\nimport { runHotfixPrep } from '../../slash/hotfix.js';\nimport { runVerifyPrep } from '../../slash/verify.js';\nimport { runCometSlash } from '../../slash/comet-passthrough.js';\nimport { runSyncCursorCommands } from '../../slash/sync-cursor-commands.js';\nimport { runVisualToolsInstall } from '../../slash/visual-tools-install.js';\n\nconst COMET_COMMANDS: SlashCommand[] = [\n 'open',\n 'design',\n 'build',\n 'verify',\n 'archive',\n 'hotfix',\n 'tweak',\n];\n\nconst ALL_COMMANDS: SlashCommand[] = [\n 'fill-context',\n ...COMET_COMMANDS,\n 'sync-cursor-commands',\n 'visual-tools-install',\n];\n\nfunction gateCometCommands(projectRoot: string, lang: 'zh-CN' | 'en'): void {\n if (agentsMdHasPendingPlaceholders(projectRoot)) {\n console.error(chalk.yellow(t('gate.fillContextFirst', lang)));\n process.exit(1);\n }\n}\n\nexport async function runSlash(command: string, args: string[]): Promise<void> {\n if (!ALL_COMMANDS.includes(command as SlashCommand)) {\n console.error(chalk.red(`Unknown slash command: ${command}`));\n process.exit(1);\n }\n\n const projectRoot = process.cwd();\n const config = await loadConfig(projectRoot);\n const lang = config.language;\n const slashCmd = command as SlashCommand;\n\n if (COMET_COMMANDS.includes(slashCmd)) {\n gateCometCommands(projectRoot, lang);\n if (slashCmd === 'build') {\n const prepResult = await runBuildPrep(config);\n if (prepResult.figma) {\n writeDefaultConfig(projectRoot, mergeConfig({ ...config, figma: prepResult.figma }));\n }\n console.log('');\n }\n if (slashCmd === 'tweak') {\n await runTweakPrep(config);\n console.log('');\n }\n if (slashCmd === 'hotfix') {\n await runHotfixPrep(config);\n console.log('');\n }\n\n let visualDiffFailed = false;\n if (slashCmd === 'verify') {\n const verifyResult = await runVerifyPrep(config);\n visualDiffFailed = verifyResult.visualDiffFailed;\n console.log('');\n }\n\n const exitCode = await runCometSlash(slashCmd, args, config);\n if (visualDiffFailed && exitCode === 0) {\n process.exit(1);\n }\n process.exit(exitCode);\n }\n\n switch (slashCmd) {\n case 'fill-context':\n await runFillContext(config);\n break;\n case 'sync-cursor-commands':\n await runSyncCursorCommands();\n break;\n case 'visual-tools-install': {\n const exitCode = await runVisualToolsInstall(config);\n process.exit(exitCode);\n }\n default:\n process.exit(1);\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { FtConfig } from '../types/index.js';\nimport { t } from '../core/i18n.js';\n\nconst PLACEHOLDER = '[NEEDS LLM INPUT]';\n\nconst SECTION_HINTS: Record<string, { zh: string; en: string }> = {\n '结构': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n 'Structure': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n '规范': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n 'Conventions': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n '路由': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n 'Routing': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n '视觉稿': {\n zh: '请填写 Figma / 蓝湖等视觉稿链接,含 frame 或 node-id;如有设计规范一并说明',\n en: 'Add Figma / Lanhu design links with frame or node-id; include design tokens if any',\n },\n 'Visual Design': {\n zh: '请填写 Figma / 蓝湖等视觉稿链接,含 frame 或 node-id;如有设计规范一并说明',\n en: 'Add Figma / Lanhu design links with frame or node-id; include design tokens if any',\n },\n 'Design': {\n zh: '请填写 Figma / 蓝湖等视觉稿链接,含 frame 或 node-id;如有设计规范一并说明',\n en: 'Add Figma / Lanhu design links with frame or node-id; include design tokens if any',\n },\n};\n\nfunction extractSections(content: string): Array<{ section: string; line: number }> {\n const lines = content.split('\\n');\n const results: Array<{ section: string; line: number }> = [];\n let currentSection = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('## ')) {\n currentSection = line.replace(/^##\\s+/, '').trim();\n }\n if (line.includes(PLACEHOLDER)) {\n results.push({ section: currentSection, line: i + 1 });\n }\n }\n return results;\n}\n\nfunction findSectionInBackup(section: string, backup: string): string {\n if (!section) return '';\n const regex = new RegExp(`## ${section}[\\\\s\\\\n]+([\\\\s\\\\S]*?)(?=\\\\n## |$)`, 'm');\n const match = backup.match(regex);\n return match?.[1]?.trim() ?? '';\n}\n\nexport async function runFillContext(config: FtConfig): Promise<void> {\n const projectRoot = process.cwd();\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const lang = config.language;\n\n if (!existsSync(agentsPath)) {\n console.log(t('fillContext.noAgents', lang));\n return;\n }\n\n const agentsContent = readFileSync(agentsPath, 'utf-8');\n const placeholders = extractSections(agentsContent);\n\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n const backupContent = existsSync(backupPath)\n ? readFileSync(backupPath, 'utf-8')\n : '';\n\n const langLabel = lang === 'en' ? 'English' : '简体中文';\n\n console.log(`# ${t('fillContext.title', lang)}\\n`);\n console.log(t('fillContext.goal', lang));\n console.log(`\\n**${t('fillContext.langConstraint', lang)}**: ${langLabel}\\n`);\n\n if (placeholders.length === 0) {\n console.log(t('fillContext.noPlaceholders', lang));\n return;\n }\n\n console.log(`## ${t('fillContext.taskList', lang)}\\n`);\n\n for (const { section, line } of placeholders) {\n const hint = SECTION_HINTS[section];\n const guide =\n lang === 'en'\n ? hint?.en ?? 'Replace placeholder with accurate project-specific content'\n : hint?.zh ?? '将占位符替换为准确的项目相关内容';\n\n console.log(`### ${section || 'General'} (line ${line})`);\n console.log(`- **${t('fillContext.placeholder', lang)}**: ${PLACEHOLDER}`);\n console.log(`- **${t('fillContext.guide', lang)}**: ${guide}`);\n\n if (backupContent && section) {\n const ref = findSectionInBackup(section, backupContent);\n if (ref) {\n console.log(`- **${t('fillContext.reference', lang)}**:\\n`);\n console.log(ref);\n }\n }\n console.log('');\n }\n\n if (backupContent) {\n console.log(`## ${t('fillContext.backupNote', lang)}\\n`);\n console.log(t('fillContext.backupMerge', lang));\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport type { FtConfig, FigmaMcpConfig, Language } from '../types/index.js';\nimport {\n isFigmaMcpConfigured,\n mergeFigmaMcpConfig,\n} from '../adapters/figma-mcp.js';\nimport { fetchFigmaDesignTokens, isFigmaApiKeyAvailable } from '../adapters/figma-api.js';\nimport { getVisualFidelitySkillPath } from '../adapters/visual-skills.js';\nimport { isStdinTTY } from '../core/detector.js';\nimport { t, tf } from '../core/i18n.js';\nimport {\n ensureVisualSpec,\n extractVisualDesignSection,\n extractFigmaLinks,\n countChecklistByStatus,\n readVisualChecklist,\n} from '../core/visual-spec.js';\n\nexport interface BuildPrepResult {\n figma?: FigmaMcpConfig;\n}\n\ntype SupplementAction = 'api_key' | 'design_link' | 'skip';\n\nfunction hasVisualDesignLinks(projectRoot: string, lang: Language): boolean {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) {\n return false;\n }\n return extractVisualDesignSection(readFileSync(agentsPath, 'utf-8'), lang).length > 0;\n}\n\nasync function promptDesignSupplement(\n projectRoot: string,\n lang: Language,\n): Promise<FigmaMcpConfig | undefined> {\n if (!isStdinTTY()) {\n console.log(t('build.supplementNonInteractive', lang));\n return undefined;\n }\n\n console.log('');\n const { action } = await inquirer.prompt<{ action: SupplementAction }>([\n {\n type: 'list',\n name: 'action',\n message: t('build.supplementQuestion', lang),\n choices: [\n { name: t('build.supplementApiKey', lang), value: 'api_key' },\n { name: t('build.supplementDesignLink', lang), value: 'design_link' },\n { name: t('build.supplementSkip', lang), value: 'skip' },\n ],\n },\n ]);\n\n if (action === 'skip') {\n console.log(chalk.yellow(t('build.supplementSkipped', lang)));\n return undefined;\n }\n\n if (action === 'api_key') {\n const { apiKey } = await inquirer.prompt<{ apiKey: string }>([\n {\n type: 'password',\n name: 'apiKey',\n message: t('init.figmaApiKeyQuestion', lang),\n mask: '*',\n validate: (value) =>\n value.trim().length > 0 ? true : t('init.figmaApiKeyRequired', lang),\n },\n ]);\n\n mergeFigmaMcpConfig(projectRoot, apiKey.trim());\n console.log(chalk.green(tf('init.figmaConfigured', lang, { path: '.cursor/mcp.json' })));\n console.log(chalk.yellow(t('build.supplementMcpRestartHint', lang)));\n return { enabled: true, configured: true };\n }\n\n const { link } = await inquirer.prompt<{ link: string }>([\n {\n type: 'input',\n name: 'link',\n message: t('build.supplementDesignLinkQuestion', lang),\n validate: (value) =>\n value.trim().length > 0 ? true : t('build.supplementDesignLinkRequired', lang),\n },\n ]);\n\n console.log(chalk.cyan(tf('build.supplementLinkNoted', lang, { link: link.trim() })));\n return undefined;\n}\n\nasync function resolveDesignTokens(\n projectRoot: string,\n designSection: string,\n figmaReady: boolean,\n): Promise<{ tokens: Awaited<ReturnType<typeof fetchFigmaDesignTokens>>; primaryLink?: ReturnType<typeof extractFigmaLinks>[number] }> {\n const links = extractFigmaLinks(designSection);\n const primary = links.find((l) => l.fileKey) ?? links[0];\n if (!figmaReady || !primary?.fileKey) {\n return { tokens: [], primaryLink: primary };\n }\n\n if (!isFigmaApiKeyAvailable(projectRoot)) {\n return { tokens: [], primaryLink: primary };\n }\n\n try {\n const tokens = await fetchFigmaDesignTokens(\n projectRoot,\n primary.fileKey,\n primary.nodeId,\n );\n return { tokens, primaryLink: primary };\n } catch {\n return { tokens: [], primaryLink: primary };\n }\n}\n\nexport async function runBuildPrep(config: FtConfig): Promise<BuildPrepResult> {\n const projectRoot = process.cwd();\n const lang = config.language;\n const figmaReady = isFigmaMcpConfigured(projectRoot) || config.figma.enabled;\n const hasDesignLinks = hasVisualDesignLinks(projectRoot, lang);\n const needsSupplement = !figmaReady || !hasDesignLinks;\n\n console.log(`# ${t('build.title', lang)}\\n`);\n console.log(t('build.mandatory', lang));\n console.log('');\n\n console.log(`## ${t('build.stepFetch', lang)}\\n`);\n console.log(t('build.stepFetchDetail', lang));\n console.log('');\n\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n let designSection = '';\n if (existsSync(agentsPath)) {\n designSection = extractVisualDesignSection(readFileSync(agentsPath, 'utf-8'), lang);\n if (designSection) {\n console.log(`### ${t('build.designLinksFromAgents', lang)}\\n`);\n console.log(designSection);\n console.log('');\n }\n }\n\n console.log(`## ${t('build.figmaMcpStatus', lang)}\\n`);\n if (figmaReady) {\n console.log(t('build.figmaMcpReady', lang));\n } else {\n console.log(t('build.figmaMcpMissing', lang));\n }\n console.log('');\n\n console.log(`## ${t('build.fidelityRules', lang)}\\n`);\n console.log(t('build.fidelityRulesDetail', lang));\n console.log('');\n\n console.log(`## ${t('build.visualSpec', lang)}\\n`);\n console.log(t('build.visualSpecDetail', lang));\n console.log('');\n\n const skillPath = getVisualFidelitySkillPath(projectRoot);\n const { tokens, primaryLink } = await resolveDesignTokens(\n projectRoot,\n designSection,\n figmaReady,\n );\n\n const specResult = ensureVisualSpec(projectRoot, lang, designSection, tokens, primaryLink);\n const checklist = readVisualChecklist(projectRoot);\n const counts = countChecklistByStatus(checklist);\n\n console.log(tf('build.visualSpecWritten', lang, { path: specResult.specPath }));\n console.log(tf('build.visualChecklistWritten', lang, { path: specResult.checklistPath }));\n if (tokens.length > 0) {\n console.log(tf('build.figmaTokensExtracted', lang, { count: String(tokens.length) }));\n } else if (figmaReady && primaryLink?.fileKey) {\n console.log(t('build.figmaTokensEmpty', lang));\n }\n console.log(tf('build.visualSkillPath', lang, { path: skillPath }));\n console.log(tf('build.checklistSummary', lang, {\n passed: String(counts.passed),\n pending: String(counts.pending),\n total: String(counts.total),\n }));\n console.log('');\n\n let figmaUpdate: FigmaMcpConfig | undefined;\n if (needsSupplement) {\n console.log(`## ${t('build.supplement', lang)}\\n`);\n console.log(t('build.supplementDetail', lang));\n console.log('');\n figmaUpdate = await promptDesignSupplement(projectRoot, lang);\n }\n\n console.log(`## ${t('build.nextStep', lang)}\\n`);\n console.log(t('build.nextStepDetail', lang));\n console.log('');\n console.log(t('build.agentMustReadSkill', lang));\n\n return figmaUpdate ? { figma: figmaUpdate } : {};\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { DesignToken } from '../types/visual.js';\n\nconst FIGMA_SERVER_ID = 'figma-developer-mcp';\n\ntype McpJson = {\n mcpServers?: Record<string, { env?: Record<string, string> }>;\n servers?: Record<string, { env?: Record<string, string> }>;\n};\n\ntype FigmaColor = { r: number; g: number; b: number; a?: number };\n\ntype FigmaPaint = {\n type?: string;\n color?: FigmaColor;\n};\n\ntype FigmaNode = {\n id?: string;\n name?: string;\n type?: string;\n characters?: string;\n style?: {\n fontFamily?: string;\n fontSize?: number;\n fontWeight?: number;\n lineHeightPx?: number;\n };\n fills?: FigmaPaint[];\n layoutMode?: string;\n paddingLeft?: number;\n paddingRight?: number;\n paddingTop?: number;\n paddingBottom?: number;\n itemSpacing?: number;\n children?: FigmaNode[];\n};\n\ntype FigmaNodesResponse = {\n nodes?: Record<\n string,\n {\n document?: FigmaNode;\n name?: string;\n }\n >;\n};\n\nfunction readFigmaApiKeyFromMcp(projectRoot: string): string | null {\n const mcpPath = path.join(projectRoot, '.cursor', 'mcp.json');\n if (!existsSync(mcpPath)) return null;\n\n try {\n const raw = JSON.parse(readFileSync(mcpPath, 'utf-8')) as McpJson;\n const servers = raw.mcpServers ?? raw.servers ?? {};\n const figma = servers[FIGMA_SERVER_ID];\n const key = figma?.env?.FIGMA_API_KEY;\n return key?.trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction rgbaToHex(color: FigmaColor): string {\n const toByte = (v: number) =>\n Math.round(Math.min(1, Math.max(0, v)) * 255)\n .toString(16)\n .padStart(2, '0');\n const alpha = color.a ?? 1;\n if (alpha < 1) {\n return `rgba(${Math.round(color.r * 255)}, ${Math.round(color.g * 255)}, ${Math.round(color.b * 255)}, ${alpha.toFixed(2)})`;\n }\n return `#${toByte(color.r)}${toByte(color.g)}${toByte(color.b)}`.toUpperCase();\n}\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 48);\n}\n\nfunction extractColorTokens(node: FigmaNode, tokens: DesignToken[], seen: Set<string>): void {\n if (!node.fills?.length) return;\n for (const fill of node.fills) {\n if (fill.type !== 'SOLID' || !fill.color) continue;\n const hex = rgbaToHex(fill.color);\n const base = slugify(node.name ?? 'color') || 'fill';\n const id = `color-${base}`;\n if (seen.has(id)) continue;\n seen.add(id);\n tokens.push({\n id,\n category: 'color',\n description: `Fill color: ${node.name ?? 'unnamed'}`,\n value: hex,\n cssVariable: `--color-${base}`,\n source: 'figma-api',\n });\n }\n}\n\nfunction extractTypographyTokens(node: FigmaNode, tokens: DesignToken[], seen: Set<string>): void {\n if (node.type !== 'TEXT' || !node.style) return;\n const { fontFamily, fontSize, fontWeight, lineHeightPx } = node.style;\n if (!fontSize) return;\n\n const base = slugify(node.name ?? 'text') || 'text';\n const id = `typography-${base}`;\n if (seen.has(id)) return;\n seen.add(id);\n\n const parts = [\n fontSize ? `${fontSize}px` : null,\n fontWeight ? `weight ${fontWeight}` : null,\n fontFamily ?? null,\n lineHeightPx ? `line-height ${lineHeightPx}px` : null,\n ].filter(Boolean);\n\n tokens.push({\n id,\n category: 'typography',\n description: `Text: ${node.name ?? node.characters?.slice(0, 24) ?? 'unnamed'}`,\n value: parts.join(' / '),\n cssVariable: `--text-${base}`,\n source: 'figma-api',\n });\n}\n\nfunction extractSpacingTokens(node: FigmaNode, tokens: DesignToken[], seen: Set<string>): void {\n if (!node.layoutMode || node.layoutMode === 'NONE') return;\n\n const base = slugify(node.name ?? 'frame') || 'frame';\n const paddings = [\n ['padding-top', node.paddingTop],\n ['padding-right', node.paddingRight],\n ['padding-bottom', node.paddingBottom],\n ['padding-left', node.paddingLeft],\n ] as const;\n\n for (const [prop, value] of paddings) {\n if (value === undefined || value === 0) continue;\n const id = `spacing-${base}-${prop}`;\n if (seen.has(id)) continue;\n seen.add(id);\n tokens.push({\n id,\n category: 'spacing',\n description: `${node.name ?? 'Frame'} ${prop}`,\n value: `${value}px`,\n cssVariable: `--${base}-${prop}`,\n source: 'figma-api',\n });\n }\n\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n const id = `spacing-${base}-gap`;\n if (!seen.has(id)) {\n seen.add(id);\n tokens.push({\n id,\n category: 'spacing',\n description: `${node.name ?? 'Frame'} item gap`,\n value: `${node.itemSpacing}px`,\n cssVariable: `--${base}-gap`,\n source: 'figma-api',\n });\n }\n }\n}\n\nfunction walkNode(node: FigmaNode, tokens: DesignToken[], seen: Set<string>): void {\n extractColorTokens(node, tokens, seen);\n extractTypographyTokens(node, tokens, seen);\n extractSpacingTokens(node, tokens, seen);\n for (const child of node.children ?? []) {\n walkNode(child, tokens, seen);\n }\n}\n\nexport async function fetchFigmaDesignTokens(\n projectRoot: string,\n fileKey: string,\n nodeId?: string,\n): Promise<DesignToken[]> {\n const apiKey = readFigmaApiKeyFromMcp(projectRoot);\n if (!apiKey) return [];\n\n const ids = nodeId ? encodeURIComponent(nodeId) : undefined;\n const url = ids\n ? `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${ids}`\n : `https://api.figma.com/v1/files/${fileKey}?depth=2`;\n\n const response = await fetch(url, {\n headers: { 'X-Figma-Token': apiKey },\n });\n\n if (!response.ok) return [];\n\n const data = (await response.json()) as FigmaNodesResponse & { document?: FigmaNode };\n const tokens: DesignToken[] = [];\n const seen = new Set<string>();\n\n if (data.nodes) {\n for (const entry of Object.values(data.nodes)) {\n if (entry.document) walkNode(entry.document, tokens, seen);\n }\n } else if (data.document) {\n walkNode(data.document, tokens, seen);\n }\n\n return tokens;\n}\n\nexport function isFigmaApiKeyAvailable(projectRoot: string): boolean {\n return readFigmaApiKeyFromMcp(projectRoot) !== null;\n}\n","import path from 'node:path';\nimport { readFileSync, existsSync } from 'node:fs';\nimport type { FtConfig } from '../types/index.js';\nimport { getVisualFidelitySkillPath } from '../adapters/visual-skills.js';\nimport { t, tf } from '../core/i18n.js';\nimport {\n extractVisualDesignSection,\n getVisualChecklistPath,\n getVisualSpecPath,\n readVisualChecklist,\n countChecklistByStatus,\n} from '../core/visual-spec.js';\n\nexport type VisualRegressionMode = 'tweak' | 'hotfix';\n\nexport async function runVisualRegressionPrep(\n config: FtConfig,\n mode: VisualRegressionMode,\n): Promise<void> {\n const projectRoot = process.cwd();\n const lang = config.language;\n const prefix = mode;\n\n console.log(`# ${t(`${prefix}.title`, lang)}\\n`);\n console.log(t(`${prefix}.regressionIntro`, lang));\n console.log('');\n\n const specPath = getVisualSpecPath(projectRoot);\n const checklistPath = getVisualChecklistPath(projectRoot);\n const skillPath = getVisualFidelitySkillPath(projectRoot);\n\n if (existsSync(specPath)) {\n console.log(tf('regression.specPath', lang, { path: specPath }));\n } else {\n console.log(t('regression.specMissing', lang));\n }\n\n if (existsSync(checklistPath)) {\n const checklist = readVisualChecklist(projectRoot);\n const counts = countChecklistByStatus(checklist);\n console.log(tf('regression.checklistSummary', lang, {\n passed: String(counts.passed),\n pending: String(counts.pending),\n failed: String(counts.failed),\n total: String(counts.total),\n }));\n\n const locked = checklist.items.filter((i) => i.status === 'passed');\n if (locked.length > 0) {\n console.log('');\n console.log(`### ${t('regression.lockedItems', lang)}\\n`);\n for (const item of locked) {\n console.log(`- \\`${item.id}\\`: ${item.description} (${item.designValue})`);\n }\n }\n } else {\n console.log(t('regression.checklistMissing', lang));\n }\n\n console.log('');\n console.log(tf('regression.skillPath', lang, { path: skillPath }));\n console.log('');\n\n console.log(`## ${t('regression.protocol', lang)}\\n`);\n console.log(t('regression.protocolDetail', lang));\n console.log('');\n\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (existsSync(agentsPath)) {\n const designSection = extractVisualDesignSection(readFileSync(agentsPath, 'utf-8'), lang);\n if (designSection) {\n console.log(`### ${t('regression.designContext', lang)}\\n`);\n console.log(designSection);\n console.log('');\n }\n }\n\n console.log(t(`${prefix}.agentMustReadSkill`, lang));\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runVisualRegressionPrep } from './visual-regression-prep.js';\n\nexport async function runTweakPrep(config: FtConfig): Promise<void> {\n await runVisualRegressionPrep(config, 'tweak');\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runVisualRegressionPrep } from './visual-regression-prep.js';\n\nexport async function runHotfixPrep(config: FtConfig): Promise<void> {\n await runVisualRegressionPrep(config, 'hotfix');\n}\n","import chalk from 'chalk';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { FtConfig } from '../types/index.js';\nimport { t, tf } from '../core/i18n.js';\nimport { getScriptsDir } from '../core/paths.js';\nimport {\n countChecklistByStatus,\n readVisualChecklist,\n getVisualChecklistPath,\n} from '../core/visual-spec.js';\nimport {\n ensureVisualVerifyConfig,\n formatVerifyConfigSummary,\n hasVisualDiffDependencies,\n readVisualVerifyConfig,\n runVisualDiff,\n} from '../core/visual-verify.js';\n\nexport interface VerifyPrepResult {\n visualDiffFailed: boolean;\n}\n\nexport async function runVerifyPrep(config: FtConfig): Promise<VerifyPrepResult> {\n const projectRoot = process.cwd();\n const lang = config.language;\n\n console.log(`# ${t('verify.title', lang)}\\n`);\n console.log(t('verify.intro', lang));\n console.log('');\n\n const checklistPath = getVisualChecklistPath(projectRoot);\n if (existsSync(checklistPath)) {\n const checklist = readVisualChecklist(projectRoot);\n const counts = countChecklistByStatus(checklist);\n console.log(`## ${t('verify.checklistGate', lang)}\\n`);\n console.log(tf('verify.checklistSummary', lang, {\n passed: String(counts.passed),\n pending: String(counts.pending),\n failed: String(counts.failed),\n total: String(counts.total),\n }));\n\n if (counts.failed > 0) {\n console.log(chalk.yellow(t('verify.checklistFailed', lang)));\n }\n if (counts.pending > 0) {\n console.log(chalk.yellow(t('verify.checklistPending', lang)));\n }\n console.log('');\n } else {\n console.log(chalk.yellow(t('verify.checklistMissing', lang)));\n console.log('');\n }\n\n const configPath = ensureVisualVerifyConfig(projectRoot);\n const verifyConfig = readVisualVerifyConfig(projectRoot);\n\n console.log(`## ${t('verify.visualDiff', lang)}\\n`);\n console.log(tf('verify.configPath', lang, { path: configPath }));\n\n if (!verifyConfig?.enabled) {\n console.log(t('verify.visualDiffDisabled', lang));\n console.log(t('verify.enableHint', lang));\n console.log(tf('verify.scriptPath', lang, { path: path.join(getScriptsDir(), 'visual-diff.mjs') }));\n console.log('');\n console.log(t('verify.nextStepDetail', lang));\n return { visualDiffFailed: false };\n }\n\n if (!hasVisualDiffDependencies(projectRoot)) {\n console.log(chalk.yellow(t('verify.depsMissing', lang)));\n console.log(t('verify.depsInstall', lang));\n console.log(tf('verify.scriptPath', lang, { path: path.join(getScriptsDir(), 'visual-diff.mjs') }));\n console.log('');\n console.log(t('verify.nextStepDetail', lang));\n return { visualDiffFailed: false };\n }\n\n console.log(t('verify.screensConfigured', lang));\n console.log(formatVerifyConfigSummary(verifyConfig, lang));\n console.log('');\n console.log(t('verify.runningDiff', lang));\n\n const { exitCode, report, stdout } = await runVisualDiff(projectRoot);\n if (stdout) {\n console.log(stdout.split('\\n').filter((line) => !line.startsWith('{')).join('\\n'));\n }\n\n if (report) {\n console.log('');\n if (report.passed) {\n console.log(chalk.green(t('verify.visualDiffPassed', lang)));\n } else {\n console.log(chalk.red(t('verify.visualDiffFailed', lang)));\n for (const result of report.results.filter((r) => !r.passed)) {\n console.log(chalk.red(` ✗ ${result.id}: ${result.error ?? `${result.diffPercent}% diff`}`));\n if (result.diff) {\n console.log(chalk.gray(` diff: ${result.diff}`));\n }\n }\n }\n }\n\n console.log('');\n console.log(t('verify.nextStepDetail', lang));\n console.log(t('verify.agentInstruction', lang));\n\n return { visualDiffFailed: exitCode !== 0 && verifyConfig.enabled };\n}\n","import { execa, type ExecaError } from 'execa';\nimport type { FtConfig } from '../types/index.js';\nimport { shouldBypassRtk, compressOutputIfNeeded } from './rtk.js';\nimport { isStdoutTTY } from './detector.js';\n\nexport interface RunWithRtkOptions {\n cwd?: string;\n rtkDisabled?: boolean;\n inheritStdio?: boolean;\n}\n\nexport async function runWithRtk(\n command: string,\n args: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const bypass = shouldBypassRtk(args, config);\n const ttyPassthrough = options.inheritStdio ?? false;\n const rtkOff = options.rtkDisabled || bypass || ttyPassthrough;\n\n if (ttyPassthrough) {\n const subprocess = execa(command, args, {\n cwd: options.cwd,\n stdio: 'inherit',\n reject: false,\n });\n const result = await subprocess;\n return {\n stdout: '',\n stderr: '',\n exitCode: result.exitCode ?? (result.failed ? 1 : 0),\n };\n }\n\n const result = await execa(command, args, {\n cwd: options.cwd,\n reject: false,\n all: true,\n });\n\n const combined = result.all ?? `${result.stdout}\\n${result.stderr}`;\n const processed = compressOutputIfNeeded(combined, config, rtkOff);\n\n if (processed !== combined) {\n process.stdout.write(processed);\n if (!processed.endsWith('\\n')) process.stdout.write('\\n');\n } else {\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n }\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 1,\n };\n}\n\nexport async function runCometPassthrough(\n subcommand: string,\n extraArgs: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<number> {\n const args = [subcommand, ...extraArgs];\n const isTTY = isStdoutTTY() && isStdinTTY();\n\n if (isTTY) {\n const result = await runWithRtk('comet', args, config, {\n ...options,\n inheritStdio: true,\n rtkDisabled: true,\n });\n return result.exitCode;\n }\n\n const withNonInteractive = ['--non-interactive', ...args];\n try {\n const result = await runWithRtk('comet', withNonInteractive, config, options);\n if (result.exitCode === 0) return 0;\n\n const retry = await runWithRtk('comet', args, config, options);\n if (retry.exitCode !== 0) {\n throw new Error('NON_INTERACTIVE_FAILED');\n }\n return 0;\n } catch (err) {\n if ((err as ExecaError).message?.includes('ENOENT')) {\n throw new Error('COMET_NOT_FOUND');\n }\n throw err;\n }\n}\n\nfunction isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n","import type { FtConfig } from '../types/index.js';\n\nconst HEAD_LINES = 200;\nconst TAIL_LINES = 100;\n\nexport function shouldBypassRtk(\n commandArgs: string[],\n config: FtConfig,\n): boolean {\n const joined = commandArgs.join(' ');\n return config.rtk.exclude_patterns.some((pattern) => joined.includes(pattern));\n}\n\nexport function truncateMiddle(\n text: string,\n headLines = HEAD_LINES,\n tailLines = TAIL_LINES,\n): string {\n const lines = text.split('\\n');\n const total = lines.length;\n const threshold = headLines + tailLines;\n\n if (total <= threshold) {\n return text;\n }\n\n const omitted = total - headLines - tailLines;\n const head = lines.slice(0, headLines);\n const tail = lines.slice(-tailLines);\n const marker = `...... (已省略 ${omitted} 行) ......`;\n\n return [...head, marker, ...tail].join('\\n');\n}\n\nexport function compressOutputIfNeeded(\n text: string,\n config: FtConfig,\n rtkDisabled: boolean,\n): string {\n if (rtkDisabled) return text;\n\n const lines = text.split('\\n');\n const shouldCompress =\n config.rtk.enabled || lines.length > config.rtk.auto_trigger_lines;\n\n if (!shouldCompress) return text;\n\n return truncateMiddle(text);\n}\n","import { runCometPassthrough } from '../core/rtk-bridge.js';\nimport type { FtConfig } from '../types/index.js';\nimport type { CometSubcommand } from '../types/index.js';\nimport chalk from 'chalk';\nimport { t } from '../core/i18n.js';\n\nconst COMET_MAP: Record<string, CometSubcommand> = {\n open: 'open',\n design: 'design',\n build: 'build',\n verify: 'verify',\n archive: 'archive',\n hotfix: 'hotfix',\n tweak: 'tweak',\n};\n\nexport async function runCometSlash(\n subcommand: string,\n args: string[],\n config: FtConfig,\n): Promise<number> {\n const mapped = COMET_MAP[subcommand];\n if (!mapped) return 1;\n\n try {\n return await runCometPassthrough(mapped, args, config);\n } catch (err) {\n const message = (err as Error).message;\n if (message === 'NON_INTERACTIVE_FAILED') {\n console.error(chalk.red(t('error.cometNonInteractive', config.language)));\n console.error(chalk.yellow(t('error.cometUseTerminal', config.language)));\n return 1;\n }\n console.error(chalk.red(String(err)));\n return 1;\n }\n}\n","import chalk from 'chalk';\nimport { injectCursorSlashCommands } from '../adapters/cursor-commands.js';\nimport { injectVisualFidelitySkill } from '../adapters/visual-skills.js';\nimport { loadConfig } from '../core/config.js';\nimport { t, tf } from '../core/i18n.js';\n\nexport async function runSyncCursorCommands(): Promise<void> {\n const config = await loadConfig();\n const count = injectCursorSlashCommands();\n console.log(\n chalk.green(tf('cursor.commandsSynced', config.language, { count: String(count) })),\n );\n\n const skillCount = injectVisualFidelitySkill();\n console.log(\n chalk.green(tf('cursor.skillsSynced', config.language, { count: String(skillCount) })),\n );\n\n console.log(chalk.cyan(t('cursor.commandsHint', config.language)));\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport type { FtConfig } from '../types/index.js';\nimport { detectPackageManager } from '../core/detector.js';\nimport { t, tf } from '../core/i18n.js';\nimport {\n buildInstallDevDepsCommand,\n buildPlaywrightInstallCommand,\n getMissingVisualDiffDeps,\n type PackageManagerId,\n} from '../core/visual-tools.js';\nimport { hasVisualDiffDependencies } from '../core/visual-verify.js';\n\nexport async function runVisualToolsInstall(config: FtConfig): Promise<number> {\n const projectRoot = process.cwd();\n const lang = config.language;\n\n console.log(`# ${t('visualTools.title', lang)}\\n`);\n console.log(t('visualTools.intro', lang));\n console.log('');\n\n const packageJsonPath = path.join(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n console.error(chalk.red(t('visualTools.noPackageJson', lang)));\n return 1;\n }\n\n const pm = detectPackageManager(projectRoot) as PackageManagerId;\n console.log(tf('visualTools.packageManager', lang, { pm }));\n console.log('');\n\n const missing = getMissingVisualDiffDeps(projectRoot);\n if (missing.length === 0) {\n console.log(chalk.green(t('visualTools.depsAlreadyInstalled', lang)));\n } else {\n const install = buildInstallDevDepsCommand(pm);\n console.log(tf('visualTools.installingDeps', lang, { packages: missing.join(', ') }));\n console.log(chalk.gray(`$ ${[install.command, ...install.args].join(' ')}`));\n console.log('');\n\n const depsResult = await execa(install.command, install.args, {\n cwd: projectRoot,\n stdio: 'inherit',\n reject: false,\n });\n if (depsResult.exitCode !== 0) {\n console.error(chalk.red(t('visualTools.depsInstallFailed', lang)));\n return depsResult.exitCode ?? 1;\n }\n console.log(chalk.green(t('visualTools.depsInstalled', lang)));\n console.log('');\n }\n\n const browserInstall = buildPlaywrightInstallCommand(pm);\n console.log(t('visualTools.installingBrowsers', lang));\n console.log(chalk.gray(`$ ${[browserInstall.command, ...browserInstall.args].join(' ')}`));\n console.log('');\n\n const browserResult = await execa(browserInstall.command, browserInstall.args, {\n cwd: projectRoot,\n stdio: 'inherit',\n reject: false,\n });\n if (browserResult.exitCode !== 0) {\n console.error(chalk.red(t('visualTools.browsersInstallFailed', lang)));\n return browserResult.exitCode ?? 1;\n }\n\n if (!hasVisualDiffDependencies(projectRoot)) {\n console.error(chalk.red(t('visualTools.verifyFailed', lang)));\n return 1;\n }\n\n console.log(chalk.green.bold(t('visualTools.success', lang)));\n console.log('');\n console.log(t('visualTools.nextStep', lang));\n\n return 0;\n}\n","import { resolveProjectDependency } from './visual-verify.js';\n\nexport const VISUAL_DIFF_PACKAGES = ['playwright', 'pixelmatch', 'pngjs'] as const;\n\nexport type PackageManagerId = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport function getMissingVisualDiffDeps(projectRoot: string): string[] {\n return VISUAL_DIFF_PACKAGES.filter((pkg) => !resolveProjectDependency(projectRoot, pkg));\n}\n\nexport function buildInstallDevDepsCommand(\n packageManager: PackageManagerId,\n): { command: string; args: string[] } {\n const packages = [...VISUAL_DIFF_PACKAGES];\n switch (packageManager) {\n case 'pnpm':\n return { command: 'pnpm', args: ['add', '-D', ...packages] };\n case 'yarn':\n return { command: 'yarn', args: ['add', '-D', ...packages] };\n case 'bun':\n return { command: 'bun', args: ['add', '-d', ...packages] };\n default:\n return { command: 'npm', args: ['install', '-D', ...packages] };\n }\n}\n\nexport function buildPlaywrightInstallCommand(\n packageManager: PackageManagerId,\n): { command: string; args: string[] } {\n switch (packageManager) {\n case 'pnpm':\n return { command: 'pnpm', args: ['exec', 'playwright', 'install', 'chromium'] };\n case 'yarn':\n return { command: 'yarn', args: ['exec', 'playwright', 'install', 'chromium'] };\n case 'bun':\n return { command: 'bunx', args: ['playwright', 'install', 'chromium'] };\n default:\n return { command: 'npx', args: ['playwright', 'install', 'chromium'] };\n }\n}\n"],"mappings":"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","names":["chalk","inquirer","execa","readFileSync","existsSync","path","existsSync","path","readFileSync","readFileSync","existsSync","path","readFileSync","writeFileSync","existsSync","path","path","readFileSync","existsSync","writeFileSync","readFileSync","existsSync","path","path","existsSync","readFileSync","path","mkdirSync","existsSync","path","existsSync","mkdirSync","copyFileSync","existsSync","mkdirSync","path","path","existsSync","mkdirSync","copyFileSync","copyFileSync","existsSync","mkdirSync","readdirSync","path","mkdirSync","readdirSync","path","copyFileSync","existsSync","existsSync","mkdirSync","readFileSync","writeFileSync","path","path","readFileSync","existsSync","mkdirSync","writeFileSync","t","existsSync","mkdirSync","readFileSync","writeFileSync","path","execa","path","existsSync","readFileSync","mkdirSync","writeFileSync","execa","existsSync","mkdirSync","readFileSync","writeFileSync","path","path","existsSync","readFileSync","mkdirSync","writeFileSync","inquirer","chalk","execa","execa","readFileSync","path","chalk","readFileSync","existsSync","path","path","existsSync","readFileSync","readFileSync","existsSync","path","chalk","inquirer","readFileSync","existsSync","path","FIGMA_SERVER_ID","path","existsSync","readFileSync","inquirer","chalk","path","readFileSync","existsSync","existsSync","path","readFileSync","chalk","existsSync","path","existsSync","chalk","path","execa","execa","result","isStdinTTY","chalk","chalk","chalk","chalk","existsSync","path","chalk","execa","path","existsSync","chalk","execa","chalk"]}
|