@nick848/fet 1.1.8 → 1.1.10
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 +120 -13
- package/README_en.md +116 -13
- package/dist/cli/index.js +961 -165
- package/dist/cli/index.js.map +1 -1
- package/package.json +9 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/doctor.ts","../../src/context-placeholders.ts","../../src/fs/atomic-write.ts","../../src/fs/backup.ts","../../src/fs/lock.ts","../../src/fs/journal.ts","../../src/gitnexus.ts","../../src/commands/fill-context.ts","../../src/agents-miniprogram.ts","../../src/scanner/miniprogram.ts","../../src/scanner/package.ts","../../src/templates/miniprogram-agents.ts","../../src/commands/graph.ts","../../src/graph-context.ts","../../src/commands/init.ts","../../src/commands/update-context.ts","../../src/config/yaml.ts","../../src/version.ts","../../src/templates/markers.ts","../../src/templates/agents-md.ts","../../src/templates/config-yaml.ts","../../src/templates/karpathy-skills.ts","../../src/templates/verify-instructions.ts","../../src/templates/figma-guard.ts","../../src/templates/ui-display-contract.ts","../../src/templates/spec-language.ts","../../src/commands/proxy.ts","../../src/figma-guard.ts","../../src/ui-display-contract.ts","../../src/state/project.ts","../../src/state/store.ts","../../src/language.ts","../../src/state/schema.ts","../../src/state/tasks.ts","../../src/update/npm.ts","../../src/commands/update.ts","../../src/commands/verify.ts","../../src/model-policy.ts","../../src/cli/context.ts","../../src/adapters/codex/index.ts","../../src/adapters/commands.ts","../../src/adapters/codex/templates.ts","../../src/adapters/cursor/index.ts","../../src/adapters/cursor/templates.ts","../../src/openspec/adapter.ts","../../src/openspec/inspector.ts","../../src/openspec/resolver.ts","../../src/openspec/runner.ts","../../src/scanner/routes.ts","../../src/scanner/index.ts","../../src/cli/output.ts","../../src/cli/update-check.ts","../../src/update/check.ts"],"sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { fillContextCommand } from \"../commands/fill-context.js\";\nimport { graphCommand, type GraphAction } from \"../commands/graph.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { proxyCommand, passthroughCommand } from \"../commands/proxy.js\";\nimport { updateCommand } from \"../commands/update.js\";\nimport { updateContextCommand } from \"../commands/update-context.js\";\nimport { verifyCommand } from \"../commands/verify.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError, toFetError } from \"../errors/fet-error.js\";\nimport { formatModelPolicyMismatch, getCommandModelPolicyMismatch, getModelPolicyMode } from \"../model-policy.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { createCommandContext, type GlobalOptions } from \"./context.js\";\nimport { OutputWriter } from \"./output.js\";\nimport { handleFetUpdateCheck } from \"./update-check.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"fet\")\n .description(\"围绕 OpenSpec 的前端开发工作流编排工具。\")\n .enablePositionalOptions()\n .version(FET_VERSION)\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n\naddGlobalOptions(program.command(\"init\")).description(\"初始化 FET + OpenSpec\").action(wrap(\"init\", initCommand));\naddGlobalOptions(program.command(\"update\")).description(\"检查 FET 是否为最新版,并在需要时自动升级\").action(wrap(\"update\", updateCommand));\naddGlobalOptions(program.command(\"update-context\")).description(\"更新项目上下文\").action(wrap(\"update-context\", updateContextCommand));\naddGlobalOptions(program.command(\"fill-context\")).description(\"刷新 IDE 填充 AGENTS.md 占位符的提示文件\").action(wrap(\"fill-context\", fillContextCommand));\n\nconst graph = addGlobalOptions(program.command(\"graph\").description(\"管理可选的 GitNexus 代码图支持\"));\nfor (const action of [\"status\", \"setup\", \"doctor\", \"handoff\"] as const) {\n addGlobalOptions(graph.command(action).description(`运行 fet graph ${action}`)).action(wrap(\"graph\", (ctx) => graphCommand(ctx, action)));\n}\nfor (const action of [\"init\", \"refresh\"] as const) {\n addGlobalOptions(\n graph\n .command(`${action} [args...]`)\n .description(`通过 GitNexus analyze 执行 graph ${action}`)\n .allowUnknownOption(true)\n .passThroughOptions()\n ).action(wrap(\"graph\", (ctx, args: string[] = []) => graphCommand(ctx, action as GraphAction, args)));\n}\n\naddGlobalOptions(program.command(\"doctor\").description(\"诊断状态、配置与一致性\").option(\"--fix-lock\", \"清理 FET 锁文件\")).action(\n wrap(\"doctor\", (ctx, options: { fixLock?: boolean }) => doctorCommand(ctx, { fixLock: Boolean(options.fixLock) }))\n);\n\naddGlobalOptions(program.command(\"verify\").description(\"最终质量验证\").option(\"--done\", \"声明手动验证已完成\").option(\"--auto\", \"生成或执行自动验证计划\")).action(\n wrap(\"verify\", verifyCommand)\n);\n\nfor (const command of [\"explore\", \"propose\", \"new\", \"continue\", \"ff\", \"apply\", \"sync\", \"archive\", \"bulk-archive\", \"onboard\"]) {\n addGlobalOptions(program.command(`${command} [args...]`).description(`代理执行 openspec ${command}`).allowUnknownOption(true).passThroughOptions()).action(\n wrap(command, (ctx, args: string[] = []) => proxyCommand(ctx, command, args))\n );\n}\n\naddGlobalOptions(program.command(\"passthrough <command> [args...]\").description(\"透传暂未接管的 OpenSpec 命令\").allowUnknownOption(true).passThroughOptions()).action(\n wrap(\"passthrough\", (ctx, command: string, args: string[] = []) => passthroughCommand(ctx, command, args))\n);\n\nprogram.parseAsync(process.argv).catch((error) => {\n const json = process.argv.includes(\"--json\");\n const output = new OutputWriter(json);\n const fetError = toFetError(error);\n output.error(fetError);\n process.exitCode = fetError.exitCode;\n});\n\nfunction wrap<T extends unknown[]>(\n command: string,\n handler: (ctx: Awaited<ReturnType<typeof createCommandContext>>, ...args: T) => Promise<void>\n) {\n return async (...args: T) => {\n const maybeCommand = args[args.length - 1] as unknown;\n const opts = isCommandLike(maybeCommand)\n ? ({ ...(maybeCommand.parent?.opts() as GlobalOptions), ...(maybeCommand.opts() as GlobalOptions) } as GlobalOptions)\n : (program.opts() as GlobalOptions);\n const ctx = await createCommandContext(command, { ...opts, ...extractGlobalOptions(args) });\n try {\n await handleFetUpdateCheck(ctx);\n await handleModelPolicyRecommendation(ctx);\n await warnIfContextPlaceholdersRemain(ctx);\n await handler(ctx, ...args);\n } catch (error) {\n const fetError = toFetError(error);\n ctx.output.error(fetError);\n process.exitCode = fetError.exitCode;\n }\n };\n}\n\nasync function handleModelPolicyRecommendation(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n const mismatch = getCommandModelPolicyMismatch(ctx.command);\n if (!mismatch) {\n return;\n }\n\n const warning = formatModelPolicyMismatch(mismatch, ctx.language);\n const policyMode = getModelPolicyMode();\n ctx.output.warn(`${warning} ${renderModelPolicyActionHint(policyMode, ctx.language)}`);\n\n if (policyMode !== \"confirm\" || ctx.yes || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question = ctx.language === \"en\" ? \"Continue anyway? [y/N] \" : \"仍然继续?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled so you can switch IDE model.\" : \"命令已取消,你可以先切换 IDE 模型。\",\n details: { command: ctx.command, detected: mismatch.detected, recommended: mismatch.recommended },\n suggestedCommand: ctx.language === \"en\" ? `Switch IDE model, then rerun fet ${ctx.command}.` : `切换 IDE 模型后重新运行 fet ${ctx.command}。`\n });\n }\n } finally {\n rl.close();\n }\n}\n\nfunction renderModelPolicyActionHint(policyMode: ReturnType<typeof getModelPolicyMode>, language: Awaited<ReturnType<typeof createCommandContext>>[\"language\"]): string {\n if (policyMode === \"confirm\") {\n return language === \"en\"\n ? \"Choose whether to continue this command or stop and switch models.\"\n : \"请选择继续执行本命令,或停止后手动切换模型。\";\n }\n return language === \"en\"\n ? \"This is advisory because FET_MODEL_POLICY=warn; the command will continue.\"\n : \"当前设置 FET_MODEL_POLICY=warn,该提醒仅作为建议,命令会继续执行。\";\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"update\", \"update-context\", \"fill-context\", \"doctor\"].includes(ctx.command)) {\n return;\n }\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (count > 0) {\n ctx.output.warn(renderAgentsPlaceholderWarning(count, ctx.language));\n }\n}\n\nfunction isCommandLike(value: unknown): value is Command {\n return value instanceof Command;\n}\n\nfunction addGlobalOptions(command: Command): Command {\n return command\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n}\n\nfunction extractGlobalOptions(args: unknown[]): GlobalOptions {\n const values = args.flatMap((arg) => (Array.isArray(arg) ? arg : []));\n const options: GlobalOptions = {};\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (typeof value !== \"string\") {\n continue;\n }\n if (value === \"--cwd\" && typeof values[index + 1] === \"string\") {\n options.cwd = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--cwd=\")) {\n options.cwd = value.slice(\"--cwd=\".length);\n } else if (value === \"--change\" && typeof values[index + 1] === \"string\") {\n options.change = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--change=\")) {\n options.change = value.slice(\"--change=\".length);\n } else if (value === \"--lang\" && typeof values[index + 1] === \"string\") {\n options.lang = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--lang=\")) {\n options.lang = value.slice(\"--lang=\".length);\n } else if (value === \"--yes\") {\n options.yes = true;\n } else if (value === \"--json\") {\n options.json = true;\n } else if (value === \"--verbose\") {\n options.verbose = true;\n }\n }\n return options;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { clearLock } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, toGitNexusState } from \"../gitnexus.js\";\nimport type { DoctorCheck } from \"../adapters/index.js\";\n\nexport async function doctorCommand(ctx: FetCommandContext, options: { fixLock?: boolean } = {}): Promise<void> {\n const checks: DoctorCheck[] = [];\n\n checks.push(await checkOpenSpec(ctx));\n checks.push(await checkState(ctx));\n checks.push(await checkFile(\"agents\", join(ctx.projectRoot, \"AGENTS.md\"), \"AGENTS.md 缺失\", \"fet update-context\"));\n checks.push(await checkFile(\"config\", join(ctx.projectRoot, \"openspec\", \"config.yaml\"), \"openspec/config.yaml 缺失\", \"fet init\"));\n\n checks.push(await checkPlaceholders(ctx));\n checks.push(await checkGitNexus(ctx));\n\n for (const adapter of ctx.toolAdapters) {\n checks.push(...(await adapter.doctor(ctx.projectRoot)));\n }\n\n const lockPath = join(ctx.projectRoot, \"openspec\", \".fet.lock\");\n if (await exists(lockPath)) {\n if (options.fixLock) {\n await clearLock(ctx.projectRoot);\n checks.push({ id: \"lock\", status: \"pass\", message: \"已清理 openspec/.fet.lock\" });\n } else {\n checks.push({ id: \"lock\", status: \"warn\", message: \"存在 openspec/.fet.lock\", suggestedCommand: \"fet doctor --fix-lock\" });\n }\n }\n\n const warnings = checks.filter((check) => check.status !== \"pass\").map((check) => check.message);\n ctx.output.result({\n ok: true,\n command: \"doctor\",\n summary: warnings.length ? `诊断完成,发现 ${warnings.length} 个需要关注的问题。` : \"诊断完成,未发现明显问题。\",\n warnings,\n data: checks\n });\n}\n\nasync function checkGitNexus(ctx: FetCommandContext): Promise<DoctorCheck> {\n const global = await ctx.stateStore.readGlobal();\n const state = mergeGitNexusGraphInfo(\n toGitNexusState(await detectGitNexus(), global?.graph?.gitnexus),\n await inspectGitNexusGraph(ctx.projectRoot)\n );\n if (global) {\n global.graph ??= {};\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return state.installed\n ? {\n id: \"gitnexus\",\n status: \"pass\",\n message:\n ctx.language === \"en\"\n ? `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n : `检测到 GitNexus:${state.executablePath ?? \"gitnexus\"}(${state.version ?? \"unknown\"}),代码图${state.graphExists ? \"已找到\" : \"未找到\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"Optional GitNexus code graph support is not installed\" : \"尚未安装可选的 GitNexus 代码图支持\",\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\n : \"如果希望 OpenSpec 产物优先参考仓库代码图,可以稍后安装 GitNexus\"\n };\n}\n\nasync function checkOpenSpec(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const identity = await ctx.openSpec.resolveExecutable();\n return { id: \"openspec\", status: \"pass\", message: `OpenSpec: ${identity.executablePath} (${identity.version})` };\n } catch (error) {\n return { id: \"openspec\", status: \"fail\", message: error instanceof Error ? error.message : \"OpenSpec 检测失败\" };\n }\n}\n\nasync function checkState(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const state = await ctx.stateStore.readGlobal();\n return state\n ? { id: \"state\", status: \"pass\", message: \"FET 全局状态可读取\" }\n : { id: \"state\", status: \"warn\", message: \"FET 全局状态尚未初始化\", suggestedCommand: \"fet init\" };\n } catch (error) {\n return { id: \"state\", status: \"fail\", message: error instanceof Error ? error.message : \"FET 状态读取失败\" };\n }\n}\n\nasync function checkFile(id: string, path: string, missing: string, suggestedCommand: string): Promise<DoctorCheck> {\n return (await exists(path))\n ? { id, status: \"pass\", message: `${id} 存在` }\n : { id, status: \"warn\", message: missing, suggestedCommand };\n}\n\nasync function checkPlaceholders(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n await readFile(join(ctx.projectRoot, \"AGENTS.md\"), \"utf8\");\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? `AGENTS.md has ${count} LLM placeholder(s)` : `AGENTS.md 仍有 ${count} 个 LLM 占位符`,\n suggestedCommand: \"fet fill-context\"\n }\n : {\n id: \"context-placeholders\",\n status: \"pass\",\n message: ctx.language === \"en\" ? \"AGENTS.md placeholders resolved\" : \"AGENTS.md 占位符已处理\"\n };\n } catch {\n return {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"AGENTS.md missing\" : \"AGENTS.md 缺失\",\n suggestedCommand: \"fet update-context\"\n };\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\n\nexport const AGENTS_LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/g;\n\nexport async function countAgentsLlmPlaceholders(projectRoot: string): Promise<number> {\n try {\n const content = await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n return [...content.matchAll(AGENTS_LLM_PLACEHOLDER_PATTERN)].length;\n } catch {\n return 0;\n }\n}\n\nexport function renderAgentsPlaceholderWarning(count: number, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return `AGENTS.md still contains ${count} LLM placeholder(s). Run fet fill-context first so your IDE AI can replace them. Continuing current command.`;\n }\n return `AGENTS.md 仍有 ${count} 个 LLM 占位符。建议先运行 fet fill-context,让 IDE AI 补齐项目上下文;当前命令会继续执行。`;\n}\n","import { dirname } from \"node:path\";\nimport { open, rename, mkdir } from \"node:fs/promises\";\n\nexport interface AtomicWriteResult {\n path: string;\n tempPath: string;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array\n): Promise<AtomicWriteResult> {\n await mkdir(dirname(targetPath), { recursive: true });\n const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;\n const handle = await open(tempPath, \"wx\");\n\n try {\n await handle.writeFile(content);\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await rename(tempPath, targetPath);\n return { path: targetPath, tempPath };\n}\n","import { copyFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport async function createBackup(filePath: string): Promise<string | null> {\n try {\n await stat(filePath);\n } catch {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\..+$/, \"\")\n .replace(\"T\", \"-\");\n const backupPath = join(dirname(filePath), `${basename(filePath)}.fet-backup-${timestamp}`);\n await copyFile(filePath, backupPath);\n return backupPath;\n}\n","import { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { mkdir, open, readFile, rm } from \"node:fs/promises\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface LockMetadata {\n command: string;\n cwd: string;\n fetVersion: string;\n}\n\ninterface LockFile {\n pid: number;\n hostname: string;\n cwd: string;\n command: string;\n startedAt: string;\n fetVersion: string;\n}\n\nexport async function withProjectLock<T>(\n projectRoot: string,\n metadata: LockMetadata,\n fn: () => Promise<T>\n): Promise<T> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n const lock: LockFile = {\n pid: process.pid,\n hostname: hostname(),\n cwd: metadata.cwd,\n command: metadata.command,\n startedAt: new Date().toISOString(),\n fetVersion: metadata.fetVersion\n };\n\n let handle;\n try {\n await mkdir(dirname(lockPath), { recursive: true });\n handle = await open(lockPath, \"wx\");\n await handle.writeFile(JSON.stringify(lock, null, 2));\n } catch {\n throw new FetError({\n code: ErrorCode.LockHeld,\n message: \"另一个 FET 写命令正在运行\",\n details: await readExistingLock(lockPath),\n suggestedCommand: \"fet doctor --fix-lock\"\n });\n } finally {\n await handle?.close();\n }\n\n try {\n return await fn();\n } finally {\n await rm(lockPath, { force: true });\n }\n}\n\nasync function readExistingLock(lockPath: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(lockPath, \"utf8\"));\n } catch {\n return { path: lockPath };\n }\n}\n\nexport async function clearLock(projectRoot: string): Promise<boolean> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n try {\n await rm(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { atomicWrite } from \"./atomic-write.js\";\n\nexport interface JournalStep {\n operation: \"write\" | \"backup\" | \"mkdir\" | \"skip\";\n path: string;\n backupPath?: string | null;\n status: \"done\" | \"failed\" | \"skipped\";\n message?: string;\n}\n\nexport interface InitJournal {\n schemaVersion: 1;\n startedAt: string;\n completedAt: string | null;\n fetVersion: string;\n steps: JournalStep[];\n}\n\nexport function createInitJournal(fetVersion: string): InitJournal {\n return {\n schemaVersion: 1,\n startedAt: new Date().toISOString(),\n completedAt: null,\n fetVersion,\n steps: []\n };\n}\n\nexport async function writeInitJournal(projectRoot: string, journal: InitJournal): Promise<void> {\n await atomicWrite(\n join(projectRoot, \"openspec\", \".fet-init-journal.json\"),\n `${JSON.stringify(journal, null, 2)}\\n`\n );\n}\n\nexport async function readInitJournal(projectRoot: string): Promise<InitJournal | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"openspec\", \".fet-init-journal.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { FetLanguage } from \"./language.js\";\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_GRAPH_PATH = \".gitnexus\";\n\nexport interface GitNexusDetection {\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n error?: string;\n}\n\nexport interface GitNexusState {\n provider: \"gitnexus\";\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n recommendationShownAt: string | null;\n graphPath?: string | null;\n graphExists?: boolean;\n lastIndexedAt?: string | null;\n lastRefreshAt?: string | null;\n lastStatus?: string | null;\n setupHandoffPath?: string | null;\n setupHandoffUpdatedAt?: string | null;\n handoffPath?: string | null;\n handoffUpdatedAt?: string | null;\n projectContextPath?: string | null;\n projectContextUpdatedAt?: string | null;\n workflowContextPath?: string | null;\n workflowContextUpdatedAt?: string | null;\n lastWorkflowGraphQuery?: string | null;\n}\n\nexport interface GitNexusGraphInfo {\n graphPath: string;\n graphExists: boolean;\n lastIndexedAt: string | null;\n}\n\nexport interface GitNexusRunResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n command: string[];\n}\n\nexport async function detectGitNexus(env: NodeJS.ProcessEnv = process.env): Promise<GitNexusDetection> {\n const checkedAt = new Date().toISOString();\n const command = resolveGitNexusCommand(env);\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, \"--version\"], { shell: process.platform === \"win32\" });\n return {\n installed: true,\n executablePath: command.label,\n version: (stdout.trim() || stderr.trim() || \"unknown\").split(/\\r?\\n/)[0] ?? \"unknown\",\n checkedAt\n };\n } catch (error) {\n return {\n installed: false,\n executablePath: command.label,\n version: null,\n checkedAt,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function toGitNexusState(detection: GitNexusDetection, previous?: GitNexusState | null): GitNexusState {\n return {\n provider: \"gitnexus\",\n installed: detection.installed,\n executablePath: detection.installed ? detection.executablePath : null,\n version: detection.version,\n checkedAt: detection.checkedAt,\n recommendationShownAt: previous?.recommendationShownAt ?? null,\n graphPath: previous?.graphPath ?? null,\n graphExists: previous?.graphExists ?? false,\n lastIndexedAt: previous?.lastIndexedAt ?? null,\n lastRefreshAt: previous?.lastRefreshAt ?? null,\n lastStatus: previous?.lastStatus ?? null,\n setupHandoffPath: previous?.setupHandoffPath ?? null,\n setupHandoffUpdatedAt: previous?.setupHandoffUpdatedAt ?? null,\n handoffPath: previous?.handoffPath ?? null,\n handoffUpdatedAt: previous?.handoffUpdatedAt ?? null,\n projectContextPath: previous?.projectContextPath ?? null,\n projectContextUpdatedAt: previous?.projectContextUpdatedAt ?? null,\n workflowContextPath: previous?.workflowContextPath ?? null,\n workflowContextUpdatedAt: previous?.workflowContextUpdatedAt ?? null,\n lastWorkflowGraphQuery: previous?.lastWorkflowGraphQuery ?? null\n };\n}\n\nexport async function inspectGitNexusGraph(projectRoot: string, env: NodeJS.ProcessEnv = process.env): Promise<GitNexusGraphInfo> {\n const relative = env.FET_GITNEXUS_GRAPH_PATH?.trim() || DEFAULT_GRAPH_PATH;\n const graphPath = join(projectRoot, relative);\n try {\n const info = await stat(graphPath);\n return {\n graphPath: relative,\n graphExists: true,\n lastIndexedAt: info.mtime.toISOString()\n };\n } catch {\n return {\n graphPath: relative,\n graphExists: false,\n lastIndexedAt: null\n };\n }\n}\n\nexport async function runGitNexus(args: string[], options: { cwd: string; env?: NodeJS.ProcessEnv }): Promise<GitNexusRunResult> {\n const command = resolveGitNexusCommand(options.env ?? process.env);\n const fullCommand = [command.file, ...command.args, ...args];\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, ...args], {\n cwd: options.cwd,\n shell: process.platform === \"win32\"\n });\n return {\n exitCode: 0,\n stdout,\n stderr,\n command: fullCommand\n };\n } catch (error) {\n const maybe = error as { code?: number | string; stdout?: string; stderr?: string };\n return {\n exitCode: typeof maybe.code === \"number\" ? maybe.code : 1,\n stdout: maybe.stdout ?? \"\",\n stderr: maybe.stderr ?? (error instanceof Error ? error.message : String(error)),\n command: fullCommand\n };\n }\n}\n\nexport function mergeGitNexusGraphInfo(state: GitNexusState, graph: GitNexusGraphInfo): GitNexusState {\n return {\n ...state,\n graphPath: graph.graphPath,\n graphExists: graph.graphExists,\n lastIndexedAt: graph.lastIndexedAt\n };\n}\n\nexport function renderGitNexusRecommendation(state: GitNexusState, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (state.installed) {\n return `Optional GitNexus detected (${state.version ?? \"unknown\"}). You can generate a code graph after init; future OpenSpec artifacts should prefer the graph when it is available.`;\n }\n return \"Optional GitNexus code graph support is not installed. Consider installing GitNexus later to speed up OpenSpec artifact generation and improve code insertion context.\";\n }\n if (state.installed) {\n return `检测到可选 GitNexus(${state.version ?? \"unknown\"})。初始化后可以生成代码图;后续 OpenSpec 产物在图可用时应优先参考它。`;\n }\n\n return \"未安装可选的 GitNexus 代码图支持。可以稍后安装 GitNexus,以加速 OpenSpec 产物生成并改善代码插入上下文。\";\n}\n\nfunction resolveGitNexusCommand(env: NodeJS.ProcessEnv): { file: string; args: string[]; label: string } {\n const raw = env.FET_GITNEXUS_COMMAND?.trim() || env.FET_GITNEXUS_EXECUTABLE?.trim() || \"gitnexus\";\n const parts = splitCommand(raw);\n const [file = \"gitnexus\", ...args] = parts;\n const resolvedFile = process.platform === \"win32\" && raw === \"gitnexus\" ? \"gitnexus.cmd\" : file;\n return { file: resolvedFile, args, label: raw };\n}\n\nfunction splitCommand(value: string): string[] {\n const matches = value.match(/\"[^\"]+\"|'[^']+'|\\S+/g);\n return (matches?.length ? matches : [value]).map((part) => part.replace(/^[\"']|[\"']$/g, \"\"));\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { applyMiniprogramAgentsContext } from \"../agents-miniprogram.js\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { withProjectLock } from \"../fs/index.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport async function fillContextCommand(ctx: FetCommandContext): Promise<void> {\n let miniprogramSummary: string | undefined;\n await withProjectLock(ctx.projectRoot, { command: \"fill-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const miniprogramResult = await applyMiniprogramAgentsContext(ctx.projectRoot, ctx.language);\n miniprogramSummary = miniprogramResult.summary;\n\n const handoffPath = join(ctx.projectRoot, \".fet\", \"fill-context.md\");\n await mkdir(dirname(handoffPath), { recursive: true });\n await atomicWrite(handoffPath, renderGenericHandoff(ctx.language, miniprogramResult.detection.supported));\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(state);\n if (ctx.verbose) {\n ctx.output.info(ctx.language === \"en\" ? `Updated ${adapter.tool} adapter` : `已更新 ${adapter.tool} 适配器`, { written: result.written });\n }\n }\n });\n\n const placeholders = await countAgentsLlmPlaceholders(ctx.projectRoot);\n const warnings = miniprogramSummary ? [miniprogramSummary] : undefined;\n ctx.output.result({\n ok: true,\n command: \"fill-context\",\n summary:\n ctx.language === \"en\"\n ? placeholders\n ? `Found ${placeholders} AGENTS.md placeholder(s). Use your IDE AI to fill the rest.`\n : \"AGENTS.md placeholders are complete. IDE fill-context commands were refreshed.\"\n : placeholders\n ? `发现 ${placeholders} 个 AGENTS.md 占位符。请使用 IDE AI 补齐其余部分。`\n : \"AGENTS.md 占位符已补齐,已刷新 IDE fill-context 命令。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? placeholders\n ? [\n \"Cursor: run /fet-fill-context\",\n \"Codex: run /prompts:fet-fill-context\",\n \"OpenCode or other IDEs: open .fet/fill-context.md or run fet fill-context for handoff instructions\"\n ]\n : [\"Run fet doctor to confirm project context health\"]\n : placeholders\n ? [\n \"Cursor:运行 /fet-fill-context\",\n \"Codex:运行 /prompts:fet-fill-context\",\n \"OpenCode 或其他 IDE:打开 .fet/fill-context.md,或运行 fet fill-context 查看交接说明\"\n ]\n : [\"运行 fet doctor 确认项目上下文状态\"],\n data: {\n placeholders,\n cursorCommand: \"/fet-fill-context\",\n codexCommand: \"/prompts:fet-fill-context\"\n }\n });\n}\n\nfunction renderGenericHandoff(language: FetLanguage, miniprogramDetected: boolean): string {\n const miniprogramNoteEn = miniprogramDetected\n ? \"FET already scanned the mini program layout and wrote package-size constraints into AGENTS.md. Do not overwrite the Mini Program / package-size / development-constraint subsections unless the repo changed.\"\n : \"If AGENTS.md has a Mini Program section marked not applicable, keep it unless the project is actually a mini program.\";\n const miniprogramNoteZh = miniprogramDetected\n ? \"FET 已扫描小程序目录并把包体积/开发约束写入 AGENTS.md。除非仓库结构已变,不要覆盖「小程序」节中的包体积表与开发约束。\"\n : \"若 AGENTS.md 小程序节已标记为不适用,且项目确实不是小程序,可保留该说明。\";\n\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET Fill Context\n\nUse the IDE AI to complete FET-generated placeholders.\n\n1. Read AGENTS.md and openspec/config.yaml.\n2. Read .fet/karpathy-guidelines.md when it exists. For Codex, also read .codex/fet/karpathy-guidelines.md when it exists.\n3. Inspect README files, package scripts, routes, tests, source layout, and project conventions.\n4. ${miniprogramNoteEn}\n5. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content.\n6. Preserve FET managed markers.\n7. Do not modify business code.\n8. Run \\`fet doctor\\` and confirm no AGENTS.md placeholder warning remains.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET 填充上下文\n\n使用 IDE AI 补齐 FET 生成的项目上下文占位符。\n\n1. 阅读 AGENTS.md 和 openspec/config.yaml。\n2. 如果存在 .fet/karpathy-guidelines.md,请一并阅读。对 Codex,如果存在 .codex/fet/karpathy-guidelines.md,也要阅读。\n3. 检查 README、package scripts、路由、测试、源码结构和项目约定。\n4. ${miniprogramNoteZh}\n5. 将其余 \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、项目相关的内容。\n6. 保留 FET 托管标记。\n7. 不要修改业务代码。\n8. 运行 \\`fet doctor\\`,确认不再有 AGENTS.md 占位符警告。\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport { detectMiniprogramProject, type MiniprogramDetection } from \"./scanner/miniprogram.js\";\nimport {\n patchAgentsMiniprogramSection,\n renderMiniprogramFilledSection,\n renderMiniprogramNotApplicableSection\n} from \"./templates/miniprogram-agents.js\";\n\nexport interface MiniprogramAgentsApplyResult {\n applied: boolean;\n detection: MiniprogramDetection;\n summary: string;\n}\n\nexport async function applyMiniprogramAgentsContext(projectRoot: string, language: FetLanguage): Promise<MiniprogramAgentsApplyResult> {\n const agentsPath = join(projectRoot, \"AGENTS.md\");\n const detection = await detectMiniprogramProject(projectRoot);\n let existing: string;\n try {\n existing = await readFile(agentsPath, \"utf8\");\n } catch {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md was not found.\" : \"未找到 AGENTS.md。\"\n };\n }\n\n const section = detection.supported\n ? renderMiniprogramFilledSection(detection, language)\n : renderMiniprogramNotApplicableSection(language);\n const next = patchAgentsMiniprogramSection(existing, section, language);\n if (next === existing) {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md mini program section was unchanged.\" : \"AGENTS.md 小程序节未变更。\"\n };\n }\n\n await atomicWrite(agentsPath, next);\n if (!detection.supported) {\n return {\n applied: true,\n detection,\n summary: language === \"en\" ? \"Marked mini program section as not applicable.\" : \"已将小程序节标记为不适用。\"\n };\n }\n\n const near = [detection.mainPackage, ...detection.subpackages].filter((pkg) => pkg.status !== \"ok\");\n const summary =\n language === \"en\"\n ? near.length\n ? `Updated AGENTS.md mini program constraints (${near.length} package(s) near or over limit).`\n : \"Updated AGENTS.md mini program constraints and package size table.\"\n : near.length\n ? `已更新 AGENTS.md 小程序约束(${near.length} 个包接近或超过体积上限)。`\n : \"已更新 AGENTS.md 小程序包体积表与开发约束。\";\n\n return { applied: true, detection, summary };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { readPackageJson } from \"./package.js\";\n\nconst MAIN_PACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst SUBPACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst TOTAL_LIMIT_BYTES = 20 * 1024 * 1024;\nconst NEAR_LIMIT_BYTES = Math.floor(1.7 * 1024 * 1024);\n\nexport type MiniprogramPlatform = \"wechat\" | \"uni-app\" | \"taro\" | \"other\";\n\nexport type PackageSizeStatus = \"ok\" | \"near_limit\" | \"over_limit\";\n\nexport interface PackageSizeReport {\n name: string;\n root: string;\n sizeBytes: number;\n sizeLabel: string;\n limitBytes: number;\n status: PackageSizeStatus;\n pagePaths: string[];\n}\n\nexport interface MiniprogramScanResult {\n supported: true;\n platform: MiniprogramPlatform;\n platformLabel: string;\n projectType: string;\n appJsonPath: string;\n miniprogramRoot: string;\n mainPackage: PackageSizeReport;\n subpackages: PackageSizeReport[];\n totalSizeBytes: number;\n warnings: string[];\n}\n\nexport type MiniprogramDetection = MiniprogramScanResult | { supported: false };\n\ninterface AppJson {\n pages?: string[];\n subPackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n subpackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n}\n\nexport async function detectMiniprogramProject(projectRoot: string): Promise<MiniprogramDetection> {\n const pkg = await readPackageJson(projectRoot);\n const platform = await resolvePlatform(projectRoot, pkg);\n if (!platform) {\n return { supported: false };\n }\n\n const appJsonPath = await resolveAppJsonPath(projectRoot, platform);\n if (!appJsonPath) {\n return { supported: false };\n }\n\n const miniprogramRoot = dirnameNormalized(appJsonPath);\n const appJson = await readAppJson(appJsonPath);\n if (!appJson) {\n return { supported: false };\n }\n\n const subPackages = appJson.subPackages ?? appJson.subpackages ?? [];\n const subRoots = subPackages.map((item) => normalizeRelative(item.root ?? \"\")).filter(Boolean);\n const mainPagePaths = appJson.pages ?? [];\n\n const mainDirs = uniquePaths(mainPagePaths.map((page) => pageDir(page)).filter(Boolean));\n const mainSize = await sumPaths(miniprogramRoot, mainDirs, subRoots);\n const mainPackage: PackageSizeReport = {\n name: \"main\",\n root: miniprogramRoot,\n sizeBytes: mainSize,\n sizeLabel: formatBytes(mainSize),\n limitBytes: MAIN_PACKAGE_LIMIT_BYTES,\n status: sizeStatus(mainSize, MAIN_PACKAGE_LIMIT_BYTES),\n pagePaths: mainPagePaths\n };\n\n const subpackageReports: PackageSizeReport[] = [];\n for (const sub of subPackages) {\n const root = normalizeRelative(sub.root ?? \"\");\n if (!root) {\n continue;\n }\n const size = await directorySize(join(miniprogramRoot, root));\n subpackageReports.push({\n name: sub.name ?? root.replace(/\\/$/, \"\"),\n root,\n sizeBytes: size,\n sizeLabel: formatBytes(size),\n limitBytes: SUBPACKAGE_LIMIT_BYTES,\n status: sizeStatus(size, SUBPACKAGE_LIMIT_BYTES),\n pagePaths: sub.pages ?? []\n });\n }\n\n const totalSizeBytes = mainPackage.sizeBytes + subpackageReports.reduce((sum, item) => sum + item.sizeBytes, 0);\n const warnings: string[] = [];\n if (totalSizeBytes >= NEAR_LIMIT_BYTES) {\n warnings.push(\n totalSizeBytes >= TOTAL_LIMIT_BYTES\n ? \"源码目录合计体积已达到或超过 20MB 参考上限,需整体瘦身。\"\n : \"源码目录合计体积已接近 20MB 参考上限。\"\n );\n }\n\n return {\n supported: true,\n platform: platform.id,\n platformLabel: platform.label,\n projectType: platform.projectType,\n appJsonPath: relative(projectRoot, appJsonPath).replace(/\\\\/g, \"/\"),\n miniprogramRoot: relative(projectRoot, miniprogramRoot).replace(/\\\\/g, \"/\") || \".\",\n mainPackage,\n subpackages: subpackageReports,\n totalSizeBytes,\n warnings\n };\n}\n\nasync function resolvePlatform(\n projectRoot: string,\n pkg: Awaited<ReturnType<typeof readPackageJson>>\n): Promise<{ id: MiniprogramPlatform; label: string; projectType: string } | null> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n\n if (await exists(join(projectRoot, \"project.config.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生 / 微信开发者工具\" };\n }\n if (deps[\"@tarojs/taro\"] || deps[\"@tarojs/cli\"] || (await exists(join(projectRoot, \"config\", \"index.ts\")))) {\n return { id: \"taro\", label: \"Taro(可发布微信小程序)\", projectType: \"Taro 跨端小程序\" };\n }\n if ((await exists(join(projectRoot, \"manifest.json\"))) && (await exists(join(projectRoot, \"pages.json\")))) {\n return { id: \"uni-app\", label: \"uni-app(可发布微信小程序)\", projectType: \"uni-app 跨端小程序\" };\n }\n if (await exists(join(projectRoot, \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(app.json)\" };\n }\n if (await exists(join(projectRoot, \"miniprogram\", \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(miniprogram 目录)\" };\n }\n if (deps[\"miniprogram-api-typings\"]) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信 API 类型定义项目\" };\n }\n return null;\n}\n\nasync function resolveAppJsonPath(projectRoot: string, platform: { id: MiniprogramPlatform }): Promise<string | null> {\n const candidates: string[] = [];\n if (platform.id === \"wechat\") {\n try {\n const config = JSON.parse(await readFile(join(projectRoot, \"project.config.json\"), \"utf8\")) as {\n miniprogramRoot?: string;\n };\n if (config.miniprogramRoot) {\n candidates.push(join(projectRoot, config.miniprogramRoot, \"app.json\"));\n }\n } catch {\n // ignore\n }\n candidates.push(join(projectRoot, \"app.json\"), join(projectRoot, \"miniprogram\", \"app.json\"));\n } else {\n candidates.push(\n join(projectRoot, \"src\", \"app.json\"),\n join(projectRoot, \"app.json\"),\n join(projectRoot, \"miniprogram\", \"app.json\"),\n join(projectRoot, \"dist\", \"app.json\")\n );\n }\n\n for (const candidate of candidates) {\n if (await exists(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nasync function readAppJson(path: string): Promise<AppJson | null> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as AppJson;\n } catch {\n return null;\n }\n}\n\nasync function sumPaths(baseDir: string, dirs: string[], excludedRoots: string[]): Promise<number> {\n let total = 0;\n const visited = new Set<string>();\n\n for (const dir of dirs) {\n const abs = join(baseDir, dir);\n if (visited.has(abs)) {\n continue;\n }\n visited.add(abs);\n total += await directorySize(abs);\n }\n\n const rootFiles = await readdir(baseDir, { withFileTypes: true });\n for (const entry of rootFiles) {\n if (!entry.isFile()) {\n continue;\n }\n if (shouldSkipName(entry.name)) {\n continue;\n }\n total += (await stat(join(baseDir, entry.name))).size;\n }\n\n for (const entry of rootFiles) {\n if (!entry.isDirectory() || shouldSkipName(entry.name)) {\n continue;\n }\n const rel = `${entry.name}/`;\n if (dirs.some((dir) => dir === entry.name || dir.startsWith(`${entry.name}/`))) {\n continue;\n }\n if (excludedRoots.some((root) => root === entry.name || root.startsWith(`${entry.name}/`) || rel.startsWith(root))) {\n continue;\n }\n total += await directorySize(join(baseDir, entry.name));\n }\n\n return total;\n}\n\nasync function directorySize(targetPath: string): Promise<number> {\n try {\n const info = await stat(targetPath);\n if (!info.isDirectory()) {\n return info.size;\n }\n } catch {\n return 0;\n }\n\n let total = 0;\n const queue = [targetPath];\n while (queue.length) {\n const current = queue.pop();\n if (!current) {\n break;\n }\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (shouldSkipName(entry.name)) {\n continue;\n }\n const next = join(current, entry.name);\n if (entry.isDirectory()) {\n queue.push(next);\n } else if (entry.isFile()) {\n try {\n total += (await stat(next)).size;\n } catch {\n // ignore unreadable files\n }\n }\n }\n }\n return total;\n}\n\nfunction pageDir(pagePath: string): string {\n const normalized = pagePath.replace(/^\\//, \"\");\n const parts = normalized.split(\"/\");\n if (parts.length <= 1) {\n return parts[0] ?? \"\";\n }\n return parts.slice(0, -1).join(\"/\");\n}\n\nfunction sizeStatus(sizeBytes: number, limitBytes: number): PackageSizeStatus {\n if (sizeBytes >= limitBytes) {\n return \"over_limit\";\n }\n if (sizeBytes >= NEAR_LIMIT_BYTES) {\n return \"near_limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.replace(/^\\//, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.filter(Boolean))];\n}\n\nfunction shouldSkipName(name: string): boolean {\n return name === \"node_modules\" || name === \".git\" || name === \"miniprogram_npm\" || name.startsWith(\".\");\n}\n\nfunction dirnameNormalized(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, \"/\").split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \".\";\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse } from \"yaml\";\nimport type { ScannedCommand, ScannedWorkspace } from \"./types.js\";\n\ninterface PackageJson {\n name?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[] };\n}\n\nexport async function readPackageJson(projectRoot: string): Promise<PackageJson | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"package.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n\nexport interface PackageManagerDetection {\n manager: string;\n confidence: \"high\" | \"medium\" | \"low\";\n warnings: string[];\n}\n\nexport async function detectPackageManager(projectRoot: string, pkg: PackageJson | null): Promise<PackageManagerDetection> {\n const warnings: string[] = [];\n if (pkg?.packageManager) {\n const declared = pkg.packageManager.split(\"@\")[0] ?? \"unknown\";\n const locks = await detectLockManagers(projectRoot);\n const conflicting = locks.filter((item) => item !== declared);\n if (conflicting.length) {\n warnings.push(`packageManager 声明为 ${declared},但同时发现锁文件:${conflicting.join(\", \")}`);\n }\n return { manager: declared, confidence: \"high\", warnings };\n }\n\n const locks = await detectLockManagers(projectRoot);\n if (locks.length > 1) {\n warnings.push(`发现多个包管理器锁文件:${locks.join(\", \")},默认使用 ${locks[0]}`);\n return { manager: locks[0] ?? \"npm\", confidence: \"medium\", warnings };\n }\n if (locks[0]) {\n return { manager: locks[0], confidence: \"high\", warnings };\n }\n return { manager: \"npm\", confidence: \"low\", warnings };\n}\n\nexport function extractCommands(pkg: PackageJson | null, packageManager: string): Record<string, ScannedCommand> {\n const scripts = pkg?.scripts ?? {};\n const result: Record<string, ScannedCommand> = {};\n const scriptNames = [\"dev\", \"build\", \"lint\", \"typecheck\", \"check\", \"test\", \"test:unit\"];\n\n for (const name of scriptNames) {\n if (scripts[name]) {\n const dimension = name === \"check\" ? \"typecheck\" : name === \"test:unit\" ? \"test\" : name;\n if (result[dimension]) {\n continue;\n }\n result[dimension] = {\n command: scriptCommand(packageManager, name),\n source: `package.json:scripts.${name}`,\n required: name === \"build\"\n };\n }\n }\n\n return result;\n}\n\nexport function detectFramework(pkg: PackageJson | null): { name: string; confidence: \"high\" | \"medium\" | \"low\"; sources: string[] } {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n const candidates: Array<[string, string[]]> = [\n [\"next\", [\"next\"]],\n [\"nuxt\", [\"nuxt\"]],\n [\"vite\", [\"vite\"]],\n [\"sveltekit\", [\"@sveltejs/kit\"]],\n [\"angular\", [\"@angular/core\", \"@angular/cli\"]],\n [\"react\", [\"react\"]],\n [\"vue\", [\"vue\"]],\n [\"svelte\", [\"svelte\"]]\n ];\n for (const [candidate, packages] of candidates) {\n if (packages.some((name) => deps[name])) {\n return { name: candidate, confidence: \"high\", sources: [\"package.json\"] };\n }\n }\n return { name: \"unknown\", confidence: \"low\", sources: [] };\n}\n\nexport async function detectLanguage(projectRoot: string, pkg: PackageJson | null): Promise<string> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n if (deps.typescript || (await exists(join(projectRoot, \"tsconfig.json\")))) {\n return \"typescript\";\n }\n return \"javascript\";\n}\n\nexport async function detectWorkspaces(projectRoot: string, pkg: PackageJson | null): Promise<ScannedWorkspace[]> {\n const packageWorkspaces = normalizeWorkspaces(pkg?.workspaces).map((path) => ({\n name: path,\n path,\n source: \"package.json:workspaces\"\n }));\n if (packageWorkspaces.length) {\n return packageWorkspaces;\n }\n\n try {\n const workspace = parse(await readFile(join(projectRoot, \"pnpm-workspace.yaml\"), \"utf8\")) as { packages?: string[] } | null;\n return (workspace?.packages ?? []).map((path) => ({\n name: path,\n path,\n source: \"pnpm-workspace.yaml:packages\"\n }));\n } catch {\n return [];\n }\n}\n\nasync function detectLockManagers(projectRoot: string): Promise<string[]> {\n const lockFiles: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"bun.lockb\", \"bun\"],\n [\"bun.lock\", \"bun\"],\n [\"package-lock.json\", \"npm\"]\n ];\n const found: string[] = [];\n for (const [file, manager] of lockFiles) {\n if (await exists(join(projectRoot, file))) {\n found.push(manager);\n }\n }\n return found;\n}\n\nfunction normalizeWorkspaces(workspaces: PackageJson[\"workspaces\"]): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n return workspaces?.packages ?? [];\n}\n\nfunction scriptCommand(packageManager: string, name: string): string {\n return packageManager === \"npm\" ? `npm run ${name}` : `${packageManager} ${name}`;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import type { MiniprogramScanResult } from \"../scanner/miniprogram.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nconst MAIN_LIMIT_MB = 2;\nconst SUB_LIMIT_MB = 2;\nconst TOTAL_LIMIT_MB = 20;\nconst NEAR_LIMIT_MB = 1.7;\n\nexport function renderMiniprogramPlaceholderSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\n- Platform: [NEEDS LLM INPUT]\n- Project type: [NEEDS LLM INPUT]\n\n### Package size (filled by \\`fet fill-context\\`)\n\n[NEEDS LLM INPUT]\n\n### Development constraints\n\n[NEEDS LLM INPUT]`;\n }\n\n return `## 小程序\n\n- 平台:[NEEDS LLM INPUT]\n- 工程类型:[NEEDS LLM INPUT]\n\n### 包体积(由 \\`fet fill-context\\` 扫描补充)\n\n[NEEDS LLM INPUT]\n\n### 开发约束\n\n[NEEDS LLM INPUT]`;\n}\n\nexport function renderMiniprogramFilledSection(scan: MiniprogramScanResult, language: FetLanguage): string {\n if (language === \"en\") {\n return renderMiniprogramFilledSectionEn(scan);\n }\n return renderMiniprogramFilledSectionZh(scan);\n}\n\nfunction renderMiniprogramFilledSectionZh(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableZh(scan);\n const rules = renderConstraintRulesZh(scan);\n const warnings = scan.warnings.length ? `\\n\\n扫描提示:${scan.warnings.join(\";\")}` : \"\";\n\n return `## 小程序\n\n- 平台:${scan.platformLabel}\n- 工程类型:${scan.projectType}\n- 配置:\\`${scan.appJsonPath}\\`(根目录 \\`${scan.miniprogramRoot}/\\`)\n\n### 包体积(源码目录估算,上传前以微信开发者工具 / CI 构建产物为准)\n\n${sizeTable}\n\n> 说明:下表按仓库内页面/分包目录源码体积累计,用于规划开发;**实际上传体积以编译后为准**,通常与源码趋势一致。\n\n### 开发约束\n\n${rules}${warnings}`;\n}\n\nfunction renderMiniprogramFilledSectionEn(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableEn(scan);\n const rules = renderConstraintRulesEn(scan);\n const warnings = scan.warnings.length ? `\\n\\nScan notes: ${scan.warnings.join(\"; \")}` : \"\";\n\n return `## Mini Program\n\n- Platform: ${scan.platformLabel}\n- Project type: ${scan.projectType}\n- Config: \\`${scan.appJsonPath}\\` (root \\`${scan.miniprogramRoot}/\\`)\n\n### Package size (source tree estimate; verify with WeChat DevTools / CI build output)\n\n${sizeTable}\n\n> These numbers sum source directories for planning. **Uploaded package size is determined by the build output**, but source trends usually match.\n\n### Development constraints\n\n${rules}${warnings}`;\n}\n\nfunction renderSizeTableZh(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowZh(\"主包\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowZh(`分包 ${item.name}`, item))\n ];\n rows.push(`| 合计(源码估算) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | 参考 |`);\n\n return `| 包 | 根目录 | 源码体积(估算) | 上限 | 状态 |\n|----|--------|------------------|------|------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderSizeTableEn(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowEn(\"main\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowEn(`subpackage ${item.name}`, item))\n ];\n rows.push(`| total (source estimate) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | reference |`);\n\n return `| package | root | estimated source size | limit | status |\n|---------|------|------------------------|-------|--------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderPackageRowZh(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelZh(pkg.status)} |`;\n}\n\nfunction renderPackageRowEn(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelEn(pkg.status)} |`;\n}\n\nfunction renderConstraintRulesZh(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- 微信小程序体积上限(发布到微信时):**主包 ≤ ${MAIN_LIMIT_MB}MB**,**单个分包 ≤ ${SUB_LIMIT_MB}MB**,**整包 ≤ ${TOTAL_LIMIT_MB}MB**(以[微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html)为准)。`,\n `- **接近上限阈值:源码目录 ≥ ${NEAR_LIMIT_MB}MB** 即视为「接近 2MB」:禁止在该包内**新增页面**、大图、音视频、重复静态资源;优先拆到其他分包、懒加载或先做体积优化。`,\n `- 体积 **≥ ${MAIN_LIMIT_MB}MB(主包)或 ≥ ${SUB_LIMIT_MB}MB(分包)** 时,必须先瘦身再新增功能或页面。`,\n `- 新增页面前:确认目标包不在「接近上限」或「超限」列表;跨包迁移页面时同步更新 \\`app.json\\` / 分包配置与路由引用。`,\n `- Taro / uni-app 发布到微信时同样受上述上传体积约束;其他端规则见对应平台文档。`\n ];\n\n if (blocked.near.length) {\n lines.push(\n `- **当前接近上限(≥${NEAR_LIMIT_MB}MB,禁止在本包内新增页面)**:${blocked.near.map((item) => `\\`${item}\\``).join(\"、\")}。`\n );\n }\n if (blocked.over.length) {\n lines.push(`- **当前已超限(必须先瘦身)**:${blocked.over.map((item) => `\\`${item}\\``).join(\"、\")}。`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- 当前扫描未发现接近 2MB 的主包/分包目录,但仍应在每次较大改动后复核构建产物体积。\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderConstraintRulesEn(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- WeChat upload limits: **main package ≤ ${MAIN_LIMIT_MB}MB**, **each subpackage ≤ ${SUB_LIMIT_MB}MB**, **whole mini program ≤ ${TOTAL_LIMIT_MB}MB** (see WeChat official docs).`,\n `- Treat **source tree ≥ ${NEAR_LIMIT_MB}MB** as near the 2MB cap: do **not** add new pages, large media, or redundant static assets in that package; split work to another subpackage or optimize first.`,\n `- If a package is **≥ ${MAIN_LIMIT_MB}MB (main) or ≥ ${SUB_LIMIT_MB}MB (sub)** , optimize before adding pages or features.`,\n `- Before adding a page, confirm the target package is not listed below; update \\`app.json\\` / subpackage config when moving pages.`,\n `- Taro / uni-app builds for WeChat follow the same upload limits.`\n ];\n\n if (blocked.near.length) {\n lines.push(`- **Near limit (≥${NEAR_LIMIT_MB}MB, no new pages in these packages):** ${blocked.near.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (blocked.over.length) {\n lines.push(`- **Over limit (optimize before more work):** ${blocked.over.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- No package is near 2MB in this scan; still verify build output after large changes.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction collectBlockedPackages(scan: MiniprogramScanResult): { near: string[]; over: string[] } {\n const near: string[] = [];\n const over: string[] = [];\n const all = [scan.mainPackage, ...scan.subpackages];\n for (const pkg of all) {\n const label = pkg.name === \"main\" ? `主包(${pkg.root})` : `${pkg.name}(${pkg.root})`;\n if (pkg.status === \"over_limit\") {\n over.push(label);\n } else if (pkg.status === \"near_limit\") {\n near.push(label);\n }\n }\n return { near, over };\n}\n\nfunction statusLabelZh(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"超限\";\n }\n if (status === \"near_limit\") {\n return \"接近上限\";\n }\n return \"正常\";\n}\n\nfunction statusLabelEn(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"over limit\";\n }\n if (status === \"near_limit\") {\n return \"near limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nexport function renderMiniprogramNotApplicableSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\nNot detected as a mini program project. Leave this section as N/A or remove it if irrelevant.`;\n }\n return `## 小程序\n\n未识别为小程序工程;如无小程序场景可填写「不适用」或删除本节。`;\n}\n\nexport function patchAgentsMiniprogramSection(content: string, sectionMarkdown: string, language: FetLanguage): string {\n const heading = language === \"en\" ? \"## Mini Program\" : \"## 小程序\";\n const autoBegin = \"<!-- FET:BEGIN AUTO -->\";\n const autoEnd = \"<!-- FET:END AUTO -->\";\n const begin = content.indexOf(autoBegin);\n const end = content.indexOf(autoEnd);\n if (begin === -1 || end === -1 || end < begin) {\n return content;\n }\n\n const auto = content.slice(begin, end);\n const headingIndex = auto.indexOf(heading);\n if (headingIndex === -1) {\n const insertion = `\\n\\n${sectionMarkdown}\\n`;\n return `${content.slice(0, end)}${insertion}${content.slice(end)}`;\n }\n\n const afterHeading = auto.slice(headingIndex + heading.length);\n const nextHeading = afterHeading.search(/\\n## /);\n const sectionEnd = nextHeading === -1 ? auto.length : headingIndex + heading.length + nextHeading;\n const absoluteStart = begin + headingIndex;\n const absoluteEnd = begin + sectionEnd;\n return `${content.slice(0, absoluteStart)}${sectionMarkdown}${content.slice(absoluteEnd)}`;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { buildProjectGraphContext } from \"../graph-context.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"../gitnexus.js\";\n\nexport type GraphAction = \"status\" | \"setup\" | \"init\" | \"refresh\" | \"doctor\" | \"handoff\";\n\nexport async function graphCommand(ctx: FetCommandContext, action: GraphAction, args: string[] = []): Promise<void> {\n switch (action) {\n case \"status\":\n await graphStatusCommand(ctx);\n return;\n case \"doctor\":\n await graphDoctorCommand(ctx);\n return;\n case \"setup\":\n await graphSetupCommand(ctx);\n return;\n case \"handoff\":\n await graphHandoffCommand(ctx);\n return;\n case \"init\":\n await graphAnalyzeCommand(ctx, \"init\", args);\n return;\n case \"refresh\":\n await graphAnalyzeCommand(ctx, \"refresh\", args);\n return;\n }\n}\n\nasync function graphStatusCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"\n : \"尚未安装 GitNexus。运行 fet graph setup 获取安装交接说明。\"\n ];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary:\n ctx.language === \"en\"\n ? result.state.installed\n ? `GitNexus graph status checked. Graph ${result.state.graphExists ? \"exists\" : \"does not exist\"} at ${result.state.graphPath ?? \".gitnexus\"}.`\n : \"GitNexus is not installed. Graph support remains optional.\"\n : result.state.installed\n ? `已检查 GitNexus 代码图状态。代码图${result.state.graphExists ? \"存在\" : \"不存在\"},路径为 ${result.state.graphPath ?? \".gitnexus\"}。`\n : \"尚未安装 GitNexus。代码图能力保持可选。\",\n warnings,\n nextSteps:\n result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"Run fet graph init to build the first GitNexus graph\" : \"运行 fet graph init 生成第一份 GitNexus 代码图\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphDoctorCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = [\n ...(!result.state.installed ? [ctx.language === \"en\" ? \"GitNexus is not installed.\" : \"尚未安装 GitNexus。\"] : []),\n ...(result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"GitNexus is installed but no graph directory was found.\" : \"已安装 GitNexus,但未发现代码图目录。\"]\n : []),\n ...(!result.state.handoffPath\n ? [ctx.language === \"en\" ? \"Graph handoff instructions have not been generated.\" : \"尚未生成代码图使用交接说明。\"]\n : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary:\n ctx.language === \"en\"\n ? warnings.length\n ? `Graph doctor completed with ${warnings.length} warning(s).`\n : \"Graph doctor completed without warnings.\"\n : warnings.length\n ? `代码图诊断完成,发现 ${warnings.length} 个警告。`\n : \"代码图诊断完成,未发现警告。\",\n warnings,\n nextSteps:\n warnings.length\n ? ctx.language === \"en\"\n ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"]\n : [\"运行 fet graph setup\", \"运行 fet graph handoff\", \"安装 GitNexus 后运行 fet graph init\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphSetupCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-setup.md\");\n const installCommand = process.env.FET_GITNEXUS_INSTALL_COMMAND?.trim() || null;\n await withProjectLock(ctx.projectRoot, { command: \"graph setup\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { write: false });\n await writeHandoffFile(handoffPath, renderGraphSetupHandoff(result.state, { installCommand, language: ctx.language }));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n setupHandoffPath: \".fet/graph-setup.md\",\n setupHandoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph setup\",\n summary:\n ctx.language === \"en\"\n ? \"GitNexus IDE-assisted setup playbook generated.\"\n : \"已生成 GitNexus IDE LLM 辅助安装任务书。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The playbook lets the current IDE LLM guide installation with user confirmation before risky commands.\"\n : \"尚未安装 GitNexus。任务书会指导当前 IDE LLM 推进安装,并在高风险命令前请求用户确认。\"\n ],\n nextSteps: result.state.installed\n ? [\n ctx.language === \"en\"\n ? \"Ask your IDE AI to read .fet/graph-setup.md and run the optional gitnexus setup flow if you want IDE/MCP integration\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并在需要 IDE/MCP 集成时按确认流程运行 gitnexus setup\",\n \"fet graph init\"\n ]\n : [\n ctx.language === \"en\"\n ? \"Ask your current IDE AI to read .fet/graph-setup.md and follow the installation playbook\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并按安装任务书推进\"\n ],\n data: {\n path: \".fet/graph-setup.md\",\n installCommandConfigured: Boolean(installCommand),\n gitnexus: result.state\n }\n });\n}\n\nasync function graphHandoffCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-handoff.md\");\n await withProjectLock(ctx.projectRoot, { command: \"graph handoff\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { runStatus: true, write: false });\n await writeHandoffFile(handoffPath, renderGraphUsageHandoff(result.state, ctx.language));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n handoffPath: \".fet/graph-handoff.md\",\n handoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph handoff\",\n summary: ctx.language === \"en\" ? \"GitNexus graph usage handoff generated.\" : \"已生成 GitNexus 代码图使用交接说明。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The handoff still documents the fallback behavior.\"\n : \"尚未安装 GitNexus。交接说明仍会记录回退行为。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"]\n : [\"Cursor/Codex/OpenCode:大范围扫描仓库前先阅读 .fet/graph-handoff.md\"],\n data: {\n path: \".fet/graph-handoff.md\",\n gitnexus: result.state\n }\n });\n}\n\nasync function graphAnalyzeCommand(ctx: FetCommandContext, mode: \"init\" | \"refresh\", args: string[]): Promise<void> {\n const detection = await detectGitNexus();\n if (!detection.installed) {\n throw new FetError({\n code: ErrorCode.GraphProviderNotFound,\n message: ctx.language === \"en\" ? \"GitNexus is not installed or is not available on PATH.\" : \"尚未安装 GitNexus,或 GitNexus 不在 PATH 中。\",\n details: { executable: detection.executablePath, error: detection.error },\n suggestedCommand: \"fet graph setup\"\n });\n }\n\n const run = await runGitNexus([\"analyze\", ...args], { cwd: ctx.projectRoot });\n if (run.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.GraphCommandFailed,\n message: ctx.language === \"en\" ? \"GitNexus analyze failed.\" : \"GitNexus analyze 执行失败。\",\n details: { command: run.command.join(\" \"), exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr },\n suggestedCommand: \"fet graph doctor\"\n });\n }\n\n const result = await refreshGraphState(ctx, { write: false });\n const graphContext = await buildProjectGraphContext(ctx, result.state, `fet graph ${mode}`);\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString(),\n projectContextPath: graphContext.path,\n projectContextUpdatedAt: graphContext.generated ? new Date().toISOString() : result.state.projectContextUpdatedAt ?? null\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary:\n ctx.language === \"en\"\n ? mode === \"init\"\n ? \"GitNexus graph initialized.\"\n : \"GitNexus graph refreshed.\"\n : mode === \"init\"\n ? \"已初始化 GitNexus 代码图。\"\n : \"已刷新 GitNexus 代码图。\",\n warnings: result.state.graphExists\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus analyze completed, but the configured graph directory was not found.\"\n : \"GitNexus analyze 已完成,但未发现配置的代码图目录。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Run fet graph status\", \"Read .fet/graph-context/project.md before broad scans\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"]\n : [\"运行 fet graph status\", \"使用 .fet/graph-handoff.md 或生成的 IDE 提示,优先参考代码图上下文\"],\n data: {\n gitnexus: global.graph.gitnexus,\n graphContext,\n run: {\n command: run.command,\n stdout: run.stdout.trim(),\n stderr: run.stderr.trim()\n }\n }\n });\n}\n\nasync function refreshGraphState(ctx: FetCommandContext, options: { runStatus?: boolean; write?: boolean } = {}) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n let state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n let gitnexusStatus: Awaited<ReturnType<typeof runGitNexus>> | null = null;\n\n if (options.runStatus && detection.installed) {\n gitnexusStatus = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n state = {\n ...state,\n lastStatus: firstLine(gitnexusStatus.stdout) || firstLine(gitnexusStatus.stderr) || `exit ${gitnexusStatus.exitCode}`\n };\n }\n\n if (options.write ?? true) {\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return {\n state,\n gitnexusStatus: gitnexusStatus\n ? {\n exitCode: gitnexusStatus.exitCode,\n command: gitnexusStatus.command,\n stdout: gitnexusStatus.stdout.trim(),\n stderr: gitnexusStatus.stderr.trim()\n }\n : null\n };\n}\n\nasync function writeHandoffFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderGraphSetupHandoff(\n state: GitNexusState,\n options: { installCommand: string | null; language: FetCommandContext[\"language\"] }\n): string {\n if (options.language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE Setup Playbook\n\nThis file is written for the current IDE LLM. Use it to help the user install and verify optional GitNexus graph support. GitNexus is optional; FET/OpenSpec workflows must continue to work when it is unavailable.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Executable: ${state.executablePath ?? \"gitnexus\"}\n- Version: ${state.version ?? \"unknown\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Configured install command: ${options.installCommand ?? \"none\"}\n\nIDE LLM setup flow:\n\n1. Check the shell, operating system, package managers, and PATH. Run only read-only detection commands at first.\n2. Run \\`gitnexus --version\\` or the executable shown above. If it succeeds, skip installation and continue to verification.\n3. If GitNexus is missing and \\`FET_GITNEXUS_INSTALL_COMMAND\\` is configured, explain that command to the user and ask for approval before running it.\n4. If no install command is configured, find the official GitNexus installation instructions or ask the user for the preferred install method. Do not invent an installer.\n5. Before running any command that downloads software, installs globally, changes PATH, modifies user home files, or changes IDE/MCP configuration, show the exact command and wait for user approval.\n6. After installation, verify with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, run \\`gitnexus setup\\` only after explaining what it may change and receiving approval.\n8. Return to this project and run \\`fet graph init\\` to build the first graph.\n9. Run \\`fet graph handoff\\` so future IDE AI work can prefer graph context before broad repository scans.\n\nGuardrails:\n\n- Do not block FET/OpenSpec commands when GitNexus is unavailable.\n- Do not generate or modify application code during setup.\n- Do not silently install software or modify global/user-level configuration.\n- If installation fails, summarize the failing command, stderr, and the next manual step.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE 安装任务书\n\n本文档写给当前 IDE LLM。请用它帮助用户安装并验证可选的 GitNexus 代码图能力。GitNexus 是可选能力;即使不可用,FET/OpenSpec 主流程也必须继续可用。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 可执行文件:${state.executablePath ?? \"gitnexus\"}\n- 版本:${state.version ?? \"unknown\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 已配置安装命令:${options.installCommand ?? \"无\"}\n\nIDE LLM 安装流程:\n\n1. 先检测 shell、操作系统、包管理器和 PATH。起步阶段只运行只读检测命令。\n2. 运行 \\`gitnexus --version\\` 或上方显示的可执行文件。如果成功,跳过安装并进入验证。\n3. 如果 GitNexus 缺失且已配置 \\`FET_GITNEXUS_INSTALL_COMMAND\\`,先向用户解释该命令,再等待用户批准后执行。\n4. 如果没有配置安装命令,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。不要臆造安装命令。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户目录或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n6. 安装后运行 \\`gitnexus --version\\` 验证。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\` 可能修改的内容,获得确认后再运行。\n8. 回到本项目运行 \\`fet graph init\\`,生成第一份代码图。\n9. 运行 \\`fet graph handoff\\`,让后续 IDE AI 在大范围扫描前优先使用代码图上下文。\n\n约束:\n\n- GitNexus 不可用时,不要阻塞 FET/OpenSpec 命令。\n- 安装过程中不要生成或修改业务代码。\n- 不要静默安装软件,也不要静默修改全局或用户级配置。\n- 如果安装失败,汇总失败命令、stderr 和下一步人工处理建议。\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState, language: FetCommandContext[\"language\"]): string {\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET Graph Handoff\n\nUse GitNexus graph context as an optional first pass before broad repository scans.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${state.lastIndexedAt ?? \"unknown\"}\n- Last status: ${state.lastStatus ?? \"unknown\"}\n\nWhen graph context is available:\n\n1. Use the graph to identify likely modules, dependencies, and insertion points.\n2. Read only the concrete source files needed to confirm behavior.\n3. Prefer OpenSpec artifacts and AGENTS.md over graph guesses when they conflict.\n4. Fall back to normal repository inspection if the graph is missing, stale, or incomplete.\n\nWhen producing OpenSpec artifacts:\n\n- Use graph context to make proposal, design, specs, and tasks more precise.\n- Avoid large repository scans when the graph already narrows the relevant area.\n- Keep all generated artifacts in the normal OpenSpec change directory.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET 代码图交接说明\n\n在大范围扫描仓库前,优先把 GitNexus 代码图上下文作为可选的第一轮线索。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 最后索引时间:${state.lastIndexedAt ?? \"unknown\"}\n- 最后状态:${state.lastStatus ?? \"unknown\"}\n\n代码图上下文可用时:\n\n1. 用代码图识别可能相关的模块、依赖和插入点。\n2. 只读取需要确认行为的具体源码文件。\n3. 当代码图推断与 OpenSpec 产物或 AGENTS.md 冲突时,优先相信 OpenSpec 产物和 AGENTS.md。\n4. 如果代码图缺失、过期或不完整,回退到普通仓库检查。\n\n生成 OpenSpec 产物时:\n\n- 用代码图上下文让 proposal、design、specs 和 tasks 更精确。\n- 当代码图已经缩小相关范围时,避免大范围仓库扫描。\n- 所有生成产物仍写入正常的 OpenSpec change 目录。\n`;\n}\n\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"./cli/context.js\";\nimport { atomicWrite } from \"./fs/index.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"./gitnexus.js\";\n\nconst MAX_SOURCE_CONTEXT = 8000;\nconst MAX_GRAPH_OUTPUT = 20000;\n\nexport interface GraphContextResult {\n generated: boolean;\n path: string | null;\n query: string | null;\n warnings: string[];\n}\n\nexport async function buildProjectGraphContext(\n ctx: FetCommandContext,\n state: GitNexusState,\n trigger: string\n): Promise<GraphContextResult> {\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: [\"GitNexus graph exists check did not pass; project graph context was not generated.\"]\n };\n }\n\n const query = \"FET OpenSpec workflow architecture commands adapters graph integration project structure\";\n const goal = \"Summarize the repository modules, workflow entry points, and likely insertion points for future FET/OpenSpec work.\";\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const status = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n const warnings = commandWarnings([[\"gitnexus query\", graphQuery], [\"gitnexus status\", status]]);\n const relativePath = \".fet/graph-context/project.md\";\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderProjectContext({\n trigger,\n state,\n query,\n goal,\n status: commandText(status),\n graphOutput: commandText(graphQuery),\n warnings\n })\n );\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nexport async function buildWorkflowGraphContext(\n ctx: FetCommandContext,\n options: { command: string; args: string[]; changeId: string | null }\n): Promise<GraphContextResult> {\n const existing = await ctx.stateStore.getOrCreateGlobal();\n if (!existing.graph?.gitnexus?.graphExists) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const state = await refreshGitNexusState(ctx);\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const sourceContext = await collectOpenSpecContext(ctx.projectRoot, options.changeId);\n const query = buildWorkflowQuery(options, sourceContext);\n const goal = workflowGoal(options.command);\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const detectChanges = shouldDetectChanges(options.command)\n ? await runGitNexus([\"detect-changes\", \"--scope\", \"all\"], { cwd: ctx.projectRoot })\n : null;\n const warnings = commandWarnings([\n [\"gitnexus query\", graphQuery],\n ...(detectChanges ? ([[\"gitnexus detect-changes\", detectChanges]] as const) : [])\n ]);\n const relativePath = `.fet/graph-context/${sanitizePathPart(options.changeId ?? options.command)}.md`;\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderWorkflowContext({\n state,\n command: options.command,\n args: options.args,\n changeId: options.changeId,\n query,\n goal,\n sourceContext,\n graphOutput: commandText(graphQuery),\n detectChanges: detectChanges ? commandText(detectChanges) : null,\n warnings\n })\n );\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...state,\n workflowContextPath: relativePath,\n workflowContextUpdatedAt: new Date().toISOString(),\n lastWorkflowGraphQuery: query\n };\n await ctx.stateStore.writeGlobal(global);\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nasync function refreshGitNexusState(ctx: FetCommandContext): Promise<GitNexusState> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n const state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n return state;\n}\n\nfunction isGraphReadable(state: GitNexusState): boolean {\n return Boolean(state.installed && state.graphExists);\n}\n\nasync function writeGraphContext(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderProjectContext(options: {\n trigger: string;\n state: GitNexusState;\n query: string;\n goal: string;\n status: string;\n graphOutput: string;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: project\nFET:END -->\n\n# FET GitNexus Project Graph Context\n\nGenerated at: ${new Date().toISOString()}\nTrigger: ${options.trigger}\n\nUse this file before broad repository scans in FET/OpenSpec work. Treat it as graph-derived context: confirm concrete behavior by reading the source files it points to.\n\n## Graph State\n\n- Provider: GitNexus\n- Installed: ${options.state.installed ? \"yes\" : \"no\"}\n- Version: ${options.state.version ?? \"unknown\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${options.state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## GitNexus Status\n\n\\`\\`\\`text\n${clip(options.status, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n\n## Project Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWorkflowContext(options: {\n state: GitNexusState;\n command: string;\n args: string[];\n changeId: string | null;\n query: string;\n goal: string;\n sourceContext: string;\n graphOutput: string;\n detectChanges: string | null;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: workflow\nFET:END -->\n\n# FET GitNexus Workflow Graph Context\n\nGenerated at: ${new Date().toISOString()}\n\nRead this before editing or generating OpenSpec artifacts for this workflow. Use the graph output to narrow likely files, symbols, dependencies, and impact areas. If it conflicts with OpenSpec artifacts or source code, OpenSpec artifacts and source code win.\n\n## Workflow\n\n- FET command: ${options.command}\n- Args: ${options.args.length ? options.args.join(\" \") : \"(none)\"}\n- Change: ${options.changeId ?? \"(none)\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## OpenSpec Context Used For Query\n\n\\`\\`\\`text\n${clip(options.sourceContext || \"(no change artifacts found yet)\", MAX_SOURCE_CONTEXT)}\n\\`\\`\\`\n\n## GitNexus Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${options.detectChanges ? `\n## GitNexus Change Impact\n\n\\`\\`\\`text\n${clip(options.detectChanges, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n` : \"\"}\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWarnings(warnings: string[]): string {\n if (!warnings.length) {\n return \"\";\n }\n return `\n## Warnings\n\n${warnings.map((warning) => `- ${warning}`).join(\"\\n\")}\n`;\n}\n\nasync function collectOpenSpecContext(projectRoot: string, changeId: string | null): Promise<string> {\n if (!changeId) {\n return \"\";\n }\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const chunks: string[] = [];\n for (const file of [\"proposal.md\", \"design.md\", \"tasks.md\", \"README.md\"]) {\n const content = await readOptional(join(changeRoot, file));\n if (content) {\n chunks.push(`## ${file}\\n${content}`);\n }\n }\n\n const specsRoot = join(changeRoot, \"specs\");\n for (const spec of await listSpecFiles(specsRoot)) {\n const content = await readOptional(spec.path);\n if (content) {\n chunks.push(`## ${spec.label}\\n${content}`);\n }\n }\n\n return clip(chunks.join(\"\\n\\n\"), MAX_SOURCE_CONTEXT);\n}\n\nasync function listSpecFiles(specsRoot: string): Promise<Array<{ path: string; label: string }>> {\n try {\n const capabilities = await readdir(specsRoot, { withFileTypes: true });\n return capabilities\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n path: join(specsRoot, entry.name, \"spec.md\"),\n label: `specs/${entry.name}/spec.md`\n }));\n } catch {\n return [];\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction buildWorkflowQuery(options: { command: string; args: string[]; changeId: string | null }, sourceContext: string): string {\n const artifactTerms = normalizeWhitespace(sourceContext).slice(0, 1200);\n return normalizeWhitespace(\n [\n `FET OpenSpec ${options.command}`,\n options.changeId ? `change ${options.changeId}` : \"\",\n options.args.join(\" \"),\n artifactTerms\n ].join(\" \")\n );\n}\n\nfunction workflowGoal(command: string): string {\n if (command === \"apply\") {\n return \"Find implementation files, symbols, dependencies, and likely blast radius for the current OpenSpec tasks.\";\n }\n if (command === \"verify\") {\n return \"Find affected flows and source areas that should be checked while verifying this OpenSpec change.\";\n }\n if ([\"explore\", \"propose\", \"new\", \"continue\", \"ff\"].includes(command)) {\n return \"Find relevant modules, entry points, and existing behavior to make OpenSpec artifacts precise.\";\n }\n return \"Find relevant repository context for this FET/OpenSpec workflow command.\";\n}\n\nfunction shouldDetectChanges(command: string): boolean {\n return [\"apply\", \"verify\", \"sync\"].includes(command);\n}\n\nfunction commandText(result: Awaited<ReturnType<typeof runGitNexus>>): string {\n const output = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join(\"\\n\");\n return output || `exit ${result.exitCode}`;\n}\n\nfunction commandWarnings(results: ReadonlyArray<readonly [string, Awaited<ReturnType<typeof runGitNexus>>]>): string[] {\n return results\n .filter(([, result]) => result.exitCode !== 0)\n .map(([label, result]) => `${label} exited with ${result.exitCode}: ${firstLine(commandText(result))}`);\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || \"no output\";\n}\n\nfunction clip(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, max)}\\n\\n[truncated ${value.length - max} characters]`;\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizePathPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"workflow\";\n}\n","import { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { createInitJournal, withProjectLock, writeInitJournal } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, renderGitNexusRecommendation, toGitNexusState } from \"../gitnexus.js\";\nimport { updateContextFiles } from \"./update-context.js\";\n\nexport async function initCommand(ctx: FetCommandContext): Promise<void> {\n const alreadyInitialized = await exists(join(ctx.projectRoot, \"openspec\", \"config.yaml\"));\n let warnings: string[] = [];\n await withProjectLock(ctx.projectRoot, { command: \"init\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const journal = createInitJournal(ctx.fetVersion);\n await writeInitJournal(ctx.projectRoot, journal);\n\n const identity = await ctx.openSpec.resolveExecutable();\n if (!alreadyInitialized) {\n const result = await ctx.openSpec.run(\"init\", [\"--tools\", \"none\"], { cwd: ctx.projectRoot, stdio: \"inherit\" });\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n return;\n }\n }\n\n const contextResult = await updateContextFiles(ctx);\n warnings = contextResult.warnings;\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openspec = identity;\n state.language = {\n current: ctx.language,\n updatedAt: new Date().toISOString()\n };\n state.graph ??= {};\n const gitnexus = mergeGitNexusGraphInfo(toGitNexusState(await detectGitNexus(), state.graph.gitnexus), await inspectGitNexusGraph(ctx.projectRoot));\n if (!gitnexus.installed && !gitnexus.recommendationShownAt) {\n warnings.push(renderGitNexusRecommendation(gitnexus, ctx.language));\n gitnexus.recommendationShownAt = new Date().toISOString();\n }\n state.graph.gitnexus = gitnexus;\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n journal.steps.push(...result.written.map((path) => ({ operation: \"write\" as const, path, status: \"done\" as const })));\n }\n\n journal.completedAt = new Date().toISOString();\n await writeInitJournal(ctx.projectRoot, journal);\n await ctx.stateStore.writeGlobal(state);\n });\n\n ctx.output.result({\n ok: true,\n command: \"init\",\n summary: ctx.language === \"en\" ? \"FET initialization completed.\" : \"FET 初始化完成。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? [\"Use fet propose/new to create an OpenSpec change\", \"Use fet doctor to check project health\"]\n : [\"使用 fet propose/new 创建 OpenSpec change\", \"使用 fet doctor 检查项目状态\"]\n });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { mergeFetConfig } from \"../config/index.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, createBackup, withProjectLock } from \"../fs/index.js\";\nimport {\n hasInvalidManagedAutoRegion,\n hasManagedAutoRegion,\n mergeKarpathyClaudeMd,\n renderAgentsMd,\n renderFetConfig,\n renderKarpathyCursorRule,\n renderKarpathyFetHandoff,\n replaceManagedRegion\n} from \"../templates/index.js\";\n\nexport async function updateContextCommand(ctx: FetCommandContext): Promise<void> {\n let contextResult: { warnings: string[] } = { warnings: [] };\n await withProjectLock(ctx.projectRoot, { command: \"update-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n contextResult = await updateContextFiles(ctx);\n });\n\n ctx.output.result({\n ok: true,\n command: \"update-context\",\n summary:\n ctx.language === \"en\"\n ? \"Updated FET-managed regions in AGENTS.md and openspec/config.yaml.\"\n : \"已更新 AGENTS.md 与 openspec/config.yaml 中的 FET 托管区域。\",\n warnings: contextResult.warnings\n });\n}\n\nexport async function updateContextFiles(ctx: FetCommandContext): Promise<{ warnings: string[] }> {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const agentsPath = join(ctx.projectRoot, \"AGENTS.md\");\n const configPath = join(ctx.projectRoot, \"openspec\", \"config.yaml\");\n const claudePath = join(ctx.projectRoot, \"CLAUDE.md\");\n const karpathyHandoffPath = join(ctx.projectRoot, \".fet\", \"karpathy-guidelines.md\");\n const karpathyCursorPath = join(ctx.projectRoot, \".cursor\", \"rules\", \"karpathy-guidelines.mdc\");\n\n const existingAgents = await readOptional(agentsPath);\n const existingClaude = await readOptional(claudePath);\n const existingKarpathyCursor = await readOptional(karpathyCursorPath);\n const warnings = [...scan.warnings];\n\n if (existingAgents && hasInvalidManagedAutoRegion(existingAgents)) {\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: ctx.language === \"en\" ? \"AGENTS.md FET managed markers are broken or duplicated.\" : \"AGENTS.md 的 FET 托管标记损坏或重复。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Manually repair FET:BEGIN AUTO / FET:END AUTO markers, then rerun.\"\n : \"手动修复 FET:BEGIN AUTO / FET:END AUTO 标记后重试。\"\n });\n }\n\n if (existingAgents && !hasManagedAutoRegion(existingAgents)) {\n if (!ctx.yes && !(await confirmInitCanReplaceUnmanagedAgents(ctx))) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message:\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and does not contain a FET-managed region.\"\n : \"AGENTS.md 已存在,且不包含 FET 托管区域。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.command === \"init\"\n ? ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet init --yes.\"\n : \"确认可备份并替换后运行 fet init --yes。\"\n : ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet update-context --yes.\"\n : \"确认可备份并替换后运行 fet update-context --yes。\"\n });\n }\n const backupPath = await createBackup(agentsPath);\n if (backupPath) {\n warnings.push(ctx.language === \"en\" ? `Backed up unmanaged AGENTS.md to ${backupPath}` : `已将非托管 AGENTS.md 备份到 ${backupPath}`);\n }\n }\n\n await atomicWrite(agentsPath, replaceManagedRegion(existingAgents, renderAgentsMd(scan, ctx.language)));\n await atomicWrite(configPath, await mergeFetConfig(configPath, renderFetConfig(scan, ctx.language)));\n await atomicWrite(claudePath, mergeKarpathyClaudeMd(existingClaude, ctx.language));\n await atomicWrite(karpathyHandoffPath, renderKarpathyFetHandoff(ctx.language));\n if (!existingKarpathyCursor || existingKarpathyCursor.includes(\"FET:MANAGED\")) {\n await atomicWrite(karpathyCursorPath, renderKarpathyCursorRule(ctx.language));\n } else {\n warnings.push(\n ctx.language === \"en\"\n ? \".cursor/rules/karpathy-guidelines.mdc exists and is not managed by FET; leaving it unchanged.\"\n : \".cursor/rules/karpathy-guidelines.mdc 已存在且不由 FET 托管,已保持不变。\"\n );\n }\n\n const placeholderCount = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (placeholderCount > 0) {\n warnings.push(renderAgentsPlaceholderWarning(placeholderCount, ctx.language));\n }\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.context = {\n agentsMdUpdatedAt: scan.generatedAt,\n configUpdatedAt: scan.generatedAt,\n scannerVersion: scan.scannerVersion\n };\n await ctx.stateStore.writeGlobal(state);\n\n return { warnings };\n}\n\nasync function confirmInitCanReplaceUnmanagedAgents(ctx: FetCommandContext): Promise<boolean> {\n if (ctx.command !== \"init\" || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and is not managed by FET. Continue now with the same effect as fet init --yes? [y/N] \"\n : \"AGENTS.md 已存在且不由 FET 托管。是否继续执行,效果等同于 fet init --yes?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"y\" || answer === \"yes\") {\n return true;\n }\n } finally {\n rl.close();\n }\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? \"fet init cancelled so you can handle AGENTS.md manually.\"\n : \"已取消 fet init,你可以先手动处理 AGENTS.md。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Review AGENTS.md, then rerun fet init or fet init --yes.\"\n : \"检查 AGENTS.md 后,手动重新运行 fet init 或 fet init --yes。\"\n });\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parseDocument } from \"yaml\";\n\nexport async function mergeFetConfig(configPath: string, renderedFetYaml: string): Promise<string> {\n const fetDoc = parseDocument(renderedFetYaml);\n const nextFet = fetDoc.get(\"fet\", true);\n\n let existing = \"\";\n try {\n existing = await readFile(configPath, \"utf8\");\n } catch {\n return renderedFetYaml;\n }\n\n const doc = parseDocument(existing || \"{}\");\n doc.set(\"fet\", nextFet);\n return doc.toString();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, parse } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const FET_VERSION = readPackageVersion();\n\nfunction readPackageVersion(): string {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n const root = parse(currentDir).root;\n\n while (true) {\n const packageJsonPath = join(currentDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\n if (typeof packageJson.version === \"string\" && packageJson.version.length > 0) {\n return packageJson.version;\n }\n throw new Error(`package.json 缺少有效的 version 字段: ${packageJsonPath}`);\n }\n\n if (currentDir === root) {\n throw new Error(\"无法定位 FET package.json\");\n }\n currentDir = dirname(currentDir);\n }\n}\n","export const AUTO_BEGIN = \"<!-- FET:BEGIN AUTO -->\";\nexport const AUTO_END = \"<!-- FET:END AUTO -->\";\nexport const USER_BEGIN = \"<!-- FET:BEGIN USER -->\";\nexport const USER_END = \"<!-- FET:END USER -->\";\n\nconst LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/;\n\nexport function hasManagedAutoRegion(content: string): boolean {\n return count(content, AUTO_BEGIN) === 1 && count(content, AUTO_END) === 1 && content.indexOf(AUTO_BEGIN) < content.indexOf(AUTO_END);\n}\n\nexport function hasInvalidManagedAutoRegion(content: string): boolean {\n const beginCount = count(content, AUTO_BEGIN);\n const endCount = count(content, AUTO_END);\n return beginCount !== endCount || beginCount > 1 || endCount > 1 || (beginCount === 1 && content.indexOf(AUTO_BEGIN) > content.indexOf(AUTO_END));\n}\n\nexport function replaceManagedRegion(existing: string | null, generated: string): string {\n if (!existing) {\n return generated;\n }\n\n const start = existing.indexOf(AUTO_BEGIN);\n const end = existing.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return generated;\n }\n\n const before = existing.slice(0, start);\n const after = existing.slice(end + AUTO_END.length);\n const existingAuto = extractAuto(existing);\n const generatedAuto = extractAuto(generated);\n return `${before}${AUTO_BEGIN}\\n${mergeAutoRegion(existingAuto, generatedAuto)}\\n${AUTO_END}${after}`;\n}\n\nfunction mergeAutoRegion(existingAuto: string, generatedAuto: string): string {\n const generatedSections = splitMarkdownSections(generatedAuto);\n const existingSections = new Map(splitMarkdownSections(existingAuto).map((section) => [sectionKey(section.heading), section]));\n if (!generatedSections.length || !existingSections.size) {\n return generatedAuto;\n }\n\n return generatedSections\n .map((section) => {\n const existing = existingSections.get(sectionKey(section.heading));\n if (existing && LLM_PLACEHOLDER_PATTERN.test(section.body) && !LLM_PLACEHOLDER_PATTERN.test(existing.body)) {\n return existing.raw.trim();\n }\n return section.raw.trim();\n })\n .join(\"\\n\\n\");\n}\n\nfunction sectionKey(heading: string): string {\n const normalized = heading.replace(/^##\\s+/, \"\").trim().toLowerCase();\n const aliases: Record<string, string> = {\n \"project snapshot\": \"snapshot\",\n \"项目快照\": \"snapshot\",\n workspaces: \"workspaces\",\n \"工作区\": \"workspaces\",\n commands: \"commands\",\n \"命令\": \"commands\",\n structure: \"structure\",\n \"结构\": \"structure\",\n routes: \"routes\",\n \"路由\": \"routes\",\n conventions: \"conventions\",\n \"约定\": \"conventions\",\n \"ai work guidelines\": \"ai-guidelines\",\n \"ai 工作指南\": \"ai-guidelines\",\n \"scanner metadata\": \"metadata\",\n \"扫描元数据\": \"metadata\",\n \"mini program\": \"miniprogram\",\n \"小程序\": \"miniprogram\",\n \"package size (filled by `fet fill-context`)\": \"miniprogram-size\",\n \"包体积(由 `fet fill-context` 扫描补充)\": \"miniprogram-size\",\n \"development constraints\": \"miniprogram-rules\",\n \"开发约束\": \"miniprogram-rules\",\n \"notes for ai\": \"notes\",\n \"给 ai 的备注\": \"notes\"\n };\n return aliases[normalized] ?? normalized;\n}\n\ninterface MarkdownSection {\n heading: string;\n body: string;\n raw: string;\n}\n\nfunction splitMarkdownSections(content: string): MarkdownSection[] {\n const matches = [...content.matchAll(/^## .+$/gm)];\n if (!matches.length) {\n return [];\n }\n\n return matches.map((match, index) => {\n const start = match.index ?? 0;\n const end = matches[index + 1]?.index ?? content.length;\n const raw = content.slice(start, end).trim();\n const newline = raw.indexOf(\"\\n\");\n const heading = newline === -1 ? raw.trim() : raw.slice(0, newline).trim();\n const body = newline === -1 ? \"\" : raw.slice(newline + 1).trim();\n return { heading, body, raw };\n });\n}\n\nfunction extractAuto(content: string): string {\n const start = content.indexOf(AUTO_BEGIN);\n const end = content.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return content.trim();\n }\n return content.slice(start + AUTO_BEGIN.length, end).trim();\n}\n\nfunction count(content: string, needle: string): number {\n return content.split(needle).length - 1;\n}\n","import type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport { renderMiniprogramPlaceholderSection } from \"./miniprogram-agents.js\";\nimport { AUTO_BEGIN, AUTO_END, USER_BEGIN, USER_END } from \"./markers.js\";\n\nexport function renderAgentsMd(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderAgentsMdEn(scan);\n }\n return renderAgentsMdZh(scan);\n}\n\nfunction renderAgentsMdZh(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# 项目上下文\n\n${AUTO_BEGIN}\n## 项目快照\n\n- 名称:${scan.project.name}\n- 包管理器:${scan.project.packageManager}(${scan.project.packageManagerConfidence})\n- 框架:${scan.project.framework.name}(${scan.project.framework.confidence})\n- 语言:${scan.project.language}\n- Monorepo:${scan.project.monorepo ? \"是\" : \"否\"}\n\n## 工作区\n\n| 名称 | 路径 | 来源 |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## 命令\n\n| 名称 | 命令 | 来源 |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## 结构\n\n[NEEDS LLM INPUT]\n\n## 路由\n\n| 路由 | 来源 | 置信度 |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## 约定\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"zh-CN\")}\n\n## AI 工作指南\n\n- 使用 FET 托管的 IDE 工作流时,优先参考 .fet/karpathy-guidelines.md 中的项目级指南。\n- 对 Codex,还应在存在时阅读 .codex/fet/karpathy-guidelines.md。\n- 这些指南低于用户最新请求和明确的 OpenSpec 产物。\n- 默认使用中文产出交互信息、计划文档和实现说明,除非用户另有明确要求。\n\n## 扫描元数据\n\n- 生成时间:${scan.generatedAt}\n- FET 版本:${FET_VERSION}\n- 扫描器版本:${scan.scannerVersion}\n- 警告:${scan.warnings.length ? scan.warnings.join(\"; \") : \"无\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## 给 AI 的备注\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n\nfunction renderAgentsMdEn(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# Project Context\n\n${AUTO_BEGIN}\n## Project Snapshot\n\n- Name: ${scan.project.name}\n- Package Manager: ${scan.project.packageManager} (${scan.project.packageManagerConfidence})\n- Framework: ${scan.project.framework.name} (${scan.project.framework.confidence})\n- Language: ${scan.project.language}\n- Monorepo: ${scan.project.monorepo ? \"yes\" : \"no\"}\n\n## Workspaces\n\n| Name | Path | Source |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## Commands\n\n| Name | Command | Source |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## Structure\n\n[NEEDS LLM INPUT]\n\n## Routes\n\n| Route | Source | Confidence |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## Conventions\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"en\")}\n\n## AI Work Guidelines\n\n- Prefer the project-level Andrej Karpathy inspired guidelines in .fet/karpathy-guidelines.md when using FET-managed IDE workflows.\n- For Codex, also read .codex/fet/karpathy-guidelines.md when present.\n- Treat those guidelines as secondary to the user's latest request and explicit OpenSpec artifacts.\n\n## Scanner Metadata\n\n- Generated At: ${scan.generatedAt}\n- FET Version: ${FET_VERSION}\n- Scanner Version: ${scan.scannerVersion}\n- Warnings: ${scan.warnings.length ? scan.warnings.join(\"; \") : \"none\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## Notes For AI\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n","import { stringify } from \"yaml\";\nimport type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function renderFetConfig(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n return stringify({\n fet: {\n schemaVersion: 1,\n generatedAt: scan.generatedAt,\n fetVersion: FET_VERSION,\n language,\n scannerVersion: scan.scannerVersion,\n project: {\n packageManager: scan.project.packageManager,\n packageManagerConfidence: scan.project.packageManagerConfidence,\n framework: scan.project.framework,\n language: scan.project.language,\n monorepo: scan.project.monorepo,\n workspaces: scan.project.workspaces\n },\n commands: scan.commands,\n validation: {\n monorepo: scan.project.monorepo,\n missing: {\n lint: \"warn\",\n typecheck: \"warn\",\n test: \"warn\"\n },\n workspaces: scan.project.workspaces\n },\n figmaGuard: {\n enabled: true,\n mode: \"require_before_ui\",\n onUncertainty: \"stop_and_ask\"\n },\n uiDisplayContract: {\n enabled: true\n },\n specLanguage: {\n style: \"layered_bilingual\",\n canonical: \"en\",\n notesLocale: \"zh-CN\",\n maintainZhNotesOnUpdate: true\n }\n }\n });\n}\n","import type { FetLanguage } from \"../language.js\";\n\nexport const KARPATHY_SKILLS_SOURCE = \"https://github.com/forrestchang/andrej-karpathy-skills\";\n\nconst BEGIN = \"<!-- FET:BEGIN ANDREJ-KARPATHY-SKILLS -->\";\nconst END = \"<!-- FET:END ANDREJ-KARPATHY-SKILLS -->\";\n\nexport function mergeKarpathyClaudeMd(existing: string | null, language: FetLanguage = \"zh-CN\"): string {\n const block = renderManagedBlock(renderKarpathyClaudeGuidelines(language));\n if (!existing || !existing.trim()) {\n return `${block}\\n`;\n }\n\n const start = existing.indexOf(BEGIN);\n const end = existing.indexOf(END);\n if (start !== -1 && end !== -1 && end > start) {\n return `${existing.slice(0, start)}${block}${existing.slice(end + END.length)}`;\n }\n\n return `${existing.replace(/\\s*$/, \"\")}\\n\\n${block}\\n`;\n}\n\nexport function renderKarpathyCursorRule(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Andrej Karpathy inspired coding guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\nalwaysApply: true\n---\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nexport function renderKarpathyFetHandoff(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nfunction renderManagedBlock(content: string): string {\n return `${BEGIN}\n${content}\n${END}`;\n}\n\nfunction renderKarpathyClaudeGuidelines(language: FetLanguage): string {\n return `# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}`;\n}\n\nexport function renderKarpathyGuidelinesBody(language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderKarpathyGuidelinesBodyEn();\n }\n return `来源:${KARPATHY_SKILLS_SOURCE}\n\n将这些项目级指南与 AGENTS.md、OpenSpec 产物和用户最新请求一起使用。\n\n## 编码前先思考\n\n- 编辑前说明重要假设。\n- 当歧义会改变实现时,先澄清。\n- 主动呈现取舍,不要静默选择高风险路径。\n- 当更简单的方案更适合请求时,明确提出。\n\n## 简洁优先\n\n- 用最小且清晰的改动解决请求的问题。\n- 避免猜测性功能、配置或抽象。\n- 不要为一次性代码创建抽象。\n- 优先删除自己改动引入的复杂度,而不是继续堆结构。\n\n## 精准编辑\n\n- 只修改直接服务于任务的文件和行。\n- 保持现有风格,即便你个人更偏好另一种模式。\n- 除非任务需要,不要顺手重构附近代码、注释或格式。\n- 只移除因自己改动而过时的死导入、变量或 helper。\n\n## 目标驱动执行\n\n- 把模糊工作转成具体成功标准。\n- 对 bug,优先准备复现测试或清晰验证,再做修复。\n- 对多步骤工作,保留简短计划并验证每个有意义的步骤。\n- 持续迭代,直到达到成功标准或明确遇到阻塞。\n\n这些指南在非平凡工作中刻意偏向谨慎而不是速度。明显的一行修复可以灵活判断,保持轻量。`;\n}\n\nfunction renderKarpathyGuidelinesBodyEn(): string {\n return `Source: ${KARPATHY_SKILLS_SOURCE}\n\nUse these project-level guidelines together with AGENTS.md, OpenSpec artifacts, and the user's latest request.\n\n## Think Before Coding\n\n- State important assumptions before editing.\n- Ask for clarification when ambiguity would change the implementation.\n- Surface tradeoffs instead of silently choosing a risky path.\n- Push back when a simpler approach better fits the request.\n\n## Simplicity First\n\n- Solve the requested problem with the smallest clear change.\n- Avoid speculative features, configuration, or abstraction.\n- Do not create abstractions for one-off code.\n- Prefer deleting complexity introduced by your own change over adding more structure.\n\n## Precise Edits\n\n- Touch only files and lines that directly serve the task.\n- Preserve existing style even when you personally prefer another pattern.\n- Do not refactor nearby code, comments, or formatting unless the task requires it.\n- Remove only dead imports, variables, or helpers made obsolete by your own change.\n\n## Goal-Driven Execution\n\n- Convert vague work into concrete success criteria.\n- For bugs, prefer a reproducing test or clear verification before the fix.\n- For multi-step work, keep a short plan and verify each meaningful step.\n- Continue iterating until the success criteria are met or a blocker is explicit.\n\nThese guidelines intentionally favor caution over speed for non-trivial work. For obvious one-line fixes, use judgment and stay lightweight.`;\n}\n","import { FET_VERSION } from \"../version.js\";\n\nexport function renderVerifyInstructions(changeId: string, generatedAt = new Date().toISOString()): string {\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${generatedAt}\nchangeId: ${changeId}\npurpose: manual-verify\n---\n\n# Verify Instructions\n\n请按顺序完成以下检查:\n\n1. 运行 OpenSpec 规范校验:\\`openspec verify\\`\n2. 按项目约定运行 lint、typecheck、test。\n3. 检查本次 change 的 \\`tasks.md\\` 是否与实现状态一致。\n\n完成后运行:\n\n\\`\\`\\`sh\nfet verify --done --change ${changeId}\n\\`\\`\\`\n`;\n}\n","import { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport const FIGMA_URL_PATTERN = /https?:\\/\\/(?:www\\.)?figma\\.com\\/(?:file|design|proto)\\/[^\\s)\\]\"'<>]+/gi;\n\nexport function figmaStopHandoffRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/figma-stop.md`;\n}\n\nexport function figmaApplyInstructionsRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/figma-apply-instructions.md`;\n}\n\nexport type FigmaGuardMode = \"stop_and_ask\" | \"require_before_ui\";\n\nexport function renderFigmaRequireBeforeUiBody(language: FetLanguage, changeId: string): string {\n const stopPath = figmaStopHandoffRelativePath(changeId);\n if (language === \"en\") {\n return `## Mandatory before any UI implementation\n\nComplete these steps **before** writing or editing UI code (components, pages, styles, layout):\n\n1. Read \\`${stopPath}\\` for detected Figma links and stop rules.\n2. Use **Figma MCP/API** (or an approved Figma tool) to read every linked frame/node referenced by this change.\n3. In your reply, briefly list design facts you confirmed from Figma (frames, colors, typography, spacing, components, states).\n4. Only then implement UI tasks from \\`tasks.md\\`.\n\n## Forbidden\n\n- Implementing or restyling UI without reading Figma when this change references design links\n- Filling gaps with \"common UI patterns\", guessed pixel values, or invented tokens\n- Marking UI tasks complete while design input is still unclear\n\n## When to stop and talk to the user\n\nFollow the stop rules in \\`${stopPath}\\`. Pause implementation, explain what failed, and ask for a viewable link, screenshots, or explicit permission to infer—do not continue UI work until the user answers or says to continue.`;\n }\n\n return `## 实施任何 UI 代码之前必须完成\n\n在编写或修改 UI 代码(组件、页面、样式、布局)**之前**,按顺序完成:\n\n1. 阅读 \\`${stopPath}\\` 中的 Figma 链接与停止规则。\n2. 使用 **Figma MCP/API**(或已配置的 Figma 工具)读取本 change 引用的每个画板/节点。\n3. 在回复中简要列出已从 Figma 确认的设计事实(画板、颜色、字号、间距、组件、状态等)。\n4. 完成以上步骤后,再按 \\`tasks.md\\` 实施 UI 任务。\n\n## 禁止\n\n- 本 change 已引用设计稿时,未读 Figma 就实现或改 UI 样式\n- 用「常见 UI 做法」、猜测的像素值或自创 token 填补空白\n- 设计输入仍不清晰就把 UI 任务标为完成\n\n## 何时必须停下并与用户沟通\n\n遵守 \\`${stopPath}\\` 中的停止规则。暂停实施,说明卡在哪一步,向用户索要可查看的链接、截图,或明确允许按某规则推断;在用户回答或明确表示继续之前,不要继续 UI 实现。`;\n}\n\nexport function renderChangeFigmaApplyInstructions(options: {\n changeId: string;\n generatedAt: string;\n urls: string[];\n sources: string[];\n language: FetLanguage;\n}): string {\n const linkList = options.urls.map((url) => `- ${url}`).join(\"\\n\");\n const title = options.language === \"en\" ? \"Figma apply gate (this change)\" : \"Figma 实施门禁(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET detected Figma links in this change. **UI work must follow the design**—read Figma first, do not invent styles. If access or design details fail, stop and coordinate with the user.\"\n : \"FET 在本 change 中检测到 Figma 链接。**UI 必须按设计稿实现**—先读 Figma,禁止自创样式;访问失败或细节不清时停下并与用户沟通。\";\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: figma-apply\n---\n\n# ${title}\n\n${intro}\n\n## Detected Figma links\n\n${linkList}\n\n${renderFigmaRequireBeforeUiBody(options.language, options.changeId)}\n\n${renderFigmaStopProtocolBody(options.language)}\n`;\n}\n\nexport function renderFigmaStopProtocolBody(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Stop immediately (do not write or change UI code) when\n\n- Figma MCP/API errors, 403, timeout, or empty node/selection\n- You cannot resolve the frame or node referenced in the change\n- Color, typography, spacing, radius, shadow, or layout cannot be determined from the design input\n- Component instances do not map to an agreed code component and the user has not chosen one\n- Interaction states (hover, disabled, loading, empty) are missing from the design\n\n## After stopping, ask the user\n\n1. What failed (permission, node, frame, token type)\n2. What you need: **viewable link**, **screenshot + short notes**, or **explicit permission to infer** (which rule)\n3. Do **not** continue UI implementation until the user clearly says to continue or answers the question\n\n## While uncertain\n\n- Do not fill gaps with \"common UI patterns\" or guessed pixel values\n- Prefer showing the blocking question over partial implementation`;\n }\n\n return `## 必须立即停止(不得继续编写或修改 UI 代码)当\n\n- Figma MCP/API 报错、403、超时,或节点/选区为空\n- 无法解析 change 中引用的画板或节点\n- 颜色、字号、间距、圆角、阴影、布局无法从设计输入中确定\n- 组件实例无法对应到已约定的代码组件,且用户未指定\n- 交互状态(hover、disabled、loading、空态等)在设计稿中缺失\n\n## 停止后必须询问用户\n\n1. 卡在哪一步(权限、节点、画板、哪类 token)\n2. 需要用户补充:**可查看的链接**、**截图 + 文字说明**,或 **明确允许按某规则推断**\n3. 在用户明确表示「继续」或回答问题之前,**不要**继续实现 UI\n\n## 存在不确定性时\n\n- 不要用「常见 UI 做法」或猜测的像素值填补空白\n- 优先向用户提问,而不是先写一版样式再改`;\n}\n\nexport function renderCursorFigmaStopRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"Stop UI work when Figma cannot be read reliably; ask the user before continuing\"\n : \"Figma 理解异常时停止 UI 实现并向用户确认后再继续\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when the user shares a Figma link, asks to implement from a design file, or uses Figma MCP/tools for UI work.\" : \"在用户分享 Figma 链接、要求按设计稿实现 UI,或使用 Figma MCP/工具时适用。\"}\n\n${renderFigmaStopProtocolBody(language)}\n\n${language === \"en\" ? \"If this change has `openspec/changes/<change-id>/.fet/figma-apply-instructions.md`, follow it before UI work. Also read `figma-stop.md` in the same folder for links and stop rules.\" : \"若当前 change 存在 `openspec/changes/<change-id>/.fet/figma-apply-instructions.md`,实施 UI 前必须遵守;同目录的 `figma-stop.md` 含链接列表与停止规则。\"}\n`;\n}\n\nexport function renderCodexFigmaStopGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# Figma stop protocol (Codex)\n\n${renderFigmaStopProtocolBody(language)}\n`;\n}\n\nexport function renderChangeFigmaStopHandoff(options: {\n changeId: string;\n generatedAt: string;\n urls: string[];\n sources: string[];\n language: FetLanguage;\n}): string {\n const linkList = options.urls.length\n ? options.urls.map((url) => `- ${url}`).join(\"\\n\")\n : options.language === \"en\"\n ? \"- (none detected in change artifacts; user may still reference Figma in chat)\"\n : \"- (change 产物中未检测到;用户仍可能在对话中提供 Figma)\";\n const sourceList = options.sources.length\n ? options.sources.map((source) => `- ${source}`).join(\"\\n\")\n : options.language === \"en\"\n ? \"- n/a\"\n : \"- 无\";\n\n const title = options.language === \"en\" ? \"Figma guard (this change)\" : \"Figma 守卫(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET detected Figma links in this change. When design input is unclear, **stop** and let the user decide whether to continue or clarify.\"\n : \"FET 在本 change 中检测到 Figma 链接。设计输入不清晰时,**停止**当前操作,由用户决定是继续还是补充说明。\";\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: figma-stop\n---\n\n# ${title}\n\n${intro}\n\n## Detected Figma links\n\n${linkList}\n\n## Sources\n\n${sourceList}\n\n${renderFigmaStopProtocolBody(options.language)}\n`;\n}\n\nexport function renderFigmaStopNextStep(changeId: string, language: FetLanguage): string {\n const path = figmaStopHandoffRelativePath(changeId);\n return language === \"en\"\n ? `Before UI implementation, read ${path}. If Figma access fails or design details are unclear, stop and ask the user—do not guess styles.`\n : `实施 UI 前阅读 ${path}。Figma 访问失败或设计细节不明确时立即停止并向用户提问,不要猜测样式。`;\n}\n\nexport function renderFigmaApplyNextSteps(changeId: string, language: FetLanguage, mode: FigmaGuardMode): string[] {\n const applyPath = figmaApplyInstructionsRelativePath(changeId);\n const stopPath = figmaStopHandoffRelativePath(changeId);\n if (mode === \"require_before_ui\") {\n return language === \"en\"\n ? [\n `Before any UI task: read and follow ${applyPath} (mandatory). Use Figma MCP/API for every linked frame—do not invent styles.`,\n `If Figma access fails or design details are unclear, stop per ${stopPath} and ask the user before continuing.`,\n `After Figma is confirmed, read openspec/changes/${changeId}/tasks.md and implement pending tasks.`\n ]\n : [\n `实施任何 UI 任务前:必须阅读并遵守 ${applyPath};用 Figma MCP/API 读取每个链接的画板,禁止自创样式。`,\n `Figma 访问失败或设计细节不清:按 ${stopPath} 立即停止并向用户提问,确认后再继续。`,\n `设计确认后,再阅读 openspec/changes/${changeId}/tasks.md 并实施待办任务。`\n ];\n }\n return [renderFigmaStopNextStep(changeId, language)];\n}\n","import { stringify } from \"yaml\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function uiDisplayContractRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/ui-display-contract.yaml`;\n}\n\nexport function uiFieldApplyInstructionsRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/ui-field-apply-instructions.md`;\n}\n\nexport interface UiDisplayContractScreen {\n id: string;\n title?: string;\n figmaUrls: string[];\n displayFields: string[];\n hiddenButUsed: string[];\n omittedFromUi: string[];\n needsReview: string[];\n}\n\nexport interface UiDisplayContractApiSchema {\n name: string;\n fields: string[];\n sourcePath: string;\n}\n\nexport interface UiDisplayContractDocument {\n schemaVersion: 1;\n fetVersion: string;\n generatedAt: string;\n changeId: string;\n purpose: \"ui-display-contract\";\n status: \"draft\";\n precedence: string[];\n sources: {\n figma: { urls: string[]; artifactPaths: string[] };\n api: Array<{ path: string; artifactPaths: string[]; schemas: UiDisplayContractApiSchema[] }>;\n };\n screens: UiDisplayContractScreen[];\n omittedCandidates: Array<{ field: string; schema?: string; reason: string }>;\n}\n\nexport function renderUiDisplayContractYaml(doc: UiDisplayContractDocument): string {\n return stringify(doc);\n}\n\nexport function renderUiFieldApplyInstructions(options: {\n changeId: string;\n generatedAt: string;\n contractPath: string;\n language: FetLanguage;\n hasFigma: boolean;\n hasApi: boolean;\n}): string {\n const title = options.language === \"en\" ? \"UI field apply gate (this change)\" : \"UI 字段实施门禁(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET generated a **UI display contract** draft. API docs are a superset; **only fields listed under `displayFields` may appear in the UI**. Figma defines what is visible; the contract records the binding.\"\n : \"FET 已生成 **UI 展示契约** 草案。接口文档是超集;**只有 `displayFields` 中的字段允许出现在界面上**。Figma 决定可见性;契约记录绑定关系。\";\n\n const steps =\n options.language === \"en\"\n ? `## Before binding API data to UI\n\n1. Read and update \\`${options.contractPath}\\` (confirm or fill \\`displayFields\\` per screen).\n2. ${options.hasFigma ? \"Use Figma MCP/API to list visible labels, columns, and form fields; map them to API field names in `displayFields`.\" : \"Infer visible fields from design artifacts in this change; document them in `displayFields`.\"}\n3. Move API fields that exist in docs but are **not** on the design into \\`omittedFromUi\\` (or \\`hiddenButUsed\\` if needed for logic without rendering).\n4. Resolve every entry in \\`needsReview\\` with the user before implementation.\n\n## Forbidden\n\n- Rendering every property from an API response type because it appears in OpenAPI/Swagger\n- Using \\`Object.keys(data)\\`, schema iteration, or generic \"show all fields\" table/form generators for user-facing UI\n- Adding columns or form inputs for fields not in \\`displayFields\\` unless the user explicitly expands the contract\n\n## Data vs presentation\n\n- **Data layer**: types, fetch, normalize may use the full API model.\n- **Presentation layer**: bind only \\`displayFields\\`; never surface \\`omittedFromUi\\` fields in lists, forms, cards, or detail views.`\n : `## 将 API 数据绑定到 UI 之前\n\n1. 阅读并更新 \\`${options.contractPath}\\`(按屏确认或填写 \\`displayFields\\`)。\n2. ${options.hasFigma ? \"用 Figma MCP/API 列出可见文案、表格列、表单项;映射到 API 字段名并写入 `displayFields`。\" : \"从本 change 的设计产物推断可见字段,写入 `displayFields`。\"}\n3. 接口文档有、设计稿**没有**的字段放入 \\`omittedFromUi\\`(仅逻辑使用且不可见则放入 \\`hiddenButUsed\\`)。\n4. \\`needsReview\\` 中每一项须在实施前与用户确认。\n\n## 禁止\n\n- 因 OpenAPI/Swagger 里有字段就在页面上全部展示\n- 对用户可见 UI 使用 \\`Object.keys(data)\\`、遍历 schema 或「自动展示全部字段」的表格/表单\n- 在 \\`displayFields\\` 未列入时新增列、表单项(除非用户明确扩展契约)\n\n## 数据层与展示层\n\n- **数据层**:类型、请求、normalize 可使用完整 API 模型。\n- **展示层**:只绑定 \\`displayFields\\`;\\`omittedFromUi\\` 中的字段不得出现在列表、表单、卡片、详情等可见区域。`;\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: ui-field-apply\n---\n\n# ${title}\n\n${intro}\n\n${steps}\n`;\n}\n\nexport function renderUiDisplayContractApplyNextSteps(changeId: string, language: FetLanguage): string[] {\n const contractPath = uiDisplayContractRelativePath(changeId);\n const applyPath = uiFieldApplyInstructionsRelativePath(changeId);\n if (language === \"en\") {\n return [\n `Read and confirm ${contractPath} before UI that binds API data (update displayFields from Figma; move extras to omittedFromUi).`,\n `Follow ${applyPath}: API schema is not a UI checklist—do not render undocumented fields.`,\n `After the contract is confirmed, implement tasks from openspec/changes/${changeId}/tasks.md.`\n ];\n }\n return [\n `在绑定 API 的 UI 实施前:阅读并确认 ${contractPath}(按 Figma 填写 displayFields;多余字段放入 omittedFromUi)。`,\n `遵守 ${applyPath}:接口文档不是 UI 清单,禁止展示契约未列出的字段。`,\n `契约确认后,再实施 openspec/changes/${changeId}/tasks.md 中的任务。`\n ];\n}\n\n/** One-line guardrail for command guides and slash prompts. */\nexport function renderUiDisplayContractGuardrail(language: FetLanguage): string {\n if (language === \"en\") {\n return \"- When a change has API docs and UI (especially with Figma), read `openspec/changes/<change-id>/.fet/ui-display-contract.yaml`. In `specs/**/spec.md`, add the UI display contract Requirement (see planning guide); API fields not in `displayFields` MUST NOT be rendered.\";\n }\n return \"- change 含接口文档且涉及 UI(尤其有 Figma)时,阅读 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml`;在 `specs/**/spec.md` 中写入 UI 展示契约 Requirement(见规划指引);未列入 `displayFields` 的接口字段禁止出现在界面上。\";\n}\n\nexport function renderPlanningArtifactUiContractBlock(language: FetLanguage, changeId: string): string {\n const contractPath = uiDisplayContractRelativePath(changeId);\n if (language === \"en\") {\n return `## UI display contract (when API + UI)\n\nIf this change renders API-backed UI (especially with Figma links), \\`${contractPath}\\` may exist or will be generated on \\`fet apply\\`. When writing \\`specs/<capability>/spec.md\\`, **add** this requirement (adjust screen ids as needed):\n\n\\`\\`\\`markdown\n### Requirement: UI displays only contracted fields\n<!-- 中文:界面只展示 ui-display-contract.yaml 中 displayFields 列出的字段;接口文档其余字段仅用于类型/数据层,不得出现在列表、表单、详情等可见 UI -->\n\nThe UI SHALL only render fields listed under \\`displayFields\\` for each screen in \\`${contractPath}\\`.\nFields documented in API/OpenAPI but absent from the design MUST be listed under \\`omittedFromUi\\` and MUST NOT appear in user-visible UI.\nThe system MAY use \\`hiddenButUsed\\` fields in logic without displaying them.\nOn conflict between API schema completeness and Figma/contract, **Figma + ui-display-contract win** for presentation.\n\\`\\`\\`\n\nUpdate \\`displayFields\\` / \\`omittedFromUi\\` in the contract in the **same edit** when requirements change.`;\n }\n\n return `## UI 展示契约(接口 + UI 时)\n\n若本 change 实施绑定接口的 UI(尤其含 Figma 链接),\\`${contractPath}\\` 可能已存在或在 \\`fet apply\\` 时生成。编写 \\`specs/<capability>/spec.md\\` 时**必须加入**如下 Requirement(按实际 screen 调整):\n\n\\`\\`\\`markdown\n### Requirement: UI displays only contracted fields\n<!-- 中文:界面只展示 ui-display-contract.yaml 中 displayFields 列出的字段;接口文档其余字段仅用于类型/数据层,不得出现在列表、表单、详情等可见 UI -->\n\nThe UI SHALL only render fields listed under \\`displayFields\\` for each screen in \\`${contractPath}\\`.\nFields documented in API/OpenAPI but absent from the design MUST be listed under \\`omittedFromUi\\` and MUST NOT appear in user-visible UI.\nThe system MAY use \\`hiddenButUsed\\` fields in logic without displaying them.\nOn conflict between API schema completeness and Figma/contract, **Figma + ui-display-contract win** for presentation.\n\\`\\`\\`\n\n修改 Requirement 时,**同一次编辑**须同步更新契约中的 \\`displayFields\\` / \\`omittedFromUi\\`。`;\n}\n\nexport function renderCursorUiDisplayContractRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"UI display contract: API schemas are not UI checklists; only displayFields may render\"\n : \"UI 展示契约:接口文档不是 UI 清单,仅 displayFields 可展示\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when implementing UI that binds API responses, or when `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` exists.\" : \"在实施绑定接口响应的 UI 时,或存在 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` 时适用。\"}\n\n${renderUiDisplayContractGuardrail(language)}\n\n${language === \"en\" ? \"Also read `ui-field-apply-instructions.md` in the same `.fet/` folder before UI work.\" : \"实施 UI 前同时阅读同目录 `.fet/ui-field-apply-instructions.md`。\"}\n`;\n}\n\nexport function renderCodexUiDisplayContractGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# UI display contract (Codex)\n\n${renderUiDisplayContractGuardrail(language)}\n\n${language === \"en\" ? \"Read `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` and `ui-field-apply-instructions.md` when applying UI tasks that use API data.\" : \"对使用接口数据的 UI 任务,阅读 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` 与 `ui-field-apply-instructions.md`。\"}\n`;\n}\n","import { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport { renderPlanningArtifactUiContractBlock } from \"./ui-display-contract.js\";\n\nexport const SPEC_STYLE_LAYERED_BILINGUAL = \"layered_bilingual\" as const;\n\n/** One-line guardrail for command guides and slash prompts. */\nexport function renderSpecArtifactGuardrail(language: FetLanguage): string {\n if (language === \"en\") {\n return \"- When creating or editing `openspec/changes/<change-id>/specs/**/spec.md` (or merging into `openspec/specs/**/spec.md`), keep English Requirements/Scenario headings and normative text; add or update the paired `<!-- 中文:... -->` note on the same edit—never leave stale Chinese notes.\";\n }\n return \"- 创建或修改 `openspec/changes/<change-id>/specs/**/spec.md`(或合并到 `openspec/specs/**/spec.md`)时:Requirements/Scenario 标题与 normative 句保持英文;**同一次编辑**必须新增或更新对应的 `<!-- 中文:... -->` 说明,禁止留下过时中文注释。\";\n}\n\nexport function renderSpecLanguagePolicyBody(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Layered bilingual spec (canonical English + Chinese notes)\n\nThis project uses **layered_bilingual** OpenSpec specs (see \\`fet.specLanguage\\` in \\`openspec/config.yaml\\`).\n\n### Structure\n\n- **English (canonical)**: Keep OpenSpec section titles (\\`## Requirements\\`, \\`### Requirement:\\`, \\`#### Scenario:\\`) and normative sentences (SHALL/MUST, acceptance criteria) in English.\n- **Chinese (human notes)**: Immediately after each \\`### Requirement:\\` line (before the English body), add one HTML comment:\n\n\\`\\`\\`markdown\n### Requirement: User can export report\n<!-- 中文:登录用户可在报表页导出 PDF;需具备 export 权限;失败时提示原因 -->\n\nThe system SHALL ...\n\\`\\`\\`\n\nOptionally add \\`<!-- 中文:... -->\\` after \\`#### Scenario:\\` when the scenario needs extra business context.\n\n### When creating or updating specs\n\n- **Same edit rule**: Any change to English normative text MUST update the paired Chinese comment in the **same** commit/edit session.\n- **Do not** remove Chinese notes when refactoring English unless the requirement was removed.\n- **Do not** let Chinese notes contradict English; if they disagree, fix both or ask the user. **On conflict, English Requirements win.**\n- **proposal.md** / **design.md** may be Chinese; **tasks.md** may be Chinese with English identifiers.\n\n### Applies to\n\n- \\`fet propose\\`, \\`fet continue\\`, \\`fet ff\\` artifact writes\n- Manual edits to spec files in chat\n- \\`fet sync\\` merges into \\`openspec/specs/**/spec.md\\` (preserve or refresh Chinese notes for touched requirements)`;\n }\n\n return `## 分层双语 spec(英文规范 + 中文说明)\n\n本项目 OpenSpec spec 采用 **layered_bilingual**(见 \\`openspec/config.yaml\\` 的 \\`fet.specLanguage\\`)。\n\n### 结构\n\n- **英文(权威)**:保留 OpenSpec 章节标题(\\`## Requirements\\`、\\`### Requirement:\\`、\\`#### Scenario:\\`)与 normative 语句(SHALL/MUST、验收条件)。\n- **中文(给人读)**:在每个 \\`### Requirement:\\` 标题行之后、英文正文之前,添加一条 HTML 注释:\n\n\\`\\`\\`markdown\n### Requirement: User can export report\n<!-- 中文:登录用户可在报表页导出 PDF;需具备 export 权限;失败时提示原因 -->\n\nThe system SHALL ...\n\\`\\`\\`\n\n若场景需要补充业务语境,可在 \\`#### Scenario:\\` 后同样添加 \\`<!-- 中文:... -->\\`。\n\n### 创建或更新 spec 时(含 LLM 改文档)\n\n- **同次编辑原则**:修改英文规范句时,**必须在同一次编辑中**同步更新对应的中文注释,不得遗留过时说明。\n- 重构英文时不要无故删除中文注释;若删除 Requirement,一并删除其注释。\n- 中文说明不得与英文矛盾;若有冲突,同时修正或询问用户。**冲突时以英文 Requirements 为准。**\n- **proposal.md** / **design.md** 可用中文;**tasks.md** 可用中文并保留英文标识符。\n\n### 适用场景\n\n- \\`fet propose\\`、\\`fet continue\\`、\\`fet ff\\` 写入的产物\n- 对话中手动修改 change 下 spec\n- \\`fet sync\\` 合并到 \\`openspec/specs/**/spec.md\\` 时,对触及的 Requirement 保留或刷新中文注释`;\n}\n\nexport function renderCursorSpecLanguageRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"Layered bilingual OpenSpec specs: English canonical text with synced Chinese HTML comments\"\n : \"OpenSpec 分层双语:英文规范 + 同步维护的中文注释\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when creating or editing OpenSpec spec files under `openspec/changes/` or `openspec/specs/`, or when running `fet propose` / `fet continue` / `fet ff` / `fet sync`.\" : \"在创建或编辑 `openspec/changes/`、`openspec/specs/` 下的 spec,或运行 `fet propose` / `fet continue` / `fet ff` / `fet sync` 时适用。\"}\n\n${renderSpecLanguagePolicyBody(language)}\n`;\n}\n\nexport function renderCodexSpecLanguageGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# OpenSpec spec language (layered bilingual)\n\n${renderSpecLanguagePolicyBody(language)}\n`;\n}\n\nexport function renderPlanningArtifactSpecBlock(language: FetLanguage, changeId?: string): string {\n const uiBlock =\n changeId !== undefined\n ? `\\n\\n${renderPlanningArtifactUiContractBlock(language, changeId)}`\n : \"\";\n\n if (language === \"en\") {\n return `## OpenSpec spec artifacts\n\nWhen the artifact is \\`specs/<capability>/spec.md\\` (or you edit spec files in this change):\n\n1. Follow \\`.cursor/rules/fet-spec-language.mdc\\` or \\`.codex/fet/spec-language.md\\`.\n2. English Requirements/Scenario + \\`<!-- 中文:... -->\\` after each Requirement title.\n3. Update Chinese notes in the **same edit** whenever English normative text changes.${uiBlock}`;\n }\n return `## OpenSpec spec 产物\n\n当产物为 \\`specs/<capability>/spec.md\\`(或你在本 change 中修改 spec)时:\n\n1. 遵守 \\`.cursor/rules/fet-spec-language.mdc\\` 或 \\`.codex/fet/spec-language.md\\`。\n2. 英文 Requirements/Scenario + 每个 Requirement 标题后加 \\`<!-- 中文:... -->\\`。\n3. 英文规范句有任何变动时,**同一次编辑**必须同步更新对应中文注释。${uiBlock}`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { ensureChangeFigmaStopHandoff } from \"../figma-guard.js\";\nimport { buildWorkflowGraphContext, type GraphContextResult } from \"../graph-context.js\";\nimport { ensureChangeUiDisplayContract } from \"../ui-display-contract.js\";\nimport { renderFigmaApplyNextSteps, renderFigmaStopNextStep } from \"../templates/figma-guard.js\";\nimport { renderUiDisplayContractApplyNextSteps } from \"../templates/ui-display-contract.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\n\nconst phaseByCommand: Record<string, ChangePhase> = {\n explore: \"explore\",\n propose: \"propose\",\n new: \"propose\",\n continue: \"propose\",\n ff: \"propose\",\n apply: \"implement\",\n verify: \"verify\",\n sync: \"sync\",\n archive: \"archive\",\n \"bulk-archive\": \"archive\",\n onboard: \"explore\"\n};\n\nexport async function proxyCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n await artifactWorkflowCommand(ctx, command, args);\n return;\n }\n if (command === \"apply\") {\n await applyWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"explore\") {\n await exploreWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"sync\") {\n await syncWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"bulk-archive\") {\n await bulkArchiveWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"onboard\") {\n await onboardWorkflowCommand(ctx);\n return;\n }\n\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n await assertOpenSpecCommandSupported(ctx, mapped.command, command);\n const mappedChangeId = extractChangeId(mapped.args);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? mappedChangeId) : (ctx.changeId ?? mappedChangeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: mapped.args,\n changeId: targetChangeId\n });\n\n const changelogEntry = command === \"archive\" && targetChangeId ? await createChangelogEntry(ctx.projectRoot, targetChangeId) : null;\n const result = await ctx.openSpec.run(mapped.command, mapped.args, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result,\n recoverable: true\n });\n }\n\n if (changelogEntry) {\n await appendChangelog(ctx.projectRoot, changelogEntry);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (command === \"archive\") {\n if (!state.activeChangeId || state.activeChangeId === targetChangeId || !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n } else if (ctx.changeId && inspection.changes.includes(ctx.changeId)) {\n state.activeChangeId = ctx.changeId;\n } else if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n } else if (!state.activeChangeId && inspection.changes.length === 1) {\n state.activeChangeId = inspection.changes[0] ?? null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n const changeId = ctx.changeId ?? state.activeChangeId;\n if (changeId && inspection.changes.includes(changeId)) {\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n changeState.currentPhase = phaseByCommand[command] ?? changeState.currentPhase;\n changeState.phases[changeState.currentPhase] = {\n status: \"done\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: mapped.command,\n args: mapped.args,\n exitCode: result.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n }\n });\n\n const graphContext = runState.graphContext;\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} completed.`,\n warnings: graphContext?.warnings,\n nextSteps: graphContext?.generated && graphContext.path ? [`Read ${graphContext.path} before broad source scans or implementation decisions.`] : undefined,\n data: graphContext ? { graphContext } : undefined\n });\n}\n\ntype ArtifactWorkflowCommand = \"propose\" | \"continue\" | \"ff\";\n\ninterface OpenSpecArtifactStatus {\n id: string;\n outputPath: string;\n status: string;\n missingDeps?: string[];\n}\n\nasync function applyWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command: \"apply\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", \"apply\");\n await assertOpenSpecCommandSupported(ctx, \"instructions\", \"apply\");\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"apply\",\n args: [\"tasks\", \"--change\", changeId],\n changeId\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const tasks = status.artifacts?.find((artifact) => artifact.id === \"tasks\");\n const warnings =\n tasks && tasks.status !== \"complete\" && tasks.status !== \"ready\"\n ? [`OpenSpec reports tasks artifact as \"${tasks.status}\". Finish planning artifacts before implementation if tasks.md is missing.`]\n : undefined;\n\n const instructions = await runInstructions(ctx, changeId, \"tasks\");\n await syncWorkflowState(ctx, \"apply\", changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [\"tasks\", \"--change\", changeId],\n exitCode: instructions.exitCode,\n phaseStatus: \"in_progress\"\n });\n\n const [figmaGuard, uiContract] = await Promise.all([\n ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n }),\n ensureChangeUiDisplayContract({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language,\n fetVersion: ctx.fetVersion\n })\n ]);\n const applyNextSteps = [\n `Read openspec/changes/${changeId}/tasks.md and the instructions output.`,\n \"Implement pending tasks and update task checkboxes only after the work is done.\",\n `Run fet verify --change ${changeId}`\n ];\n if (uiContract) {\n applyNextSteps.unshift(...renderUiDisplayContractApplyNextSteps(changeId, ctx.language));\n }\n if (figmaGuard) {\n applyNextSteps.unshift(...renderFigmaApplyNextSteps(changeId, ctx.language, figmaGuard.mode));\n }\n\n ctx.output.result({\n ok: true,\n command: \"apply\",\n summary: `fet apply prepared implementation instructions for change \"${changeId}\".`,\n warnings: [...(runState.graphContext?.warnings ?? []), ...(warnings ?? [])],\n nextSteps: applyNextSteps,\n data: {\n changeId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext,\n figmaGuard: figmaGuard ?? undefined,\n uiDisplayContract: uiContract ?? undefined\n }\n });\n });\n}\n\nasync function exploreWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const changeId = ctx.changeId ?? (openSpecArgs[0] && isKebabId(openSpecArgs[0]) ? openSpecArgs[0] : null);\n const graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"explore\",\n args: openSpecArgs,\n changeId\n });\n\n const figmaGuard = changeId\n ? await ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n })\n : null;\n const exploreNextSteps = [\n \"Discuss the requirement, constraints, and acceptance criteria with the user.\",\n changeId ? `Run fet continue --change ${changeId} when ready to create the next artifact.` : \"Run fet propose <change-id-or-description> when ready to create a change.\"\n ];\n if (figmaGuard) {\n exploreNextSteps.unshift(renderFigmaStopNextStep(changeId!, ctx.language));\n }\n\n ctx.output.result({\n ok: true,\n command: \"explore\",\n summary: \"fet explore is an IDE-guided workflow for shaping OpenSpec changes.\",\n warnings: graphContext.warnings,\n nextSteps: exploreNextSteps,\n data: { changeId, args: openSpecArgs, graphContext, figmaGuard: figmaGuard ?? undefined }\n });\n}\n\nasync function syncWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const openSpecArgs = stripFetOptions(args);\n\n await withProjectLock(ctx.projectRoot, { command: \"sync\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertVerifiedChange(ctx, changeId);\n await assertOpenSpecCommandSupported(ctx, \"validate\", \"sync\");\n\n const validateArgs = [changeId, \"--type\", \"change\", ...openSpecArgs.filter((arg) => arg !== changeId)];\n const result = await ctx.openSpec.run(\"validate\", validateArgs, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec validate failed during fet sync.\",\n details: result,\n recoverable: true\n });\n }\n\n await syncWorkflowState(ctx, \"sync\", changeId, {\n openSpecCommand: \"validate\",\n openSpecArgs: validateArgs,\n exitCode: result.exitCode,\n phaseStatus: \"done\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"sync\",\n summary: `fet sync validated change \"${changeId}\". OpenSpec 1.3.x applies spec updates during archive.`,\n nextSteps: [`Run fet archive --change ${changeId} when you are ready to archive and update main specs.`],\n data: ctx.json ? { changeId, validate: result } : { changeId }\n });\n });\n}\n\nasync function bulkArchiveWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const targets = [...new Set([...(ctx.changeId ? [ctx.changeId] : []), ...openSpecArgs.filter((arg) => !arg.startsWith(\"-\"))])];\n if (!targets.length) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"fet bulk-archive requires explicit change ids with the current OpenSpec CLI.\",\n suggestedCommand: \"fet bulk-archive --change <change-id>\"\n });\n }\n\n await withProjectLock(ctx.projectRoot, { command: \"bulk-archive\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"archive\", \"bulk-archive\");\n const archived: string[] = [];\n for (const changeId of targets) {\n await assertVerifiedChange(ctx, changeId);\n const changelogEntry = await createChangelogEntry(ctx.projectRoot, changeId);\n const result = await ctx.openSpec.run(\"archive\", [changeId], { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec archive failed for \"${changeId}\".`,\n details: result,\n recoverable: true\n });\n }\n await appendChangelog(ctx.projectRoot, changelogEntry);\n archived.push(changeId);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"bulk-archive\",\n summary: `fet bulk-archive archived ${archived.length} change(s) via OpenSpec archive.`,\n nextSteps: inspection.changes.length ? [`Remaining open changes: ${inspection.changes.join(\", \")}`] : undefined,\n data: { archived, openChangeIds: inspection.changes }\n });\n });\n}\n\nasync function onboardWorkflowCommand(ctx: FetCommandContext): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"onboard\",\n summary: \"fet onboard loaded local FET/OpenSpec workflow context.\",\n nextSteps: [\n inspection.changes.length ? `Open changes: ${inspection.changes.join(\", \")}` : \"No open changes found. Run fet propose <change-id-or-description> to start one.\",\n \"Use fet continue to prepare planning artifacts, fet apply for implementation instructions, fet verify before archive.\"\n ],\n data: { activeChangeId: state.activeChangeId, openChangeIds: inspection.changes, archivedChangeIds: inspection.archived }\n });\n}\n\ninterface OpenSpecStatusResult {\n changeName: string;\n schemaName?: string;\n isComplete?: boolean;\n applyRequires?: string[];\n artifacts?: OpenSpecArtifactStatus[];\n}\n\nasync function artifactWorkflowCommand(ctx: FetCommandContext, command: ArtifactWorkflowCommand, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", command);\n await assertOpenSpecCommandSupported(ctx, \"instructions\", command);\n if (command === \"propose\") {\n await assertOpenSpecCommandSupported(ctx, \"new\", command);\n }\n\n const changeId = command === \"propose\" ? await ensureProposedChange(ctx, openSpecArgs) : await requireChangeId(ctx);\n const artifactId = command === \"continue\" ? await resolveArtifactId(ctx, changeId, openSpecArgs[0]) : await resolveArtifactId(ctx, changeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: artifactId ? [artifactId, \"--change\", changeId] : [\"--change\", changeId],\n changeId\n });\n\n const instructions = await runInstructions(ctx, changeId, artifactId);\n await syncWorkflowState(ctx, command, changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [artifactId, \"--change\", changeId],\n exitCode: instructions.exitCode\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const [figmaGuard, uiContract] = await Promise.all([\n ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n }),\n ensureChangeUiDisplayContract({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language,\n fetVersion: ctx.fetVersion\n })\n ]);\n const planningNextSteps = [\n `Create or update openspec/changes/${changeId}/${resolveOutputPath(status, artifactId)}`,\n \"Review the artifact with the user before generating the next planning file.\",\n `Run fet passthrough status --change ${changeId}`,\n status.isComplete ? `Run fet apply --change ${changeId}` : `Run fet continue --change ${changeId} when ready for the next artifact`\n ];\n if (uiContract) {\n planningNextSteps.unshift(\n ctx.language === \"en\"\n ? `If writing specs for API-backed UI, add the UI display contract Requirement; draft at ${uiContract.contractPath}.`\n : `若编写绑定接口的 UI spec,须加入 UI 展示契约 Requirement;草案见 ${uiContract.contractPath}。`\n );\n }\n if (figmaGuard) {\n planningNextSteps.unshift(renderFigmaStopNextStep(changeId, ctx.language));\n }\n\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} prepared OpenSpec artifact \"${artifactId}\" for change \"${changeId}\".`,\n warnings: runState.graphContext?.warnings,\n nextSteps: planningNextSteps,\n data: {\n changeId,\n artifactId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext,\n figmaGuard: figmaGuard ?? undefined,\n uiDisplayContract: uiContract ?? undefined\n }\n });\n });\n}\n\nasync function ensureProposedChange(ctx: FetCommandContext, args: string[]): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const existing = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const explicit = args[0];\n if (!explicit) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id or short description is required for fet propose.\",\n suggestedCommand: \"fet propose <change-id-or-description>\"\n });\n }\n\n const input = args.join(\" \").trim();\n const changeId = isKebabId(input) ? input : toKebabId(input);\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"Unable to derive a valid OpenSpec change id from the proposal input.\",\n details: { input },\n suggestedCommand: \"fet propose <kebab-case-change-id>\"\n });\n }\n\n if (existing.changes.includes(changeId)) {\n return changeId;\n }\n\n const createArgs = [\"change\", changeId];\n if (input && input !== changeId) {\n createArgs.push(\"--description\", input);\n }\n const result = await ctx.openSpec.run(\"new\", createArgs, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec new change failed.\",\n details: result,\n recoverable: true\n });\n }\n return changeId;\n}\n\nasync function resolveArtifactId(ctx: FetCommandContext, changeId: string, requestedArtifactId?: string): Promise<string> {\n const status = await readOpenSpecStatus(ctx, changeId);\n const artifacts = status.artifacts ?? [];\n if (requestedArtifactId) {\n const requested = artifacts.find((artifact) => artifact.id === requestedArtifactId);\n if (!requested) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" was not found for change \"${changeId}\".`,\n details: { changeId, requestedArtifactId, artifacts: artifacts.map((artifact) => artifact.id) },\n suggestedCommand: `fet passthrough status --change ${changeId} --json`\n });\n }\n if (requested.status !== \"ready\" && requested.status !== \"complete\") {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" is ${requested.status}, not ready.`,\n details: { changeId, requestedArtifactId, missingDeps: requested.missingDeps },\n suggestedCommand: `fet continue --change ${changeId}`\n });\n }\n return requestedArtifactId;\n }\n\n const next = artifacts.find((artifact) => artifact.status === \"ready\");\n if (!next) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `No ready OpenSpec artifact was found for change \"${changeId}\".`,\n details: { changeId, artifacts },\n suggestedCommand: status.isComplete ? `fet apply --change ${changeId}` : `fet passthrough status --change ${changeId} --json`\n });\n }\n return next.id;\n}\n\nasync function readOpenSpecStatus(ctx: FetCommandContext, changeId: string): Promise<OpenSpecStatusResult> {\n const result = await ctx.openSpec.run(\"status\", [\"--change\", changeId, \"--json\"], { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec status failed.\",\n details: result,\n recoverable: true\n });\n }\n try {\n return parseOpenSpecJson(result.stdout ?? \"{}\") as OpenSpecStatusResult;\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec status JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function runInstructions(ctx: FetCommandContext, changeId: string, artifactId: string): Promise<{ exitCode: number; data: unknown }> {\n const args = [artifactId, \"--change\", changeId, ...(ctx.json ? [\"--json\"] : [])];\n const result = await ctx.openSpec.run(\"instructions\", args, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.stdout && !ctx.json) {\n process.stdout.write(result.stdout.endsWith(\"\\n\") ? result.stdout : `${result.stdout}\\n`);\n }\n if (result.stderr && !ctx.json) {\n process.stderr.write(result.stderr.endsWith(\"\\n\") ? result.stderr : `${result.stderr}\\n`);\n }\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec instructions failed.\",\n details: result,\n recoverable: true\n });\n }\n if (!ctx.json) {\n return { exitCode: result.exitCode, data: null };\n }\n try {\n return { exitCode: result.exitCode, data: parseOpenSpecJson(result.stdout ?? \"{}\") };\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec instructions JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function syncWorkflowState(\n ctx: FetCommandContext,\n command: string,\n changeId: string,\n lastOpenSpecCommand: { openSpecCommand: string; openSpecArgs: string[]; exitCode: number; phaseStatus?: \"in_progress\" | \"done\" }\n): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (inspection.changes.includes(changeId)) {\n state.activeChangeId = changeId;\n }\n await ctx.stateStore.writeGlobal(state);\n\n if (!inspection.changes.includes(changeId)) {\n return;\n }\n\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n const phase = phaseByCommand[command] ?? \"propose\";\n changeState.currentPhase = phase;\n changeState.phases[phase] = {\n status: lastOpenSpecCommand.phaseStatus ?? \"in_progress\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: lastOpenSpecCommand.openSpecCommand,\n args: lastOpenSpecCommand.openSpecArgs,\n exitCode: lastOpenSpecCommand.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n}\n\nfunction resolveOutputPath(status: OpenSpecStatusResult, artifactId: string): string {\n return status.artifacts?.find((artifact) => artifact.id === artifactId)?.outputPath ?? `${artifactId}.md`;\n}\n\nfunction isKebabId(value: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);\n}\n\nfunction toKebabId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction parseOpenSpecJson(stdout: string): unknown {\n const trimmed = stdout.trim();\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n const starts = [objectStart, arrayStart].filter((index) => index >= 0);\n if (!starts.length) {\n return JSON.parse(trimmed || \"{}\");\n }\n return JSON.parse(trimmed.slice(Math.min(...starts)));\n}\n\nasync function assertOpenSpecCommandSupported(ctx: FetCommandContext, openSpecCommand: string, fetCommand: string): Promise<void> {\n const capabilities = await ctx.openSpec.getCapabilities();\n if (capabilities.commands.includes(openSpecCommand)) {\n return;\n }\n\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: `OpenSpec CLI ${capabilities.version} does not expose command \"${openSpecCommand}\" required by \"fet ${fetCommand}\". FET will not substitute another workflow command automatically.`,\n details: {\n openSpecVersion: capabilities.version,\n requiredCommand: openSpecCommand,\n availableCommands: capabilities.commands,\n supported: capabilities.supported\n },\n suggestedCommand:\n \"Upgrade OpenSpec to a version that supports this command, then rerun FET. Try: npm install -g @fission-ai/openspec@latest && fet doctor. If your OpenSpec version intentionally removed this command, pause and choose a compatible FET workflow instead of running ff automatically.\"\n });\n}\n\ninterface ChangelogEntry {\n updateTime: string;\n content: string;\n}\n\nasync function createChangelogEntry(projectRoot: string, changeId: string): Promise<ChangelogEntry> {\n return {\n updateTime: formatLocalTimestamp(new Date()),\n content: await readChangeRequirement(projectRoot, changeId)\n };\n}\n\nasync function appendChangelog(projectRoot: string, entry: ChangelogEntry): Promise<void> {\n const changelogPath = join(projectRoot, \"CHANGELOG.md\");\n const existing = await readOptional(changelogPath);\n const legacyContentLabel = \"\\u66f4\\u65b0\\u5185\\u5bb9\";\n const block = `updateTime: ${entry.updateTime}\\nchangeRequirement:${entry.content}\\n${legacyContentLabel}:${entry.content}\\n`;\n const next = existing?.trimEnd() ? `${existing.trimEnd()}\\n\\n${block}` : block;\n await atomicWrite(changelogPath, next);\n}\n\nasync function readChangeRequirement(projectRoot: string, changeId: string): Promise<string> {\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const proposal = await readOptional(join(changeRoot, \"proposal.md\"));\n if (proposal) {\n return summarizeMarkdown(proposal);\n }\n const readme = await readOptional(join(changeRoot, \"README.md\"));\n if (readme) {\n return summarizeMarkdown(readme);\n }\n return changeId;\n}\n\nfunction summarizeMarkdown(content: string): string {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"<!--\") && !line.startsWith(\"---\"))\n .join(\" \");\n return normalized || \"No change requirement found.\";\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction formatLocalTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport async function passthroughCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n const result = await ctx.openSpec.run(command, stripFetOptions(args), { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result\n });\n }\n}\n\nfunction stripFetOptions(args: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--cwd\" || arg === \"--change\") {\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--cwd=\") || arg?.startsWith(\"--change=\")) {\n continue;\n }\n if (arg === \"--yes\" || arg === \"--json\" || arg === \"--verbose\" || arg === \"--no-color\") {\n continue;\n }\n if (arg) {\n result.push(arg);\n }\n }\n return result;\n}\n\nasync function mapOpenSpecCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<{ command: string; args: string[] }> {\n switch (command) {\n case \"propose\":\n case \"bulk-archive\":\n case \"explore\":\n case \"onboard\":\n return { command, args: withGlobalChange(ctx, args) };\n case \"continue\":\n case \"ff\":\n return { command, args: await withDefaultChange(ctx, args, true) };\n case \"apply\":\n case \"sync\":\n return { command, args: await withDefaultChange(ctx, args) };\n case \"new\":\n return { command: \"new\", args: args[0] === \"change\" ? args : [\"change\", ...args] };\n case \"archive\":\n return { command: \"archive\", args: [ctx.changeId ?? args[0] ?? (await requireChangeId(ctx)), ...args.slice(ctx.changeId ? 0 : 1)] };\n default:\n return { command, args };\n }\n}\n\nfunction withGlobalChange(ctx: FetCommandContext, args: string[]): string[] {\n return ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args;\n}\n\nasync function withDefaultChange(ctx: FetCommandContext, args: string[], allowWithArgs = false): Promise<string[]> {\n if (ctx.changeId) {\n return [\"--change\", ctx.changeId, ...args];\n }\n if (args.includes(\"--change\") || args.some((arg) => arg.startsWith(\"--change=\"))) {\n return args;\n }\n if (args.length > 0 && !allowWithArgs) {\n return args;\n }\n return [\"--change\", await requireChangeId(ctx), ...args];\n}\n\nfunction extractChangeId(args: string[]): string | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--change\") {\n return args[index + 1] ?? null;\n }\n if (arg?.startsWith(\"--change=\")) {\n return arg.slice(\"--change=\".length) || null;\n }\n }\n return null;\n}\n\nasync function requireChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n const state = await ctx.stateStore.getOrCreateGlobal();\n if (state.activeChangeId) {\n return state.activeChangeId;\n }\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"No unambiguous OpenSpec change id was found.\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"Pass --change <change-id>.\"\n });\n}\n\nasync function assertVerified(ctx: FetCommandContext): Promise<void> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n const changeId = ctx.changeId ?? global.activeChangeId;\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id is required before this command can check FET verification.\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\n await assertVerifiedChange(ctx, changeId);\n}\n\nasync function assertVerifiedChange(ctx: FetCommandContext, changeId: string): Promise<void> {\n const change = await ctx.stateStore.readChange(changeId);\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (!inspection.changes.includes(changeId)) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"The selected change does not exist in openspec/changes.\",\n details: { changeId, openChangeIds: inspection.changes },\n suggestedCommand: \"fet doctor\"\n });\n }\n if (change?.manualVerify?.status !== \"declared_done\") {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"This change has not been marked verified by FET.\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { parseDocument } from \"yaml\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport type { FetLanguage } from \"./language.js\";\nimport {\n FIGMA_URL_PATTERN,\n figmaApplyInstructionsRelativePath,\n figmaStopHandoffRelativePath,\n type FigmaGuardMode,\n renderChangeFigmaApplyInstructions,\n renderChangeFigmaStopHandoff\n} from \"./templates/figma-guard.js\";\nexport type { FigmaGuardMode } from \"./templates/figma-guard.js\";\n\nexport interface FigmaGuardConfig {\n enabled: boolean;\n mode: FigmaGuardMode;\n onUncertainty: \"stop_and_ask\";\n}\n\nexport interface FigmaGuardHandoffResult {\n path: string;\n applyInstructionsPath?: string;\n written: boolean;\n urls: string[];\n sources: string[];\n mode: FigmaGuardMode;\n}\n\nconst DEFAULT_CONFIG: FigmaGuardConfig = {\n enabled: true,\n mode: \"require_before_ui\",\n onUncertainty: \"stop_and_ask\"\n};\n\nexport async function loadFigmaGuardConfig(projectRoot: string): Promise<FigmaGuardConfig> {\n try {\n const raw = await readFile(join(projectRoot, \"openspec\", \"config.yaml\"), \"utf8\");\n const doc = parseDocument(raw);\n const fetNode = doc.get(\"fet\", true) as { get?: (key: string) => unknown } | undefined;\n const node = fetNode?.get?.(\"figmaGuard\") as { get?: (key: string) => unknown } | undefined;\n if (!node || typeof node.get !== \"function\") {\n return DEFAULT_CONFIG;\n }\n const enabled = node.get(\"enabled\");\n const modeRaw = node.get(\"mode\");\n const mode: FigmaGuardMode = modeRaw === \"stop_and_ask\" ? \"stop_and_ask\" : \"require_before_ui\";\n return {\n enabled: enabled === undefined ? true : Boolean(enabled),\n mode,\n onUncertainty: \"stop_and_ask\"\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport function extractFigmaUrls(content: string): string[] {\n const matches = content.match(FIGMA_URL_PATTERN) ?? [];\n return [...new Set(matches.map((url) => url.replace(/[.,;]+$/, \"\")))];\n}\n\nexport async function collectFigmaUrlsFromChange(projectRoot: string, changeId: string): Promise<{ urls: string[]; sources: string[] }> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const urls = new Set<string>();\n const sources: string[] = [];\n\n const candidates = [\"proposal.md\", \"tasks.md\", \"design.md\"];\n for (const name of candidates) {\n const filePath = join(changePath, name);\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractFigmaUrls(content);\n if (found.length) {\n sources.push(`openspec/changes/${changeId}/${name}`);\n for (const url of found) {\n urls.add(url);\n }\n }\n }\n\n const specsPath = join(changePath, \"specs\");\n for (const filePath of await listMarkdownFiles(specsPath)) {\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractFigmaUrls(content);\n if (found.length) {\n sources.push(relative(projectRoot, filePath).replaceAll(\"\\\\\", \"/\"));\n for (const url of found) {\n urls.add(url);\n }\n }\n }\n\n return { urls: [...urls], sources };\n}\n\nexport async function ensureChangeFigmaStopHandoff(options: {\n projectRoot: string;\n changeId: string;\n language: FetLanguage;\n enabled?: boolean;\n mode?: FigmaGuardMode;\n}): Promise<FigmaGuardHandoffResult | null> {\n const config =\n options.enabled === undefined\n ? await loadFigmaGuardConfig(options.projectRoot)\n : {\n enabled: options.enabled,\n mode: options.mode ?? \"require_before_ui\",\n onUncertainty: \"stop_and_ask\" as const\n };\n if (!config.enabled) {\n return null;\n }\n\n const { urls, sources } = await collectFigmaUrlsFromChange(options.projectRoot, options.changeId);\n if (!urls.length) {\n return null;\n }\n\n const generatedAt = new Date().toISOString();\n let written = false;\n\n const stopRelativePath = figmaStopHandoffRelativePath(options.changeId);\n const stopAbsolutePath = join(options.projectRoot, stopRelativePath);\n const stopContent = renderChangeFigmaStopHandoff({\n changeId: options.changeId,\n generatedAt,\n urls,\n sources,\n language: options.language\n });\n const existingStop = await readOptional(stopAbsolutePath);\n if (existingStop !== stopContent) {\n await atomicWrite(stopAbsolutePath, stopContent);\n written = true;\n }\n\n let applyInstructionsPath: string | undefined;\n if (config.mode === \"require_before_ui\") {\n applyInstructionsPath = figmaApplyInstructionsRelativePath(options.changeId);\n const applyAbsolutePath = join(options.projectRoot, applyInstructionsPath);\n const applyContent = renderChangeFigmaApplyInstructions({\n changeId: options.changeId,\n generatedAt,\n urls,\n sources,\n language: options.language\n });\n const existingApply = await readOptional(applyAbsolutePath);\n if (existingApply !== applyContent) {\n await atomicWrite(applyAbsolutePath, applyContent);\n written = true;\n }\n }\n\n return {\n path: stopRelativePath,\n applyInstructionsPath,\n written,\n urls,\n sources,\n mode: config.mode\n };\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n await walk(root, files);\n return files;\n}\n\nasync function walk(dir: string, files: string[]): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath, files);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n files.push(fullPath);\n }\n }\n } catch {\n return;\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n await stat(path);\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { parse, parseDocument } from \"yaml\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport { collectFigmaUrlsFromChange } from \"./figma-guard.js\";\nimport type { FetLanguage } from \"./language.js\";\nimport {\n renderUiDisplayContractYaml,\n renderUiFieldApplyInstructions,\n type UiDisplayContractApiSchema,\n type UiDisplayContractDocument,\n uiDisplayContractRelativePath,\n uiFieldApplyInstructionsRelativePath\n} from \"./templates/ui-display-contract.js\";\n\nexport interface UiDisplayContractConfig {\n enabled: boolean;\n}\n\nexport interface UiDisplayContractHandoffResult {\n contractPath: string;\n applyInstructionsPath: string;\n written: boolean;\n hasFigma: boolean;\n hasApi: boolean;\n apiFieldCount: number;\n}\n\nconst DEFAULT_CONFIG: UiDisplayContractConfig = {\n enabled: true\n};\n\nconst API_DOC_PATH_PATTERN =\n /(?:^|[\\s(`])([\\w./-]*(?:openapi|swagger|api-doc|api\\/docs)[\\w./-]*\\.(?:ya?ml|json))(?:[\\s)`.,;]|$)/gi;\nconst MARKDOWN_LINK_PATH_PATTERN = /\\[[^\\]]*\\]\\(([^)]+\\.(?:ya?ml|json))\\)/gi;\nconst BACKTICK_PATH_PATTERN = /`([^`]+\\.(?:ya?ml|json))`/gi;\nconst OPENAPI_BARE_PATTERN = /\\b(openapi\\.ya?ml|swagger\\.ya?ml|swagger\\.json)\\b/gi;\n\nexport async function loadUiDisplayContractConfig(projectRoot: string): Promise<UiDisplayContractConfig> {\n try {\n const raw = await readFile(join(projectRoot, \"openspec\", \"config.yaml\"), \"utf8\");\n const doc = parseDocument(raw);\n const fetNode = doc.get(\"fet\", true) as { get?: (key: string) => unknown } | undefined;\n const node = fetNode?.get?.(\"uiDisplayContract\") as { get?: (key: string) => unknown } | undefined;\n if (!node || typeof node.get !== \"function\") {\n return DEFAULT_CONFIG;\n }\n const enabled = node.get(\"enabled\");\n return {\n enabled: enabled === undefined ? true : Boolean(enabled)\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function collectApiSourcesFromChange(\n projectRoot: string,\n changeId: string\n): Promise<{ paths: string[]; sources: string[] }> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const paths = new Set<string>();\n const sources: string[] = [];\n\n const candidates = [\"proposal.md\", \"tasks.md\", \"design.md\"];\n for (const name of candidates) {\n const filePath = join(changePath, name);\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractApiDocPaths(content, projectRoot);\n if (found.length) {\n sources.push(`openspec/changes/${changeId}/${name}`);\n for (const path of found) {\n paths.add(path);\n }\n }\n }\n\n const specsPath = join(changePath, \"specs\");\n for (const filePath of await listMarkdownFiles(specsPath)) {\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractApiDocPaths(content, projectRoot);\n if (found.length) {\n sources.push(relative(projectRoot, filePath).replaceAll(\"\\\\\", \"/\"));\n for (const path of found) {\n paths.add(path);\n }\n }\n }\n\n return { paths: [...paths], sources };\n}\n\nexport function extractApiDocPaths(content: string, projectRoot: string): string[] {\n const found = new Set<string>();\n const patterns = [API_DOC_PATH_PATTERN, MARKDOWN_LINK_PATH_PATTERN, BACKTICK_PATH_PATTERN, OPENAPI_BARE_PATTERN];\n\n for (const pattern of patterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const raw = (match[1] ?? match[0]).trim().replace(/^[\"']|[\"']$/g, \"\");\n const normalized = normalizeRepoPath(raw, projectRoot);\n if (normalized) {\n found.add(normalized);\n }\n }\n }\n\n if (/\\b(openapi|swagger|接口文档|API\\s*文档)\\b/i.test(content)) {\n const common = [\"openapi.yaml\", \"openapi.yml\", \"docs/openapi.yaml\", \"swagger.yaml\", \"swagger.json\"];\n for (const candidate of common) {\n const normalized = normalizeRepoPath(candidate, projectRoot);\n if (normalized && existsSync(join(projectRoot, normalized))) {\n found.add(normalized);\n }\n }\n }\n\n return [...found];\n}\n\nexport async function extractOpenApiSchemas(\n projectRoot: string,\n relativePaths: string[]\n): Promise<UiDisplayContractApiSchema[]> {\n const schemas: UiDisplayContractApiSchema[] = [];\n\n for (const rel of relativePaths) {\n const absolute = join(projectRoot, rel);\n const content = await readOptional(absolute);\n if (!content) {\n continue;\n }\n let doc: unknown;\n try {\n doc = rel.endsWith(\".json\") ? JSON.parse(content) : parse(content);\n } catch {\n continue;\n }\n const names = collectOpenApiSchemaPropertyNames(doc);\n for (const [name, fields] of names) {\n if (fields.length) {\n schemas.push({ name, fields: [...new Set(fields)].sort(), sourcePath: rel });\n }\n }\n }\n\n return schemas;\n}\n\nexport function buildUiDisplayContractDocument(options: {\n changeId: string;\n generatedAt: string;\n fetVersion: string;\n figmaUrls: string[];\n figmaSources: string[];\n apiPaths: string[];\n apiSources: string[];\n apiSchemas: UiDisplayContractApiSchema[];\n}): UiDisplayContractDocument {\n const allApiFields = [...new Set(options.apiSchemas.flatMap((schema) => schema.fields))].sort();\n const screenId = options.figmaUrls.length ? \"primary\" : \"default\";\n\n const omittedCandidates = allApiFields.map((field) => {\n const schema = options.apiSchemas.find((item) => item.fields.includes(field))?.name;\n return {\n field,\n schema,\n reason:\n \"Listed in API/OpenAPI schema; not yet in displayFields—confirm with Figma before rendering in UI.\"\n };\n });\n\n return {\n schemaVersion: 1,\n fetVersion: options.fetVersion,\n generatedAt: options.generatedAt,\n changeId: options.changeId,\n purpose: \"ui-display-contract\",\n status: \"draft\",\n precedence: [\n \"ui-display-contract.yaml displayFields\",\n \"Figma visible elements\",\n \"API/OpenAPI schema (data layer and types only)\"\n ],\n sources: {\n figma: {\n urls: options.figmaUrls,\n artifactPaths: options.figmaSources\n },\n api: options.apiPaths.map((path) => ({\n path,\n artifactPaths: options.apiSources,\n schemas: options.apiSchemas.filter((schema) => schema.sourcePath === path)\n }))\n },\n screens: [\n {\n id: screenId,\n title: options.figmaUrls.length ? \"Primary screen (confirm id with design)\" : \"Default screen\",\n figmaUrls: options.figmaUrls,\n displayFields: [],\n hiddenButUsed: [],\n omittedFromUi: [],\n needsReview: allApiFields.length\n ? [\n `Fill displayFields for screen \"${screenId}\" from Figma before UI implementation.`,\n ...omittedCandidates.slice(0, 12).map((item) => `API field \"${item.field}\"—omit from UI or add to displayFields?`)\n ]\n : options.figmaUrls.length\n ? [`Fill displayFields for screen \"${screenId}\" from Figma MCP/API.`]\n : [\"Add API doc paths to change artifacts or confirm this change has no API-backed UI.\"]\n }\n ],\n omittedCandidates\n };\n}\n\nexport async function ensureChangeUiDisplayContract(options: {\n projectRoot: string;\n changeId: string;\n language: FetLanguage;\n fetVersion: string;\n enabled?: boolean;\n}): Promise<UiDisplayContractHandoffResult | null> {\n const config =\n options.enabled === undefined ? await loadUiDisplayContractConfig(options.projectRoot) : { enabled: options.enabled };\n if (!config.enabled) {\n return null;\n }\n\n const figma = await collectFigmaUrlsFromChange(options.projectRoot, options.changeId);\n const api = await collectApiSourcesFromChange(options.projectRoot, options.changeId);\n const hasFigma = figma.urls.length > 0;\n const hasApi = api.paths.length > 0;\n\n if (!hasFigma && !hasApi) {\n return null;\n }\n\n const apiSchemas = hasApi ? await extractOpenApiSchemas(options.projectRoot, api.paths) : [];\n const generatedAt = new Date().toISOString();\n const contractRelativePath = uiDisplayContractRelativePath(options.changeId);\n const applyRelativePath = uiFieldApplyInstructionsRelativePath(options.changeId);\n\n const doc = buildUiDisplayContractDocument({\n changeId: options.changeId,\n generatedAt,\n fetVersion: options.fetVersion,\n figmaUrls: figma.urls,\n figmaSources: figma.sources,\n apiPaths: api.paths,\n apiSources: api.sources,\n apiSchemas\n });\n\n const contractContent = renderUiDisplayContractYaml(doc);\n const contractAbsolutePath = join(options.projectRoot, contractRelativePath);\n const existingContract = await readOptional(contractAbsolutePath);\n let written = false;\n if (existingContract !== contractContent) {\n await atomicWrite(contractAbsolutePath, contractContent);\n written = true;\n }\n\n const applyContent = renderUiFieldApplyInstructions({\n changeId: options.changeId,\n generatedAt,\n contractPath: contractRelativePath,\n language: options.language,\n hasFigma,\n hasApi\n });\n const applyAbsolutePath = join(options.projectRoot, applyRelativePath);\n const existingApply = await readOptional(applyAbsolutePath);\n if (existingApply !== applyContent) {\n await atomicWrite(applyAbsolutePath, applyContent);\n written = true;\n }\n\n return {\n contractPath: contractRelativePath,\n applyInstructionsPath: applyRelativePath,\n written,\n hasFigma,\n hasApi,\n apiFieldCount: apiSchemas.reduce((sum, schema) => sum + schema.fields.length, 0)\n };\n}\n\nfunction collectOpenApiSchemaPropertyNames(doc: unknown): Map<string, string[]> {\n const result = new Map<string, string[]>();\n if (!doc || typeof doc !== \"object\") {\n return result;\n }\n const root = doc as Record<string, unknown>;\n const components = root.components as Record<string, unknown> | undefined;\n const schemas = components?.schemas as Record<string, unknown> | undefined;\n if (schemas && typeof schemas === \"object\") {\n for (const [name, schema] of Object.entries(schemas)) {\n const fields = propertyNamesFromSchema(schema);\n if (fields.length) {\n result.set(name, fields);\n }\n }\n }\n return result;\n}\n\nfunction propertyNamesFromSchema(schema: unknown, depth = 0): string[] {\n if (!schema || typeof schema !== \"object\" || depth > 4) {\n return [];\n }\n const node = schema as Record<string, unknown>;\n if (node.$ref && typeof node.$ref === \"string\") {\n return [];\n }\n const properties = node.properties as Record<string, unknown> | undefined;\n if (properties && typeof properties === \"object\") {\n return Object.keys(properties).sort();\n }\n if (node.items) {\n return propertyNamesFromSchema(node.items, depth + 1);\n }\n if (node.allOf && Array.isArray(node.allOf)) {\n return node.allOf.flatMap((part) => propertyNamesFromSchema(part, depth + 1));\n }\n return [];\n}\n\nfunction normalizeRepoPath(raw: string, projectRoot: string): string | null {\n const cleaned = raw.replace(/^\\.\\//, \"\").replaceAll(\"\\\\\", \"/\");\n if (!cleaned || cleaned.includes(\"..\")) {\n return null;\n }\n return cleaned;\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n await walk(root, files);\n return files;\n}\n\nasync function walk(dir: string, files: string[]): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath, files);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n files.push(fullPath);\n }\n }\n } catch {\n return;\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n await stat(path);\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { ProjectIdentity } from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function detectProjectIdentity(projectRoot: string): Promise<ProjectIdentity> {\n const [gitRoot, branch, headCommit] = await Promise.all([\n git(projectRoot, [\"rev-parse\", \"--show-toplevel\"]),\n git(projectRoot, [\"branch\", \"--show-current\"]),\n git(projectRoot, [\"rev-parse\", \"HEAD\"])\n ]);\n\n return {\n gitRoot,\n worktreePath: projectRoot,\n branch,\n headCommit\n };\n}\n\nasync function git(cwd: string, args: string[]): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { assertChangeState, assertGlobalState, createChangeState, createGlobalState } from \"./schema.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nexport class StateStore {\n constructor(\n private readonly projectRoot: string,\n private readonly fetVersion: string,\n private readonly project: ProjectIdentity\n ) {}\n\n async readGlobal(): Promise<GlobalState | null> {\n try {\n const value = JSON.parse(await readFile(this.globalPath(), \"utf8\"));\n assertGlobalState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateGlobal(): Promise<GlobalState> {\n return (await this.readGlobal()) ?? createGlobalState(this.fetVersion, this.project);\n }\n\n async writeGlobal(state: GlobalState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\"), { recursive: true });\n await atomicWrite(this.globalPath(), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n async readChange(changeId: string): Promise<ChangeState | null> {\n try {\n const value = JSON.parse(await readFile(this.changePath(changeId), \"utf8\"));\n assertChangeState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateChange(changeId: string, phase: ChangePhase): Promise<ChangeState> {\n return (await this.readChange(changeId)) ?? createChangeState(this.fetVersion, changeId, phase);\n }\n\n async writeChange(state: ChangeState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\", \"changes\", state.changeId), { recursive: true });\n await atomicWrite(this.changePath(state.changeId), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n private globalPath(): string {\n return join(this.projectRoot, \"openspec\", \"fet-state.json\");\n }\n\n private changePath(changeId: string): string {\n return join(this.projectRoot, \"openspec\", \"changes\", changeId, \"fet-state.json\");\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n","export const DEFAULT_LANGUAGE = \"zh-CN\" as const;\n\nexport type FetLanguage = \"zh-CN\" | \"en\";\n\nexport interface LanguageState {\n current: FetLanguage;\n updatedAt: string;\n}\n\nexport function normalizeLanguage(value: string | null | undefined): FetLanguage {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return DEFAULT_LANGUAGE;\n }\n if ([\"en\", \"en-us\", \"english\"].includes(normalized)) {\n return \"en\";\n }\n return DEFAULT_LANGUAGE;\n}\n\nexport function languageLabel(language: FetLanguage): string {\n return language === \"en\" ? \"English\" : \"中文\";\n}\n\nexport function languageInstruction(language: FetLanguage): string {\n return language === \"en\"\n ? \"Use English for FET interaction messages, generated handoff documents, and IDE prompt output unless the user asks otherwise.\"\n : \"除非用户另有明确要求,FET 的交互信息、生成的交接文档和 IDE 提示产出均使用中文。\";\n}\n","import { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { DEFAULT_LANGUAGE } from \"../language.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nconst phases: ChangePhase[] = [\"explore\", \"propose\", \"implement\", \"verify\", \"sync\", \"archive\"];\n\nexport function createGlobalState(fetVersion: string, project: ProjectIdentity): GlobalState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n createdAt: now,\n updatedAt: now,\n project,\n language: {\n current: DEFAULT_LANGUAGE,\n updatedAt: now\n },\n openspec: null,\n activeChangeId: null,\n openChangeIds: [],\n context: {\n agentsMdUpdatedAt: null,\n configUpdatedAt: null,\n scannerVersion: 1\n },\n toolAdapters: {},\n graph: {},\n verifyAuthorization: null,\n lastDoctor: null\n };\n}\n\nexport function createChangeState(fetVersion: string, changeId: string, phase: ChangePhase): ChangeState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n changeId,\n createdAt: now,\n updatedAt: now,\n currentPhase: phase,\n phases: Object.fromEntries(phases.map((item) => [item, { status: item === phase ? \"in_progress\" : \"not_started\" }])) as ChangeState[\"phases\"],\n tasks: {\n source: \"tasks.md\",\n completedIds: [],\n lastSyncedAt: null\n },\n manualVerify: null,\n lastOpenSpecCommand: null,\n warnings: []\n };\n}\n\nexport function assertGlobalState(value: unknown): asserts value is GlobalState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"全局状态 schema 不受支持\");\n }\n if (!isRecord(value.language)) {\n value.language = {\n current: DEFAULT_LANGUAGE,\n updatedAt: typeof value.updatedAt === \"string\" ? value.updatedAt : new Date().toISOString()\n };\n }\n if (typeof value.fetVersion !== \"string\" || !isRecord(value.project)) {\n throw corruptedState(\"全局状态缺少必填字段\");\n }\n}\n\nexport function assertChangeState(value: unknown): asserts value is ChangeState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"变更状态 schema 不受支持\");\n }\n if (typeof value.fetVersion !== \"string\" || typeof value.changeId !== \"string\") {\n throw corruptedState(\"变更状态缺少必填字段\");\n }\n}\n\nfunction unsupportedSchema(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateSchemaUnsupported,\n message,\n suggestedCommand: \"npm update -g @nick848/fet\"\n });\n}\n\nfunction corruptedState(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateCorrupted,\n message,\n suggestedCommand: \"fet doctor --fix\"\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readCompletedTaskIds(tasksPath: string): Promise<string[]> {\n let content: string;\n try {\n content = await readFile(tasksPath, \"utf8\");\n } catch {\n return [];\n }\n\n const completed: string[] = [];\n const pattern = /^\\s*[-*]\\s+\\[[xX]\\]\\s+([0-9]+(?:\\.[0-9]+)*)/gm;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content))) {\n if (match[1]) {\n completed.push(match[1]);\n }\n }\n return completed;\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport const DEFAULT_FET_PACKAGE_NAME = \"@nick848/fet\";\n\nexport interface NpmRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal: NodeJS.Signals | null;\n stdout?: string;\n stderr?: string;\n}\n\nexport interface FetUpdateInstallOptions {\n cwd: string;\n json: boolean;\n language: \"en\" | \"zh-CN\";\n info: (message: string) => void;\n}\n\nexport function getFetPackageName(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_PACKAGE_NAME?.trim() || DEFAULT_FET_PACKAGE_NAME;\n}\n\nexport function getNpmExecutable(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_NPM_EXECUTABLE?.trim() || (process.platform === \"win32\" ? \"npm.cmd\" : \"npm\");\n}\n\nexport async function resolveLatestFetVersion(\n packageName = getFetPackageName(),\n npmExecutable = getNpmExecutable()\n): Promise<string> {\n const override = process.env.FET_UPDATE_LATEST_VERSION?.trim();\n if (override) {\n return override;\n }\n\n const result = await runNpm(npmExecutable, [\"view\", packageName, \"version\", \"--json\"], {\n cwd: process.cwd(),\n stdio: \"pipe\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to check the latest FET version from npm.\",\n details: result,\n suggestedCommand: `${npmExecutable} view ${packageName} version`\n });\n }\n\n const version = parseNpmVersion(result.stdout ?? \"\");\n if (!version) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"npm returned an invalid FET version.\",\n details: { stdout: result.stdout }\n });\n }\n return version;\n}\n\nexport async function performFetUpdate(\n currentVersion: string,\n latestVersion: string,\n options: FetUpdateInstallOptions\n): Promise<{ packageName: string; installCommand: string }> {\n const packageName = getFetPackageName();\n const npmExecutable = getNpmExecutable();\n const installArgs = [\"install\", \"-g\", `${packageName}@latest`];\n\n if (!options.json) {\n options.info(\n options.language === \"en\"\n ? `Updating FET from ${currentVersion} to ${latestVersion}...`\n : `正在将 FET 从 ${currentVersion} 升级到 ${latestVersion}...`\n );\n }\n\n const result = await runNpm(npmExecutable, installArgs, {\n cwd: options.cwd,\n stdio: options.json ? \"pipe\" : \"inherit\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: options.language === \"en\" ? \"FET update failed.\" : \"FET 升级失败。\",\n details: result,\n suggestedCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n });\n }\n\n return {\n packageName,\n installCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n };\n}\n\nfunction parseNpmVersion(stdout: string): string | null {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" && parsed.length > 0 ? parsed : null;\n } catch {\n return trimmed;\n }\n}\n\nexport function runNpm(\n command: string,\n args: string[],\n options: { cwd: string; stdio: \"inherit\" | \"pipe\" }\n): Promise<NpmRunResult> {\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(command, args, {\n cwd: options.cwd,\n stdio: options.stdio,\n shell: process.platform === \"win32\"\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to run npm for FET update.\",\n details: { command, args },\n cause: error,\n suggestedCommand: `${command} ${args.join(\" \")}`\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const diff = leftVersion.main[index] - rightVersion.main[index];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n\n if (!leftVersion.prerelease.length && rightVersion.prerelease.length) {\n return 1;\n }\n if (leftVersion.prerelease.length && !rightVersion.prerelease.length) {\n return -1;\n }\n\n const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftVersion.prerelease[index];\n const rightPart = rightVersion.prerelease[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const diff = comparePrereleasePart(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(version: string): { main: [number, number, number]; prerelease: string[] } {\n const [withoutBuild] = version.trim().replace(/^v/i, \"\").split(\"+\");\n const [mainValue = \"\", prereleaseValue = \"\"] = withoutBuild.split(\"-\");\n const mainParts = mainValue.split(\".\").map((part) => Number.parseInt(part, 10));\n return {\n main: [\n Number.isFinite(mainParts[0]) ? mainParts[0] : 0,\n Number.isFinite(mainParts[1]) ? mainParts[1] : 0,\n Number.isFinite(mainParts[2]) ? mainParts[2] : 0\n ],\n prerelease: prereleaseValue ? prereleaseValue.split(\".\") : []\n };\n}\n\nfunction comparePrereleasePart(left: string, right: string): number {\n const leftNumber = /^\\d+$/.test(left) ? Number.parseInt(left, 10) : null;\n const rightNumber = /^\\d+$/.test(right) ? Number.parseInt(right, 10) : null;\n\n if (leftNumber !== null && rightNumber !== null) {\n return Math.sign(leftNumber - rightNumber);\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return left.localeCompare(right);\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { compareVersions, getFetPackageName, performFetUpdate, resolveLatestFetVersion } from \"../update/npm.js\";\n\nexport async function updateCommand(ctx: FetCommandContext): Promise<void> {\n const packageName = getFetPackageName();\n const latestVersion = await resolveLatestFetVersion(packageName);\n const currentVersion = ctx.fetVersion;\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET is already up to date (${currentVersion}).`\n : `FET 已是最新版 (${currentVersion})。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: false\n }\n });\n return;\n }\n\n const install = await performFetUpdate(currentVersion, latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET updated from ${currentVersion} to ${latestVersion}.`\n : `FET 已从 ${currentVersion} 升级到 ${latestVersion}。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: true,\n installCommand: install.installCommand\n }\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { renderVerifyInstructions } from \"../templates/index.js\";\n\nexport async function verifyCommand(ctx: FetCommandContext, options: { done?: boolean; auto?: boolean }): Promise<void> {\n if (options.auto) {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const plan = {\n schemaVersion: 1,\n packageManager: scan.project.packageManager,\n workspaces: [\n {\n name: \"root\",\n cwd: \".\",\n commands: Object.entries(scan.commands)\n .filter(([name]) => [\"lint\", \"typecheck\", \"test\"].includes(name))\n .map(([dimension, command]) => ({\n dimension,\n command: command.command,\n source: command.source,\n required: command.required,\n statusIfMissing: command.required ? \"fail\" : \"warn\"\n }))\n }\n ],\n missing: [\"lint\", \"typecheck\", \"test\"].filter((name) => !scan.commands[name])\n };\n if (ctx.yes) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.verifyAuthorization = {\n schemaVersion: 1,\n approvedAt: new Date().toISOString(),\n commandFingerprint: fingerprint(plan),\n packageManager: plan.packageManager,\n plan: plan.workspaces.flatMap((workspace) =>\n workspace.commands.map((command) => ({\n cwd: workspace.cwd,\n dimension: command.dimension,\n command: command.command,\n source: command.source,\n required: command.required\n }))\n )\n };\n await ctx.stateStore.writeGlobal(global);\n }\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: ctx.yes ? \"已确认 verify --auto 执行计划;MVP 暂不执行仓库脚本。\" : \"已生成 verify --auto 执行计划;MVP 暂不执行仓库脚本。\",\n warnings: plan.missing.map((name) => `未发现 ${name} 脚本,将在自动执行版本中按配置处理。`),\n data: plan,\n nextSteps: ctx.yes ? [\"当前版本请运行 fet verify 进入手动验证模式\"] : [\"审核执行计划\", \"确认计划后可运行 fet verify --auto --yes\", \"当前版本请运行 fet verify 进入手动验证模式\"]\n });\n return;\n }\n\n await withProjectLock(\n ctx.projectRoot,\n { command: \"verify\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n const changeId = await resolveChangeId(ctx);\n if (options.done) {\n await markDone(ctx, changeId);\n } else {\n await writeInstructions(ctx, changeId);\n }\n }\n );\n}\n\nasync function writeInstructions(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const generatedAt = new Date().toISOString();\n const dir = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\");\n const instructionsPath = join(dir, \"verify-instructions.md\");\n await mkdir(dir, { recursive: true });\n await atomicWrite(instructionsPath, renderVerifyInstructions(changeId, generatedAt));\n\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"in_progress\", updatedAt: generatedAt };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已生成手动验证指令。\",\n nextSteps: [`阅读 openspec/changes/${changeId}/.fet/verify-instructions.md`, `完成后运行 fet verify --done --change ${changeId}`]\n });\n}\n\nasync function markDone(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const declaredAt = new Date().toISOString();\n const instructionsPath = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\", \"verify-instructions.md\");\n const instructions = await readInstructions(instructionsPath, changeId);\n const instructionsGeneratedAt = readFrontMatterValue(instructions, \"generatedAt\") ?? declaredAt;\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"done\", updatedAt: declaredAt };\n state.manualVerify = {\n mode: \"manual\",\n status: \"declared_done\",\n declaredAt,\n instructionsPath: `openspec/changes/${changeId}/.fet/verify-instructions.md`,\n instructionsGeneratedAt,\n evidence: null\n };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已记录手动验证完成声明。\",\n nextSteps: [`fet sync --change ${changeId}`, `fet archive --change ${changeId}`]\n });\n}\n\nasync function assertChangeExists(ctx: FetCommandContext, changeId: string): Promise<void> {\n const inspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n if (!inspection.exists) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"指定的 change 不存在\",\n details: { changeId },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n }\n}\n\nasync function readInstructions(path: string, changeId: string): Promise<string> {\n try {\n await stat(path);\n const content = await readFile(path, \"utf8\");\n const fileChangeId = readFrontMatterValue(content, \"changeId\");\n if (fileChangeId !== changeId) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件与当前 change 不匹配\",\n details: { expected: changeId, actual: fileChangeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n return content;\n } catch (error) {\n if (error instanceof FetError) {\n throw error;\n }\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件不存在或无法读取\",\n details: { path },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n\nfunction readFrontMatterValue(content: string, key: string): string | null {\n const match = content.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n return match?.[1]?.trim() ?? null;\n}\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\nasync function resolveChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n if (global.activeChangeId) {\n return global.activeChangeId;\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"无法确定要验证的 change\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n}\n","import type { FetLanguage } from \"./language.js\";\n\nconst HIGH_COST_MODEL_PATTERNS = [\n /gpt[-_ ]?5\\.5/i,\n /glm[-_ ]?5(?:\\.1)?/i,\n /claude.*opus/i,\n /opus/i,\n /claude.*sonnet/i,\n /sonnet/i\n];\n\nconst MODEL_ENV_KEYS = [\"FET_IDE_MODEL\", \"FET_MODEL\", \"CODEX_MODEL\", \"CURSOR_MODEL\", \"OPENCODE_MODEL\", \"OPENAI_MODEL\", \"ANTHROPIC_MODEL\"];\n\nexport type ModelPolicyMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface DetectedModel {\n source: string;\n name: string;\n}\n\nexport interface ModelPolicyMismatch {\n command: string;\n detected: DetectedModel;\n recommended: \"high-cost\" | \"low-cost\";\n reason: string;\n}\n\nexport function detectCurrentModel(env: NodeJS.ProcessEnv = process.env): DetectedModel | null {\n for (const key of MODEL_ENV_KEYS) {\n const value = env[key]?.trim();\n if (value) {\n return { source: key, name: value };\n }\n }\n return null;\n}\n\nexport function isHighCostModel(model: string): boolean {\n return HIGH_COST_MODEL_PATTERNS.some((pattern) => pattern.test(model));\n}\n\nexport function getModelPolicyMode(env: NodeJS.ProcessEnv = process.env): ModelPolicyMode {\n const value = env.FET_MODEL_POLICY?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_MODEL_POLICY === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n return \"confirm\";\n}\n\nexport function getCommandModelPolicyMismatch(command: string, env: NodeJS.ProcessEnv = process.env): ModelPolicyMismatch | null {\n if (getModelPolicyMode(env) === \"off\") {\n return null;\n }\n\n const detected = detectCurrentModel(env);\n if (!detected) {\n return null;\n }\n\n const highCost = isHighCostModel(detected.name);\n if (command === \"apply\") {\n if (!highCost) {\n return {\n command,\n detected,\n recommended: \"high-cost\",\n reason: \"fet apply is the implementation phase and is recommended to use a high-capability/high-cost model.\"\n };\n }\n return null;\n }\n\n if (highCost) {\n return {\n command,\n detected,\n recommended: \"low-cost\",\n reason: `fet ${command} is not the implementation phase and is recommended to use a lower-cost model.`\n };\n }\n return null;\n}\n\nexport function formatModelPolicyMismatch(mismatch: ModelPolicyMismatch, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"Recommended models include GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet.\"\n : \"Recommended action: switch to a lower-cost model and reserve high-cost models for fet apply.\";\n return `${mismatch.reason} Detected ${mismatch.detected.source}=\"${mismatch.detected.name}\". ${switchHint}`;\n }\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"建议模型包括 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。\"\n : \"建议切换到低成本模型,把高成本模型留给 fet apply。\";\n const reason =\n mismatch.recommended === \"high-cost\"\n ? \"fet apply 属于实施阶段,建议使用高能力/高成本模型。\"\n : `fet ${mismatch.command} 不是实施阶段,建议使用低成本模型。`;\n return `${reason} 检测到 ${mismatch.detected.source}=\"${mismatch.detected.name}\"。${switchHint}`;\n}\n\nexport function renderIdeModelPolicy(command: string, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (command === \"apply\") {\n return \"Model policy: this command is recommended to run with a high-capability/high-cost model such as GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet. If the current IDE model is lower-cost, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n return \"Model policy: this command is recommended to run with a low-cost model. If the current IDE model is GPT-5.5, GLM-5.1, GLM-5, Claude Opus, Claude Sonnet, or another high-cost model, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n if (command === \"apply\") {\n return \"模型策略:该命令建议使用高能力/高成本模型运行,例如 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。若当前 IDE 模型能力较低,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n }\n\n return \"模型策略:该命令建议使用低成本模型运行。若当前 IDE 模型是 GPT-5.5、GLM-5.1、GLM-5、Claude Opus、Claude Sonnet 或其他高成本模型,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n}\n","import { resolve } from \"node:path\";\nimport { CodexAdapter, CursorAdapter } from \"../adapters/index.js\";\nimport { normalizeLanguage, type FetLanguage } from \"../language.js\";\nimport { DefaultOpenSpecAdapter } from \"../openspec/index.js\";\nimport { ProjectScanner } from \"../scanner/index.js\";\nimport { detectProjectIdentity, StateStore } from \"../state/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { OutputWriter } from \"./output.js\";\n\nexport interface GlobalOptions {\n cwd?: string;\n json?: boolean;\n verbose?: boolean;\n yes?: boolean;\n change?: string;\n lang?: string;\n}\n\nexport async function createCommandContext(command: string, options: GlobalOptions) {\n const projectRoot = resolve(options.cwd ?? process.cwd());\n const project = await detectProjectIdentity(projectRoot);\n const stateStore = new StateStore(projectRoot, FET_VERSION, project);\n const savedState = await stateStore.readGlobal();\n const language: FetLanguage = normalizeLanguage(options.lang ?? savedState?.language.current);\n const output = new OutputWriter(Boolean(options.json), language);\n\n return {\n command,\n cwd: projectRoot,\n projectRoot,\n isTty: Boolean(process.stdout.isTTY),\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n yes: Boolean(options.yes),\n changeId: options.change,\n language,\n explicitLanguage: options.lang !== undefined,\n fetVersion: FET_VERSION,\n output,\n stateStore,\n openSpec: new DefaultOpenSpecAdapter(),\n scanner: new ProjectScanner(),\n toolAdapters: [new CursorAdapter(), new CodexAdapter()]\n };\n}\n\nexport type FetCommandContext = Awaited<ReturnType<typeof createCommandContext>>;\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { codexCommandFiles, codexGuideFile, codexSlashPromptFiles } from \"./templates.js\";\n\ninterface CodexToolFile {\n path: string;\n content: string;\n managed: boolean;\n root?: \"project\" | \"codex-home\";\n}\n\nexport class CodexAdapter implements ToolAdapter {\n readonly tool = \"codex\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".codex\")) || await exists(join(projectRoot, \"AGENTS.md\")),\n reason: \"Codex adapter is available for projects that use AGENTS.md\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [\n ...[codexGuideFile(language), ...codexCommandFiles(language)].map((file) => ({\n ...file,\n managed: true,\n root: \"project\" as const\n })),\n ...codexSlashPromptFiles(language).map((file) => ({\n ...file,\n managed: true,\n root: \"codex-home\" as const\n }))\n ]\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Codex adapter file already exists and is not managed by FET\",\n details: { path: displayPath },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(displayPath);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `codex:${displayPath}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${displayPath} is missing`\n : !managed\n ? `${displayPath} exists but is not managed by FET`\n : !versionMatches\n ? `${displayPath} adapterVersion is stale`\n : `${displayPath} is managed by FET`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nfunction resolveTarget(projectRoot: string, file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return join(resolveCodexHome(), file.path);\n }\n return join(projectRoot, file.path);\n}\n\nfunction displayPathFor(file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return `$CODEX_HOME/${file.path.replaceAll(\"\\\\\", \"/\")}`;\n }\n return file.path;\n}\n\nfunction resolveCodexHome(): string {\n return process.env.FET_CODEX_HOME ?? process.env.CODEX_HOME ?? join(homedir(), \".codex\");\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","export const FET_WORKFLOW_COMMANDS = [\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n] as const;\n\nexport type FetWorkflowCommand = (typeof FET_WORKFLOW_COMMANDS)[number];\n\nexport const FET_GRAPH_COMMANDS = [\"graph-status\", \"graph-setup\", \"graph-init\", \"graph-refresh\", \"graph-doctor\", \"graph-handoff\"] as const;\n\nexport type FetGraphCommand = (typeof FET_GRAPH_COMMANDS)[number];\n\nexport const FET_ADAPTER_COMMANDS = [...FET_WORKFLOW_COMMANDS, \"update\", \"fill-context\", \"passthrough\", ...FET_GRAPH_COMMANDS] as const;\n\nexport type FetAdapterCommand = (typeof FET_ADAPTER_COMMANDS)[number];\n\nexport function renderFetAdapterUsage(command: FetAdapterCommand, args = \"[...args]\"): string {\n if (command.startsWith(\"graph-\")) {\n const subcommand = command.slice(\"graph-\".length);\n return `fet graph ${subcommand}${args ? ` ${args}` : \"\"}`;\n }\n if (command === \"passthrough\") {\n return `fet passthrough <openspec-command>${args ? ` ${args}` : \"\"}`;\n }\n return `fet ${command}${args ? ` ${args}` : \"\"}`;\n}\n","import { FET_VERSION } from \"../../version.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderCodexFigmaStopGuide } from \"../../templates/figma-guard.js\";\nimport { renderCodexUiDisplayContractGuide } from \"../../templates/ui-display-contract.js\";\nimport {\n renderCodexSpecLanguageGuide,\n renderPlanningArtifactSpecBlock,\n renderSpecArtifactGuardrail\n} from \"../../templates/spec-language.js\";\nimport { renderUiDisplayContractGuardrail } from \"../../templates/ui-display-contract.js\";\nimport { renderKarpathyGuidelinesBody } from \"../../templates/index.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function codexGuideFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n const body =\n language === \"en\"\n ? `# FET For Codex\n\n## Language\n\n${languageInstruction(language)}\n\nBefore doing FET or OpenSpec work in Codex, read:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- .codex/fet/figma-stop.md when implementing UI from Figma\n- .codex/fet/spec-language.md when writing or updating OpenSpec specs\n- openspec/changes/<change-id>/.fet/figma-apply-instructions.md before UI work when FET apply reports Figma links\n- .codex/fet/ui-display-contract.md when UI binds API data; openspec/changes/<change-id>/.fet/ui-display-contract.yaml when present\n- the active change files under openspec/changes/<change-id>/, when a change is selected\n\nIf GitNexus code graph context is available in the IDE or MCP tools, prefer it before broad repository scans. Use it to identify relevant modules, dependencies, and insertion points, then read only the concrete source files needed. If GitNexus is unavailable, continue with the normal FET/OpenSpec workflow.\n\nUse the terminal command \\`fet <command>\\` as the source of truth for workflow transitions. These files are Codex-readable guidance; they do not register native slash commands.\n\nCommand guides live in .codex/fet/commands/.\n`\n : `# Codex 的 FET 使用指南\n\n## 语言\n\n${languageInstruction(language)}\n\n在 Codex 中执行 FET 或 OpenSpec 工作前,先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- 按 Figma 实现 UI 时阅读 .codex/fet/figma-stop.md;有 figma-apply-instructions.md 时必须在改 UI 前完整执行\n- 编写或更新 spec 时阅读 .codex/fet/spec-language.md(英文规范 + 同次编辑维护中文注释)\n- 绑定接口的 UI 阅读 .codex/fet/ui-display-contract.md;存在 ui-display-contract.yaml 时实施前须确认 displayFields\n- 如果已选择 change,阅读 openspec/changes/<change-id>/ 下的当前产物\n\n如果 IDE 或 MCP 工具中可用 GitNexus 代码图上下文,先用它缩小仓库扫描范围;用图识别相关模块、依赖和插入点,再只读取需要确认行为的具体源码文件。GitNexus 不可用时,按普通 FET/OpenSpec 工作流继续。\n\n工作流流转以终端命令 \\`fet <command>\\` 为准。这些文件是给 Codex 阅读的指导,不注册原生 slash command。\n\n命令指南位于 .codex/fet/commands/。\n`;\n\n return {\n path: \".codex/fet/context.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n${body}`\n };\n}\n\nexport function codexFigmaStopFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/figma-stop.md\",\n content: renderCodexFigmaStopGuide(language)\n };\n}\n\nexport function codexSpecLanguageFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/spec-language.md\",\n content: renderCodexSpecLanguageGuide(language)\n };\n}\n\nexport function codexUiDisplayContractFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/ui-display-contract.md\",\n content: renderCodexUiDisplayContractGuide(language)\n };\n}\n\nexport function codexCommandFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return [\n codexKarpathyGuidelinesFile(language),\n codexFigmaStopFile(language),\n codexUiDisplayContractFile(language),\n codexSpecLanguageFile(language),\n ...FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.codex/fet/commands/${command}.md`,\n content: renderCommand(command, language)\n }))\n ];\n}\n\nexport function codexSlashPromptFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `prompts/fet-${command}.md`,\n content: renderSlashPrompt(command, language)\n }));\n}\n\nfunction codexKarpathyGuidelinesFile(language: FetLanguage): { path: string; content: string } {\n return {\n path: \".codex/fet/karpathy-guidelines.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`\n };\n}\n\nfunction renderCommand(command: FetAdapterCommand, language: FetLanguage): string {\n if (language !== \"en\") {\n return renderCommandZh(command);\n }\n if (command === \"fill-context\") {\n return renderFillContextCommand(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughCommand(language);\n }\n if (command.startsWith(\"graph-\")) {\n return renderGraphCommand(command, language);\n }\n\n const usage = renderFetAdapterUsage(command, \"\");\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run the FET ${command} workflow, first make sure the project context is loaded from AGENTS.md and openspec/config.yaml.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nIf the command needs a change id, pass it with \\`--change <change-id>\\` or use the active OpenSpec change from the user's request.\n\nAfter the command completes, report the important next steps from the FET output and keep any generated OpenSpec artifacts in the normal project workflow.\n`;\n}\n\nfunction renderCommandZh(command: FetAdapterCommand): string {\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"\");\n const title = commandTitleZh(command);\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n用于指导当前 IDE LLM 在用户确认下安装 GitNexus。\n\n先运行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n然后阅读 .fet/graph-setup.md,并以它作为安装任务书。只读检测命令可以直接运行;任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证。合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,报告失败命令、stderr 和下一步人工处理建议。\n`;\n }\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 用途\n\n${title}\n\n## 执行方式\n\n在执行前阅读 AGENTS.md、openspec/config.yaml、.codex/fet/karpathy-guidelines.md,以及当前 change 目录下已有的 OpenSpec 产物。\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n如果命令需要 change id,优先使用用户输入、\\`--change <change-id>\\`、FET active change 或唯一打开的 change。存在歧义时先询问用户。\n\n执行完成后,用中文总结关键输出、生成或更新的文件,以及下一步建议。\n`;\n}\n\nfunction renderPassthroughCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet passthrough <openspec-command>\nFET:END -->\n\n# fet passthrough\n\n${renderIdeModelPolicy(\"passthrough\", language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run an OpenSpec command that FET does not manage as a first-class workflow command, use FET passthrough instead of calling OpenSpec directly.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\nfet passthrough <openspec-command> [...args]\n\\`\\`\\`\n\nThis preserves the FET entry point while allowing access to unmanaged or newly added OpenSpec commands. Passthrough does not update FET lifecycle state.\n`;\n}\n\nfunction renderGraphCommand(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, \"\");\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nUse this command to guide IDE-assisted GitNexus installation with user approval.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nThen read .fet/graph-setup.md and follow it as the source of truth. You may run read-only detection commands directly. Before downloading software, installing globally, changing PATH, writing user-level files, or modifying IDE/MCP configuration, show the exact command and wait for user approval.\n\nAfter installation, verify \\`gitnexus --version\\`. If appropriate, continue with \\`fet graph init\\` and \\`fet graph handoff\\`. If installation fails, report the failing command, stderr, and next manual step.\n`;\n }\n const subcommand = command.slice(\"graph-\".length);\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to work with optional GitNexus graph support, use FET as the entry point.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nFor graph init or refresh, pass extra GitNexus analyze arguments only when the user provides them.\n\nAfter the command completes, report the GitNexus state, generated handoff files, and next steps.\n`;\n}\n\nfunction renderSlashPrompt(command: FetAdapterCommand, language: FetLanguage): string {\n if (command === \"ff\") {\n return renderFastForwardSlashPrompt(language);\n }\n if (language !== \"en\") {\n return renderSlashPromptZh(command);\n }\n if (command === \"propose\") {\n return renderProposeSlashPrompt(language);\n }\n if (command === \"continue\") {\n return renderContinueSlashPrompt(language);\n }\n if (command === \"explore\") {\n return renderExploreSlashPrompt(language);\n }\n if (command === \"new\") {\n return renderNewSlashPrompt(language);\n }\n if (command === \"apply\") {\n return renderApplySlashPrompt(language);\n }\n if (command === \"verify\") {\n return renderVerifySlashPrompt(language);\n }\n if (command === \"sync\") {\n return renderSyncSlashPrompt(language);\n }\n if (command === \"archive\") {\n return renderArchiveSlashPrompt(language);\n }\n if (command === \"bulk-archive\") {\n return renderBulkArchiveSlashPrompt(language);\n }\n if (command === \"onboard\") {\n return renderOnboardSlashPrompt(language);\n }\n if (command === \"fill-context\") {\n return renderFillContextSlashPrompt(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughSlashPrompt(language);\n }\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(language);\n }\n\n const usage = renderFetAdapterUsage(command);\n const isGraph = command.startsWith(\"graph-\");\n const shellCommand = isGraph ? `${renderFetAdapterUsage(command, \"\")} $ARGUMENTS` : `fet ${command} $ARGUMENTS`;\n const description = isGraph\n ? `Run optional GitNexus graph ${command.slice(\"graph-\".length)} through FET`\n : `Run the FET-managed OpenSpec ${command} workflow`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${description}\n---\n\nUse FET as the entry point for this OpenSpec workflow.\n\nBefore running the command, make sure the relevant project context is loaded from AGENTS.md and openspec/config.yaml. If a change id is needed and was not provided, infer it from the active FET/OpenSpec state when unambiguous; otherwise ask the user for the change id.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${shellCommand}\n\\`\\`\\`\n\nAfter it completes, summarize the important FET output and next steps.\n`;\n}\n\nfunction renderSlashPromptZh(command: FetAdapterCommand): string {\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(\"zh-CN\");\n }\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"[...args]\");\n const argumentHint = command === \"passthrough\" ? \"openspec-command [...args]\" : undefined;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${commandTitleZh(command)}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 目标\n\n${commandGoalZh(command)}\n\n## 步骤\n\n1. 阅读 AGENTS.md、openspec/config.yaml 和 .codex/fet/karpathy-guidelines.md。\n2. 如果存在当前 OpenSpec change,阅读 openspec/changes/<change-id>/ 下的相关产物。\n3. 运行 FET 命令:\n \\`\\`\\`sh\n ${usage}\n \\`\\`\\`\n4. 按 FET/OpenSpec 输出继续;需要写产物时,只写到 OpenSpec 指定路径,不要把提示包装文本复制进产物。\n5. 用中文总结本次动作、文件路径、状态和下一步。\n\n## 约束\n\n- 默认使用中文产出。\n- 不要绕过 FET 直接调用 openspec,除非 FET 命令本身不可用。\n- change 不明确时先询问用户。\n${command === \"fill-context\" ? \"- fet fill-context 可能已写入小程序包体积与 2MB 约束,不要覆盖该节中的扫描结果,除非仓库结构已变。\\n- 替换 AGENTS.md 中其余 [NEEDS LLM INPUT] 占位符,保留 FET 托管标记,不要修改业务代码。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? \"- 一次只创建一个 ready artifact,并在写入前阅读依赖文件。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? \"- 不要在用户审阅当前产物前自动运行 fet continue、fet ff 或循环生成后续产物;需要用户明确确认后再推进。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" || command === \"sync\" ? `${renderSpecArtifactGuardrail(\"zh-CN\")}\\n` : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? `${renderUiDisplayContractGuardrail(\"zh-CN\")}\\n` : \"\"}${command === \"apply\" ? \"- 不要在未完成真实实现前勾选 tasks.md;不要从 apply 阶段直接 sync 或 archive。\\n- 若存在 openspec/changes/<change-id>/.fet/figma-apply-instructions.md,必须先读 Figma(MCP/API)再改 UI;失败则停下问用户,禁止猜样式。\\n- 若存在 openspec/changes/<change-id>/.fet/ui-display-contract.yaml,实施绑定接口的 UI 前须确认 displayFields,禁止按 OpenAPI 全量展示。\\n\" : \"\"}`;\n}\n\nfunction commandTitleZh(command: FetAdapterCommand): string {\n const titles: Partial<Record<FetAdapterCommand, string>> = {\n explore: \"探索 FET/OpenSpec 需求\",\n propose: \"创建 FET/OpenSpec change 并生成首个规划产物\",\n new: \"创建新的 FET/OpenSpec change 骨架\",\n continue: \"推进当前 FET/OpenSpec change 的下一个产物\",\n ff: \"快速生成 FET/OpenSpec 所需产物\",\n apply: \"实施 FET/OpenSpec change 中的任务\",\n verify: \"验证 FET/OpenSpec change\",\n sync: \"同步 delta specs 到主规范\",\n archive: \"归档已验证的 FET/OpenSpec change\",\n \"bulk-archive\": \"批量归档 FET/OpenSpec changes\",\n onboard: \"加载 FET/OpenSpec 项目上下文\",\n \"fill-context\": \"填充 FET AGENTS.md 占位符\",\n passthrough: \"通过 FET 透传未接管的 OpenSpec 命令\",\n \"graph-status\": \"查看 GitNexus 代码图状态\",\n \"graph-setup\": \"生成 GitNexus 安装交接说明\",\n \"graph-init\": \"初始化 GitNexus 代码图\",\n \"graph-refresh\": \"刷新 GitNexus 代码图\",\n \"graph-doctor\": \"诊断 GitNexus 代码图\",\n \"graph-handoff\": \"生成 GitNexus 代码图使用说明\"\n };\n return titles[command] ?? `运行 FET ${command} 工作流`;\n}\n\nfunction commandGoalZh(command: FetAdapterCommand): string {\n if (command === \"fill-context\") {\n return \"补齐 FET 自动生成的项目上下文,让后续 AI 编码和 OpenSpec 工作流拥有稳定的项目事实。\";\n }\n if (command === \"propose\") {\n return \"根据 change id 或描述创建 OpenSpec change(如不存在),并只生成当前第一个 ready 的规划产物。\";\n }\n if (command === \"continue\") {\n return \"基于 active change 或用户指定的 change,创建下一个 ready 的 OpenSpec 规划产物。\";\n }\n if (command === \"ff\") {\n return \"在用户明确要求快进时,一次性生成 change 所需的全部规划产物。\";\n }\n if (command === \"apply\") {\n return \"读取 OpenSpec 产物;有 Figma 时先读稿再实施 UI;有 ui-display-contract.yaml 时只展示 displayFields,禁止按 OpenAPI 全量渲染。\";\n }\n if (command.startsWith(\"graph-\")) {\n return \"管理可选的 GitNexus 代码图,让 AI 在大范围扫描前优先获得结构化代码上下文。\";\n }\n return commandTitleZh(command);\n}\n\nfunction renderFillContextCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet fill-context\nFET:END -->\n\n# fet fill-context\n\n${renderIdeModelPolicy(\"fill-context\", language)}\n\n${languageInstruction(language)}\n\nUse this command to complete FET-generated project context placeholders with Codex.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nFirst run:\n\n\\`\\`\\`sh\nfet fill-context\n\\`\\`\\`\n\nThen read AGENTS.md and openspec/config.yaml, inspect the project, and replace every [NEEDS LLM INPUT] or [NEED LLM INPUT] placeholder in AGENTS.md with concrete project-specific content. Preserve FET managed markers and do not modify business code.\n`;\n}\n\nfunction renderFillContextSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet fill-context\",\n \"Fill FET AGENTS.md placeholders with Codex\",\n `Complete FET-generated project context placeholders.\n\nSteps:\n\n1. Refresh FET IDE handoff files:\n \\`\\`\\`sh\n fet fill-context\n \\`\\`\\`\n2. Read AGENTS.md and openspec/config.yaml.\n3. Read .codex/fet/karpathy-guidelines.md.\n4. Inspect the project to understand:\n - source structure and major modules\n - framework and routing conventions\n - scripts, test commands, and build commands\n - coding conventions and project-specific patterns\n - important docs such as README files\n5. \\`fet fill-context\\` may already fill the mini program package-size table and 2MB constraints. Do not overwrite those subsections unless the repo changed.\n6. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete, concise project-specific content.\n7. Preserve FET managed markers such as \\`FET:BEGIN AUTO\\`, \\`FET:END AUTO\\`, \\`FET:BEGIN USER\\`, and \\`FET:END USER\\`.\n8. Do not modify business code.\n9. Run:\n \\`\\`\\`sh\n fet doctor\n \\`\\`\\`\n Confirm that no AGENTS.md placeholder warning remains.\n\nGuardrails:\n- Do not invent facts that cannot be inferred from the repo.\n- Use [UNKNOWN] only when the repository does not contain enough evidence.\n- Keep generated context stable and useful for future AI coding sessions.`,\n undefined,\n language\n );\n}\n\nfunction renderNewSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet new [...args]\",\n \"Create a new FET/OpenSpec change scaffold\",\n `Create a new FET-managed OpenSpec change scaffold.\n\nInput after the slash command should be a kebab-case change id or a short description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. If no input was provided, ask what change the user wants to build or fix.\n3. Derive a kebab-case change id when the user provided a description.\n4. Create the change through FET:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Show current artifact status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n6. Get the first ready artifact instructions:\n \\`\\`\\`sh\n fet continue <first-ready-artifact-id> --change <change-id>\n \\`\\`\\`\n\nGuardrails:\n- Do not create artifact files in /prompts:fet-new.\n- If the change already exists, suggest /prompts:fet-continue <change-id>.\n- Show the change location and the next command to create the first artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderApplySlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet apply [...args]\",\n \"Implement tasks from a FET/OpenSpec change\",\n `Implement a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change, for example a change id or --change <change-id>. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Run the native OpenSpec apply flow through FET:\n \\`\\`\\`sh\n fet apply --change <change-id> --json\n \\`\\`\\`\n3. Follow the native apply output. If JSON output is unavailable, read the files referenced by the terminal output and the artifacts under openspec/changes/<change-id>/.\n4. If \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\` exists (or apply nextSteps mention Figma):\n - Read it and \\`figma-stop.md\\` in the same folder before any UI code.\n - Use Figma MCP/API to read every linked frame; briefly confirm design facts in your reply.\n - If Figma access fails or design details are unclear, stop and ask the user—do not guess styles or implement UI.\n5. If \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` exists (or apply nextSteps mention UI display contract):\n - Read it and \\`ui-field-apply-instructions.md\\` in the same folder before UI that binds API data.\n - Confirm \\`displayFields\\` from Figma; list API-only fields under \\`omittedFromUi\\`.\n - Do not render every OpenAPI property—only fields in \\`displayFields\\`.\n6. If apply is blocked because required artifacts are missing, stop and suggest /prompts:fet-continue <change-id> or /prompts:fet-ff <change-id>.\n7. Implement pending tasks one by one:\n - Keep code changes minimal and scoped to the task.\n - Follow proposal, specs, design, and tasks.\n - Mark each completed task checkbox in tasks.md from \\`- [ ]\\` to \\`- [x]\\`.\n - Pause and ask if a task is ambiguous or reveals a design conflict.\n8. After completing or pausing, summarize completed tasks, remaining tasks, and blockers.\n\nGuardrails:\n- Never skip reading OpenSpec artifacts before implementation.\n- When Figma links exist for this change, never implement or restyle UI without reading Figma first.\n- When ui-display-contract.yaml exists, API schemas are not UI checklists—only displayFields may render.\n- Do not mark a task complete until the code change is actually done.\n- Do not run sync or archive from apply.`,\n undefined,\n language\n );\n}\n\nfunction renderVerifySlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet verify [...args]\",\n \"Verify a FET/OpenSpec change before sync or archive\",\n `Verify a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous. If the user passes --done, declare verification complete only after checks have been performed or explicitly accepted by the user.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Generate FET verification instructions:\n \\`\\`\\`sh\n fet verify --change <change-id>\n \\`\\`\\`\n3. Read openspec/changes/<change-id>/.fet/verify-instructions.md.\n4. Read available artifacts for the change: proposal.md, design.md, tasks.md, and delta specs.\n5. Verify:\n - Completeness: tasks and required artifacts are present and checked off where appropriate.\n - Correctness: implementation evidence matches specs and proposal.\n - Coherence: code follows design decisions and project patterns.\n6. Report critical issues, warnings, and suggestions with file references.\n7. If there are no critical issues, or the user explicitly accepts the remaining risk, mark FET verification done:\n \\`\\`\\`sh\n fet verify --done --change <change-id>\n \\`\\`\\`\n\nGuardrails:\n- Do not run --done before producing a verification assessment.\n- Treat incomplete tasks or missing required behavior as critical unless user explicitly accepts them.\n- Suggest /prompts:fet-sync <change-id> and /prompts:fet-archive <change-id> only after verification is done.`,\n undefined,\n language\n );\n}\n\nfunction renderSyncSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet sync [...args]\",\n \"Sync delta specs and validate a FET/OpenSpec change\",\n `Sync a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Confirm FET verification is complete or run /prompts:fet-verify <change-id> first.\n3. Find delta specs under openspec/changes/<change-id>/specs/*/spec.md.\n4. If delta specs exist, intelligently merge them into openspec/specs/<capability>/spec.md:\n - Add ADDED requirements.\n - Apply MODIFIED requirements without deleting unrelated existing scenarios.\n - Remove REMOVED requirements.\n - Apply RENAMED requirements.\n - Preserve main-spec content not mentioned in the delta.\n - Follow .codex/fet/spec-language.md: keep English normative text; carry over or refresh \\`<!-- 中文:... -->\\` for every touched Requirement in the same edit.\n5. If no delta specs exist, state that there is nothing to merge.\n6. Run the FET sync gate and strict OpenSpec validation:\n \\`\\`\\`sh\n fet sync --change <change-id>\n \\`\\`\\`\n7. Summarize updated capabilities and validation result.\n\nGuardrails:\n- Read both delta and main specs before editing.\n- Make sync idempotent where possible.\n- If FET reports verify is not done, stop and run/ask for verification instead of bypassing the gate.`,\n undefined,\n language\n );\n}\n\nfunction renderArchiveSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet archive [...args]\",\n \"Archive a verified FET/OpenSpec change\",\n `Archive a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Check artifact and task status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n3. If tasks or required artifacts are incomplete, show the warning and ask whether to continue.\n4. If delta specs exist, assess whether they have been synced. If not, recommend /prompts:fet-sync <change-id> before archiving.\n5. Confirm FET verification is complete. If not, run or suggest /prompts:fet-verify <change-id>.\n6. Archive through FET:\n \\`\\`\\`sh\n fet archive --change <change-id>\n \\`\\`\\`\n7. Report archive result, sync status, and any warnings.\n\nGuardrails:\n- Do not move change directories manually; use fet archive.\n- Do not bypass the FET verify gate.\n- Ask before archiving with incomplete tasks or unsynced delta specs.`,\n undefined,\n language\n );\n}\n\nfunction renderBulkArchiveSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet bulk-archive [...args]\",\n \"Archive multiple FET/OpenSpec changes safely\",\n `Bulk archive FET-managed OpenSpec changes.\n\nSteps:\n\n1. List active changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n2. Ask the user which changes to archive. Do not auto-select.\n3. For each selected change:\n - Check artifact/task status.\n - Confirm verification is done.\n - Recommend sync if delta specs are unsynced.\n - Run \\`fet archive --change <change-id>\\`.\n4. If \\`fet bulk-archive\\` reports that the current OpenSpec version does not support a native bulk command, archive selected changes one by one through \\`fet archive --change <change-id>\\`.\n5. Summarize successes, skipped changes, and failures.\n\nGuardrails:\n- Never archive all changes without explicit user selection.\n- Do not bypass verify or warnings for individual changes.\n- Continue with remaining selected changes if one archive fails, then report the failure clearly.`,\n undefined,\n language\n );\n}\n\nfunction renderOnboardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet onboard [...args]\",\n \"Load FET/OpenSpec onboarding context\",\n `Onboard the user or Codex into the FET/OpenSpec workflow for this project.\n\nSteps:\n\n1. Read AGENTS.md and openspec/config.yaml.\n2. Run FET onboarding:\n \\`\\`\\`sh\n fet onboard\n \\`\\`\\`\n3. Summarize:\n - Project context.\n - Available active changes.\n - Core commands: new, continue, ff, apply, verify, sync, archive.\n - Where Codex prompts live.\n\nGuardrails:\n- Do not create or modify artifacts during onboard.\n- Use this command to orient the session, then suggest the next concrete FET command.`,\n undefined,\n language\n );\n}\n\nfunction renderPassthroughSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet passthrough <openspec-command> [...args]\",\n \"Run an unmanaged OpenSpec command through FET\",\n `Run an OpenSpec command that FET does not manage as a first-class workflow command.\n\nSteps:\n\n1. Identify the OpenSpec command and arguments from the user's input.\n2. Run it through FET:\n \\`\\`\\`sh\n fet passthrough <openspec-command> [...args]\n \\`\\`\\`\n3. Report the output and whether FET lifecycle state was updated.\n\nGuardrails:\n- Do not call openspec directly unless FET passthrough itself is unavailable.\n- Remember that passthrough does not update FET lifecycle state.\n- For managed workflows, prefer the specific FET prompt instead of passthrough.`,\n \"openspec-command [...args]\",\n language\n );\n}\n\nfunction renderGraphSetupSlashPrompt(language: FetLanguage): string {\n if (language === \"en\") {\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"Guide IDE-assisted GitNexus installation with user approval\",\n `Guide optional GitNexus installation for this project.\n\nSteps:\n\n1. Run:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. Read .fet/graph-setup.md and follow it as the source of truth.\n3. Run read-only detection commands as needed, such as checking the shell, PATH, package managers, and \\`gitnexus --version\\`.\n4. If GitNexus is missing, use the configured \\`FET_GITNEXUS_INSTALL_COMMAND\\` when present; otherwise find the official GitNexus installation instructions or ask the user for the preferred method.\n5. Before any command that downloads software, installs globally, changes PATH, writes user-level files, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n6. Verify installation with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, explain \\`gitnexus setup\\` and run it only after approval.\n8. Run \\`fet graph init\\` and then \\`fet graph handoff\\` when GitNexus is available.\n\nGuardrails:\n- GitNexus is optional; do not block FET/OpenSpec workflows if installation fails.\n- Do not modify application code during setup.\n- Report the failing command, stderr, and next manual step if blocked.`,\n undefined,\n language\n );\n }\n\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"指导 IDE LLM 在用户确认下安装 GitNexus\",\n `为当前项目引导可选的 GitNexus 安装。\n\n步骤:\n\n1. 运行:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. 阅读 .fet/graph-setup.md,并以它作为安装任务书。\n3. 按需运行只读检测命令,例如检查 shell、PATH、包管理器和 \\`gitnexus --version\\`。\n4. 如果 GitNexus 缺失,优先使用已配置的 \\`FET_GITNEXUS_INSTALL_COMMAND\\`;没有配置时,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n6. 用 \\`gitnexus --version\\` 验证安装。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\`,获得确认后再运行。\n8. GitNexus 可用后运行 \\`fet graph init\\`,再运行 \\`fet graph handoff\\`。\n\n约束:\n- GitNexus 是可选能力;安装失败时不要阻塞 FET/OpenSpec 主流程。\n- 安装过程中不要修改业务代码。\n- 如果受阻,报告失败命令、stderr 和下一步人工处理建议。`,\n undefined,\n language\n );\n}\n\nfunction renderExploreSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet explore [...args]\",\n \"Explore requirements for a FET/OpenSpec change\",\n `Enter exploration mode for a FET-managed OpenSpec change.\n\nUse this command for thinking and proposal shaping, not application implementation.\n\nInput after the slash command may be a change id, a feature idea, or a problem description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Check existing changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n3. If the input names an existing change, read its current artifacts under openspec/changes/<change-id>/.\n4. If the input is a new idea and the user wants to capture it, derive a kebab-case change id and create the change:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Run the native OpenSpec exploration flow through FET so clarification prompts stay interactive:\n \\`\\`\\`sh\n fet explore --change <change-id>\n \\`\\`\\`\n6. If OpenSpec or the user asks to generate or capture the proposal, create openspec/changes/<change-id>/proposal.md using the interactive answers, conversation, and project context.\n\nGuardrails:\n- Do not write application code in explore mode.\n- Ask a clarifying question if the proposal would otherwise be mostly guesswork.\n- Creating or updating OpenSpec artifacts is allowed when the user asks to capture the thinking.\n- After creating proposal.md, show the path and suggest /prompts:fet-continue <change-id> for the next artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderProposeSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet propose [...args]\",\n \"Create a FET/OpenSpec change and its first ready artifact\",\n `Start proposal planning for a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id or a short description of what the user wants to build. If omitted, ask the user.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Derive a kebab-case change id when the user provided a description. If ambiguous, ask the user.\n3. Run the native OpenSpec propose flow through FET. This creates the change when needed and returns instructions for only the next ready artifact:\n \\`\\`\\`sh\n fet propose <change-id-or-description> --json\n \\`\\`\\`\n4. Follow the native output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n5. Read dependency files before writing.\n6. Create only that artifact file at outputPath. Do not copy context/rules wrapper text into the artifact.\n - If the artifact is specs/<capability>/spec.md, follow .codex/fet/spec-language.md: English Requirements/Scenario plus \\`<!-- 中文:... -->\\` after each Requirement title; update Chinese notes in the same edit when English changes.\n7. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- Change id and location.\n- Which single artifact was created and its file path.\n- Current status.\n- Tell the user to review the artifact and run /prompts:fet-continue <change-id> when ready for the next artifact. Mention /prompts:fet-ff <change-id> only if they explicitly want to fast-forward all remaining artifacts.\n\nGuardrails:\n- Create one artifact per invocation. Do not run fet continue or fet ff in the same session unless the user explicitly asks after reviewing the artifact just created.\n- Never skip dependency order.\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderContinueSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet continue [...args]\",\n \"Create the next FET/OpenSpec artifact\",\n `Continue a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id, optionally followed by an artifact id. If omitted, use the active OpenSpec change and continue the next ready artifact.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n3. Check status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n4. Pick the first artifact whose status is ready, unless the user specified an artifact id.\n5. Run the native OpenSpec continue flow through FET:\n \\`\\`\\`sh\n fet continue [artifact-id] --change <change-id> --json\n \\`\\`\\`\n6. Follow the native continue output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n7. Read dependency files before writing.\n8. Create the artifact file at outputPath. Do not copy context/rules wrapper text into the artifact; use those fields only as constraints.\n - If the artifact is specs/<capability>/spec.md, follow .codex/fet/spec-language.md: English Requirements/Scenario plus \\`<!-- 中文:... -->\\` after each Requirement title; update Chinese notes in the same edit when English changes.\n9. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- State which artifact was created.\n- Show the file path.\n- Show the current status and what to run next.\n\nGuardrails:\n- Create one artifact per invocation.\n- Never skip dependency order.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderFastForwardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet ff [...args]\",\n language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\",\n `${language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\"}.\n\nUse this command only when the user explicitly wants to generate all remaining planning artifacts in one session without reviewing each artifact between steps. For step-by-step review, use /prompts:fet-propose or /prompts:fet-continue instead.\n\nInput after the slash command may be a change id. It may be omitted when the active OpenSpec change is unambiguous.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id. If ambiguous, ask the user.\n3. Run the native OpenSpec ff flow through FET:\n \\`\\`\\`sh\n fet ff --change <change-id>\n \\`\\`\\`\n4. Follow the native output. If it asks for clarification, ask the user rather than inventing details.\n5. If the native output includes artifact paths or templates to write, create those files and preserve OpenSpec structure.\n6. If FET reports that the OpenSpec CLI does not expose the requested command, stop immediately. Do not run \\`fet continue\\`, \\`openspec change\\`, or any alternative workflow command unless the user explicitly chooses that fallback after seeing the error.\n\nArtifact rules:\n- Follow the instruction field from OpenSpec/FET for each artifact.\n- Use template as structure, filling it with concrete project-specific content.\n- Do not copy context/rules wrapper text into artifact files.\n- For specs/<capability>/spec.md, follow .codex/fet/spec-language.md (English canonical + \\`<!-- 中文:... -->\\`; update Chinese notes in the same edit when English changes).\n- Verify each file exists after writing.\n\nOutput:\n- Change id and location.\n- Artifacts created.\n- Current status.\n- Next recommended command, usually /prompts:fet-apply <change-id>.\n\nGuardrails:\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- If OpenSpec appears outdated or incompatible, report the detected version and suggest \\`npm install -g @fission-ai/openspec@latest\\` or \\`fet doctor\\`, then wait for the user's decision.`,\n undefined,\n language\n );\n}\n\nfunction renderManagedSlashPrompt(command: string, description: string, body: string, argumentHint?: string, language: FetLanguage = DEFAULT_LANGUAGE): string {\n const policyCommand = command.split(/\\s+/)[1] ?? command;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n const graphContextInstruction =\n language === \"en\"\n ? \"If GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\"\n : \"如果 GitNexus 代码图上下文可用,先用它缩小源码扫描范围;不可用时按普通流程继续。\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${command}\nFET:END -->\n\n---\ndescription: ${description}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(policyCommand, language)}\n\n${languageInstruction(language)}\n\n${graphContextInstruction}\n\n${body}\n`;\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { cursorRuleFiles, cursorSkillFiles } from \"./templates.js\";\n\nexport class CursorAdapter implements ToolAdapter {\n readonly tool = \"cursor\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".cursor\")),\n reason: \"Cursor adapter is available for any project\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [...cursorSkillFiles(language), ...cursorRuleFiles(language)].map((file) => ({\n ...file,\n managed: true\n }))\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files) {\n const target = join(projectRoot, file.path);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Cursor 配置文件已存在,且不由 FET 管理。\",\n details: { path: file.path },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(file.path);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files) {\n const target = join(projectRoot, file.path);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `cursor:${file.path}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${file.path} 缺失`\n : !managed\n ? `${file.path} 已存在,但不由 FET 管理`\n : !versionMatches\n ? `${file.path} adapterVersion 已过期`\n : `${file.path} 已存在且版本匹配`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { FET_VERSION } from \"../../version.js\";\nimport { renderCursorFigmaStopRule } from \"../../templates/figma-guard.js\";\nimport { renderCursorUiDisplayContractRule } from \"../../templates/ui-display-contract.js\";\nimport {\n renderCursorSpecLanguageRule,\n renderPlanningArtifactSpecBlock,\n renderSpecArtifactGuardrail\n} from \"../../templates/spec-language.js\";\nimport { renderUiDisplayContractGuardrail } from \"../../templates/ui-display-contract.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function cursorFigmaStopRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-figma-stop.mdc\",\n content: renderCursorFigmaStopRule(language)\n };\n}\n\nexport function cursorSpecLanguageRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-spec-language.mdc\",\n content: renderCursorSpecLanguageRule(language)\n };\n}\n\nexport function cursorUiDisplayContractRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-ui-display-contract.mdc\",\n content: renderCursorUiDisplayContractRule(language)\n };\n}\n\nexport function cursorRuleFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return [\n cursorRuleFile(language),\n cursorFigmaStopRuleFile(language),\n cursorUiDisplayContractRuleFile(language),\n cursorSpecLanguageRuleFile(language)\n ];\n}\n\nexport function cursorSkillFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.cursor/skills/fet-${command}/SKILL.md`,\n content: renderSkill(command, language)\n }));\n}\n\nexport function cursorRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-context.mdc\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Load FET project context for implementation tasks\" : \"为实现任务加载 FET 项目上下文\"}\nalwaysApply: false\n---\n\n${languageInstruction(language)}\n\n当用户请求修改项目、实现 OpenSpec change、运行 FET 工作流或解释项目结构时,优先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- 可用时的 GitNexus 代码图上下文。优先用它缩小范围;不可用时按普通 FET/OpenSpec 工作流继续。\n- 当前 change 目录下的 OpenSpec 规划产物。\n- 按 Figma 实现 UI 时遵守 \\`.cursor/rules/fet-figma-stop.mdc\\`;若存在 \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\` 必须在改 UI 前完整执行;同目录 \\`figma-stop.md\\` 含链接与停止规则。\n- 编写或修改 OpenSpec \\`specs/**/spec.md\\` 时遵守 \\`.cursor/rules/fet-spec-language.mdc\\`(英文规范 + \\`<!-- 中文:... -->\\`,同次编辑同步更新中文说明)。\n- 绑定接口的 UI 遵守 \\`.cursor/rules/fet-ui-display-contract.mdc\\`;存在 \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` 时实施前须确认 displayFields。\n\n如果用户输入类似 \\`/fet apply\\` 的请求,请把它视为工作流意图,并提示或执行对应的终端命令 \\`fet <cmd>\\`。\n`\n };\n}\n\nfunction renderSkill(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, command === \"passthrough\" ? \"[...args]\" : \"\");\n if (command === \"fill-context\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet fill-context\nFET:END -->\n\n---\nname: fet-fill-context\ndescription: ${language === \"en\" ? \"Fill FET AGENTS.md placeholders with Cursor AI\" : \"使用 Cursor AI 填充 FET AGENTS.md 占位符\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n如果 IDE 命令需要刷新,先运行 \\`fet fill-context\\`。\n\n然后阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n\n\\`fet fill-context\\` 可能已写入小程序包体积表与 2MB 开发约束,不要覆盖 AGENTS.md「小程序」节中的扫描结果,除非仓库结构已变。\n\n检查 README、package scripts、路由、测试、源码结构和现有约定后,把 AGENTS.md 中**其余** \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、简洁、项目相关的内容。保留 FET 托管标记,不要修改业务代码。\n`;\n }\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet graph setup\nFET:END -->\n\n---\nname: fet-graph-setup\ndescription: ${language === \"en\" ? \"Guide IDE-assisted GitNexus installation with user approval\" : \"指导 IDE LLM 在用户确认下安装 GitNexus\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n${\n language === \"en\"\n ? `Run \\`fet graph setup\\`, then read .fet/graph-setup.md and follow it as an installation playbook.\n\nYou may run read-only detection commands without extra confirmation. Before any command that downloads software, installs globally, changes PATH, writes user-level config, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n\nAfter installation, verify with \\`gitnexus --version\\`, then run \\`fet graph init\\` and \\`fet graph handoff\\` when appropriate. If installation fails, summarize the failing command and next manual step.`\n : `先运行 \\`fet graph setup\\`,再阅读 .fet/graph-setup.md,并把它作为安装任务书执行。\n\n只读检测命令可以直接运行。任何会下载软件、全局安装、修改 PATH、写入用户级配置或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证;合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,汇总失败命令和下一步人工处理建议。`\n}\n`;\n }\n\n if (command === \"apply\") {\n return renderApplySkill(usage, language);\n }\n\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n return renderPlanningSkill(command, usage, language);\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-${command}\ndescription: ${language === \"en\" ? `Run FET-managed OpenSpec ${command} workflow from the terminal` : `从终端运行 FET 托管的 OpenSpec ${command} 工作流`}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n此文件采用 Cursor Skill 目录结构,提供 \\`/fet-${command}\\` 风格的工作流说明,不承诺注册 \\`/fet ${command}\\` 这种带空格的原生 slash command。\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n执行前请确认已阅读 AGENTS.md 和 openspec/config.yaml。\n`;\n}\n\nfunction renderPlanningSkill(command: FetAdapterCommand, usage: string, language: FetLanguage): string {\n const title =\n command === \"propose\"\n ? language === \"en\"\n ? \"Create OpenSpec change and first artifact\"\n : \"创建 OpenSpec change 并生成首个规划产物\"\n : command === \"ff\"\n ? language === \"en\"\n ? \"Fast-forward OpenSpec artifacts\"\n : \"快进生成 OpenSpec 规划产物\"\n : language === \"en\"\n ? \"Create next OpenSpec artifact\"\n : \"生成下一个 OpenSpec 规划产物\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-${command}\ndescription: ${title}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n${renderPlanningArtifactSpecBlock(language)}\n\n${renderSpecArtifactGuardrail(language)}\n\n${renderUiDisplayContractGuardrail(language)}\n\n执行前请阅读 AGENTS.md、openspec/config.yaml(含 \\`fet.specLanguage\\`)与当前 change 已有产物。\n`;\n}\n\nfunction renderApplySkill(usage: string, language: FetLanguage): string {\n const uiContractBlock =\n language === \"en\"\n ? `If \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` exists:\n\n1. Read it and \\`ui-field-apply-instructions.md\\` in the same folder before UI that binds API data.\n2. Confirm \\`displayFields\\` from Figma; put API-only fields in \\`omittedFromUi\\`.\n3. Do not render every OpenAPI property—only contracted display fields.`\n : `若存在 \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\`:\n\n1. 在绑定接口的 UI 实施前阅读该文件与同目录 \\`ui-field-apply-instructions.md\\`。\n2. 按 Figma 确认 \\`displayFields\\`;仅接口有的字段放入 \\`omittedFromUi\\`。\n3. 禁止按 OpenAPI 全量展示—只渲染契约中的 displayFields。`;\n\n const figmaBlock =\n language === \"en\"\n ? `If \\`fet apply\\` output or the change has \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\`:\n\n1. Read that file and \\`figma-stop.md\\` in the same folder before any UI code.\n2. Use Figma MCP/API to read every linked frame; do not invent colors, spacing, or layout.\n3. If Figma fails or design is unclear, stop and ask the user—do not guess styles or mark UI tasks done.\n4. After design is confirmed, implement tasks from \\`tasks.md\\`.`\n : `若 \\`fet apply\\` 输出或 change 中存在 \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\`:\n\n1. 在改任何 UI 代码前,先阅读该文件与同目录 \\`figma-stop.md\\`。\n2. 用 Figma MCP/API 读取每个链接的画板;禁止自创颜色、间距、布局。\n3. Figma 失败或设计不清时立即停止并向用户提问,不要猜样式,不要把 UI 任务标为完成。\n4. 设计确认后,再按 \\`tasks.md\\` 实施任务。`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-apply\ndescription: ${language === \"en\" ? \"Implement OpenSpec tasks; require Figma when design links exist\" : \"实施 OpenSpec 任务;有 Figma 链接时必须先按稿实现\"}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(\"apply\", language)}\n\n${languageInstruction(language)}\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n${figmaBlock}\n\n${uiContractBlock}\n\n执行前请阅读 AGENTS.md、openspec/config.yaml 与当前 change 下的 OpenSpec 产物。\n`;\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\nimport { inspectOpenSpecChange, inspectOpenSpecProject } from \"./inspector.js\";\nimport { resolveOpenSpecExecutable } from \"./resolver.js\";\nimport { runOpenSpec } from \"./runner.js\";\nimport type {\n OpenSpecAdapter,\n OpenSpecCapabilities,\n OpenSpecChangeInspection,\n OpenSpecProjectInspection,\n OpenSpecRunOptions,\n OpenSpecRunResult\n} from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport class DefaultOpenSpecAdapter implements OpenSpecAdapter {\n private identity?: OpenSpecIdentity;\n\n async resolveExecutable(): Promise<OpenSpecIdentity> {\n this.identity ??= await resolveOpenSpecExecutable();\n return this.identity;\n }\n\n async getCapabilities(): Promise<OpenSpecCapabilities> {\n const identity = await this.resolveExecutable();\n const executable = identity.executablePath === \"npx openspec\" ? \"npx\" : identity.executablePath;\n const args = identity.executablePath === \"npx openspec\" ? [\"openspec\", \"--help\"] : [\"--help\"];\n\n try {\n const { stdout } = await execFileAsync(executable, args, { shell: process.platform === \"win32\" });\n return {\n version: identity.version,\n commands: parseCommands(stdout),\n supported: true\n };\n } catch {\n return {\n version: identity.version,\n commands: [],\n supported: false\n };\n }\n }\n\n async run(command: string, args: string[], options: OpenSpecRunOptions): Promise<OpenSpecRunResult> {\n const identity = await this.resolveExecutable();\n return runOpenSpec(identity.executablePath, command, args, options);\n }\n\n inspectProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n return inspectOpenSpecProject(projectRoot);\n }\n\n inspectChange(projectRoot: string, changeId: string): Promise<OpenSpecChangeInspection> {\n return inspectOpenSpecChange(projectRoot, changeId);\n }\n}\n\nfunction parseCommands(help: string): string[] {\n const known = [\n \"init\",\n \"update\",\n \"list\",\n \"view\",\n \"change\",\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\",\n \"spec\",\n \"config\",\n \"schema\",\n \"validate\",\n \"show\",\n \"feedback\",\n \"completion\",\n \"status\",\n \"instructions\",\n \"templates\",\n \"schemas\"\n ];\n return known.filter((command) => new RegExp(`\\\\b${escapeRegExp(command)}\\\\b`).test(help));\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OpenSpecChangeInspection, OpenSpecProjectInspection } from \"./types.js\";\n\nexport async function inspectOpenSpecProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n const openspecPath = join(projectRoot, \"openspec\");\n const changesPath = join(openspecPath, \"changes\");\n const legacyArchivePath = join(openspecPath, \"archive\");\n const changesArchivePath = join(changesPath, \"archive\");\n\n return {\n exists: await exists(openspecPath),\n changes: await listDirectories(changesPath, { exclude: [\"archive\"] }),\n archived: [...new Set([...(await listDirectories(legacyArchivePath)), ...(await listDirectories(changesArchivePath))])]\n };\n}\n\nexport async function inspectOpenSpecChange(\n projectRoot: string,\n changeId: string\n): Promise<OpenSpecChangeInspection> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const tasksPath = join(changePath, \"tasks.md\");\n const specsPath = join(changePath, \"specs\");\n\n return {\n changeId,\n exists: await exists(changePath),\n hasProposal: await exists(join(changePath, \"proposal.md\")),\n hasTasks: await exists(tasksPath),\n hasSpecs: await exists(specsPath),\n tasksPath,\n changePath\n };\n}\n\nasync function listDirectories(path: string, options: { exclude?: string[] } = {}): Promise<string[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n const excluded = new Set(options.exclude ?? []);\n return entries.filter((entry) => entry.isDirectory() && !excluded.has(entry.name)).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function resolveOpenSpecExecutable(): Promise<OpenSpecIdentity> {\n const executablePath = await findExecutable();\n const version = await readVersion(executablePath);\n return {\n executablePath,\n version,\n adapterVersion: 1\n };\n}\n\nasync function findExecutable(): Promise<string> {\n const command = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const { stdout } = await exec(command, [\"openspec\"]);\n const first = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .sort((left, right) => executablePreference(left) - executablePreference(right))\n .find(Boolean);\n if (first) {\n return first;\n }\n } catch {\n // Try npx below.\n }\n\n try {\n await exec(\"npx\", [\"openspec\", \"--version\"]);\n return \"npx openspec\";\n } catch {\n throw new FetError({\n code: ErrorCode.OpenSpecNotFound,\n message: \"OpenSpec CLI 未安装\",\n suggestedCommand: \"npm install -g @fission-ai/openspec\"\n });\n }\n}\n\nfunction executablePreference(path: string): number {\n if (process.platform === \"win32\" && path.toLowerCase().endsWith(\".cmd\")) {\n return 0;\n }\n return 1;\n}\n\nasync function readVersion(executablePath: string): Promise<string> {\n const command = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const args = executablePath === \"npx openspec\" ? [\"openspec\", \"--version\"] : [\"--version\"];\n try {\n const { stdout, stderr } = await exec(command, args);\n return stdout.trim() || stderr.trim() || \"unknown\";\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: \"无法读取 OpenSpec 版本\",\n details: { executablePath },\n cause: error\n });\n }\n}\n\nfunction exec(command: string, args: string[]) {\n return execFileAsync(command, args, { shell: process.platform === \"win32\" });\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecRunOptions, OpenSpecRunResult } from \"./types.js\";\n\nexport async function runOpenSpec(\n executablePath: string,\n command: string,\n args: string[],\n options: OpenSpecRunOptions\n): Promise<OpenSpecRunResult> {\n const spawnCommand = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const spawnArgs = executablePath === \"npx openspec\" ? [\"openspec\", command, ...args] : [command, ...args];\n\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(spawnCommand, spawnArgs, {\n cwd: options.cwd,\n stdio: options.stdio ?? \"inherit\",\n shell: process.platform === \"win32\"\n });\n\n if (child.stdout) {\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n }\n if (child.stderr) {\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n }\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec 命令启动失败\",\n details: { command, args },\n cause: error\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { ScannedRoute } from \"./types.js\";\n\nexport async function scanRoutes(projectRoot: string): Promise<ScannedRoute[]> {\n const candidates = [\"src/routes\", \"src/pages\", \"app\", \"pages\"];\n const routes: ScannedRoute[] = [];\n\n for (const candidate of candidates) {\n const root = join(projectRoot, candidate);\n if (!(await exists(root))) {\n continue;\n }\n for (const file of await listFiles(root)) {\n if (!/\\.(tsx?|jsx?|vue|svelte)$/.test(file)) {\n continue;\n }\n routes.push({\n path: inferRoutePath(relative(root, file)),\n source: relative(projectRoot, file).split(sep).join(\"/\"),\n inferred: true,\n confidence: \"medium\"\n });\n }\n }\n\n return routes.slice(0, 100);\n}\n\nfunction inferRoutePath(relativePath: string): string {\n const normalized = relativePath.split(sep).join(\"/\");\n const withoutExt = normalized.replace(/\\.(tsx?|jsx?|vue|svelte)$/, \"\");\n const withoutIndex = withoutExt.replace(/\\/index$/, \"\").replace(/^index$/, \"\");\n return `/${withoutIndex}`.replace(/\\/+/g, \"/\");\n}\n\nasync function listFiles(root: string): Promise<string[]> {\n const entries = await readdir(root, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFiles(path)));\n } else {\n files.push(path);\n }\n }\n return files;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { detectMiniprogramProject } from \"./miniprogram.js\";\nimport { detectFramework, detectLanguage, detectPackageManager, detectWorkspaces, extractCommands, readPackageJson } from \"./package.js\";\nimport { scanRoutes } from \"./routes.js\";\nimport type { ProjectScanResult, ScanOptions } from \"./types.js\";\n\nexport class ProjectScanner {\n async scan(projectRoot: string, _options: ScanOptions = {}): Promise<ProjectScanResult> {\n const pkg = await readPackageJson(projectRoot);\n const packageManager = await detectPackageManager(projectRoot, pkg);\n const framework = detectFramework(pkg);\n const workspaces = await detectWorkspaces(projectRoot, pkg);\n const language = await detectLanguage(projectRoot, pkg);\n const miniprogram = await detectMiniprogramProject(projectRoot);\n const warnings = [...packageManager.warnings];\n if (framework.name === \"unknown\") {\n warnings.push(\"未能从 package.json 识别主要框架\");\n }\n if (miniprogram.supported) {\n warnings.push(...miniprogram.warnings);\n }\n\n return {\n generatedAt: new Date().toISOString(),\n scannerVersion: 1,\n project: {\n name: pkg?.name ?? \"unknown\",\n packageManager: packageManager.manager,\n packageManagerConfidence: packageManager.confidence,\n framework,\n language,\n monorepo: workspaces.length > 0,\n workspaces\n },\n commands: extractCommands(pkg, packageManager.manager),\n routes: await scanRoutes(projectRoot),\n conventions: [],\n skippedFiles: [],\n warnings,\n miniprogram\n };\n }\n}\n\nexport type { MiniprogramDetection, MiniprogramScanResult } from \"./miniprogram.js\";\n\nexport type {\n ProjectScanResult,\n ScanOptions,\n ScannedCommand,\n ScannedConvention,\n ScannedProjectMetadata,\n ScannedRoute,\n ScannedWorkspace,\n SkippedFile\n} from \"./types.js\";\n","import type { FetLanguage } from \"../language.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface CommandResult {\n ok: true;\n command: string;\n summary: string;\n warnings?: string[];\n nextSteps?: string[];\n data?: unknown;\n}\n\nexport class OutputWriter {\n constructor(\n private readonly json: boolean,\n private readonly language: FetLanguage = \"zh-CN\"\n ) {}\n\n info(message: string, details?: unknown): void {\n if (!this.json) {\n process.stdout.write(`${message}${formatDetails(details)}\\n`);\n }\n }\n\n warn(message: string, details?: unknown): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: true, warning: message, details }, null, 2)}\\n`);\n return;\n }\n process.stderr.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${message}${formatDetails(details)}\\n`);\n }\n\n error(error: FetError): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: false, error: error.toJSON() }, null, 2)}\\n`);\n return;\n }\n\n process.stderr.write(`${this.language === \"en\" ? \"FET cannot continue\" : \"FET 无法继续\"}:${error.message}\\n`);\n if (error.details !== undefined) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Details\" : \"详情\"}:\\n${formatBlock(error.details)}\\n`);\n }\n if (error.suggestedCommand) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Suggestion\" : \"建议\"}:\\n ${error.suggestedCommand}\\n`);\n }\n }\n\n result(result: CommandResult): void {\n if (this.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`${result.summary}\\n`);\n for (const warning of result.warnings ?? []) {\n process.stdout.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${warning}\\n`);\n }\n if (result.nextSteps?.length) {\n process.stdout.write(`\\n${this.language === \"en\" ? \"Next steps\" : \"下一步\"}:\\n`);\n for (const step of result.nextSteps) {\n process.stdout.write(` ${step}\\n`);\n }\n }\n }\n}\n\nfunction formatDetails(details: unknown): string {\n if (details === undefined) {\n return \"\";\n }\n return ` ${JSON.stringify(details)}`;\n}\n\nfunction formatBlock(details: unknown): string {\n if (typeof details === \"string\") {\n return ` ${details}`;\n }\n return JSON.stringify(details, null, 2)\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { FetCommandContext } from \"./context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport {\n formatFetUpdateWarning,\n getFetUpdateCheckMode,\n rememberDismissedFetUpdate,\n resolveFetUpdateAvailability,\n shouldCheckFetUpdateForCommand,\n type FetUpdateAvailability\n} from \"../update/check.js\";\nimport { performFetUpdate } from \"../update/npm.js\";\n\nexport async function handleFetUpdateCheck(ctx: FetCommandContext): Promise<void> {\n if (!shouldCheckFetUpdateForCommand(ctx.command)) {\n return;\n }\n\n const mode = getFetUpdateCheckMode();\n if (mode === \"off\") {\n return;\n }\n\n const availability = await resolveFetUpdateAvailability(ctx.fetVersion);\n if (!availability) {\n return;\n }\n\n const warning = formatFetUpdateWarning(availability, ctx.language);\n ctx.output.warn(warning);\n\n const forceConfirm = process.env.FET_UPDATE_CHECK_FORCE_CONFIRM === \"1\";\n const interactive =\n mode === \"confirm\" && !ctx.json && !ctx.yes && (forceConfirm || (process.stdin.isTTY && process.stderr.isTTY));\n if (!interactive) {\n return;\n }\n\n const choice = await promptFetUpdateChoice(availability, ctx.language);\n if (choice === \"skip\") {\n await rememberDismissedFetUpdate(availability.latestVersion);\n return;\n }\n if (choice === \"cancel\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled before FET update.\" : \"命令已取消,未执行 FET 升级。\",\n details: availability,\n suggestedCommand: ctx.language === \"en\" ? `fet update` : \"fet update\"\n });\n }\n\n await performFetUpdate(availability.currentVersion, availability.latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? `FET updated to ${availability.latestVersion}. Rerun this command to use the new version.`\n : `FET 已升级到 ${availability.latestVersion}。请重新运行当前命令以使用新版本。`,\n details: availability,\n suggestedCommand: `fet ${ctx.command}`\n });\n}\n\nasync function promptFetUpdateChoice(\n availability: FetUpdateAvailability,\n language: FetCommandContext[\"language\"]\n): Promise<\"update\" | \"skip\" | \"cancel\"> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n language === \"en\"\n ? `Update FET now (${availability.currentVersion} -> ${availability.latestVersion})? [U]pdate / [S]kip / [C]ancel [s]: `\n : `是否现在升级 FET(${availability.currentVersion} -> ${availability.latestVersion})?[U]升级 / [S]跳过 / [C]取消 [s]: `;\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"u\" || answer === \"update\" || answer === \"升级\") {\n return \"update\";\n }\n if (answer === \"c\" || answer === \"cancel\" || answer === \"取消\") {\n return \"cancel\";\n }\n return \"skip\";\n } finally {\n rl.close();\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { FetLanguage } from \"../language.js\";\nimport { compareVersions, getFetPackageName, resolveLatestFetVersion } from \"./npm.js\";\n\nexport type FetUpdateCheckMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface FetUpdateAvailability {\n packageName: string;\n currentVersion: string;\n latestVersion: string;\n}\n\ninterface UpdateCheckCache {\n latestVersion: string;\n checkedAt: string;\n dismissedLatestVersion?: string;\n}\n\nconst DEFAULT_CACHE_TTL_MS = 6 * 60 * 60 * 1000;\n\nexport function getFetUpdateCheckMode(env: NodeJS.ProcessEnv = process.env): FetUpdateCheckMode {\n const value = env.FET_UPDATE_CHECK?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_UPDATE_CHECK === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n if (value === \"confirm\") {\n return \"confirm\";\n }\n return \"confirm\";\n}\n\nexport function shouldCheckFetUpdateForCommand(command: string): boolean {\n return command !== \"update\";\n}\n\nexport async function resolveFetUpdateAvailability(currentVersion: string): Promise<FetUpdateAvailability | null> {\n const packageName = getFetPackageName();\n const cache = await readUpdateCheckCache();\n const ttlMs = Number.parseInt(process.env.FET_UPDATE_CHECK_TTL_MS ?? \"\", 10);\n const cacheTtlMs = Number.isFinite(ttlMs) && ttlMs > 0 ? ttlMs : DEFAULT_CACHE_TTL_MS;\n\n let latestVersion = cache?.latestVersion;\n const cacheFresh = cache?.checkedAt ? Date.now() - Date.parse(cache.checkedAt) < cacheTtlMs : false;\n\n if (!latestVersion || !cacheFresh) {\n try {\n latestVersion = await resolveLatestFetVersion(packageName);\n await writeUpdateCheckCache({\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: cache?.dismissedLatestVersion\n });\n } catch {\n if (cache?.latestVersion) {\n latestVersion = cache.latestVersion;\n } else {\n return null;\n }\n }\n }\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n return null;\n }\n\n if (cache?.dismissedLatestVersion === latestVersion) {\n return null;\n }\n\n return {\n packageName,\n currentVersion,\n latestVersion\n };\n}\n\nexport async function rememberDismissedFetUpdate(latestVersion: string): Promise<void> {\n const cache = (await readUpdateCheckCache()) ?? {\n latestVersion,\n checkedAt: new Date().toISOString()\n };\n await writeUpdateCheckCache({\n ...cache,\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: latestVersion\n });\n}\n\nexport function formatFetUpdateWarning(availability: FetUpdateAvailability, language: FetLanguage): string {\n if (language === \"en\") {\n return `A newer FET release is available (${availability.currentVersion} -> ${availability.latestVersion}). Run \\`fet update\\` or choose update when prompted.`;\n }\n return `检测到 FET 有新版本(当前 ${availability.currentVersion},最新 ${availability.latestVersion})。可运行 \\`fet update\\`,或在提示时选择升级。`;\n}\n\nfunction cachePath(): string {\n const home = process.env.FET_UPDATE_CHECK_CACHE_HOME?.trim() || homedir();\n return join(home, \".fet\", \"update-check-cache.json\");\n}\n\nasync function readUpdateCheckCache(): Promise<UpdateCheckCache | null> {\n try {\n const raw = await readFile(cachePath(), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<UpdateCheckCache>;\n if (typeof parsed.latestVersion !== \"string\" || typeof parsed.checkedAt !== \"string\") {\n return null;\n }\n return {\n latestVersion: parsed.latestVersion,\n checkedAt: parsed.checkedAt,\n dismissedLatestVersion: typeof parsed.dismissedLatestVersion === \"string\" ? parsed.dismissedLatestVersion : undefined\n };\n } catch {\n return null;\n }\n}\n\nasync function writeUpdateCheckCache(cache: UpdateCheckCache): Promise<void> {\n const path = cachePath();\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(cache, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":"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","names":["createInterface","readFile","stat","join","count","dirname","join","dirname","join","mkdir","open","readFile","join","mkdir","dirname","open","readFile","join","readFile","join","stat","join","relative","graph","join","readFile","count","stat","mkdir","dirname","join","readFile","join","readFile","stat","join","readFile","stat","join","locks","exists","join","exists","readFile","stat","formatBytes","join","readFile","join","mkdir","dirname","mkdir","dirname","join","mkdir","readdir","readFile","dirname","join","join","graph","mkdir","dirname","readdir","readFile","join","graph","firstLine","mkdir","dirname","stat","join","readFile","join","readFile","dirname","join","parse","stringify","stringify","join","readOptional","readFile","exists","join","stat","readFile","join","readdir","readFile","stat","join","relative","parseDocument","readFile","join","parseDocument","readOptional","relative","readdir","stat","existsSync","readdir","readFile","stat","join","relative","parse","parseDocument","DEFAULT_CONFIG","readFile","join","parseDocument","readOptional","listMarkdownFiles","relative","existsSync","parse","walk","readdir","stat","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","join","readOptional","readFile","resolve","mkdir","readFile","stat","join","join","mkdir","stat","readFile","switchHint","mkdir","readFile","stat","dirname","join","exists","join","mkdir","dirname","readFile","stat","mkdir","readFile","stat","dirname","join","exists","join","readExisting","mkdir","dirname","readFile","stat","execFile","promisify","readdir","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","spawn","resolve","spawn","execFileAsync","promisify","execFile","readdir","stat","join","relative","exists","createInterface","mkdir","readFile","homedir","dirname","join","homedir","join","readFile","mkdir","dirname","createInterface","createInterface","count"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/doctor.ts","../../src/context-placeholders.ts","../../src/fs/atomic-write.ts","../../src/fs/backup.ts","../../src/fs/lock.ts","../../src/fs/journal.ts","../../src/gitnexus.ts","../../src/commands/fill-context.ts","../../src/agents-miniprogram.ts","../../src/scanner/miniprogram.ts","../../src/scanner/package.ts","../../src/templates/miniprogram-agents.ts","../../src/commands/graph.ts","../../src/graph-context.ts","../../src/commands/init.ts","../../src/commands/update-context.ts","../../src/config/yaml.ts","../../src/version.ts","../../src/templates/markers.ts","../../src/templates/agents-md.ts","../../src/templates/config-yaml.ts","../../src/templates/karpathy-skills.ts","../../src/templates/verify-instructions.ts","../../src/tdd/paths.ts","../../src/templates/tdd.ts","../../src/templates/figma-guard.ts","../../src/templates/ui-display-contract.ts","../../src/templates/spec-language.ts","../../src/commands/proxy.ts","../../src/figma-guard.ts","../../src/ui-display-contract.ts","../../src/commands/change-id.ts","../../src/tdd/config.ts","../../src/tdd/fingerprint.ts","../../src/tdd/manifest.ts","../../src/tdd/gates.ts","../../src/state/project.ts","../../src/state/store.ts","../../src/language.ts","../../src/state/schema.ts","../../src/state/tasks.ts","../../src/update/npm.ts","../../src/commands/update.ts","../../src/commands/tdd.ts","../../src/tdd/extract-cases.ts","../../src/commands/run-script.ts","../../src/commands/test.ts","../../src/commands/verify.ts","../../src/model-policy.ts","../../src/cli/context.ts","../../src/adapters/codex/index.ts","../../src/adapters/commands.ts","../../src/adapters/codex/templates.ts","../../src/adapters/cursor/index.ts","../../src/adapters/cursor/templates.ts","../../src/openspec/adapter.ts","../../src/openspec/inspector.ts","../../src/openspec/resolver.ts","../../src/openspec/runner.ts","../../src/scanner/routes.ts","../../src/scanner/index.ts","../../src/cli/output.ts","../../src/cli/update-check.ts","../../src/update/check.ts"],"sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { fillContextCommand } from \"../commands/fill-context.js\";\nimport { graphCommand, type GraphAction } from \"../commands/graph.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { proxyCommand, passthroughCommand } from \"../commands/proxy.js\";\nimport { updateCommand } from \"../commands/update.js\";\nimport { updateContextCommand } from \"../commands/update-context.js\";\nimport { tddCommand } from \"../commands/tdd.js\";\nimport { testCommand } from \"../commands/test.js\";\nimport { verifyCommand } from \"../commands/verify.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError, toFetError } from \"../errors/fet-error.js\";\nimport { formatModelPolicyMismatch, getCommandModelPolicyMismatch, getModelPolicyMode } from \"../model-policy.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { createCommandContext, type GlobalOptions } from \"./context.js\";\nimport { OutputWriter } from \"./output.js\";\nimport { handleFetUpdateCheck } from \"./update-check.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"fet\")\n .description(\"围绕 OpenSpec 的前端开发工作流编排工具。\")\n .enablePositionalOptions()\n .version(FET_VERSION)\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n\naddGlobalOptions(program.command(\"init\")).description(\"初始化 FET + OpenSpec\").action(wrap(\"init\", initCommand));\naddGlobalOptions(program.command(\"update\")).description(\"检查 FET 是否为最新版,并在需要时自动升级\").action(wrap(\"update\", updateCommand));\naddGlobalOptions(program.command(\"update-context\")).description(\"更新项目上下文\").action(wrap(\"update-context\", updateContextCommand));\naddGlobalOptions(program.command(\"fill-context\")).description(\"刷新 IDE 填充 AGENTS.md 占位符的提示文件\").action(wrap(\"fill-context\", fillContextCommand));\n\nconst graph = addGlobalOptions(program.command(\"graph\").description(\"管理可选的 GitNexus 代码图支持\"));\nfor (const action of [\"status\", \"setup\", \"doctor\", \"handoff\"] as const) {\n addGlobalOptions(graph.command(action).description(`运行 fet graph ${action}`)).action(wrap(\"graph\", (ctx) => graphCommand(ctx, action)));\n}\nfor (const action of [\"init\", \"refresh\"] as const) {\n addGlobalOptions(\n graph\n .command(`${action} [args...]`)\n .description(`通过 GitNexus analyze 执行 graph ${action}`)\n .allowUnknownOption(true)\n .passThroughOptions()\n ).action(wrap(\"graph\", (ctx, args: string[] = []) => graphCommand(ctx, action as GraphAction, args)));\n}\n\naddGlobalOptions(program.command(\"doctor\").description(\"诊断状态、配置与一致性\").option(\"--fix-lock\", \"清理 FET 锁文件\")).action(\n wrap(\"doctor\", (ctx, options: { fixLock?: boolean }) => doctorCommand(ctx, { fixLock: Boolean(options.fixLock) }))\n);\n\naddGlobalOptions(program.command(\"tdd\").description(\"根据规划产物生成 change 级 TDD 清单与测试指引\")).action(wrap(\"tdd\", tddCommand));\n\naddGlobalOptions(program.command(\"test\").description(\"按 change TDD 清单运行单测并记录绿灯状态\").option(\"--plan\", \"仅输出将执行的测试命令,不运行\")).action(\n wrap(\"test\", (ctx, options: { plan?: boolean }) => testCommand(ctx, { plan: Boolean(options.plan) }))\n);\n\naddGlobalOptions(program.command(\"verify\").description(\"最终质量验证\").option(\"--done\", \"声明手动验证已完成\").option(\"--auto\", \"生成或执行自动验证计划\")).action(\n wrap(\"verify\", verifyCommand)\n);\n\nfor (const command of [\"explore\", \"propose\", \"new\", \"continue\", \"ff\", \"apply\", \"sync\", \"archive\", \"bulk-archive\", \"onboard\"]) {\n addGlobalOptions(program.command(`${command} [args...]`).description(`代理执行 openspec ${command}`).allowUnknownOption(true).passThroughOptions()).action(\n wrap(command, (ctx, args: string[] = []) => proxyCommand(ctx, command, args))\n );\n}\n\naddGlobalOptions(program.command(\"passthrough <command> [args...]\").description(\"透传暂未接管的 OpenSpec 命令\").allowUnknownOption(true).passThroughOptions()).action(\n wrap(\"passthrough\", (ctx, command: string, args: string[] = []) => passthroughCommand(ctx, command, args))\n);\n\nprogram.parseAsync(process.argv).catch((error) => {\n const json = process.argv.includes(\"--json\");\n const output = new OutputWriter(json);\n const fetError = toFetError(error);\n output.error(fetError);\n process.exitCode = fetError.exitCode;\n});\n\nfunction wrap<T extends unknown[]>(\n command: string,\n handler: (ctx: Awaited<ReturnType<typeof createCommandContext>>, ...args: T) => Promise<void>\n) {\n return async (...args: T) => {\n const maybeCommand = args[args.length - 1] as unknown;\n const opts = isCommandLike(maybeCommand)\n ? ({ ...(maybeCommand.parent?.opts() as GlobalOptions), ...(maybeCommand.opts() as GlobalOptions) } as GlobalOptions)\n : (program.opts() as GlobalOptions);\n const ctx = await createCommandContext(command, { ...opts, ...extractGlobalOptions(args) });\n try {\n await handleFetUpdateCheck(ctx);\n await handleModelPolicyRecommendation(ctx);\n await warnIfContextPlaceholdersRemain(ctx);\n await handler(ctx, ...args);\n } catch (error) {\n const fetError = toFetError(error);\n ctx.output.error(fetError);\n process.exitCode = fetError.exitCode;\n }\n };\n}\n\nasync function handleModelPolicyRecommendation(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n const mismatch = getCommandModelPolicyMismatch(ctx.command);\n if (!mismatch) {\n return;\n }\n\n const warning = formatModelPolicyMismatch(mismatch, ctx.language);\n const policyMode = getModelPolicyMode();\n ctx.output.warn(`${warning} ${renderModelPolicyActionHint(policyMode, ctx.language)}`);\n\n if (policyMode !== \"confirm\" || ctx.yes || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question = ctx.language === \"en\" ? \"Continue anyway? [y/N] \" : \"仍然继续?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled so you can switch IDE model.\" : \"命令已取消,你可以先切换 IDE 模型。\",\n details: { command: ctx.command, detected: mismatch.detected, recommended: mismatch.recommended },\n suggestedCommand: ctx.language === \"en\" ? `Switch IDE model, then rerun fet ${ctx.command}.` : `切换 IDE 模型后重新运行 fet ${ctx.command}。`\n });\n }\n } finally {\n rl.close();\n }\n}\n\nfunction renderModelPolicyActionHint(policyMode: ReturnType<typeof getModelPolicyMode>, language: Awaited<ReturnType<typeof createCommandContext>>[\"language\"]): string {\n if (policyMode === \"confirm\") {\n return language === \"en\"\n ? \"Choose whether to continue this command or stop and switch models.\"\n : \"请选择继续执行本命令,或停止后手动切换模型。\";\n }\n return language === \"en\"\n ? \"This is advisory because FET_MODEL_POLICY=warn; the command will continue.\"\n : \"当前设置 FET_MODEL_POLICY=warn,该提醒仅作为建议,命令会继续执行。\";\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"update\", \"update-context\", \"fill-context\", \"doctor\"].includes(ctx.command)) {\n return;\n }\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (count > 0) {\n ctx.output.warn(renderAgentsPlaceholderWarning(count, ctx.language));\n }\n}\n\nfunction isCommandLike(value: unknown): value is Command {\n return value instanceof Command;\n}\n\nfunction addGlobalOptions(command: Command): Command {\n return command\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n}\n\nfunction extractGlobalOptions(args: unknown[]): GlobalOptions {\n const values = args.flatMap((arg) => (Array.isArray(arg) ? arg : []));\n const options: GlobalOptions = {};\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (typeof value !== \"string\") {\n continue;\n }\n if (value === \"--cwd\" && typeof values[index + 1] === \"string\") {\n options.cwd = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--cwd=\")) {\n options.cwd = value.slice(\"--cwd=\".length);\n } else if (value === \"--change\" && typeof values[index + 1] === \"string\") {\n options.change = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--change=\")) {\n options.change = value.slice(\"--change=\".length);\n } else if (value === \"--lang\" && typeof values[index + 1] === \"string\") {\n options.lang = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--lang=\")) {\n options.lang = value.slice(\"--lang=\".length);\n } else if (value === \"--yes\") {\n options.yes = true;\n } else if (value === \"--json\") {\n options.json = true;\n } else if (value === \"--verbose\") {\n options.verbose = true;\n }\n }\n return options;\n}\n","import { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { clearLock } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, toGitNexusState } from \"../gitnexus.js\";\nimport type { DoctorCheck } from \"../adapters/index.js\";\n\nexport async function doctorCommand(ctx: FetCommandContext, options: { fixLock?: boolean } = {}): Promise<void> {\n const checks: DoctorCheck[] = [];\n\n checks.push(await checkOpenSpec(ctx));\n checks.push(await checkState(ctx));\n checks.push(await checkFile(\"agents\", join(ctx.projectRoot, \"AGENTS.md\"), \"AGENTS.md 缺失\", \"fet update-context\"));\n checks.push(await checkFile(\"config\", join(ctx.projectRoot, \"openspec\", \"config.yaml\"), \"openspec/config.yaml 缺失\", \"fet init\"));\n\n const placeholders = await checkPlaceholders(ctx);\n if (placeholders) {\n checks.push(placeholders);\n }\n checks.push(await checkGitNexus(ctx));\n\n for (const adapter of ctx.toolAdapters) {\n checks.push(...(await adapter.doctor(ctx.projectRoot)));\n }\n\n const lockPath = join(ctx.projectRoot, \"openspec\", \".fet.lock\");\n if (await exists(lockPath)) {\n if (options.fixLock) {\n await clearLock(ctx.projectRoot);\n checks.push({ id: \"lock\", status: \"pass\", message: \"已清理 openspec/.fet.lock\" });\n } else {\n checks.push({ id: \"lock\", status: \"warn\", message: \"存在 openspec/.fet.lock\", suggestedCommand: \"fet doctor --fix-lock\" });\n }\n }\n\n const warnings = checks.filter((check) => check.status !== \"pass\").map((check) => check.message);\n ctx.output.result({\n ok: true,\n command: \"doctor\",\n summary: warnings.length ? `诊断完成,发现 ${warnings.length} 个需要关注的问题。` : \"诊断完成,未发现明显问题。\",\n warnings,\n data: checks\n });\n}\n\nasync function checkGitNexus(ctx: FetCommandContext): Promise<DoctorCheck> {\n const global = await ctx.stateStore.readGlobal();\n const state = mergeGitNexusGraphInfo(\n toGitNexusState(await detectGitNexus(), global?.graph?.gitnexus),\n await inspectGitNexusGraph(ctx.projectRoot)\n );\n if (global) {\n global.graph ??= {};\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return state.installed\n ? {\n id: \"gitnexus\",\n status: \"pass\",\n message:\n ctx.language === \"en\"\n ? `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n : `检测到 GitNexus:${state.executablePath ?? \"gitnexus\"}(${state.version ?? \"unknown\"}),代码图${state.graphExists ? \"已找到\" : \"未找到\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"Optional GitNexus code graph support is not installed\" : \"尚未安装可选的 GitNexus 代码图支持\",\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\n : \"如果希望 OpenSpec 产物优先参考仓库代码图,可以稍后安装 GitNexus\"\n };\n}\n\nasync function checkOpenSpec(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const identity = await ctx.openSpec.resolveExecutable();\n return { id: \"openspec\", status: \"pass\", message: `OpenSpec: ${identity.executablePath} (${identity.version})` };\n } catch (error) {\n return { id: \"openspec\", status: \"fail\", message: error instanceof Error ? error.message : \"OpenSpec 检测失败\" };\n }\n}\n\nasync function checkState(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const state = await ctx.stateStore.readGlobal();\n return state\n ? { id: \"state\", status: \"pass\", message: \"FET 全局状态可读取\" }\n : { id: \"state\", status: \"warn\", message: \"FET 全局状态尚未初始化\", suggestedCommand: \"fet init\" };\n } catch (error) {\n return { id: \"state\", status: \"fail\", message: error instanceof Error ? error.message : \"FET 状态读取失败\" };\n }\n}\n\nasync function checkFile(id: string, path: string, missing: string, suggestedCommand: string): Promise<DoctorCheck> {\n return (await exists(path))\n ? { id, status: \"pass\", message: `${id} 存在` }\n : { id, status: \"warn\", message: missing, suggestedCommand };\n}\n\nasync function checkPlaceholders(ctx: FetCommandContext): Promise<DoctorCheck | null> {\n const agentsPath = join(ctx.projectRoot, \"AGENTS.md\");\n if (!(await exists(agentsPath))) {\n return null;\n }\n\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? `AGENTS.md has ${count} LLM placeholder(s)` : `AGENTS.md 仍有 ${count} 个 LLM 占位符`,\n suggestedCommand: \"fet fill-context\"\n }\n : {\n id: \"context-placeholders\",\n status: \"pass\",\n message: ctx.language === \"en\" ? \"AGENTS.md placeholders resolved\" : \"AGENTS.md 占位符已处理\"\n };\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\n\nexport const AGENTS_LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/g;\n\nexport async function countAgentsLlmPlaceholders(projectRoot: string): Promise<number> {\n try {\n const content = await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n return [...content.matchAll(AGENTS_LLM_PLACEHOLDER_PATTERN)].length;\n } catch {\n return 0;\n }\n}\n\nexport function renderAgentsPlaceholderWarning(count: number, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return `AGENTS.md still contains ${count} LLM placeholder(s). Run fet fill-context first so your IDE AI can replace them. Continuing current command.`;\n }\n return `AGENTS.md 仍有 ${count} 个 LLM 占位符。建议先运行 fet fill-context,让 IDE AI 补齐项目上下文;当前命令会继续执行。`;\n}\n","import { dirname } from \"node:path\";\nimport { open, rename, mkdir } from \"node:fs/promises\";\n\nexport interface AtomicWriteResult {\n path: string;\n tempPath: string;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array\n): Promise<AtomicWriteResult> {\n await mkdir(dirname(targetPath), { recursive: true });\n const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;\n const handle = await open(tempPath, \"wx\");\n\n try {\n await handle.writeFile(content);\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await rename(tempPath, targetPath);\n return { path: targetPath, tempPath };\n}\n","import { copyFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport async function createBackup(filePath: string): Promise<string | null> {\n try {\n await stat(filePath);\n } catch {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\..+$/, \"\")\n .replace(\"T\", \"-\");\n const backupPath = join(dirname(filePath), `${basename(filePath)}.fet-backup-${timestamp}`);\n await copyFile(filePath, backupPath);\n return backupPath;\n}\n","import { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { mkdir, open, readFile, rm } from \"node:fs/promises\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface LockMetadata {\n command: string;\n cwd: string;\n fetVersion: string;\n}\n\ninterface LockFile {\n pid: number;\n hostname: string;\n cwd: string;\n command: string;\n startedAt: string;\n fetVersion: string;\n}\n\nexport async function withProjectLock<T>(\n projectRoot: string,\n metadata: LockMetadata,\n fn: () => Promise<T>\n): Promise<T> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n const lock: LockFile = {\n pid: process.pid,\n hostname: hostname(),\n cwd: metadata.cwd,\n command: metadata.command,\n startedAt: new Date().toISOString(),\n fetVersion: metadata.fetVersion\n };\n\n let handle;\n try {\n await mkdir(dirname(lockPath), { recursive: true });\n handle = await open(lockPath, \"wx\");\n await handle.writeFile(JSON.stringify(lock, null, 2));\n } catch {\n throw new FetError({\n code: ErrorCode.LockHeld,\n message: \"另一个 FET 写命令正在运行\",\n details: await readExistingLock(lockPath),\n suggestedCommand: \"fet doctor --fix-lock\"\n });\n } finally {\n await handle?.close();\n }\n\n try {\n return await fn();\n } finally {\n await rm(lockPath, { force: true });\n }\n}\n\nasync function readExistingLock(lockPath: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(lockPath, \"utf8\"));\n } catch {\n return { path: lockPath };\n }\n}\n\nexport async function clearLock(projectRoot: string): Promise<boolean> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n try {\n await rm(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { atomicWrite } from \"./atomic-write.js\";\n\nexport interface JournalStep {\n operation: \"write\" | \"backup\" | \"mkdir\" | \"skip\";\n path: string;\n backupPath?: string | null;\n status: \"done\" | \"failed\" | \"skipped\";\n message?: string;\n}\n\nexport interface InitJournal {\n schemaVersion: 1;\n startedAt: string;\n completedAt: string | null;\n fetVersion: string;\n steps: JournalStep[];\n}\n\nexport function createInitJournal(fetVersion: string): InitJournal {\n return {\n schemaVersion: 1,\n startedAt: new Date().toISOString(),\n completedAt: null,\n fetVersion,\n steps: []\n };\n}\n\nexport async function writeInitJournal(projectRoot: string, journal: InitJournal): Promise<void> {\n await atomicWrite(\n join(projectRoot, \"openspec\", \".fet-init-journal.json\"),\n `${JSON.stringify(journal, null, 2)}\\n`\n );\n}\n\nexport async function readInitJournal(projectRoot: string): Promise<InitJournal | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"openspec\", \".fet-init-journal.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { FetLanguage } from \"./language.js\";\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_GRAPH_PATH = \".gitnexus\";\n\nexport interface GitNexusDetection {\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n error?: string;\n}\n\nexport interface GitNexusState {\n provider: \"gitnexus\";\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n recommendationShownAt: string | null;\n graphPath?: string | null;\n graphExists?: boolean;\n lastIndexedAt?: string | null;\n lastRefreshAt?: string | null;\n lastStatus?: string | null;\n setupHandoffPath?: string | null;\n setupHandoffUpdatedAt?: string | null;\n handoffPath?: string | null;\n handoffUpdatedAt?: string | null;\n projectContextPath?: string | null;\n projectContextUpdatedAt?: string | null;\n workflowContextPath?: string | null;\n workflowContextUpdatedAt?: string | null;\n lastWorkflowGraphQuery?: string | null;\n}\n\nexport interface GitNexusGraphInfo {\n graphPath: string;\n graphExists: boolean;\n lastIndexedAt: string | null;\n}\n\nexport interface GitNexusRunResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n command: string[];\n}\n\nexport async function detectGitNexus(env: NodeJS.ProcessEnv = process.env): Promise<GitNexusDetection> {\n const checkedAt = new Date().toISOString();\n const command = resolveGitNexusCommand(env);\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, \"--version\"], { shell: process.platform === \"win32\" });\n return {\n installed: true,\n executablePath: command.label,\n version: (stdout.trim() || stderr.trim() || \"unknown\").split(/\\r?\\n/)[0] ?? \"unknown\",\n checkedAt\n };\n } catch (error) {\n return {\n installed: false,\n executablePath: command.label,\n version: null,\n checkedAt,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function toGitNexusState(detection: GitNexusDetection, previous?: GitNexusState | null): GitNexusState {\n return {\n provider: \"gitnexus\",\n installed: detection.installed,\n executablePath: detection.installed ? detection.executablePath : null,\n version: detection.version,\n checkedAt: detection.checkedAt,\n recommendationShownAt: previous?.recommendationShownAt ?? null,\n graphPath: previous?.graphPath ?? null,\n graphExists: previous?.graphExists ?? false,\n lastIndexedAt: previous?.lastIndexedAt ?? null,\n lastRefreshAt: previous?.lastRefreshAt ?? null,\n lastStatus: previous?.lastStatus ?? null,\n setupHandoffPath: previous?.setupHandoffPath ?? null,\n setupHandoffUpdatedAt: previous?.setupHandoffUpdatedAt ?? null,\n handoffPath: previous?.handoffPath ?? null,\n handoffUpdatedAt: previous?.handoffUpdatedAt ?? null,\n projectContextPath: previous?.projectContextPath ?? null,\n projectContextUpdatedAt: previous?.projectContextUpdatedAt ?? null,\n workflowContextPath: previous?.workflowContextPath ?? null,\n workflowContextUpdatedAt: previous?.workflowContextUpdatedAt ?? null,\n lastWorkflowGraphQuery: previous?.lastWorkflowGraphQuery ?? null\n };\n}\n\nexport async function inspectGitNexusGraph(projectRoot: string, env: NodeJS.ProcessEnv = process.env): Promise<GitNexusGraphInfo> {\n const relative = env.FET_GITNEXUS_GRAPH_PATH?.trim() || DEFAULT_GRAPH_PATH;\n const graphPath = join(projectRoot, relative);\n try {\n const info = await stat(graphPath);\n return {\n graphPath: relative,\n graphExists: true,\n lastIndexedAt: info.mtime.toISOString()\n };\n } catch {\n return {\n graphPath: relative,\n graphExists: false,\n lastIndexedAt: null\n };\n }\n}\n\nexport async function runGitNexus(args: string[], options: { cwd: string; env?: NodeJS.ProcessEnv }): Promise<GitNexusRunResult> {\n const command = resolveGitNexusCommand(options.env ?? process.env);\n const fullCommand = [command.file, ...command.args, ...args];\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, ...args], {\n cwd: options.cwd,\n shell: process.platform === \"win32\"\n });\n return {\n exitCode: 0,\n stdout,\n stderr,\n command: fullCommand\n };\n } catch (error) {\n const maybe = error as { code?: number | string; stdout?: string; stderr?: string };\n return {\n exitCode: typeof maybe.code === \"number\" ? maybe.code : 1,\n stdout: maybe.stdout ?? \"\",\n stderr: maybe.stderr ?? (error instanceof Error ? error.message : String(error)),\n command: fullCommand\n };\n }\n}\n\nexport function mergeGitNexusGraphInfo(state: GitNexusState, graph: GitNexusGraphInfo): GitNexusState {\n return {\n ...state,\n graphPath: graph.graphPath,\n graphExists: graph.graphExists,\n lastIndexedAt: graph.lastIndexedAt\n };\n}\n\nexport function renderGitNexusRecommendation(state: GitNexusState, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (state.installed) {\n return `Optional GitNexus detected (${state.version ?? \"unknown\"}). You can generate a code graph after init; future OpenSpec artifacts should prefer the graph when it is available.`;\n }\n return \"Optional GitNexus code graph support is not installed. Consider installing GitNexus later to speed up OpenSpec artifact generation and improve code insertion context.\";\n }\n if (state.installed) {\n return `检测到可选 GitNexus(${state.version ?? \"unknown\"})。初始化后可以生成代码图;后续 OpenSpec 产物在图可用时应优先参考它。`;\n }\n\n return \"未安装可选的 GitNexus 代码图支持。可以稍后安装 GitNexus,以加速 OpenSpec 产物生成并改善代码插入上下文。\";\n}\n\nfunction resolveGitNexusCommand(env: NodeJS.ProcessEnv): { file: string; args: string[]; label: string } {\n const raw = env.FET_GITNEXUS_COMMAND?.trim() || env.FET_GITNEXUS_EXECUTABLE?.trim() || \"gitnexus\";\n const parts = splitCommand(raw);\n const [file = \"gitnexus\", ...args] = parts;\n const resolvedFile = process.platform === \"win32\" && raw === \"gitnexus\" ? \"gitnexus.cmd\" : file;\n return { file: resolvedFile, args, label: raw };\n}\n\nfunction splitCommand(value: string): string[] {\n const matches = value.match(/\"[^\"]+\"|'[^']+'|\\S+/g);\n return (matches?.length ? matches : [value]).map((part) => part.replace(/^[\"']|[\"']$/g, \"\"));\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { applyMiniprogramAgentsContext } from \"../agents-miniprogram.js\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { withProjectLock } from \"../fs/index.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport async function fillContextCommand(ctx: FetCommandContext): Promise<void> {\n let miniprogramSummary: string | undefined;\n await withProjectLock(ctx.projectRoot, { command: \"fill-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const miniprogramResult = await applyMiniprogramAgentsContext(ctx.projectRoot, ctx.language);\n miniprogramSummary = miniprogramResult.summary;\n\n const handoffPath = join(ctx.projectRoot, \".fet\", \"fill-context.md\");\n await mkdir(dirname(handoffPath), { recursive: true });\n await atomicWrite(handoffPath, renderGenericHandoff(ctx.language, miniprogramResult.detection.supported));\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(state);\n if (ctx.verbose) {\n ctx.output.info(ctx.language === \"en\" ? `Updated ${adapter.tool} adapter` : `已更新 ${adapter.tool} 适配器`, { written: result.written });\n }\n }\n });\n\n const placeholders = await countAgentsLlmPlaceholders(ctx.projectRoot);\n const warnings = miniprogramSummary ? [miniprogramSummary] : undefined;\n ctx.output.result({\n ok: true,\n command: \"fill-context\",\n summary:\n ctx.language === \"en\"\n ? placeholders\n ? `Found ${placeholders} AGENTS.md placeholder(s). Use your IDE AI to fill the rest.`\n : \"AGENTS.md placeholders are complete. IDE fill-context commands were refreshed.\"\n : placeholders\n ? `发现 ${placeholders} 个 AGENTS.md 占位符。请使用 IDE AI 补齐其余部分。`\n : \"AGENTS.md 占位符已补齐,已刷新 IDE fill-context 命令。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? placeholders\n ? [\n \"Cursor: run /fet-fill-context\",\n \"Codex: run /prompts:fet-fill-context\",\n \"OpenCode or other IDEs: open .fet/fill-context.md or run fet fill-context for handoff instructions\"\n ]\n : [\"Run fet doctor to confirm project context health\"]\n : placeholders\n ? [\n \"Cursor:运行 /fet-fill-context\",\n \"Codex:运行 /prompts:fet-fill-context\",\n \"OpenCode 或其他 IDE:打开 .fet/fill-context.md,或运行 fet fill-context 查看交接说明\"\n ]\n : [\"运行 fet doctor 确认项目上下文状态\"],\n data: {\n placeholders,\n cursorCommand: \"/fet-fill-context\",\n codexCommand: \"/prompts:fet-fill-context\"\n }\n });\n}\n\nfunction renderGenericHandoff(language: FetLanguage, miniprogramDetected: boolean): string {\n const miniprogramNoteEn = miniprogramDetected\n ? \"FET already scanned the mini program layout and wrote package-size constraints into AGENTS.md. Do not overwrite the Mini Program / package-size / development-constraint subsections unless the repo changed.\"\n : \"If AGENTS.md has a Mini Program section marked not applicable, keep it unless the project is actually a mini program.\";\n const miniprogramNoteZh = miniprogramDetected\n ? \"FET 已扫描小程序目录并把包体积/开发约束写入 AGENTS.md。除非仓库结构已变,不要覆盖「小程序」节中的包体积表与开发约束。\"\n : \"若 AGENTS.md 小程序节已标记为不适用,且项目确实不是小程序,可保留该说明。\";\n\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET Fill Context\n\nUse the IDE AI to complete FET-generated placeholders.\n\n1. Read AGENTS.md and openspec/config.yaml.\n2. Read .fet/karpathy-guidelines.md when it exists. For Codex, also read .codex/fet/karpathy-guidelines.md when it exists.\n3. Inspect README files, package scripts, routes, tests, source layout, and project conventions.\n4. ${miniprogramNoteEn}\n5. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content.\n6. Preserve FET managed markers.\n7. Do not modify business code.\n8. Run \\`fet doctor\\` and confirm no AGENTS.md placeholder warning remains.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET 填充上下文\n\n使用 IDE AI 补齐 FET 生成的项目上下文占位符。\n\n1. 阅读 AGENTS.md 和 openspec/config.yaml。\n2. 如果存在 .fet/karpathy-guidelines.md,请一并阅读。对 Codex,如果存在 .codex/fet/karpathy-guidelines.md,也要阅读。\n3. 检查 README、package scripts、路由、测试、源码结构和项目约定。\n4. ${miniprogramNoteZh}\n5. 将其余 \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、项目相关的内容。\n6. 保留 FET 托管标记。\n7. 不要修改业务代码。\n8. 运行 \\`fet doctor\\`,确认不再有 AGENTS.md 占位符警告。\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport { detectMiniprogramProject, type MiniprogramDetection } from \"./scanner/miniprogram.js\";\nimport {\n patchAgentsMiniprogramSection,\n renderMiniprogramFilledSection,\n renderMiniprogramNotApplicableSection\n} from \"./templates/miniprogram-agents.js\";\n\nexport interface MiniprogramAgentsApplyResult {\n applied: boolean;\n detection: MiniprogramDetection;\n summary: string;\n}\n\nexport async function applyMiniprogramAgentsContext(projectRoot: string, language: FetLanguage): Promise<MiniprogramAgentsApplyResult> {\n const agentsPath = join(projectRoot, \"AGENTS.md\");\n const detection = await detectMiniprogramProject(projectRoot);\n let existing: string;\n try {\n existing = await readFile(agentsPath, \"utf8\");\n } catch {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md was not found.\" : \"未找到 AGENTS.md。\"\n };\n }\n\n const section = detection.supported\n ? renderMiniprogramFilledSection(detection, language)\n : renderMiniprogramNotApplicableSection(language);\n const next = patchAgentsMiniprogramSection(existing, section, language);\n if (next === existing) {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md mini program section was unchanged.\" : \"AGENTS.md 小程序节未变更。\"\n };\n }\n\n await atomicWrite(agentsPath, next);\n if (!detection.supported) {\n return {\n applied: true,\n detection,\n summary: language === \"en\" ? \"Marked mini program section as not applicable.\" : \"已将小程序节标记为不适用。\"\n };\n }\n\n const near = [detection.mainPackage, ...detection.subpackages].filter((pkg) => pkg.status !== \"ok\");\n const summary =\n language === \"en\"\n ? near.length\n ? `Updated AGENTS.md mini program constraints (${near.length} package(s) near or over limit).`\n : \"Updated AGENTS.md mini program constraints and package size table.\"\n : near.length\n ? `已更新 AGENTS.md 小程序约束(${near.length} 个包接近或超过体积上限)。`\n : \"已更新 AGENTS.md 小程序包体积表与开发约束。\";\n\n return { applied: true, detection, summary };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { readPackageJson } from \"./package.js\";\n\nconst MAIN_PACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst SUBPACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst TOTAL_LIMIT_BYTES = 20 * 1024 * 1024;\nconst NEAR_LIMIT_BYTES = Math.floor(1.7 * 1024 * 1024);\n\nexport type MiniprogramPlatform = \"wechat\" | \"uni-app\" | \"taro\" | \"other\";\n\nexport type PackageSizeStatus = \"ok\" | \"near_limit\" | \"over_limit\";\n\nexport interface PackageSizeReport {\n name: string;\n root: string;\n sizeBytes: number;\n sizeLabel: string;\n limitBytes: number;\n status: PackageSizeStatus;\n pagePaths: string[];\n}\n\nexport interface MiniprogramScanResult {\n supported: true;\n platform: MiniprogramPlatform;\n platformLabel: string;\n projectType: string;\n appJsonPath: string;\n miniprogramRoot: string;\n mainPackage: PackageSizeReport;\n subpackages: PackageSizeReport[];\n totalSizeBytes: number;\n warnings: string[];\n}\n\nexport type MiniprogramDetection = MiniprogramScanResult | { supported: false };\n\ninterface AppJson {\n pages?: string[];\n subPackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n subpackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n}\n\nexport async function detectMiniprogramProject(projectRoot: string): Promise<MiniprogramDetection> {\n const pkg = await readPackageJson(projectRoot);\n const platform = await resolvePlatform(projectRoot, pkg);\n if (!platform) {\n return { supported: false };\n }\n\n const appJsonPath = await resolveAppJsonPath(projectRoot, platform);\n if (!appJsonPath) {\n return { supported: false };\n }\n\n const miniprogramRoot = dirnameNormalized(appJsonPath);\n const appJson = await readAppJson(appJsonPath);\n if (!appJson) {\n return { supported: false };\n }\n\n const subPackages = appJson.subPackages ?? appJson.subpackages ?? [];\n const subRoots = subPackages.map((item) => normalizeRelative(item.root ?? \"\")).filter(Boolean);\n const mainPagePaths = appJson.pages ?? [];\n\n const mainDirs = uniquePaths(mainPagePaths.map((page) => pageDir(page)).filter(Boolean));\n const mainSize = await sumPaths(miniprogramRoot, mainDirs, subRoots);\n const mainPackage: PackageSizeReport = {\n name: \"main\",\n root: miniprogramRoot,\n sizeBytes: mainSize,\n sizeLabel: formatBytes(mainSize),\n limitBytes: MAIN_PACKAGE_LIMIT_BYTES,\n status: sizeStatus(mainSize, MAIN_PACKAGE_LIMIT_BYTES),\n pagePaths: mainPagePaths\n };\n\n const subpackageReports: PackageSizeReport[] = [];\n for (const sub of subPackages) {\n const root = normalizeRelative(sub.root ?? \"\");\n if (!root) {\n continue;\n }\n const size = await directorySize(join(miniprogramRoot, root));\n subpackageReports.push({\n name: sub.name ?? root.replace(/\\/$/, \"\"),\n root,\n sizeBytes: size,\n sizeLabel: formatBytes(size),\n limitBytes: SUBPACKAGE_LIMIT_BYTES,\n status: sizeStatus(size, SUBPACKAGE_LIMIT_BYTES),\n pagePaths: sub.pages ?? []\n });\n }\n\n const totalSizeBytes = mainPackage.sizeBytes + subpackageReports.reduce((sum, item) => sum + item.sizeBytes, 0);\n const warnings: string[] = [];\n if (totalSizeBytes >= NEAR_LIMIT_BYTES) {\n warnings.push(\n totalSizeBytes >= TOTAL_LIMIT_BYTES\n ? \"源码目录合计体积已达到或超过 20MB 参考上限,需整体瘦身。\"\n : \"源码目录合计体积已接近 20MB 参考上限。\"\n );\n }\n\n return {\n supported: true,\n platform: platform.id,\n platformLabel: platform.label,\n projectType: platform.projectType,\n appJsonPath: relative(projectRoot, appJsonPath).replace(/\\\\/g, \"/\"),\n miniprogramRoot: relative(projectRoot, miniprogramRoot).replace(/\\\\/g, \"/\") || \".\",\n mainPackage,\n subpackages: subpackageReports,\n totalSizeBytes,\n warnings\n };\n}\n\nasync function resolvePlatform(\n projectRoot: string,\n pkg: Awaited<ReturnType<typeof readPackageJson>>\n): Promise<{ id: MiniprogramPlatform; label: string; projectType: string } | null> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n\n if (await exists(join(projectRoot, \"project.config.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生 / 微信开发者工具\" };\n }\n if (deps[\"@tarojs/taro\"] || deps[\"@tarojs/cli\"] || (await exists(join(projectRoot, \"config\", \"index.ts\")))) {\n return { id: \"taro\", label: \"Taro(可发布微信小程序)\", projectType: \"Taro 跨端小程序\" };\n }\n if ((await exists(join(projectRoot, \"manifest.json\"))) && (await exists(join(projectRoot, \"pages.json\")))) {\n return { id: \"uni-app\", label: \"uni-app(可发布微信小程序)\", projectType: \"uni-app 跨端小程序\" };\n }\n if (await exists(join(projectRoot, \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(app.json)\" };\n }\n if (await exists(join(projectRoot, \"miniprogram\", \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(miniprogram 目录)\" };\n }\n if (deps[\"miniprogram-api-typings\"]) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信 API 类型定义项目\" };\n }\n return null;\n}\n\nasync function resolveAppJsonPath(projectRoot: string, platform: { id: MiniprogramPlatform }): Promise<string | null> {\n const candidates: string[] = [];\n if (platform.id === \"wechat\") {\n try {\n const config = JSON.parse(await readFile(join(projectRoot, \"project.config.json\"), \"utf8\")) as {\n miniprogramRoot?: string;\n };\n if (config.miniprogramRoot) {\n candidates.push(join(projectRoot, config.miniprogramRoot, \"app.json\"));\n }\n } catch {\n // ignore\n }\n candidates.push(join(projectRoot, \"app.json\"), join(projectRoot, \"miniprogram\", \"app.json\"));\n } else {\n candidates.push(\n join(projectRoot, \"src\", \"app.json\"),\n join(projectRoot, \"app.json\"),\n join(projectRoot, \"miniprogram\", \"app.json\"),\n join(projectRoot, \"dist\", \"app.json\")\n );\n }\n\n for (const candidate of candidates) {\n if (await exists(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nasync function readAppJson(path: string): Promise<AppJson | null> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as AppJson;\n } catch {\n return null;\n }\n}\n\nasync function sumPaths(baseDir: string, dirs: string[], excludedRoots: string[]): Promise<number> {\n let total = 0;\n const visited = new Set<string>();\n\n for (const dir of dirs) {\n const abs = join(baseDir, dir);\n if (visited.has(abs)) {\n continue;\n }\n visited.add(abs);\n total += await directorySize(abs);\n }\n\n const rootFiles = await readdir(baseDir, { withFileTypes: true });\n for (const entry of rootFiles) {\n if (!entry.isFile()) {\n continue;\n }\n if (shouldSkipName(entry.name)) {\n continue;\n }\n total += (await stat(join(baseDir, entry.name))).size;\n }\n\n for (const entry of rootFiles) {\n if (!entry.isDirectory() || shouldSkipName(entry.name)) {\n continue;\n }\n const rel = `${entry.name}/`;\n if (dirs.some((dir) => dir === entry.name || dir.startsWith(`${entry.name}/`))) {\n continue;\n }\n if (excludedRoots.some((root) => root === entry.name || root.startsWith(`${entry.name}/`) || rel.startsWith(root))) {\n continue;\n }\n total += await directorySize(join(baseDir, entry.name));\n }\n\n return total;\n}\n\nasync function directorySize(targetPath: string): Promise<number> {\n try {\n const info = await stat(targetPath);\n if (!info.isDirectory()) {\n return info.size;\n }\n } catch {\n return 0;\n }\n\n let total = 0;\n const queue = [targetPath];\n while (queue.length) {\n const current = queue.pop();\n if (!current) {\n break;\n }\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (shouldSkipName(entry.name)) {\n continue;\n }\n const next = join(current, entry.name);\n if (entry.isDirectory()) {\n queue.push(next);\n } else if (entry.isFile()) {\n try {\n total += (await stat(next)).size;\n } catch {\n // ignore unreadable files\n }\n }\n }\n }\n return total;\n}\n\nfunction pageDir(pagePath: string): string {\n const normalized = pagePath.replace(/^\\//, \"\");\n const parts = normalized.split(\"/\");\n if (parts.length <= 1) {\n return parts[0] ?? \"\";\n }\n return parts.slice(0, -1).join(\"/\");\n}\n\nfunction sizeStatus(sizeBytes: number, limitBytes: number): PackageSizeStatus {\n if (sizeBytes >= limitBytes) {\n return \"over_limit\";\n }\n if (sizeBytes >= NEAR_LIMIT_BYTES) {\n return \"near_limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.replace(/^\\//, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.filter(Boolean))];\n}\n\nfunction shouldSkipName(name: string): boolean {\n return name === \"node_modules\" || name === \".git\" || name === \"miniprogram_npm\" || name.startsWith(\".\");\n}\n\nfunction dirnameNormalized(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, \"/\").split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \".\";\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse } from \"yaml\";\nimport type { ScannedCommand, ScannedWorkspace } from \"./types.js\";\n\ninterface PackageJson {\n name?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[] };\n}\n\nexport async function readPackageJson(projectRoot: string): Promise<PackageJson | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"package.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n\nexport interface PackageManagerDetection {\n manager: string;\n confidence: \"high\" | \"medium\" | \"low\";\n warnings: string[];\n}\n\nexport async function detectPackageManager(projectRoot: string, pkg: PackageJson | null): Promise<PackageManagerDetection> {\n const warnings: string[] = [];\n if (pkg?.packageManager) {\n const declared = pkg.packageManager.split(\"@\")[0] ?? \"unknown\";\n const locks = await detectLockManagers(projectRoot);\n const conflicting = locks.filter((item) => item !== declared);\n if (conflicting.length) {\n warnings.push(`packageManager 声明为 ${declared},但同时发现锁文件:${conflicting.join(\", \")}`);\n }\n return { manager: declared, confidence: \"high\", warnings };\n }\n\n const locks = await detectLockManagers(projectRoot);\n if (locks.length > 1) {\n warnings.push(`发现多个包管理器锁文件:${locks.join(\", \")},默认使用 ${locks[0]}`);\n return { manager: locks[0] ?? \"npm\", confidence: \"medium\", warnings };\n }\n if (locks[0]) {\n return { manager: locks[0], confidence: \"high\", warnings };\n }\n return { manager: \"npm\", confidence: \"low\", warnings };\n}\n\nexport function extractCommands(pkg: PackageJson | null, packageManager: string): Record<string, ScannedCommand> {\n const scripts = pkg?.scripts ?? {};\n const result: Record<string, ScannedCommand> = {};\n const scriptNames = [\"dev\", \"build\", \"lint\", \"typecheck\", \"check\", \"test\", \"test:unit\"];\n\n for (const name of scriptNames) {\n if (scripts[name]) {\n const dimension = name === \"check\" ? \"typecheck\" : name === \"test:unit\" ? \"test\" : name;\n if (result[dimension]) {\n continue;\n }\n result[dimension] = {\n command: scriptCommand(packageManager, name),\n source: `package.json:scripts.${name}`,\n required: name === \"build\"\n };\n }\n }\n\n return result;\n}\n\nexport function detectFramework(pkg: PackageJson | null): { name: string; confidence: \"high\" | \"medium\" | \"low\"; sources: string[] } {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n const candidates: Array<[string, string[]]> = [\n [\"next\", [\"next\"]],\n [\"nuxt\", [\"nuxt\"]],\n [\"vite\", [\"vite\"]],\n [\"sveltekit\", [\"@sveltejs/kit\"]],\n [\"angular\", [\"@angular/core\", \"@angular/cli\"]],\n [\"react\", [\"react\"]],\n [\"vue\", [\"vue\"]],\n [\"svelte\", [\"svelte\"]]\n ];\n for (const [candidate, packages] of candidates) {\n if (packages.some((name) => deps[name])) {\n return { name: candidate, confidence: \"high\", sources: [\"package.json\"] };\n }\n }\n return { name: \"unknown\", confidence: \"low\", sources: [] };\n}\n\nexport async function detectLanguage(projectRoot: string, pkg: PackageJson | null): Promise<string> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n if (deps.typescript || (await exists(join(projectRoot, \"tsconfig.json\")))) {\n return \"typescript\";\n }\n return \"javascript\";\n}\n\nexport async function detectWorkspaces(projectRoot: string, pkg: PackageJson | null): Promise<ScannedWorkspace[]> {\n const packageWorkspaces = normalizeWorkspaces(pkg?.workspaces).map((path) => ({\n name: path,\n path,\n source: \"package.json:workspaces\"\n }));\n if (packageWorkspaces.length) {\n return packageWorkspaces;\n }\n\n try {\n const workspace = parse(await readFile(join(projectRoot, \"pnpm-workspace.yaml\"), \"utf8\")) as { packages?: string[] } | null;\n return (workspace?.packages ?? []).map((path) => ({\n name: path,\n path,\n source: \"pnpm-workspace.yaml:packages\"\n }));\n } catch {\n return [];\n }\n}\n\nasync function detectLockManagers(projectRoot: string): Promise<string[]> {\n const lockFiles: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"bun.lockb\", \"bun\"],\n [\"bun.lock\", \"bun\"],\n [\"package-lock.json\", \"npm\"]\n ];\n const found: string[] = [];\n for (const [file, manager] of lockFiles) {\n if (await exists(join(projectRoot, file))) {\n found.push(manager);\n }\n }\n return found;\n}\n\nfunction normalizeWorkspaces(workspaces: PackageJson[\"workspaces\"]): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n return workspaces?.packages ?? [];\n}\n\nfunction scriptCommand(packageManager: string, name: string): string {\n return packageManager === \"npm\" ? `npm run ${name}` : `${packageManager} ${name}`;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import type { MiniprogramScanResult } from \"../scanner/miniprogram.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nconst MAIN_LIMIT_MB = 2;\nconst SUB_LIMIT_MB = 2;\nconst TOTAL_LIMIT_MB = 20;\nconst NEAR_LIMIT_MB = 1.7;\n\nexport function renderMiniprogramPlaceholderSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\n- Platform: [NEEDS LLM INPUT]\n- Project type: [NEEDS LLM INPUT]\n\n### Package size (filled by \\`fet fill-context\\`)\n\n[NEEDS LLM INPUT]\n\n### Development constraints\n\n[NEEDS LLM INPUT]`;\n }\n\n return `## 小程序\n\n- 平台:[NEEDS LLM INPUT]\n- 工程类型:[NEEDS LLM INPUT]\n\n### 包体积(由 \\`fet fill-context\\` 扫描补充)\n\n[NEEDS LLM INPUT]\n\n### 开发约束\n\n[NEEDS LLM INPUT]`;\n}\n\nexport function renderMiniprogramFilledSection(scan: MiniprogramScanResult, language: FetLanguage): string {\n if (language === \"en\") {\n return renderMiniprogramFilledSectionEn(scan);\n }\n return renderMiniprogramFilledSectionZh(scan);\n}\n\nfunction renderMiniprogramFilledSectionZh(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableZh(scan);\n const rules = renderConstraintRulesZh(scan);\n const warnings = scan.warnings.length ? `\\n\\n扫描提示:${scan.warnings.join(\";\")}` : \"\";\n\n return `## 小程序\n\n- 平台:${scan.platformLabel}\n- 工程类型:${scan.projectType}\n- 配置:\\`${scan.appJsonPath}\\`(根目录 \\`${scan.miniprogramRoot}/\\`)\n\n### 包体积(源码目录估算,上传前以微信开发者工具 / CI 构建产物为准)\n\n${sizeTable}\n\n> 说明:下表按仓库内页面/分包目录源码体积累计,用于规划开发;**实际上传体积以编译后为准**,通常与源码趋势一致。\n\n### 开发约束\n\n${rules}${warnings}`;\n}\n\nfunction renderMiniprogramFilledSectionEn(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableEn(scan);\n const rules = renderConstraintRulesEn(scan);\n const warnings = scan.warnings.length ? `\\n\\nScan notes: ${scan.warnings.join(\"; \")}` : \"\";\n\n return `## Mini Program\n\n- Platform: ${scan.platformLabel}\n- Project type: ${scan.projectType}\n- Config: \\`${scan.appJsonPath}\\` (root \\`${scan.miniprogramRoot}/\\`)\n\n### Package size (source tree estimate; verify with WeChat DevTools / CI build output)\n\n${sizeTable}\n\n> These numbers sum source directories for planning. **Uploaded package size is determined by the build output**, but source trends usually match.\n\n### Development constraints\n\n${rules}${warnings}`;\n}\n\nfunction renderSizeTableZh(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowZh(\"主包\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowZh(`分包 ${item.name}`, item))\n ];\n rows.push(`| 合计(源码估算) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | 参考 |`);\n\n return `| 包 | 根目录 | 源码体积(估算) | 上限 | 状态 |\n|----|--------|------------------|------|------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderSizeTableEn(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowEn(\"main\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowEn(`subpackage ${item.name}`, item))\n ];\n rows.push(`| total (source estimate) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | reference |`);\n\n return `| package | root | estimated source size | limit | status |\n|---------|------|------------------------|-------|--------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderPackageRowZh(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelZh(pkg.status)} |`;\n}\n\nfunction renderPackageRowEn(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelEn(pkg.status)} |`;\n}\n\nfunction renderConstraintRulesZh(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- 微信小程序体积上限(发布到微信时):**主包 ≤ ${MAIN_LIMIT_MB}MB**,**单个分包 ≤ ${SUB_LIMIT_MB}MB**,**整包 ≤ ${TOTAL_LIMIT_MB}MB**(以[微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html)为准)。`,\n `- **接近上限阈值:源码目录 ≥ ${NEAR_LIMIT_MB}MB** 即视为「接近 2MB」:禁止在该包内**新增页面**、大图、音视频、重复静态资源;优先拆到其他分包、懒加载或先做体积优化。`,\n `- 体积 **≥ ${MAIN_LIMIT_MB}MB(主包)或 ≥ ${SUB_LIMIT_MB}MB(分包)** 时,必须先瘦身再新增功能或页面。`,\n `- 新增页面前:确认目标包不在「接近上限」或「超限」列表;跨包迁移页面时同步更新 \\`app.json\\` / 分包配置与路由引用。`,\n `- Taro / uni-app 发布到微信时同样受上述上传体积约束;其他端规则见对应平台文档。`\n ];\n\n if (blocked.near.length) {\n lines.push(\n `- **当前接近上限(≥${NEAR_LIMIT_MB}MB,禁止在本包内新增页面)**:${blocked.near.map((item) => `\\`${item}\\``).join(\"、\")}。`\n );\n }\n if (blocked.over.length) {\n lines.push(`- **当前已超限(必须先瘦身)**:${blocked.over.map((item) => `\\`${item}\\``).join(\"、\")}。`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- 当前扫描未发现接近 2MB 的主包/分包目录,但仍应在每次较大改动后复核构建产物体积。\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderConstraintRulesEn(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- WeChat upload limits: **main package ≤ ${MAIN_LIMIT_MB}MB**, **each subpackage ≤ ${SUB_LIMIT_MB}MB**, **whole mini program ≤ ${TOTAL_LIMIT_MB}MB** (see WeChat official docs).`,\n `- Treat **source tree ≥ ${NEAR_LIMIT_MB}MB** as near the 2MB cap: do **not** add new pages, large media, or redundant static assets in that package; split work to another subpackage or optimize first.`,\n `- If a package is **≥ ${MAIN_LIMIT_MB}MB (main) or ≥ ${SUB_LIMIT_MB}MB (sub)** , optimize before adding pages or features.`,\n `- Before adding a page, confirm the target package is not listed below; update \\`app.json\\` / subpackage config when moving pages.`,\n `- Taro / uni-app builds for WeChat follow the same upload limits.`\n ];\n\n if (blocked.near.length) {\n lines.push(`- **Near limit (≥${NEAR_LIMIT_MB}MB, no new pages in these packages):** ${blocked.near.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (blocked.over.length) {\n lines.push(`- **Over limit (optimize before more work):** ${blocked.over.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- No package is near 2MB in this scan; still verify build output after large changes.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction collectBlockedPackages(scan: MiniprogramScanResult): { near: string[]; over: string[] } {\n const near: string[] = [];\n const over: string[] = [];\n const all = [scan.mainPackage, ...scan.subpackages];\n for (const pkg of all) {\n const label = pkg.name === \"main\" ? `主包(${pkg.root})` : `${pkg.name}(${pkg.root})`;\n if (pkg.status === \"over_limit\") {\n over.push(label);\n } else if (pkg.status === \"near_limit\") {\n near.push(label);\n }\n }\n return { near, over };\n}\n\nfunction statusLabelZh(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"超限\";\n }\n if (status === \"near_limit\") {\n return \"接近上限\";\n }\n return \"正常\";\n}\n\nfunction statusLabelEn(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"over limit\";\n }\n if (status === \"near_limit\") {\n return \"near limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nexport function renderMiniprogramNotApplicableSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\nNot detected as a mini program project. Leave this section as N/A or remove it if irrelevant.`;\n }\n return `## 小程序\n\n未识别为小程序工程;如无小程序场景可填写「不适用」或删除本节。`;\n}\n\nexport function patchAgentsMiniprogramSection(content: string, sectionMarkdown: string, language: FetLanguage): string {\n const heading = language === \"en\" ? \"## Mini Program\" : \"## 小程序\";\n const autoBegin = \"<!-- FET:BEGIN AUTO -->\";\n const autoEnd = \"<!-- FET:END AUTO -->\";\n const begin = content.indexOf(autoBegin);\n const end = content.indexOf(autoEnd);\n if (begin === -1 || end === -1 || end < begin) {\n return content;\n }\n\n const auto = content.slice(begin, end);\n const headingIndex = auto.indexOf(heading);\n if (headingIndex === -1) {\n const insertion = `\\n\\n${sectionMarkdown}\\n`;\n return `${content.slice(0, end)}${insertion}${content.slice(end)}`;\n }\n\n const afterHeading = auto.slice(headingIndex + heading.length);\n const nextHeading = afterHeading.search(/\\n## /);\n const sectionEnd = nextHeading === -1 ? auto.length : headingIndex + heading.length + nextHeading;\n const absoluteStart = begin + headingIndex;\n const absoluteEnd = begin + sectionEnd;\n return `${content.slice(0, absoluteStart)}${sectionMarkdown}${content.slice(absoluteEnd)}`;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { buildProjectGraphContext } from \"../graph-context.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"../gitnexus.js\";\n\nexport type GraphAction = \"status\" | \"setup\" | \"init\" | \"refresh\" | \"doctor\" | \"handoff\";\n\nexport async function graphCommand(ctx: FetCommandContext, action: GraphAction, args: string[] = []): Promise<void> {\n switch (action) {\n case \"status\":\n await graphStatusCommand(ctx);\n return;\n case \"doctor\":\n await graphDoctorCommand(ctx);\n return;\n case \"setup\":\n await graphSetupCommand(ctx);\n return;\n case \"handoff\":\n await graphHandoffCommand(ctx);\n return;\n case \"init\":\n await graphAnalyzeCommand(ctx, \"init\", args);\n return;\n case \"refresh\":\n await graphAnalyzeCommand(ctx, \"refresh\", args);\n return;\n }\n}\n\nasync function graphStatusCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"\n : \"尚未安装 GitNexus。运行 fet graph setup 获取安装交接说明。\"\n ];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary:\n ctx.language === \"en\"\n ? result.state.installed\n ? `GitNexus graph status checked. Graph ${result.state.graphExists ? \"exists\" : \"does not exist\"} at ${result.state.graphPath ?? \".gitnexus\"}.`\n : \"GitNexus is not installed. Graph support remains optional.\"\n : result.state.installed\n ? `已检查 GitNexus 代码图状态。代码图${result.state.graphExists ? \"存在\" : \"不存在\"},路径为 ${result.state.graphPath ?? \".gitnexus\"}。`\n : \"尚未安装 GitNexus。代码图能力保持可选。\",\n warnings,\n nextSteps:\n result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"Run fet graph init to build the first GitNexus graph\" : \"运行 fet graph init 生成第一份 GitNexus 代码图\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphDoctorCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = [\n ...(!result.state.installed ? [ctx.language === \"en\" ? \"GitNexus is not installed.\" : \"尚未安装 GitNexus。\"] : []),\n ...(result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"GitNexus is installed but no graph directory was found.\" : \"已安装 GitNexus,但未发现代码图目录。\"]\n : []),\n ...(!result.state.handoffPath\n ? [ctx.language === \"en\" ? \"Graph handoff instructions have not been generated.\" : \"尚未生成代码图使用交接说明。\"]\n : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary:\n ctx.language === \"en\"\n ? warnings.length\n ? `Graph doctor completed with ${warnings.length} warning(s).`\n : \"Graph doctor completed without warnings.\"\n : warnings.length\n ? `代码图诊断完成,发现 ${warnings.length} 个警告。`\n : \"代码图诊断完成,未发现警告。\",\n warnings,\n nextSteps:\n warnings.length\n ? ctx.language === \"en\"\n ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"]\n : [\"运行 fet graph setup\", \"运行 fet graph handoff\", \"安装 GitNexus 后运行 fet graph init\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphSetupCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-setup.md\");\n const installCommand = process.env.FET_GITNEXUS_INSTALL_COMMAND?.trim() || null;\n await withProjectLock(ctx.projectRoot, { command: \"graph setup\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { write: false });\n await writeHandoffFile(handoffPath, renderGraphSetupHandoff(result.state, { installCommand, language: ctx.language }));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n setupHandoffPath: \".fet/graph-setup.md\",\n setupHandoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph setup\",\n summary:\n ctx.language === \"en\"\n ? \"GitNexus IDE-assisted setup playbook generated.\"\n : \"已生成 GitNexus IDE LLM 辅助安装任务书。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The playbook lets the current IDE LLM guide installation with user confirmation before risky commands.\"\n : \"尚未安装 GitNexus。任务书会指导当前 IDE LLM 推进安装,并在高风险命令前请求用户确认。\"\n ],\n nextSteps: result.state.installed\n ? [\n ctx.language === \"en\"\n ? \"Ask your IDE AI to read .fet/graph-setup.md and run the optional gitnexus setup flow if you want IDE/MCP integration\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并在需要 IDE/MCP 集成时按确认流程运行 gitnexus setup\",\n \"fet graph init\"\n ]\n : [\n ctx.language === \"en\"\n ? \"Ask your current IDE AI to read .fet/graph-setup.md and follow the installation playbook\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并按安装任务书推进\"\n ],\n data: {\n path: \".fet/graph-setup.md\",\n installCommandConfigured: Boolean(installCommand),\n gitnexus: result.state\n }\n });\n}\n\nasync function graphHandoffCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-handoff.md\");\n await withProjectLock(ctx.projectRoot, { command: \"graph handoff\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { runStatus: true, write: false });\n await writeHandoffFile(handoffPath, renderGraphUsageHandoff(result.state, ctx.language));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n handoffPath: \".fet/graph-handoff.md\",\n handoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph handoff\",\n summary: ctx.language === \"en\" ? \"GitNexus graph usage handoff generated.\" : \"已生成 GitNexus 代码图使用交接说明。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The handoff still documents the fallback behavior.\"\n : \"尚未安装 GitNexus。交接说明仍会记录回退行为。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"]\n : [\"Cursor/Codex/OpenCode:大范围扫描仓库前先阅读 .fet/graph-handoff.md\"],\n data: {\n path: \".fet/graph-handoff.md\",\n gitnexus: result.state\n }\n });\n}\n\nasync function graphAnalyzeCommand(ctx: FetCommandContext, mode: \"init\" | \"refresh\", args: string[]): Promise<void> {\n const detection = await detectGitNexus();\n if (!detection.installed) {\n throw new FetError({\n code: ErrorCode.GraphProviderNotFound,\n message: ctx.language === \"en\" ? \"GitNexus is not installed or is not available on PATH.\" : \"尚未安装 GitNexus,或 GitNexus 不在 PATH 中。\",\n details: { executable: detection.executablePath, error: detection.error },\n suggestedCommand: \"fet graph setup\"\n });\n }\n\n const run = await runGitNexus([\"analyze\", ...args], { cwd: ctx.projectRoot });\n if (run.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.GraphCommandFailed,\n message: ctx.language === \"en\" ? \"GitNexus analyze failed.\" : \"GitNexus analyze 执行失败。\",\n details: { command: run.command.join(\" \"), exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr },\n suggestedCommand: \"fet graph doctor\"\n });\n }\n\n const result = await refreshGraphState(ctx, { write: false });\n const graphContext = await buildProjectGraphContext(ctx, result.state, `fet graph ${mode}`);\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString(),\n projectContextPath: graphContext.path,\n projectContextUpdatedAt: graphContext.generated ? new Date().toISOString() : result.state.projectContextUpdatedAt ?? null\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary:\n ctx.language === \"en\"\n ? mode === \"init\"\n ? \"GitNexus graph initialized.\"\n : \"GitNexus graph refreshed.\"\n : mode === \"init\"\n ? \"已初始化 GitNexus 代码图。\"\n : \"已刷新 GitNexus 代码图。\",\n warnings: result.state.graphExists\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus analyze completed, but the configured graph directory was not found.\"\n : \"GitNexus analyze 已完成,但未发现配置的代码图目录。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Run fet graph status\", \"Read .fet/graph-context/project.md before broad scans\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"]\n : [\"运行 fet graph status\", \"使用 .fet/graph-handoff.md 或生成的 IDE 提示,优先参考代码图上下文\"],\n data: {\n gitnexus: global.graph.gitnexus,\n graphContext,\n run: {\n command: run.command,\n stdout: run.stdout.trim(),\n stderr: run.stderr.trim()\n }\n }\n });\n}\n\nasync function refreshGraphState(ctx: FetCommandContext, options: { runStatus?: boolean; write?: boolean } = {}) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n let state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n let gitnexusStatus: Awaited<ReturnType<typeof runGitNexus>> | null = null;\n\n if (options.runStatus && detection.installed) {\n gitnexusStatus = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n state = {\n ...state,\n lastStatus: firstLine(gitnexusStatus.stdout) || firstLine(gitnexusStatus.stderr) || `exit ${gitnexusStatus.exitCode}`\n };\n }\n\n if (options.write ?? true) {\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return {\n state,\n gitnexusStatus: gitnexusStatus\n ? {\n exitCode: gitnexusStatus.exitCode,\n command: gitnexusStatus.command,\n stdout: gitnexusStatus.stdout.trim(),\n stderr: gitnexusStatus.stderr.trim()\n }\n : null\n };\n}\n\nasync function writeHandoffFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderGraphSetupHandoff(\n state: GitNexusState,\n options: { installCommand: string | null; language: FetCommandContext[\"language\"] }\n): string {\n if (options.language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE Setup Playbook\n\nThis file is written for the current IDE LLM. Use it to help the user install and verify optional GitNexus graph support. GitNexus is optional; FET/OpenSpec workflows must continue to work when it is unavailable.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Executable: ${state.executablePath ?? \"gitnexus\"}\n- Version: ${state.version ?? \"unknown\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Configured install command: ${options.installCommand ?? \"none\"}\n\nIDE LLM setup flow:\n\n1. Check the shell, operating system, package managers, and PATH. Run only read-only detection commands at first.\n2. Run \\`gitnexus --version\\` or the executable shown above. If it succeeds, skip installation and continue to verification.\n3. If GitNexus is missing and \\`FET_GITNEXUS_INSTALL_COMMAND\\` is configured, explain that command to the user and ask for approval before running it.\n4. If no install command is configured, find the official GitNexus installation instructions or ask the user for the preferred install method. Do not invent an installer.\n5. Before running any command that downloads software, installs globally, changes PATH, modifies user home files, or changes IDE/MCP configuration, show the exact command and wait for user approval.\n6. After installation, verify with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, run \\`gitnexus setup\\` only after explaining what it may change and receiving approval.\n8. Return to this project and run \\`fet graph init\\` to build the first graph.\n9. Run \\`fet graph handoff\\` so future IDE AI work can prefer graph context before broad repository scans.\n\nGuardrails:\n\n- Do not block FET/OpenSpec commands when GitNexus is unavailable.\n- Do not generate or modify application code during setup.\n- Do not silently install software or modify global/user-level configuration.\n- If installation fails, summarize the failing command, stderr, and the next manual step.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE 安装任务书\n\n本文档写给当前 IDE LLM。请用它帮助用户安装并验证可选的 GitNexus 代码图能力。GitNexus 是可选能力;即使不可用,FET/OpenSpec 主流程也必须继续可用。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 可执行文件:${state.executablePath ?? \"gitnexus\"}\n- 版本:${state.version ?? \"unknown\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 已配置安装命令:${options.installCommand ?? \"无\"}\n\nIDE LLM 安装流程:\n\n1. 先检测 shell、操作系统、包管理器和 PATH。起步阶段只运行只读检测命令。\n2. 运行 \\`gitnexus --version\\` 或上方显示的可执行文件。如果成功,跳过安装并进入验证。\n3. 如果 GitNexus 缺失且已配置 \\`FET_GITNEXUS_INSTALL_COMMAND\\`,先向用户解释该命令,再等待用户批准后执行。\n4. 如果没有配置安装命令,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。不要臆造安装命令。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户目录或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n6. 安装后运行 \\`gitnexus --version\\` 验证。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\` 可能修改的内容,获得确认后再运行。\n8. 回到本项目运行 \\`fet graph init\\`,生成第一份代码图。\n9. 运行 \\`fet graph handoff\\`,让后续 IDE AI 在大范围扫描前优先使用代码图上下文。\n\n约束:\n\n- GitNexus 不可用时,不要阻塞 FET/OpenSpec 命令。\n- 安装过程中不要生成或修改业务代码。\n- 不要静默安装软件,也不要静默修改全局或用户级配置。\n- 如果安装失败,汇总失败命令、stderr 和下一步人工处理建议。\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState, language: FetCommandContext[\"language\"]): string {\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET Graph Handoff\n\nUse GitNexus graph context as an optional first pass before broad repository scans.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${state.lastIndexedAt ?? \"unknown\"}\n- Last status: ${state.lastStatus ?? \"unknown\"}\n\nWhen graph context is available:\n\n1. Use the graph to identify likely modules, dependencies, and insertion points.\n2. Read only the concrete source files needed to confirm behavior.\n3. Prefer OpenSpec artifacts and AGENTS.md over graph guesses when they conflict.\n4. Fall back to normal repository inspection if the graph is missing, stale, or incomplete.\n\nWhen producing OpenSpec artifacts:\n\n- Use graph context to make proposal, design, specs, and tasks more precise.\n- Avoid large repository scans when the graph already narrows the relevant area.\n- Keep all generated artifacts in the normal OpenSpec change directory.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET 代码图交接说明\n\n在大范围扫描仓库前,优先把 GitNexus 代码图上下文作为可选的第一轮线索。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 最后索引时间:${state.lastIndexedAt ?? \"unknown\"}\n- 最后状态:${state.lastStatus ?? \"unknown\"}\n\n代码图上下文可用时:\n\n1. 用代码图识别可能相关的模块、依赖和插入点。\n2. 只读取需要确认行为的具体源码文件。\n3. 当代码图推断与 OpenSpec 产物或 AGENTS.md 冲突时,优先相信 OpenSpec 产物和 AGENTS.md。\n4. 如果代码图缺失、过期或不完整,回退到普通仓库检查。\n\n生成 OpenSpec 产物时:\n\n- 用代码图上下文让 proposal、design、specs 和 tasks 更精确。\n- 当代码图已经缩小相关范围时,避免大范围仓库扫描。\n- 所有生成产物仍写入正常的 OpenSpec change 目录。\n`;\n}\n\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"./cli/context.js\";\nimport { atomicWrite } from \"./fs/index.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"./gitnexus.js\";\n\nconst MAX_SOURCE_CONTEXT = 8000;\nconst MAX_GRAPH_OUTPUT = 20000;\n\nexport interface GraphContextResult {\n generated: boolean;\n path: string | null;\n query: string | null;\n warnings: string[];\n}\n\nexport async function buildProjectGraphContext(\n ctx: FetCommandContext,\n state: GitNexusState,\n trigger: string\n): Promise<GraphContextResult> {\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: [\"GitNexus graph exists check did not pass; project graph context was not generated.\"]\n };\n }\n\n const query = \"FET OpenSpec workflow architecture commands adapters graph integration project structure\";\n const goal = \"Summarize the repository modules, workflow entry points, and likely insertion points for future FET/OpenSpec work.\";\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const status = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n const warnings = commandWarnings([[\"gitnexus query\", graphQuery], [\"gitnexus status\", status]]);\n const relativePath = \".fet/graph-context/project.md\";\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderProjectContext({\n trigger,\n state,\n query,\n goal,\n status: commandText(status),\n graphOutput: commandText(graphQuery),\n warnings\n })\n );\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nexport async function buildWorkflowGraphContext(\n ctx: FetCommandContext,\n options: { command: string; args: string[]; changeId: string | null }\n): Promise<GraphContextResult> {\n const existing = await ctx.stateStore.getOrCreateGlobal();\n if (!existing.graph?.gitnexus?.graphExists) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const state = await refreshGitNexusState(ctx);\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const sourceContext = await collectOpenSpecContext(ctx.projectRoot, options.changeId);\n const query = buildWorkflowQuery(options, sourceContext);\n const goal = workflowGoal(options.command);\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const detectChanges = shouldDetectChanges(options.command)\n ? await runGitNexus([\"detect-changes\", \"--scope\", \"all\"], { cwd: ctx.projectRoot })\n : null;\n const warnings = commandWarnings([\n [\"gitnexus query\", graphQuery],\n ...(detectChanges ? ([[\"gitnexus detect-changes\", detectChanges]] as const) : [])\n ]);\n const relativePath = `.fet/graph-context/${sanitizePathPart(options.changeId ?? options.command)}.md`;\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderWorkflowContext({\n state,\n command: options.command,\n args: options.args,\n changeId: options.changeId,\n query,\n goal,\n sourceContext,\n graphOutput: commandText(graphQuery),\n detectChanges: detectChanges ? commandText(detectChanges) : null,\n warnings\n })\n );\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...state,\n workflowContextPath: relativePath,\n workflowContextUpdatedAt: new Date().toISOString(),\n lastWorkflowGraphQuery: query\n };\n await ctx.stateStore.writeGlobal(global);\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nasync function refreshGitNexusState(ctx: FetCommandContext): Promise<GitNexusState> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n const state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n return state;\n}\n\nfunction isGraphReadable(state: GitNexusState): boolean {\n return Boolean(state.installed && state.graphExists);\n}\n\nasync function writeGraphContext(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderProjectContext(options: {\n trigger: string;\n state: GitNexusState;\n query: string;\n goal: string;\n status: string;\n graphOutput: string;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: project\nFET:END -->\n\n# FET GitNexus Project Graph Context\n\nGenerated at: ${new Date().toISOString()}\nTrigger: ${options.trigger}\n\nUse this file before broad repository scans in FET/OpenSpec work. Treat it as graph-derived context: confirm concrete behavior by reading the source files it points to.\n\n## Graph State\n\n- Provider: GitNexus\n- Installed: ${options.state.installed ? \"yes\" : \"no\"}\n- Version: ${options.state.version ?? \"unknown\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${options.state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## GitNexus Status\n\n\\`\\`\\`text\n${clip(options.status, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n\n## Project Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWorkflowContext(options: {\n state: GitNexusState;\n command: string;\n args: string[];\n changeId: string | null;\n query: string;\n goal: string;\n sourceContext: string;\n graphOutput: string;\n detectChanges: string | null;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: workflow\nFET:END -->\n\n# FET GitNexus Workflow Graph Context\n\nGenerated at: ${new Date().toISOString()}\n\nRead this before editing or generating OpenSpec artifacts for this workflow. Use the graph output to narrow likely files, symbols, dependencies, and impact areas. If it conflicts with OpenSpec artifacts or source code, OpenSpec artifacts and source code win.\n\n## Workflow\n\n- FET command: ${options.command}\n- Args: ${options.args.length ? options.args.join(\" \") : \"(none)\"}\n- Change: ${options.changeId ?? \"(none)\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## OpenSpec Context Used For Query\n\n\\`\\`\\`text\n${clip(options.sourceContext || \"(no change artifacts found yet)\", MAX_SOURCE_CONTEXT)}\n\\`\\`\\`\n\n## GitNexus Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${options.detectChanges ? `\n## GitNexus Change Impact\n\n\\`\\`\\`text\n${clip(options.detectChanges, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n` : \"\"}\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWarnings(warnings: string[]): string {\n if (!warnings.length) {\n return \"\";\n }\n return `\n## Warnings\n\n${warnings.map((warning) => `- ${warning}`).join(\"\\n\")}\n`;\n}\n\nasync function collectOpenSpecContext(projectRoot: string, changeId: string | null): Promise<string> {\n if (!changeId) {\n return \"\";\n }\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const chunks: string[] = [];\n for (const file of [\"proposal.md\", \"design.md\", \"tasks.md\", \"README.md\"]) {\n const content = await readOptional(join(changeRoot, file));\n if (content) {\n chunks.push(`## ${file}\\n${content}`);\n }\n }\n\n const specsRoot = join(changeRoot, \"specs\");\n for (const spec of await listSpecFiles(specsRoot)) {\n const content = await readOptional(spec.path);\n if (content) {\n chunks.push(`## ${spec.label}\\n${content}`);\n }\n }\n\n return clip(chunks.join(\"\\n\\n\"), MAX_SOURCE_CONTEXT);\n}\n\nasync function listSpecFiles(specsRoot: string): Promise<Array<{ path: string; label: string }>> {\n try {\n const capabilities = await readdir(specsRoot, { withFileTypes: true });\n return capabilities\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n path: join(specsRoot, entry.name, \"spec.md\"),\n label: `specs/${entry.name}/spec.md`\n }));\n } catch {\n return [];\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction buildWorkflowQuery(options: { command: string; args: string[]; changeId: string | null }, sourceContext: string): string {\n const artifactTerms = normalizeWhitespace(sourceContext).slice(0, 1200);\n return normalizeWhitespace(\n [\n `FET OpenSpec ${options.command}`,\n options.changeId ? `change ${options.changeId}` : \"\",\n options.args.join(\" \"),\n artifactTerms\n ].join(\" \")\n );\n}\n\nfunction workflowGoal(command: string): string {\n if (command === \"apply\") {\n return \"Find implementation files, symbols, dependencies, and likely blast radius for the current OpenSpec tasks.\";\n }\n if (command === \"verify\") {\n return \"Find affected flows and source areas that should be checked while verifying this OpenSpec change.\";\n }\n if ([\"explore\", \"propose\", \"new\", \"continue\", \"ff\"].includes(command)) {\n return \"Find relevant modules, entry points, and existing behavior to make OpenSpec artifacts precise.\";\n }\n return \"Find relevant repository context for this FET/OpenSpec workflow command.\";\n}\n\nfunction shouldDetectChanges(command: string): boolean {\n return [\"apply\", \"verify\", \"sync\"].includes(command);\n}\n\nfunction commandText(result: Awaited<ReturnType<typeof runGitNexus>>): string {\n const output = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join(\"\\n\");\n return output || `exit ${result.exitCode}`;\n}\n\nfunction commandWarnings(results: ReadonlyArray<readonly [string, Awaited<ReturnType<typeof runGitNexus>>]>): string[] {\n return results\n .filter(([, result]) => result.exitCode !== 0)\n .map(([label, result]) => `${label} exited with ${result.exitCode}: ${firstLine(commandText(result))}`);\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || \"no output\";\n}\n\nfunction clip(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, max)}\\n\\n[truncated ${value.length - max} characters]`;\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizePathPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"workflow\";\n}\n","import { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { createInitJournal, withProjectLock, writeInitJournal } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, renderGitNexusRecommendation, toGitNexusState } from \"../gitnexus.js\";\nimport { updateContextFiles } from \"./update-context.js\";\n\nexport async function initCommand(ctx: FetCommandContext): Promise<void> {\n const alreadyInitialized = await exists(join(ctx.projectRoot, \"openspec\", \"config.yaml\"));\n let warnings: string[] = [];\n await withProjectLock(ctx.projectRoot, { command: \"init\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const journal = createInitJournal(ctx.fetVersion);\n await writeInitJournal(ctx.projectRoot, journal);\n\n const identity = await ctx.openSpec.resolveExecutable();\n if (!alreadyInitialized) {\n const result = await ctx.openSpec.run(\"init\", [\"--tools\", \"none\"], { cwd: ctx.projectRoot, stdio: \"inherit\" });\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n return;\n }\n }\n\n const contextResult = await updateContextFiles(ctx);\n warnings = contextResult.warnings;\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openspec = identity;\n state.language = {\n current: ctx.language,\n updatedAt: new Date().toISOString()\n };\n state.graph ??= {};\n const gitnexus = mergeGitNexusGraphInfo(toGitNexusState(await detectGitNexus(), state.graph.gitnexus), await inspectGitNexusGraph(ctx.projectRoot));\n if (!gitnexus.installed && !gitnexus.recommendationShownAt) {\n warnings.push(renderGitNexusRecommendation(gitnexus, ctx.language));\n gitnexus.recommendationShownAt = new Date().toISOString();\n }\n state.graph.gitnexus = gitnexus;\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n journal.steps.push(...result.written.map((path) => ({ operation: \"write\" as const, path, status: \"done\" as const })));\n }\n\n journal.completedAt = new Date().toISOString();\n await writeInitJournal(ctx.projectRoot, journal);\n await ctx.stateStore.writeGlobal(state);\n });\n\n ctx.output.result({\n ok: true,\n command: \"init\",\n summary: ctx.language === \"en\" ? \"FET initialization completed.\" : \"FET 初始化完成。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? [\"Use fet propose/new to create an OpenSpec change\", \"Use fet doctor to check project health\"]\n : [\"使用 fet propose/new 创建 OpenSpec change\", \"使用 fet doctor 检查项目状态\"]\n });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { mergeFetConfig } from \"../config/index.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, createBackup, withProjectLock } from \"../fs/index.js\";\nimport {\n hasInvalidManagedAutoRegion,\n hasManagedAutoRegion,\n mergeKarpathyClaudeMd,\n renderAgentsMd,\n renderFetConfig,\n renderKarpathyCursorRule,\n renderKarpathyFetHandoff,\n replaceManagedRegion\n} from \"../templates/index.js\";\n\nexport async function updateContextCommand(ctx: FetCommandContext): Promise<void> {\n let contextResult: { warnings: string[] } = { warnings: [] };\n await withProjectLock(ctx.projectRoot, { command: \"update-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n contextResult = await updateContextFiles(ctx);\n });\n\n ctx.output.result({\n ok: true,\n command: \"update-context\",\n summary:\n ctx.language === \"en\"\n ? \"Updated FET-managed regions in AGENTS.md and openspec/config.yaml.\"\n : \"已更新 AGENTS.md 与 openspec/config.yaml 中的 FET 托管区域。\",\n warnings: contextResult.warnings\n });\n}\n\nexport async function updateContextFiles(ctx: FetCommandContext): Promise<{ warnings: string[] }> {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const agentsPath = join(ctx.projectRoot, \"AGENTS.md\");\n const configPath = join(ctx.projectRoot, \"openspec\", \"config.yaml\");\n const claudePath = join(ctx.projectRoot, \"CLAUDE.md\");\n const karpathyHandoffPath = join(ctx.projectRoot, \".fet\", \"karpathy-guidelines.md\");\n const karpathyCursorPath = join(ctx.projectRoot, \".cursor\", \"rules\", \"karpathy-guidelines.mdc\");\n\n const existingAgents = await readOptional(agentsPath);\n const existingClaude = await readOptional(claudePath);\n const existingKarpathyCursor = await readOptional(karpathyCursorPath);\n const warnings = [...scan.warnings];\n\n if (existingAgents && hasInvalidManagedAutoRegion(existingAgents)) {\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: ctx.language === \"en\" ? \"AGENTS.md FET managed markers are broken or duplicated.\" : \"AGENTS.md 的 FET 托管标记损坏或重复。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Manually repair FET:BEGIN AUTO / FET:END AUTO markers, then rerun.\"\n : \"手动修复 FET:BEGIN AUTO / FET:END AUTO 标记后重试。\"\n });\n }\n\n if (existingAgents && !hasManagedAutoRegion(existingAgents)) {\n if (!ctx.yes && !(await confirmInitCanReplaceUnmanagedAgents(ctx))) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message:\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and does not contain a FET-managed region.\"\n : \"AGENTS.md 已存在,且不包含 FET 托管区域。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.command === \"init\"\n ? ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet init --yes.\"\n : \"确认可备份并替换后运行 fet init --yes。\"\n : ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet update-context --yes.\"\n : \"确认可备份并替换后运行 fet update-context --yes。\"\n });\n }\n const backupPath = await createBackup(agentsPath);\n if (backupPath) {\n warnings.push(ctx.language === \"en\" ? `Backed up unmanaged AGENTS.md to ${backupPath}` : `已将非托管 AGENTS.md 备份到 ${backupPath}`);\n }\n }\n\n await atomicWrite(agentsPath, replaceManagedRegion(existingAgents, renderAgentsMd(scan, ctx.language)));\n await atomicWrite(configPath, await mergeFetConfig(configPath, renderFetConfig(scan, ctx.language)));\n await atomicWrite(claudePath, mergeKarpathyClaudeMd(existingClaude, ctx.language));\n await atomicWrite(karpathyHandoffPath, renderKarpathyFetHandoff(ctx.language));\n if (!existingKarpathyCursor || existingKarpathyCursor.includes(\"FET:MANAGED\")) {\n await atomicWrite(karpathyCursorPath, renderKarpathyCursorRule(ctx.language));\n } else {\n warnings.push(\n ctx.language === \"en\"\n ? \".cursor/rules/karpathy-guidelines.mdc exists and is not managed by FET; leaving it unchanged.\"\n : \".cursor/rules/karpathy-guidelines.mdc 已存在且不由 FET 托管,已保持不变。\"\n );\n }\n\n const placeholderCount = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (placeholderCount > 0) {\n warnings.push(renderAgentsPlaceholderWarning(placeholderCount, ctx.language));\n }\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.context = {\n agentsMdUpdatedAt: scan.generatedAt,\n configUpdatedAt: scan.generatedAt,\n scannerVersion: scan.scannerVersion\n };\n await ctx.stateStore.writeGlobal(state);\n\n return { warnings };\n}\n\nasync function confirmInitCanReplaceUnmanagedAgents(ctx: FetCommandContext): Promise<boolean> {\n if (ctx.command !== \"init\" || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and is not managed by FET. Continue now with the same effect as fet init --yes? [y/N] \"\n : \"AGENTS.md 已存在且不由 FET 托管。是否继续执行,效果等同于 fet init --yes?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"y\" || answer === \"yes\") {\n return true;\n }\n } finally {\n rl.close();\n }\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? \"fet init cancelled so you can handle AGENTS.md manually.\"\n : \"已取消 fet init,你可以先手动处理 AGENTS.md。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Review AGENTS.md, then rerun fet init or fet init --yes.\"\n : \"检查 AGENTS.md 后,手动重新运行 fet init 或 fet init --yes。\"\n });\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parseDocument } from \"yaml\";\n\nexport async function mergeFetConfig(configPath: string, renderedFetYaml: string): Promise<string> {\n const fetDoc = parseDocument(renderedFetYaml);\n const nextFet = fetDoc.get(\"fet\", true);\n\n let existing = \"\";\n try {\n existing = await readFile(configPath, \"utf8\");\n } catch {\n return renderedFetYaml;\n }\n\n const doc = parseDocument(existing || \"{}\");\n doc.set(\"fet\", nextFet);\n return doc.toString();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, parse } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const FET_VERSION = readPackageVersion();\n\nfunction readPackageVersion(): string {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n const root = parse(currentDir).root;\n\n while (true) {\n const packageJsonPath = join(currentDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\n if (typeof packageJson.version === \"string\" && packageJson.version.length > 0) {\n return packageJson.version;\n }\n throw new Error(`package.json 缺少有效的 version 字段: ${packageJsonPath}`);\n }\n\n if (currentDir === root) {\n throw new Error(\"无法定位 FET package.json\");\n }\n currentDir = dirname(currentDir);\n }\n}\n","export const AUTO_BEGIN = \"<!-- FET:BEGIN AUTO -->\";\nexport const AUTO_END = \"<!-- FET:END AUTO -->\";\nexport const USER_BEGIN = \"<!-- FET:BEGIN USER -->\";\nexport const USER_END = \"<!-- FET:END USER -->\";\n\nconst LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/;\n\nexport function hasManagedAutoRegion(content: string): boolean {\n return count(content, AUTO_BEGIN) === 1 && count(content, AUTO_END) === 1 && content.indexOf(AUTO_BEGIN) < content.indexOf(AUTO_END);\n}\n\nexport function hasInvalidManagedAutoRegion(content: string): boolean {\n const beginCount = count(content, AUTO_BEGIN);\n const endCount = count(content, AUTO_END);\n return beginCount !== endCount || beginCount > 1 || endCount > 1 || (beginCount === 1 && content.indexOf(AUTO_BEGIN) > content.indexOf(AUTO_END));\n}\n\nexport function replaceManagedRegion(existing: string | null, generated: string): string {\n if (!existing) {\n return generated;\n }\n\n const start = existing.indexOf(AUTO_BEGIN);\n const end = existing.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return generated;\n }\n\n const before = existing.slice(0, start);\n const after = existing.slice(end + AUTO_END.length);\n const existingAuto = extractAuto(existing);\n const generatedAuto = extractAuto(generated);\n return `${before}${AUTO_BEGIN}\\n${mergeAutoRegion(existingAuto, generatedAuto)}\\n${AUTO_END}${after}`;\n}\n\nfunction mergeAutoRegion(existingAuto: string, generatedAuto: string): string {\n const generatedSections = splitMarkdownSections(generatedAuto);\n const existingSections = new Map(splitMarkdownSections(existingAuto).map((section) => [sectionKey(section.heading), section]));\n if (!generatedSections.length || !existingSections.size) {\n return generatedAuto;\n }\n\n return generatedSections\n .map((section) => {\n const existing = existingSections.get(sectionKey(section.heading));\n if (existing && LLM_PLACEHOLDER_PATTERN.test(section.body) && !LLM_PLACEHOLDER_PATTERN.test(existing.body)) {\n return existing.raw.trim();\n }\n return section.raw.trim();\n })\n .join(\"\\n\\n\");\n}\n\nfunction sectionKey(heading: string): string {\n const normalized = heading.replace(/^##\\s+/, \"\").trim().toLowerCase();\n const aliases: Record<string, string> = {\n \"project snapshot\": \"snapshot\",\n \"项目快照\": \"snapshot\",\n workspaces: \"workspaces\",\n \"工作区\": \"workspaces\",\n commands: \"commands\",\n \"命令\": \"commands\",\n structure: \"structure\",\n \"结构\": \"structure\",\n routes: \"routes\",\n \"路由\": \"routes\",\n conventions: \"conventions\",\n \"约定\": \"conventions\",\n \"ai work guidelines\": \"ai-guidelines\",\n \"ai 工作指南\": \"ai-guidelines\",\n \"scanner metadata\": \"metadata\",\n \"扫描元数据\": \"metadata\",\n \"mini program\": \"miniprogram\",\n \"小程序\": \"miniprogram\",\n \"package size (filled by `fet fill-context`)\": \"miniprogram-size\",\n \"包体积(由 `fet fill-context` 扫描补充)\": \"miniprogram-size\",\n \"development constraints\": \"miniprogram-rules\",\n \"开发约束\": \"miniprogram-rules\",\n \"notes for ai\": \"notes\",\n \"给 ai 的备注\": \"notes\"\n };\n return aliases[normalized] ?? normalized;\n}\n\ninterface MarkdownSection {\n heading: string;\n body: string;\n raw: string;\n}\n\nfunction splitMarkdownSections(content: string): MarkdownSection[] {\n const matches = [...content.matchAll(/^## .+$/gm)];\n if (!matches.length) {\n return [];\n }\n\n return matches.map((match, index) => {\n const start = match.index ?? 0;\n const end = matches[index + 1]?.index ?? content.length;\n const raw = content.slice(start, end).trim();\n const newline = raw.indexOf(\"\\n\");\n const heading = newline === -1 ? raw.trim() : raw.slice(0, newline).trim();\n const body = newline === -1 ? \"\" : raw.slice(newline + 1).trim();\n return { heading, body, raw };\n });\n}\n\nfunction extractAuto(content: string): string {\n const start = content.indexOf(AUTO_BEGIN);\n const end = content.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return content.trim();\n }\n return content.slice(start + AUTO_BEGIN.length, end).trim();\n}\n\nfunction count(content: string, needle: string): number {\n return content.split(needle).length - 1;\n}\n","import type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport { renderMiniprogramPlaceholderSection } from \"./miniprogram-agents.js\";\nimport { AUTO_BEGIN, AUTO_END, USER_BEGIN, USER_END } from \"./markers.js\";\n\nexport function renderAgentsMd(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderAgentsMdEn(scan);\n }\n return renderAgentsMdZh(scan);\n}\n\nfunction renderAgentsMdZh(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# 项目上下文\n\n${AUTO_BEGIN}\n## 项目快照\n\n- 名称:${scan.project.name}\n- 包管理器:${scan.project.packageManager}(${scan.project.packageManagerConfidence})\n- 框架:${scan.project.framework.name}(${scan.project.framework.confidence})\n- 语言:${scan.project.language}\n- Monorepo:${scan.project.monorepo ? \"是\" : \"否\"}\n\n## 工作区\n\n| 名称 | 路径 | 来源 |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## 命令\n\n| 名称 | 命令 | 来源 |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## 结构\n\n[NEEDS LLM INPUT]\n\n## 路由\n\n| 路由 | 来源 | 置信度 |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## 约定\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"zh-CN\")}\n\n## AI 工作指南\n\n- 使用 FET 托管的 IDE 工作流时,优先参考 .fet/karpathy-guidelines.md 中的项目级指南。\n- 对 Codex,还应在存在时阅读 .codex/fet/karpathy-guidelines.md。\n- 这些指南低于用户最新请求和明确的 OpenSpec 产物。\n- 默认使用中文产出交互信息、计划文档和实现说明,除非用户另有明确要求。\n\n## 扫描元数据\n\n- 生成时间:${scan.generatedAt}\n- FET 版本:${FET_VERSION}\n- 扫描器版本:${scan.scannerVersion}\n- 警告:${scan.warnings.length ? scan.warnings.join(\"; \") : \"无\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## 给 AI 的备注\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n\nfunction renderAgentsMdEn(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# Project Context\n\n${AUTO_BEGIN}\n## Project Snapshot\n\n- Name: ${scan.project.name}\n- Package Manager: ${scan.project.packageManager} (${scan.project.packageManagerConfidence})\n- Framework: ${scan.project.framework.name} (${scan.project.framework.confidence})\n- Language: ${scan.project.language}\n- Monorepo: ${scan.project.monorepo ? \"yes\" : \"no\"}\n\n## Workspaces\n\n| Name | Path | Source |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## Commands\n\n| Name | Command | Source |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## Structure\n\n[NEEDS LLM INPUT]\n\n## Routes\n\n| Route | Source | Confidence |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## Conventions\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"en\")}\n\n## AI Work Guidelines\n\n- Prefer the project-level Andrej Karpathy inspired guidelines in .fet/karpathy-guidelines.md when using FET-managed IDE workflows.\n- For Codex, also read .codex/fet/karpathy-guidelines.md when present.\n- Treat those guidelines as secondary to the user's latest request and explicit OpenSpec artifacts.\n\n## Scanner Metadata\n\n- Generated At: ${scan.generatedAt}\n- FET Version: ${FET_VERSION}\n- Scanner Version: ${scan.scannerVersion}\n- Warnings: ${scan.warnings.length ? scan.warnings.join(\"; \") : \"none\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## Notes For AI\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n","import { stringify } from \"yaml\";\nimport type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function renderFetConfig(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n return stringify({\n fet: {\n schemaVersion: 1,\n generatedAt: scan.generatedAt,\n fetVersion: FET_VERSION,\n language,\n scannerVersion: scan.scannerVersion,\n project: {\n packageManager: scan.project.packageManager,\n packageManagerConfidence: scan.project.packageManagerConfidence,\n framework: scan.project.framework,\n language: scan.project.language,\n monorepo: scan.project.monorepo,\n workspaces: scan.project.workspaces\n },\n commands: scan.commands,\n validation: {\n monorepo: scan.project.monorepo,\n missing: {\n lint: \"warn\",\n typecheck: \"warn\",\n test: \"warn\"\n },\n workspaces: scan.project.workspaces\n },\n figmaGuard: {\n enabled: true,\n mode: \"require_before_ui\",\n onUncertainty: \"stop_and_ask\"\n },\n uiDisplayContract: {\n enabled: true\n },\n tdd: {\n enabled: true,\n mode: \"require_before_apply\",\n whenNoTestScript: \"block\"\n },\n specLanguage: {\n style: \"layered_bilingual\",\n canonical: \"en\",\n notesLocale: \"zh-CN\",\n maintainZhNotesOnUpdate: true\n }\n }\n });\n}\n","import type { FetLanguage } from \"../language.js\";\n\nexport const KARPATHY_SKILLS_SOURCE = \"https://github.com/forrestchang/andrej-karpathy-skills\";\n\nconst BEGIN = \"<!-- FET:BEGIN ANDREJ-KARPATHY-SKILLS -->\";\nconst END = \"<!-- FET:END ANDREJ-KARPATHY-SKILLS -->\";\n\nexport function mergeKarpathyClaudeMd(existing: string | null, language: FetLanguage = \"zh-CN\"): string {\n const block = renderManagedBlock(renderKarpathyClaudeGuidelines(language));\n if (!existing || !existing.trim()) {\n return `${block}\\n`;\n }\n\n const start = existing.indexOf(BEGIN);\n const end = existing.indexOf(END);\n if (start !== -1 && end !== -1 && end > start) {\n return `${existing.slice(0, start)}${block}${existing.slice(end + END.length)}`;\n }\n\n return `${existing.replace(/\\s*$/, \"\")}\\n\\n${block}\\n`;\n}\n\nexport function renderKarpathyCursorRule(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Andrej Karpathy inspired coding guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\nalwaysApply: true\n---\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nexport function renderKarpathyFetHandoff(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nfunction renderManagedBlock(content: string): string {\n return `${BEGIN}\n${content}\n${END}`;\n}\n\nfunction renderKarpathyClaudeGuidelines(language: FetLanguage): string {\n return `# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}`;\n}\n\nexport function renderKarpathyGuidelinesBody(language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderKarpathyGuidelinesBodyEn();\n }\n return `来源:${KARPATHY_SKILLS_SOURCE}\n\n将这些项目级指南与 AGENTS.md、OpenSpec 产物和用户最新请求一起使用。\n\n## 编码前先思考\n\n- 编辑前说明重要假设。\n- 当歧义会改变实现时,先澄清。\n- 主动呈现取舍,不要静默选择高风险路径。\n- 当更简单的方案更适合请求时,明确提出。\n\n## 简洁优先\n\n- 用最小且清晰的改动解决请求的问题。\n- 避免猜测性功能、配置或抽象。\n- 不要为一次性代码创建抽象。\n- 优先删除自己改动引入的复杂度,而不是继续堆结构。\n\n## 精准编辑\n\n- 只修改直接服务于任务的文件和行。\n- 保持现有风格,即便你个人更偏好另一种模式。\n- 除非任务需要,不要顺手重构附近代码、注释或格式。\n- 只移除因自己改动而过时的死导入、变量或 helper。\n\n## 目标驱动执行\n\n- 把模糊工作转成具体成功标准。\n- 对 bug,优先准备复现测试或清晰验证,再做修复。\n- 对多步骤工作,保留简短计划并验证每个有意义的步骤。\n- 持续迭代,直到达到成功标准或明确遇到阻塞。\n\n这些指南在非平凡工作中刻意偏向谨慎而不是速度。明显的一行修复可以灵活判断,保持轻量。`;\n}\n\nfunction renderKarpathyGuidelinesBodyEn(): string {\n return `Source: ${KARPATHY_SKILLS_SOURCE}\n\nUse these project-level guidelines together with AGENTS.md, OpenSpec artifacts, and the user's latest request.\n\n## Think Before Coding\n\n- State important assumptions before editing.\n- Ask for clarification when ambiguity would change the implementation.\n- Surface tradeoffs instead of silently choosing a risky path.\n- Push back when a simpler approach better fits the request.\n\n## Simplicity First\n\n- Solve the requested problem with the smallest clear change.\n- Avoid speculative features, configuration, or abstraction.\n- Do not create abstractions for one-off code.\n- Prefer deleting complexity introduced by your own change over adding more structure.\n\n## Precise Edits\n\n- Touch only files and lines that directly serve the task.\n- Preserve existing style even when you personally prefer another pattern.\n- Do not refactor nearby code, comments, or formatting unless the task requires it.\n- Remove only dead imports, variables, or helpers made obsolete by your own change.\n\n## Goal-Driven Execution\n\n- Convert vague work into concrete success criteria.\n- For bugs, prefer a reproducing test or clear verification before the fix.\n- For multi-step work, keep a short plan and verify each meaningful step.\n- Continue iterating until the success criteria are met or a blocker is explicit.\n\nThese guidelines intentionally favor caution over speed for non-trivial work. For obvious one-line fixes, use judgment and stay lightweight.`;\n}\n","import { FET_VERSION } from \"../version.js\";\n\nexport function renderVerifyInstructions(changeId: string, generatedAt = new Date().toISOString()): string {\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${generatedAt}\nchangeId: ${changeId}\npurpose: manual-verify\n---\n\n# Verify Instructions\n\n请按顺序完成以下检查:\n\n1. 运行 OpenSpec 规范校验:\\`openspec verify\\`\n2. 按项目约定运行 lint、typecheck、test。\n3. 检查本次 change 的 \\`tasks.md\\` 是否与实现状态一致。\n\n完成后运行:\n\n\\`\\`\\`sh\nfet verify --done --change ${changeId}\n\\`\\`\\`\n`;\n}\n","export function tddFetDirRelative(changeId: string): string {\n return `openspec/changes/${changeId}/.fet`;\n}\n\nexport function tddManifestRelativePath(changeId: string): string {\n return `${tddFetDirRelative(changeId)}/tdd-manifest.yaml`;\n}\n\nexport function tddSpecRelativePath(changeId: string): string {\n return `${tddFetDirRelative(changeId)}/tdd-spec.md`;\n}\n\nexport function tddInstructionsRelativePath(changeId: string): string {\n return `${tddFetDirRelative(changeId)}/tdd-instructions.md`;\n}\n\nexport function tddResultsRelativePath(changeId: string): string {\n return `${tddFetDirRelative(changeId)}/tdd-results.json`;\n}\n","import { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport type { TddManifest, TddManifestCase } from \"../tdd/types.js\";\nimport { tddInstructionsRelativePath, tddManifestRelativePath, tddSpecRelativePath } from \"../tdd/paths.js\";\n\nexport function renderTddInstructions(changeId: string, manifest: TddManifest, language: FetLanguage): string {\n const manifestPath = tddManifestRelativePath(changeId);\n const specPath = tddSpecRelativePath(changeId);\n const caseList = manifest.cases\n .map((item) => `- \\`${item.id}\\`: ${item.title} → \\`${item.testFile}\\` (${item.testIds.join(\", \")})`)\n .join(\"\\n\");\n\n if (language === \"en\") {\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\nchangeId: ${changeId}\npurpose: tdd-instructions\ngeneratedAt: ${manifest.generatedAt}\n---\n\n# TDD instructions (this change)\n\nCreate or update unit tests **before** marking implementation tasks done in \\`tasks.md\\`.\n\n## Sources\n${manifest.sources.map((s) => `- ${s}`).join(\"\\n\")}\n\n## Cases (from ${manifestPath})\n${caseList}\n\n## Rules\n1. Each case must map to a real test file under the repo test tree.\n2. Tests should fail until implementation lands (red → green).\n3. Do not edit \\`${manifestPath}\\` by hand unless fixing IDs; re-run \\`fet tdd --change ${changeId}\\` after planning changes.\n4. When tests exist, run \\`fet test --change ${changeId}\\` before \\`fet verify\\`.\n\nHuman-readable matrix: \\`${specPath}\\`\n`;\n }\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\nchangeId: ${changeId}\npurpose: tdd-instructions\ngeneratedAt: ${manifest.generatedAt}\n---\n\n# TDD 指令(本 change)\n\n在将 \\`tasks.md\\` 中的任务标为完成之前,先创建或更新单元测试。\n\n## 来源\n${manifest.sources.map((s) => `- ${s}`).join(\"\\n\")}\n\n## 用例(见 ${manifestPath})\n${caseList}\n\n## 规则\n1. 每个用例必须对应仓库内真实测试文件。\n2. 实现落地前测试应处于失败(红)状态,落地后应变绿。\n3. 除非修正 ID,不要手改 \\`${manifestPath}\\`;规划变更后请重新执行 \\`fet tdd --change ${changeId}\\`。\n4. 测试就绪后先 \\`fet test --change ${changeId}\\`,再 \\`fet verify\\`。\n\n可读矩阵见 \\`${specPath}\\`\n`;\n}\n\nexport function renderTddSpec(changeId: string, manifest: TddManifest, language: FetLanguage): string {\n const rows = manifest.cases.map((item) => renderSpecRow(item, language)).join(\"\\n\");\n\n if (language === \"en\") {\n return `---\nschemaVersion: 1\nchangeId: ${changeId}\ngeneratedAt: ${manifest.generatedAt}\nplanningFingerprint: ${manifest.planningFingerprint}\n---\n\n# TDD case matrix\n\n| ID | Scenario | Spec reference | Test file | Required |\n|----|----------|----------------|-----------|----------|\n${rows}\n`;\n }\n\n return `---\nschemaVersion: 1\nchangeId: ${changeId}\ngeneratedAt: ${manifest.generatedAt}\nplanningFingerprint: ${manifest.planningFingerprint}\n---\n\n# TDD 用例矩阵\n\n| ID | 场景 | Spec 引用 | 测试文件 | 必需 |\n|----|------|-----------|----------|------|\n${rows}\n`;\n}\n\nfunction renderSpecRow(item: TddManifestCase, language: FetLanguage): string {\n const required = language === \"en\" ? (item.required ? \"yes\" : \"no\") : item.required ? \"是\" : \"否\";\n return `| ${item.id} | ${escapeTable(item.title)} | ${escapeTable(item.specRef)} | \\`${item.testFile}\\` | ${required} |`;\n}\n\nfunction escapeTable(value: string): string {\n return value.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n}\n\nexport function renderTddApplyNextSteps(changeId: string, language: FetLanguage): string[] {\n const manifestPath = tddManifestRelativePath(changeId);\n if (language === \"en\") {\n return [\n `Read ${manifestPath} and tdd-instructions.md; implement code until fet test passes for this change.`,\n `Run fet test --change ${changeId} before fet verify.`\n ];\n }\n return [\n `阅读 ${manifestPath} 与 tdd-instructions.md;实现代码直至本 change 的 fet test 通过。`,\n `在 fet verify 之前先执行 fet test --change ${changeId}。`\n ];\n}\n\nexport function renderTddContinueNextStep(changeId: string, language: FetLanguage): string {\n if (language === \"en\") {\n return `When planning is complete, run fet tdd --change ${changeId} before fet apply.`;\n }\n return `规划完成后、执行 fet apply 之前,先运行 fet tdd --change ${changeId}。`;\n}\n","import { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport const FIGMA_URL_PATTERN = /https?:\\/\\/(?:www\\.)?figma\\.com\\/(?:file|design|proto)\\/[^\\s)\\]\"'<>]+/gi;\n\nexport function figmaStopHandoffRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/figma-stop.md`;\n}\n\nexport function figmaApplyInstructionsRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/figma-apply-instructions.md`;\n}\n\nexport type FigmaGuardMode = \"stop_and_ask\" | \"require_before_ui\";\n\nexport function renderFigmaRequireBeforeUiBody(language: FetLanguage, changeId: string): string {\n const stopPath = figmaStopHandoffRelativePath(changeId);\n if (language === \"en\") {\n return `## Mandatory before any UI implementation\n\nComplete these steps **before** writing or editing UI code (components, pages, styles, layout):\n\n1. Read \\`${stopPath}\\` for detected Figma links and stop rules.\n2. Use **Figma MCP/API** (or an approved Figma tool) to read every linked frame/node referenced by this change.\n3. In your reply, briefly list design facts you confirmed from Figma (frames, colors, typography, spacing, components, states).\n4. Only then implement UI tasks from \\`tasks.md\\`.\n\n## Forbidden\n\n- Implementing or restyling UI without reading Figma when this change references design links\n- Filling gaps with \"common UI patterns\", guessed pixel values, or invented tokens\n- Marking UI tasks complete while design input is still unclear\n\n## When to stop and talk to the user\n\nFollow the stop rules in \\`${stopPath}\\`. Pause implementation, explain what failed, and ask for a viewable link, screenshots, or explicit permission to infer—do not continue UI work until the user answers or says to continue.`;\n }\n\n return `## 实施任何 UI 代码之前必须完成\n\n在编写或修改 UI 代码(组件、页面、样式、布局)**之前**,按顺序完成:\n\n1. 阅读 \\`${stopPath}\\` 中的 Figma 链接与停止规则。\n2. 使用 **Figma MCP/API**(或已配置的 Figma 工具)读取本 change 引用的每个画板/节点。\n3. 在回复中简要列出已从 Figma 确认的设计事实(画板、颜色、字号、间距、组件、状态等)。\n4. 完成以上步骤后,再按 \\`tasks.md\\` 实施 UI 任务。\n\n## 禁止\n\n- 本 change 已引用设计稿时,未读 Figma 就实现或改 UI 样式\n- 用「常见 UI 做法」、猜测的像素值或自创 token 填补空白\n- 设计输入仍不清晰就把 UI 任务标为完成\n\n## 何时必须停下并与用户沟通\n\n遵守 \\`${stopPath}\\` 中的停止规则。暂停实施,说明卡在哪一步,向用户索要可查看的链接、截图,或明确允许按某规则推断;在用户回答或明确表示继续之前,不要继续 UI 实现。`;\n}\n\nexport function renderChangeFigmaApplyInstructions(options: {\n changeId: string;\n generatedAt: string;\n urls: string[];\n sources: string[];\n language: FetLanguage;\n}): string {\n const linkList = options.urls.map((url) => `- ${url}`).join(\"\\n\");\n const title = options.language === \"en\" ? \"Figma apply gate (this change)\" : \"Figma 实施门禁(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET detected Figma links in this change. **UI work must follow the design**—read Figma first, do not invent styles. If access or design details fail, stop and coordinate with the user.\"\n : \"FET 在本 change 中检测到 Figma 链接。**UI 必须按设计稿实现**—先读 Figma,禁止自创样式;访问失败或细节不清时停下并与用户沟通。\";\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: figma-apply\n---\n\n# ${title}\n\n${intro}\n\n## Detected Figma links\n\n${linkList}\n\n${renderFigmaRequireBeforeUiBody(options.language, options.changeId)}\n\n${renderFigmaStopProtocolBody(options.language)}\n`;\n}\n\nexport function renderFigmaStopProtocolBody(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Stop immediately (do not write or change UI code) when\n\n- Figma MCP/API errors, 403, timeout, or empty node/selection\n- You cannot resolve the frame or node referenced in the change\n- Color, typography, spacing, radius, shadow, or layout cannot be determined from the design input\n- Component instances do not map to an agreed code component and the user has not chosen one\n- Interaction states (hover, disabled, loading, empty) are missing from the design\n\n## After stopping, ask the user\n\n1. What failed (permission, node, frame, token type)\n2. What you need: **viewable link**, **screenshot + short notes**, or **explicit permission to infer** (which rule)\n3. Do **not** continue UI implementation until the user clearly says to continue or answers the question\n\n## While uncertain\n\n- Do not fill gaps with \"common UI patterns\" or guessed pixel values\n- Prefer showing the blocking question over partial implementation`;\n }\n\n return `## 必须立即停止(不得继续编写或修改 UI 代码)当\n\n- Figma MCP/API 报错、403、超时,或节点/选区为空\n- 无法解析 change 中引用的画板或节点\n- 颜色、字号、间距、圆角、阴影、布局无法从设计输入中确定\n- 组件实例无法对应到已约定的代码组件,且用户未指定\n- 交互状态(hover、disabled、loading、空态等)在设计稿中缺失\n\n## 停止后必须询问用户\n\n1. 卡在哪一步(权限、节点、画板、哪类 token)\n2. 需要用户补充:**可查看的链接**、**截图 + 文字说明**,或 **明确允许按某规则推断**\n3. 在用户明确表示「继续」或回答问题之前,**不要**继续实现 UI\n\n## 存在不确定性时\n\n- 不要用「常见 UI 做法」或猜测的像素值填补空白\n- 优先向用户提问,而不是先写一版样式再改`;\n}\n\nexport function renderCursorFigmaStopRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"Stop UI work when Figma cannot be read reliably; ask the user before continuing\"\n : \"Figma 理解异常时停止 UI 实现并向用户确认后再继续\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when the user shares a Figma link, asks to implement from a design file, or uses Figma MCP/tools for UI work.\" : \"在用户分享 Figma 链接、要求按设计稿实现 UI,或使用 Figma MCP/工具时适用。\"}\n\n${renderFigmaStopProtocolBody(language)}\n\n${language === \"en\" ? \"If this change has `openspec/changes/<change-id>/.fet/figma-apply-instructions.md`, follow it before UI work. Also read `figma-stop.md` in the same folder for links and stop rules.\" : \"若当前 change 存在 `openspec/changes/<change-id>/.fet/figma-apply-instructions.md`,实施 UI 前必须遵守;同目录的 `figma-stop.md` 含链接列表与停止规则。\"}\n`;\n}\n\nexport function renderCodexFigmaStopGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# Figma stop protocol (Codex)\n\n${renderFigmaStopProtocolBody(language)}\n`;\n}\n\nexport function renderChangeFigmaStopHandoff(options: {\n changeId: string;\n generatedAt: string;\n urls: string[];\n sources: string[];\n language: FetLanguage;\n}): string {\n const linkList = options.urls.length\n ? options.urls.map((url) => `- ${url}`).join(\"\\n\")\n : options.language === \"en\"\n ? \"- (none detected in change artifacts; user may still reference Figma in chat)\"\n : \"- (change 产物中未检测到;用户仍可能在对话中提供 Figma)\";\n const sourceList = options.sources.length\n ? options.sources.map((source) => `- ${source}`).join(\"\\n\")\n : options.language === \"en\"\n ? \"- n/a\"\n : \"- 无\";\n\n const title = options.language === \"en\" ? \"Figma guard (this change)\" : \"Figma 守卫(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET detected Figma links in this change. When design input is unclear, **stop** and let the user decide whether to continue or clarify.\"\n : \"FET 在本 change 中检测到 Figma 链接。设计输入不清晰时,**停止**当前操作,由用户决定是继续还是补充说明。\";\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: figma-stop\n---\n\n# ${title}\n\n${intro}\n\n## Detected Figma links\n\n${linkList}\n\n## Sources\n\n${sourceList}\n\n${renderFigmaStopProtocolBody(options.language)}\n`;\n}\n\nexport function renderFigmaStopNextStep(changeId: string, language: FetLanguage): string {\n const path = figmaStopHandoffRelativePath(changeId);\n return language === \"en\"\n ? `Before UI implementation, read ${path}. If Figma access fails or design details are unclear, stop and ask the user—do not guess styles.`\n : `实施 UI 前阅读 ${path}。Figma 访问失败或设计细节不明确时立即停止并向用户提问,不要猜测样式。`;\n}\n\nexport function renderFigmaApplyNextSteps(changeId: string, language: FetLanguage, mode: FigmaGuardMode): string[] {\n const applyPath = figmaApplyInstructionsRelativePath(changeId);\n const stopPath = figmaStopHandoffRelativePath(changeId);\n if (mode === \"require_before_ui\") {\n return language === \"en\"\n ? [\n `Before any UI task: read and follow ${applyPath} (mandatory). Use Figma MCP/API for every linked frame—do not invent styles.`,\n `If Figma access fails or design details are unclear, stop per ${stopPath} and ask the user before continuing.`,\n `After Figma is confirmed, read openspec/changes/${changeId}/tasks.md and implement pending tasks.`\n ]\n : [\n `实施任何 UI 任务前:必须阅读并遵守 ${applyPath};用 Figma MCP/API 读取每个链接的画板,禁止自创样式。`,\n `Figma 访问失败或设计细节不清:按 ${stopPath} 立即停止并向用户提问,确认后再继续。`,\n `设计确认后,再阅读 openspec/changes/${changeId}/tasks.md 并实施待办任务。`\n ];\n }\n return [renderFigmaStopNextStep(changeId, language)];\n}\n","import { stringify } from \"yaml\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function uiDisplayContractRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/ui-display-contract.yaml`;\n}\n\nexport function uiFieldApplyInstructionsRelativePath(changeId: string): string {\n return `openspec/changes/${changeId}/.fet/ui-field-apply-instructions.md`;\n}\n\nexport interface UiDisplayContractScreen {\n id: string;\n title?: string;\n figmaUrls: string[];\n displayFields: string[];\n hiddenButUsed: string[];\n omittedFromUi: string[];\n needsReview: string[];\n}\n\nexport interface UiDisplayContractApiSchema {\n name: string;\n fields: string[];\n sourcePath: string;\n}\n\nexport interface UiDisplayContractDocument {\n schemaVersion: 1;\n fetVersion: string;\n generatedAt: string;\n changeId: string;\n purpose: \"ui-display-contract\";\n status: \"draft\";\n precedence: string[];\n sources: {\n figma: { urls: string[]; artifactPaths: string[] };\n api: Array<{ path: string; artifactPaths: string[]; schemas: UiDisplayContractApiSchema[] }>;\n };\n screens: UiDisplayContractScreen[];\n omittedCandidates: Array<{ field: string; schema?: string; reason: string }>;\n}\n\nexport function renderUiDisplayContractYaml(doc: UiDisplayContractDocument): string {\n return stringify(doc);\n}\n\nexport function renderUiFieldApplyInstructions(options: {\n changeId: string;\n generatedAt: string;\n contractPath: string;\n language: FetLanguage;\n hasFigma: boolean;\n hasApi: boolean;\n}): string {\n const title = options.language === \"en\" ? \"UI field apply gate (this change)\" : \"UI 字段实施门禁(本 change)\";\n const intro =\n options.language === \"en\"\n ? \"FET generated a **UI display contract** draft. API docs are a superset; **only fields listed under `displayFields` may appear in the UI**. Figma defines what is visible; the contract records the binding.\"\n : \"FET 已生成 **UI 展示契约** 草案。接口文档是超集;**只有 `displayFields` 中的字段允许出现在界面上**。Figma 决定可见性;契约记录绑定关系。\";\n\n const steps =\n options.language === \"en\"\n ? `## Before binding API data to UI\n\n1. Read and update \\`${options.contractPath}\\` (confirm or fill \\`displayFields\\` per screen).\n2. ${options.hasFigma ? \"Use Figma MCP/API to list visible labels, columns, and form fields; map them to API field names in `displayFields`.\" : \"Infer visible fields from design artifacts in this change; document them in `displayFields`.\"}\n3. Move API fields that exist in docs but are **not** on the design into \\`omittedFromUi\\` (or \\`hiddenButUsed\\` if needed for logic without rendering).\n4. Resolve every entry in \\`needsReview\\` with the user before implementation.\n\n## Forbidden\n\n- Rendering every property from an API response type because it appears in OpenAPI/Swagger\n- Using \\`Object.keys(data)\\`, schema iteration, or generic \"show all fields\" table/form generators for user-facing UI\n- Adding columns or form inputs for fields not in \\`displayFields\\` unless the user explicitly expands the contract\n\n## Data vs presentation\n\n- **Data layer**: types, fetch, normalize may use the full API model.\n- **Presentation layer**: bind only \\`displayFields\\`; never surface \\`omittedFromUi\\` fields in lists, forms, cards, or detail views.`\n : `## 将 API 数据绑定到 UI 之前\n\n1. 阅读并更新 \\`${options.contractPath}\\`(按屏确认或填写 \\`displayFields\\`)。\n2. ${options.hasFigma ? \"用 Figma MCP/API 列出可见文案、表格列、表单项;映射到 API 字段名并写入 `displayFields`。\" : \"从本 change 的设计产物推断可见字段,写入 `displayFields`。\"}\n3. 接口文档有、设计稿**没有**的字段放入 \\`omittedFromUi\\`(仅逻辑使用且不可见则放入 \\`hiddenButUsed\\`)。\n4. \\`needsReview\\` 中每一项须在实施前与用户确认。\n\n## 禁止\n\n- 因 OpenAPI/Swagger 里有字段就在页面上全部展示\n- 对用户可见 UI 使用 \\`Object.keys(data)\\`、遍历 schema 或「自动展示全部字段」的表格/表单\n- 在 \\`displayFields\\` 未列入时新增列、表单项(除非用户明确扩展契约)\n\n## 数据层与展示层\n\n- **数据层**:类型、请求、normalize 可使用完整 API 模型。\n- **展示层**:只绑定 \\`displayFields\\`;\\`omittedFromUi\\` 中的字段不得出现在列表、表单、卡片、详情等可见区域。`;\n\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${options.generatedAt}\nchangeId: ${options.changeId}\npurpose: ui-field-apply\n---\n\n# ${title}\n\n${intro}\n\n${steps}\n`;\n}\n\nexport function renderUiDisplayContractApplyNextSteps(changeId: string, language: FetLanguage): string[] {\n const contractPath = uiDisplayContractRelativePath(changeId);\n const applyPath = uiFieldApplyInstructionsRelativePath(changeId);\n if (language === \"en\") {\n return [\n `Read and confirm ${contractPath} before UI that binds API data (update displayFields from Figma; move extras to omittedFromUi).`,\n `Follow ${applyPath}: API schema is not a UI checklist—do not render undocumented fields.`,\n `After the contract is confirmed, implement tasks from openspec/changes/${changeId}/tasks.md.`\n ];\n }\n return [\n `在绑定 API 的 UI 实施前:阅读并确认 ${contractPath}(按 Figma 填写 displayFields;多余字段放入 omittedFromUi)。`,\n `遵守 ${applyPath}:接口文档不是 UI 清单,禁止展示契约未列出的字段。`,\n `契约确认后,再实施 openspec/changes/${changeId}/tasks.md 中的任务。`\n ];\n}\n\n/** One-line guardrail for command guides and slash prompts. */\nexport function renderUiDisplayContractGuardrail(language: FetLanguage): string {\n if (language === \"en\") {\n return \"- When a change has API docs and UI (especially with Figma), read `openspec/changes/<change-id>/.fet/ui-display-contract.yaml`. In `specs/**/spec.md`, add the UI display contract Requirement (see planning guide); API fields not in `displayFields` MUST NOT be rendered.\";\n }\n return \"- change 含接口文档且涉及 UI(尤其有 Figma)时,阅读 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml`;在 `specs/**/spec.md` 中写入 UI 展示契约 Requirement(见规划指引);未列入 `displayFields` 的接口字段禁止出现在界面上。\";\n}\n\nexport function renderPlanningArtifactUiContractBlock(language: FetLanguage, changeId: string): string {\n const contractPath = uiDisplayContractRelativePath(changeId);\n if (language === \"en\") {\n return `## UI display contract (when API + UI)\n\nIf this change renders API-backed UI (especially with Figma links), \\`${contractPath}\\` may exist or will be generated on \\`fet apply\\`. When writing \\`specs/<capability>/spec.md\\`, **add** this requirement (adjust screen ids as needed):\n\n\\`\\`\\`markdown\n### Requirement: UI displays only contracted fields\n<!-- 中文:界面只展示 ui-display-contract.yaml 中 displayFields 列出的字段;接口文档其余字段仅用于类型/数据层,不得出现在列表、表单、详情等可见 UI -->\n\nThe UI SHALL only render fields listed under \\`displayFields\\` for each screen in \\`${contractPath}\\`.\nFields documented in API/OpenAPI but absent from the design MUST be listed under \\`omittedFromUi\\` and MUST NOT appear in user-visible UI.\nThe system MAY use \\`hiddenButUsed\\` fields in logic without displaying them.\nOn conflict between API schema completeness and Figma/contract, **Figma + ui-display-contract win** for presentation.\n\\`\\`\\`\n\nUpdate \\`displayFields\\` / \\`omittedFromUi\\` in the contract in the **same edit** when requirements change.`;\n }\n\n return `## UI 展示契约(接口 + UI 时)\n\n若本 change 实施绑定接口的 UI(尤其含 Figma 链接),\\`${contractPath}\\` 可能已存在或在 \\`fet apply\\` 时生成。编写 \\`specs/<capability>/spec.md\\` 时**必须加入**如下 Requirement(按实际 screen 调整):\n\n\\`\\`\\`markdown\n### Requirement: UI displays only contracted fields\n<!-- 中文:界面只展示 ui-display-contract.yaml 中 displayFields 列出的字段;接口文档其余字段仅用于类型/数据层,不得出现在列表、表单、详情等可见 UI -->\n\nThe UI SHALL only render fields listed under \\`displayFields\\` for each screen in \\`${contractPath}\\`.\nFields documented in API/OpenAPI but absent from the design MUST be listed under \\`omittedFromUi\\` and MUST NOT appear in user-visible UI.\nThe system MAY use \\`hiddenButUsed\\` fields in logic without displaying them.\nOn conflict between API schema completeness and Figma/contract, **Figma + ui-display-contract win** for presentation.\n\\`\\`\\`\n\n修改 Requirement 时,**同一次编辑**须同步更新契约中的 \\`displayFields\\` / \\`omittedFromUi\\`。`;\n}\n\nexport function renderCursorUiDisplayContractRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"UI display contract: API schemas are not UI checklists; only displayFields may render\"\n : \"UI 展示契约:接口文档不是 UI 清单,仅 displayFields 可展示\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when implementing UI that binds API responses, or when `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` exists.\" : \"在实施绑定接口响应的 UI 时,或存在 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` 时适用。\"}\n\n${renderUiDisplayContractGuardrail(language)}\n\n${language === \"en\" ? \"Also read `ui-field-apply-instructions.md` in the same `.fet/` folder before UI work.\" : \"实施 UI 前同时阅读同目录 `.fet/ui-field-apply-instructions.md`。\"}\n`;\n}\n\nexport function renderCodexUiDisplayContractGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# UI display contract (Codex)\n\n${renderUiDisplayContractGuardrail(language)}\n\n${language === \"en\" ? \"Read `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` and `ui-field-apply-instructions.md` when applying UI tasks that use API data.\" : \"对使用接口数据的 UI 任务,阅读 `openspec/changes/<change-id>/.fet/ui-display-contract.yaml` 与 `ui-field-apply-instructions.md`。\"}\n`;\n}\n","import { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport { renderPlanningArtifactUiContractBlock } from \"./ui-display-contract.js\";\n\nexport const SPEC_STYLE_LAYERED_BILINGUAL = \"layered_bilingual\" as const;\n\n/** One-line guardrail for command guides and slash prompts. */\nexport function renderSpecArtifactGuardrail(language: FetLanguage): string {\n if (language === \"en\") {\n return \"- When creating or editing `openspec/changes/<change-id>/specs/**/spec.md` (or merging into `openspec/specs/**/spec.md`), keep English Requirements/Scenario headings and normative text; add or update the paired `<!-- 中文:... -->` note on the same edit—never leave stale Chinese notes.\";\n }\n return \"- 创建或修改 `openspec/changes/<change-id>/specs/**/spec.md`(或合并到 `openspec/specs/**/spec.md`)时:Requirements/Scenario 标题与 normative 句保持英文;**同一次编辑**必须新增或更新对应的 `<!-- 中文:... -->` 说明,禁止留下过时中文注释。\";\n}\n\nexport function renderSpecLanguagePolicyBody(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Layered bilingual spec (canonical English + Chinese notes)\n\nThis project uses **layered_bilingual** OpenSpec specs (see \\`fet.specLanguage\\` in \\`openspec/config.yaml\\`).\n\n### Structure\n\n- **English (canonical)**: Keep OpenSpec section titles (\\`## Requirements\\`, \\`### Requirement:\\`, \\`#### Scenario:\\`) and normative sentences (SHALL/MUST, acceptance criteria) in English.\n- **Chinese (human notes)**: Immediately after each \\`### Requirement:\\` line (before the English body), add one HTML comment:\n\n\\`\\`\\`markdown\n### Requirement: User can export report\n<!-- 中文:登录用户可在报表页导出 PDF;需具备 export 权限;失败时提示原因 -->\n\nThe system SHALL ...\n\\`\\`\\`\n\nOptionally add \\`<!-- 中文:... -->\\` after \\`#### Scenario:\\` when the scenario needs extra business context.\n\n### When creating or updating specs\n\n- **Same edit rule**: Any change to English normative text MUST update the paired Chinese comment in the **same** commit/edit session.\n- **Do not** remove Chinese notes when refactoring English unless the requirement was removed.\n- **Do not** let Chinese notes contradict English; if they disagree, fix both or ask the user. **On conflict, English Requirements win.**\n- **proposal.md** / **design.md** may be Chinese; **tasks.md** may be Chinese with English identifiers.\n\n### Applies to\n\n- \\`fet propose\\`, \\`fet continue\\`, \\`fet ff\\` artifact writes\n- Manual edits to spec files in chat\n- \\`fet sync\\` merges into \\`openspec/specs/**/spec.md\\` (preserve or refresh Chinese notes for touched requirements)`;\n }\n\n return `## 分层双语 spec(英文规范 + 中文说明)\n\n本项目 OpenSpec spec 采用 **layered_bilingual**(见 \\`openspec/config.yaml\\` 的 \\`fet.specLanguage\\`)。\n\n### 结构\n\n- **英文(权威)**:保留 OpenSpec 章节标题(\\`## Requirements\\`、\\`### Requirement:\\`、\\`#### Scenario:\\`)与 normative 语句(SHALL/MUST、验收条件)。\n- **中文(给人读)**:在每个 \\`### Requirement:\\` 标题行之后、英文正文之前,添加一条 HTML 注释:\n\n\\`\\`\\`markdown\n### Requirement: User can export report\n<!-- 中文:登录用户可在报表页导出 PDF;需具备 export 权限;失败时提示原因 -->\n\nThe system SHALL ...\n\\`\\`\\`\n\n若场景需要补充业务语境,可在 \\`#### Scenario:\\` 后同样添加 \\`<!-- 中文:... -->\\`。\n\n### 创建或更新 spec 时(含 LLM 改文档)\n\n- **同次编辑原则**:修改英文规范句时,**必须在同一次编辑中**同步更新对应的中文注释,不得遗留过时说明。\n- 重构英文时不要无故删除中文注释;若删除 Requirement,一并删除其注释。\n- 中文说明不得与英文矛盾;若有冲突,同时修正或询问用户。**冲突时以英文 Requirements 为准。**\n- **proposal.md** / **design.md** 可用中文;**tasks.md** 可用中文并保留英文标识符。\n\n### 适用场景\n\n- \\`fet propose\\`、\\`fet continue\\`、\\`fet ff\\` 写入的产物\n- 对话中手动修改 change 下 spec\n- \\`fet sync\\` 合并到 \\`openspec/specs/**/spec.md\\` 时,对触及的 Requirement 保留或刷新中文注释`;\n}\n\nexport function renderCursorSpecLanguageRule(language: FetLanguage): string {\n const description =\n language === \"en\"\n ? \"Layered bilingual OpenSpec specs: English canonical text with synced Chinese HTML comments\"\n : \"OpenSpec 分层双语:英文规范 + 同步维护的中文注释\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${description}\nalwaysApply: false\n---\n\n${language === \"en\" ? \"Apply when creating or editing OpenSpec spec files under `openspec/changes/` or `openspec/specs/`, or when running `fet propose` / `fet continue` / `fet ff` / `fet sync`.\" : \"在创建或编辑 `openspec/changes/`、`openspec/specs/` 下的 spec,或运行 `fet propose` / `fet continue` / `fet ff` / `fet sync` 时适用。\"}\n\n${renderSpecLanguagePolicyBody(language)}\n`;\n}\n\nexport function renderCodexSpecLanguageGuide(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# OpenSpec spec language (layered bilingual)\n\n${renderSpecLanguagePolicyBody(language)}\n`;\n}\n\nexport function renderPlanningArtifactSpecBlock(language: FetLanguage, changeId?: string): string {\n const uiBlock =\n changeId !== undefined\n ? `\\n\\n${renderPlanningArtifactUiContractBlock(language, changeId)}`\n : \"\";\n\n if (language === \"en\") {\n return `## OpenSpec spec artifacts\n\nWhen the artifact is \\`specs/<capability>/spec.md\\` (or you edit spec files in this change):\n\n1. Follow \\`.cursor/rules/fet-spec-language.mdc\\` or \\`.codex/fet/spec-language.md\\`.\n2. English Requirements/Scenario + \\`<!-- 中文:... -->\\` after each Requirement title.\n3. Update Chinese notes in the **same edit** whenever English normative text changes.${uiBlock}`;\n }\n return `## OpenSpec spec 产物\n\n当产物为 \\`specs/<capability>/spec.md\\`(或你在本 change 中修改 spec)时:\n\n1. 遵守 \\`.cursor/rules/fet-spec-language.mdc\\` 或 \\`.codex/fet/spec-language.md\\`。\n2. 英文 Requirements/Scenario + 每个 Requirement 标题后加 \\`<!-- 中文:... -->\\`。\n3. 英文规范句有任何变动时,**同一次编辑**必须同步更新对应中文注释。${uiBlock}`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { ensureChangeFigmaStopHandoff } from \"../figma-guard.js\";\nimport { buildWorkflowGraphContext, type GraphContextResult } from \"../graph-context.js\";\nimport { ensureChangeUiDisplayContract } from \"../ui-display-contract.js\";\nimport { renderFigmaApplyNextSteps, renderFigmaStopNextStep } from \"../templates/figma-guard.js\";\nimport { renderUiDisplayContractApplyNextSteps } from \"../templates/ui-display-contract.js\";\nimport { renderTddApplyNextSteps } from \"../templates/tdd.js\";\nimport { assertTddReady } from \"../tdd/gates.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\n\nconst phaseByCommand: Record<string, ChangePhase> = {\n explore: \"explore\",\n propose: \"propose\",\n new: \"propose\",\n continue: \"propose\",\n ff: \"propose\",\n apply: \"implement\",\n verify: \"verify\",\n sync: \"sync\",\n archive: \"archive\",\n \"bulk-archive\": \"archive\",\n onboard: \"explore\"\n};\n\nexport async function proxyCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n await artifactWorkflowCommand(ctx, command, args);\n return;\n }\n if (command === \"apply\") {\n await applyWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"explore\") {\n await exploreWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"sync\") {\n await syncWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"bulk-archive\") {\n await bulkArchiveWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"onboard\") {\n await onboardWorkflowCommand(ctx);\n return;\n }\n\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n await assertOpenSpecCommandSupported(ctx, mapped.command, command);\n const mappedChangeId = extractChangeId(mapped.args);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? mappedChangeId) : (ctx.changeId ?? mappedChangeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: mapped.args,\n changeId: targetChangeId\n });\n\n const changelogEntry = command === \"archive\" && targetChangeId ? await createChangelogEntry(ctx.projectRoot, targetChangeId) : null;\n const result = await ctx.openSpec.run(mapped.command, mapped.args, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result,\n recoverable: true\n });\n }\n\n if (changelogEntry) {\n await appendChangelog(ctx.projectRoot, changelogEntry);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (command === \"archive\") {\n if (!state.activeChangeId || state.activeChangeId === targetChangeId || !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n } else if (ctx.changeId && inspection.changes.includes(ctx.changeId)) {\n state.activeChangeId = ctx.changeId;\n } else if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n } else if (!state.activeChangeId && inspection.changes.length === 1) {\n state.activeChangeId = inspection.changes[0] ?? null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n const changeId = ctx.changeId ?? state.activeChangeId;\n if (changeId && inspection.changes.includes(changeId)) {\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n changeState.currentPhase = phaseByCommand[command] ?? changeState.currentPhase;\n changeState.phases[changeState.currentPhase] = {\n status: \"done\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: mapped.command,\n args: mapped.args,\n exitCode: result.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n }\n });\n\n const graphContext = runState.graphContext;\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} completed.`,\n warnings: graphContext?.warnings,\n nextSteps: graphContext?.generated && graphContext.path ? [`Read ${graphContext.path} before broad source scans or implementation decisions.`] : undefined,\n data: graphContext ? { graphContext } : undefined\n });\n}\n\ntype ArtifactWorkflowCommand = \"propose\" | \"continue\" | \"ff\";\n\ninterface OpenSpecArtifactStatus {\n id: string;\n outputPath: string;\n status: string;\n missingDeps?: string[];\n}\n\nasync function applyWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command: \"apply\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", \"apply\");\n await assertOpenSpecCommandSupported(ctx, \"instructions\", \"apply\");\n await assertTddReady(ctx, changeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"apply\",\n args: [\"tasks\", \"--change\", changeId],\n changeId\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const tasks = status.artifacts?.find((artifact) => artifact.id === \"tasks\");\n const warnings =\n tasks && tasks.status !== \"complete\" && tasks.status !== \"ready\"\n ? [`OpenSpec reports tasks artifact as \"${tasks.status}\". Finish planning artifacts before implementation if tasks.md is missing.`]\n : undefined;\n\n const instructions = await runInstructions(ctx, changeId, \"tasks\");\n await syncWorkflowState(ctx, \"apply\", changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [\"tasks\", \"--change\", changeId],\n exitCode: instructions.exitCode,\n phaseStatus: \"in_progress\"\n });\n\n const [figmaGuard, uiContract] = await Promise.all([\n ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n }),\n ensureChangeUiDisplayContract({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language,\n fetVersion: ctx.fetVersion\n })\n ]);\n const applyNextSteps = [\n `Read openspec/changes/${changeId}/tasks.md and the instructions output.`,\n \"Implement pending tasks and update task checkboxes only after the work is done.\",\n ...renderTddApplyNextSteps(changeId, ctx.language),\n `Run fet verify --change ${changeId}`\n ];\n if (uiContract) {\n applyNextSteps.unshift(...renderUiDisplayContractApplyNextSteps(changeId, ctx.language));\n }\n if (figmaGuard) {\n applyNextSteps.unshift(...renderFigmaApplyNextSteps(changeId, ctx.language, figmaGuard.mode));\n }\n\n ctx.output.result({\n ok: true,\n command: \"apply\",\n summary: `fet apply prepared implementation instructions for change \"${changeId}\".`,\n warnings: [...(runState.graphContext?.warnings ?? []), ...(warnings ?? [])],\n nextSteps: applyNextSteps,\n data: {\n changeId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext,\n figmaGuard: figmaGuard ?? undefined,\n uiDisplayContract: uiContract ?? undefined\n }\n });\n });\n}\n\nasync function exploreWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const changeId = ctx.changeId ?? (openSpecArgs[0] && isKebabId(openSpecArgs[0]) ? openSpecArgs[0] : null);\n const graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"explore\",\n args: openSpecArgs,\n changeId\n });\n\n const figmaGuard = changeId\n ? await ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n })\n : null;\n const exploreNextSteps = [\n \"Discuss the requirement, constraints, and acceptance criteria with the user.\",\n changeId ? `Run fet continue --change ${changeId} when ready to create the next artifact.` : \"Run fet propose <change-id-or-description> when ready to create a change.\"\n ];\n if (figmaGuard) {\n exploreNextSteps.unshift(renderFigmaStopNextStep(changeId!, ctx.language));\n }\n\n ctx.output.result({\n ok: true,\n command: \"explore\",\n summary: \"fet explore is an IDE-guided workflow for shaping OpenSpec changes.\",\n warnings: graphContext.warnings,\n nextSteps: exploreNextSteps,\n data: { changeId, args: openSpecArgs, graphContext, figmaGuard: figmaGuard ?? undefined }\n });\n}\n\nasync function syncWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const openSpecArgs = stripFetOptions(args);\n\n await withProjectLock(ctx.projectRoot, { command: \"sync\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertVerifiedChange(ctx, changeId);\n await assertOpenSpecCommandSupported(ctx, \"validate\", \"sync\");\n\n const validateArgs = [changeId, \"--type\", \"change\", ...openSpecArgs.filter((arg) => arg !== changeId)];\n const result = await ctx.openSpec.run(\"validate\", validateArgs, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec validate failed during fet sync.\",\n details: result,\n recoverable: true\n });\n }\n\n await syncWorkflowState(ctx, \"sync\", changeId, {\n openSpecCommand: \"validate\",\n openSpecArgs: validateArgs,\n exitCode: result.exitCode,\n phaseStatus: \"done\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"sync\",\n summary: `fet sync validated change \"${changeId}\". OpenSpec 1.3.x applies spec updates during archive.`,\n nextSteps: [`Run fet archive --change ${changeId} when you are ready to archive and update main specs.`],\n data: ctx.json ? { changeId, validate: result } : { changeId }\n });\n });\n}\n\nasync function bulkArchiveWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const targets = [...new Set([...(ctx.changeId ? [ctx.changeId] : []), ...openSpecArgs.filter((arg) => !arg.startsWith(\"-\"))])];\n if (!targets.length) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"fet bulk-archive requires explicit change ids with the current OpenSpec CLI.\",\n suggestedCommand: \"fet bulk-archive --change <change-id>\"\n });\n }\n\n await withProjectLock(ctx.projectRoot, { command: \"bulk-archive\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"archive\", \"bulk-archive\");\n const archived: string[] = [];\n for (const changeId of targets) {\n await assertVerifiedChange(ctx, changeId);\n const changelogEntry = await createChangelogEntry(ctx.projectRoot, changeId);\n const result = await ctx.openSpec.run(\"archive\", [changeId], { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec archive failed for \"${changeId}\".`,\n details: result,\n recoverable: true\n });\n }\n await appendChangelog(ctx.projectRoot, changelogEntry);\n archived.push(changeId);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"bulk-archive\",\n summary: `fet bulk-archive archived ${archived.length} change(s) via OpenSpec archive.`,\n nextSteps: inspection.changes.length ? [`Remaining open changes: ${inspection.changes.join(\", \")}`] : undefined,\n data: { archived, openChangeIds: inspection.changes }\n });\n });\n}\n\nasync function onboardWorkflowCommand(ctx: FetCommandContext): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"onboard\",\n summary: \"fet onboard loaded local FET/OpenSpec workflow context.\",\n nextSteps: [\n inspection.changes.length ? `Open changes: ${inspection.changes.join(\", \")}` : \"No open changes found. Run fet propose <change-id-or-description> to start one.\",\n \"Use fet continue to prepare planning artifacts, fet tdd then fet apply for implementation, fet test then fet verify before archive.\"\n ],\n data: { activeChangeId: state.activeChangeId, openChangeIds: inspection.changes, archivedChangeIds: inspection.archived }\n });\n}\n\ninterface OpenSpecStatusResult {\n changeName: string;\n schemaName?: string;\n isComplete?: boolean;\n applyRequires?: string[];\n artifacts?: OpenSpecArtifactStatus[];\n}\n\nasync function artifactWorkflowCommand(ctx: FetCommandContext, command: ArtifactWorkflowCommand, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", command);\n await assertOpenSpecCommandSupported(ctx, \"instructions\", command);\n if (command === \"propose\") {\n await assertOpenSpecCommandSupported(ctx, \"new\", command);\n }\n\n const changeId = command === \"propose\" ? await ensureProposedChange(ctx, openSpecArgs) : await requireChangeId(ctx);\n const artifactId = command === \"continue\" ? await resolveArtifactId(ctx, changeId, openSpecArgs[0]) : await resolveArtifactId(ctx, changeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: artifactId ? [artifactId, \"--change\", changeId] : [\"--change\", changeId],\n changeId\n });\n\n const instructions = await runInstructions(ctx, changeId, artifactId);\n await syncWorkflowState(ctx, command, changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [artifactId, \"--change\", changeId],\n exitCode: instructions.exitCode\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const [figmaGuard, uiContract] = await Promise.all([\n ensureChangeFigmaStopHandoff({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language\n }),\n ensureChangeUiDisplayContract({\n projectRoot: ctx.projectRoot,\n changeId,\n language: ctx.language,\n fetVersion: ctx.fetVersion\n })\n ]);\n const planningNextSteps = [\n `Create or update openspec/changes/${changeId}/${resolveOutputPath(status, artifactId)}`,\n \"Review the artifact with the user before generating the next planning file.\",\n `Run fet passthrough status --change ${changeId}`,\n status.isComplete\n ? `Run fet tdd --change ${changeId}, then fet apply --change ${changeId}`\n : `Run fet continue --change ${changeId} when ready for the next artifact`\n ];\n if (uiContract) {\n planningNextSteps.unshift(\n ctx.language === \"en\"\n ? `If writing specs for API-backed UI, add the UI display contract Requirement; draft at ${uiContract.contractPath}.`\n : `若编写绑定接口的 UI spec,须加入 UI 展示契约 Requirement;草案见 ${uiContract.contractPath}。`\n );\n }\n if (figmaGuard) {\n planningNextSteps.unshift(renderFigmaStopNextStep(changeId, ctx.language));\n }\n\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} prepared OpenSpec artifact \"${artifactId}\" for change \"${changeId}\".`,\n warnings: runState.graphContext?.warnings,\n nextSteps: planningNextSteps,\n data: {\n changeId,\n artifactId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext,\n figmaGuard: figmaGuard ?? undefined,\n uiDisplayContract: uiContract ?? undefined\n }\n });\n });\n}\n\nasync function ensureProposedChange(ctx: FetCommandContext, args: string[]): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const existing = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const explicit = args[0];\n if (!explicit) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id or short description is required for fet propose.\",\n suggestedCommand: \"fet propose <change-id-or-description>\"\n });\n }\n\n const input = args.join(\" \").trim();\n const changeId = isKebabId(input) ? input : toKebabId(input);\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"Unable to derive a valid OpenSpec change id from the proposal input.\",\n details: { input },\n suggestedCommand: \"fet propose <kebab-case-change-id>\"\n });\n }\n\n if (existing.changes.includes(changeId)) {\n return changeId;\n }\n\n const createArgs = [\"change\", changeId];\n if (input && input !== changeId) {\n createArgs.push(\"--description\", input);\n }\n const result = await ctx.openSpec.run(\"new\", createArgs, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec new change failed.\",\n details: result,\n recoverable: true\n });\n }\n return changeId;\n}\n\nasync function resolveArtifactId(ctx: FetCommandContext, changeId: string, requestedArtifactId?: string): Promise<string> {\n const status = await readOpenSpecStatus(ctx, changeId);\n const artifacts = status.artifacts ?? [];\n if (requestedArtifactId) {\n const requested = artifacts.find((artifact) => artifact.id === requestedArtifactId);\n if (!requested) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" was not found for change \"${changeId}\".`,\n details: { changeId, requestedArtifactId, artifacts: artifacts.map((artifact) => artifact.id) },\n suggestedCommand: `fet passthrough status --change ${changeId} --json`\n });\n }\n if (requested.status !== \"ready\" && requested.status !== \"complete\") {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" is ${requested.status}, not ready.`,\n details: { changeId, requestedArtifactId, missingDeps: requested.missingDeps },\n suggestedCommand: `fet continue --change ${changeId}`\n });\n }\n return requestedArtifactId;\n }\n\n const next = artifacts.find((artifact) => artifact.status === \"ready\");\n if (!next) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `No ready OpenSpec artifact was found for change \"${changeId}\".`,\n details: { changeId, artifacts },\n suggestedCommand: status.isComplete ? `fet apply --change ${changeId}` : `fet passthrough status --change ${changeId} --json`\n });\n }\n return next.id;\n}\n\nasync function readOpenSpecStatus(ctx: FetCommandContext, changeId: string): Promise<OpenSpecStatusResult> {\n const result = await ctx.openSpec.run(\"status\", [\"--change\", changeId, \"--json\"], { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec status failed.\",\n details: result,\n recoverable: true\n });\n }\n try {\n return parseOpenSpecJson(result.stdout ?? \"{}\") as OpenSpecStatusResult;\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec status JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function runInstructions(ctx: FetCommandContext, changeId: string, artifactId: string): Promise<{ exitCode: number; data: unknown }> {\n const args = [artifactId, \"--change\", changeId, ...(ctx.json ? [\"--json\"] : [])];\n const result = await ctx.openSpec.run(\"instructions\", args, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.stdout && !ctx.json) {\n process.stdout.write(result.stdout.endsWith(\"\\n\") ? result.stdout : `${result.stdout}\\n`);\n }\n if (result.stderr && !ctx.json) {\n process.stderr.write(result.stderr.endsWith(\"\\n\") ? result.stderr : `${result.stderr}\\n`);\n }\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec instructions failed.\",\n details: result,\n recoverable: true\n });\n }\n if (!ctx.json) {\n return { exitCode: result.exitCode, data: null };\n }\n try {\n return { exitCode: result.exitCode, data: parseOpenSpecJson(result.stdout ?? \"{}\") };\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec instructions JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function syncWorkflowState(\n ctx: FetCommandContext,\n command: string,\n changeId: string,\n lastOpenSpecCommand: { openSpecCommand: string; openSpecArgs: string[]; exitCode: number; phaseStatus?: \"in_progress\" | \"done\" }\n): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (inspection.changes.includes(changeId)) {\n state.activeChangeId = changeId;\n }\n await ctx.stateStore.writeGlobal(state);\n\n if (!inspection.changes.includes(changeId)) {\n return;\n }\n\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n const phase = phaseByCommand[command] ?? \"propose\";\n changeState.currentPhase = phase;\n changeState.phases[phase] = {\n status: lastOpenSpecCommand.phaseStatus ?? \"in_progress\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: lastOpenSpecCommand.openSpecCommand,\n args: lastOpenSpecCommand.openSpecArgs,\n exitCode: lastOpenSpecCommand.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n}\n\nfunction resolveOutputPath(status: OpenSpecStatusResult, artifactId: string): string {\n return status.artifacts?.find((artifact) => artifact.id === artifactId)?.outputPath ?? `${artifactId}.md`;\n}\n\nfunction isKebabId(value: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);\n}\n\nfunction toKebabId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction parseOpenSpecJson(stdout: string): unknown {\n const trimmed = stdout.trim();\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n const starts = [objectStart, arrayStart].filter((index) => index >= 0);\n if (!starts.length) {\n return JSON.parse(trimmed || \"{}\");\n }\n return JSON.parse(trimmed.slice(Math.min(...starts)));\n}\n\nasync function assertOpenSpecCommandSupported(ctx: FetCommandContext, openSpecCommand: string, fetCommand: string): Promise<void> {\n const capabilities = await ctx.openSpec.getCapabilities();\n if (capabilities.commands.includes(openSpecCommand)) {\n return;\n }\n\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: `OpenSpec CLI ${capabilities.version} does not expose command \"${openSpecCommand}\" required by \"fet ${fetCommand}\". FET will not substitute another workflow command automatically.`,\n details: {\n openSpecVersion: capabilities.version,\n requiredCommand: openSpecCommand,\n availableCommands: capabilities.commands,\n supported: capabilities.supported\n },\n suggestedCommand:\n \"Upgrade OpenSpec to a version that supports this command, then rerun FET. Try: npm install -g @fission-ai/openspec@latest && fet doctor. If your OpenSpec version intentionally removed this command, pause and choose a compatible FET workflow instead of running ff automatically.\"\n });\n}\n\ninterface ChangelogEntry {\n updateTime: string;\n content: string;\n}\n\nasync function createChangelogEntry(projectRoot: string, changeId: string): Promise<ChangelogEntry> {\n return {\n updateTime: formatLocalTimestamp(new Date()),\n content: await readChangeRequirement(projectRoot, changeId)\n };\n}\n\nasync function appendChangelog(projectRoot: string, entry: ChangelogEntry): Promise<void> {\n const changelogPath = join(projectRoot, \"CHANGELOG.md\");\n const existing = await readOptional(changelogPath);\n const legacyContentLabel = \"\\u66f4\\u65b0\\u5185\\u5bb9\";\n const block = `updateTime: ${entry.updateTime}\\nchangeRequirement:${entry.content}\\n${legacyContentLabel}:${entry.content}\\n`;\n const next = existing?.trimEnd() ? `${existing.trimEnd()}\\n\\n${block}` : block;\n await atomicWrite(changelogPath, next);\n}\n\nasync function readChangeRequirement(projectRoot: string, changeId: string): Promise<string> {\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const proposal = await readOptional(join(changeRoot, \"proposal.md\"));\n if (proposal) {\n return summarizeMarkdown(proposal);\n }\n const readme = await readOptional(join(changeRoot, \"README.md\"));\n if (readme) {\n return summarizeMarkdown(readme);\n }\n return changeId;\n}\n\nfunction summarizeMarkdown(content: string): string {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"<!--\") && !line.startsWith(\"---\"))\n .join(\" \");\n return normalized || \"No change requirement found.\";\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction formatLocalTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport async function passthroughCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n const result = await ctx.openSpec.run(command, stripFetOptions(args), { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result\n });\n }\n}\n\nfunction stripFetOptions(args: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--cwd\" || arg === \"--change\") {\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--cwd=\") || arg?.startsWith(\"--change=\")) {\n continue;\n }\n if (arg === \"--yes\" || arg === \"--json\" || arg === \"--verbose\" || arg === \"--no-color\") {\n continue;\n }\n if (arg) {\n result.push(arg);\n }\n }\n return result;\n}\n\nasync function mapOpenSpecCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<{ command: string; args: string[] }> {\n switch (command) {\n case \"propose\":\n case \"bulk-archive\":\n case \"explore\":\n case \"onboard\":\n return { command, args: withGlobalChange(ctx, args) };\n case \"continue\":\n case \"ff\":\n return { command, args: await withDefaultChange(ctx, args, true) };\n case \"apply\":\n case \"sync\":\n return { command, args: await withDefaultChange(ctx, args) };\n case \"new\":\n return { command: \"new\", args: args[0] === \"change\" ? args : [\"change\", ...args] };\n case \"archive\":\n return { command: \"archive\", args: [ctx.changeId ?? args[0] ?? (await requireChangeId(ctx)), ...args.slice(ctx.changeId ? 0 : 1)] };\n default:\n return { command, args };\n }\n}\n\nfunction withGlobalChange(ctx: FetCommandContext, args: string[]): string[] {\n return ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args;\n}\n\nasync function withDefaultChange(ctx: FetCommandContext, args: string[], allowWithArgs = false): Promise<string[]> {\n if (ctx.changeId) {\n return [\"--change\", ctx.changeId, ...args];\n }\n if (args.includes(\"--change\") || args.some((arg) => arg.startsWith(\"--change=\"))) {\n return args;\n }\n if (args.length > 0 && !allowWithArgs) {\n return args;\n }\n return [\"--change\", await requireChangeId(ctx), ...args];\n}\n\nfunction extractChangeId(args: string[]): string | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--change\") {\n return args[index + 1] ?? null;\n }\n if (arg?.startsWith(\"--change=\")) {\n return arg.slice(\"--change=\".length) || null;\n }\n }\n return null;\n}\n\nasync function requireChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n const state = await ctx.stateStore.getOrCreateGlobal();\n if (state.activeChangeId) {\n return state.activeChangeId;\n }\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"No unambiguous OpenSpec change id was found.\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"Pass --change <change-id>.\"\n });\n}\n\nasync function assertVerified(ctx: FetCommandContext): Promise<void> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n const changeId = ctx.changeId ?? global.activeChangeId;\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id is required before this command can check FET verification.\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\n await assertVerifiedChange(ctx, changeId);\n}\n\nasync function assertVerifiedChange(ctx: FetCommandContext, changeId: string): Promise<void> {\n const change = await ctx.stateStore.readChange(changeId);\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (!inspection.changes.includes(changeId)) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"The selected change does not exist in openspec/changes.\",\n details: { changeId, openChangeIds: inspection.changes },\n suggestedCommand: \"fet doctor\"\n });\n }\n if (change?.manualVerify?.status !== \"declared_done\") {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"This change has not been marked verified by FET.\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { parseDocument } from \"yaml\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport type { FetLanguage } from \"./language.js\";\nimport {\n FIGMA_URL_PATTERN,\n figmaApplyInstructionsRelativePath,\n figmaStopHandoffRelativePath,\n type FigmaGuardMode,\n renderChangeFigmaApplyInstructions,\n renderChangeFigmaStopHandoff\n} from \"./templates/figma-guard.js\";\nexport type { FigmaGuardMode } from \"./templates/figma-guard.js\";\n\nexport interface FigmaGuardConfig {\n enabled: boolean;\n mode: FigmaGuardMode;\n onUncertainty: \"stop_and_ask\";\n}\n\nexport interface FigmaGuardHandoffResult {\n path: string;\n applyInstructionsPath?: string;\n written: boolean;\n urls: string[];\n sources: string[];\n mode: FigmaGuardMode;\n}\n\nconst DEFAULT_CONFIG: FigmaGuardConfig = {\n enabled: true,\n mode: \"require_before_ui\",\n onUncertainty: \"stop_and_ask\"\n};\n\nexport async function loadFigmaGuardConfig(projectRoot: string): Promise<FigmaGuardConfig> {\n try {\n const raw = await readFile(join(projectRoot, \"openspec\", \"config.yaml\"), \"utf8\");\n const doc = parseDocument(raw);\n const fetNode = doc.get(\"fet\", true) as { get?: (key: string) => unknown } | undefined;\n const node = fetNode?.get?.(\"figmaGuard\") as { get?: (key: string) => unknown } | undefined;\n if (!node || typeof node.get !== \"function\") {\n return DEFAULT_CONFIG;\n }\n const enabled = node.get(\"enabled\");\n const modeRaw = node.get(\"mode\");\n const mode: FigmaGuardMode = modeRaw === \"stop_and_ask\" ? \"stop_and_ask\" : \"require_before_ui\";\n return {\n enabled: enabled === undefined ? true : Boolean(enabled),\n mode,\n onUncertainty: \"stop_and_ask\"\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport function extractFigmaUrls(content: string): string[] {\n const matches = content.match(FIGMA_URL_PATTERN) ?? [];\n return [...new Set(matches.map((url) => url.replace(/[.,;]+$/, \"\")))];\n}\n\nexport async function collectFigmaUrlsFromChange(projectRoot: string, changeId: string): Promise<{ urls: string[]; sources: string[] }> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const urls = new Set<string>();\n const sources: string[] = [];\n\n const candidates = [\"proposal.md\", \"tasks.md\", \"design.md\"];\n for (const name of candidates) {\n const filePath = join(changePath, name);\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractFigmaUrls(content);\n if (found.length) {\n sources.push(`openspec/changes/${changeId}/${name}`);\n for (const url of found) {\n urls.add(url);\n }\n }\n }\n\n const specsPath = join(changePath, \"specs\");\n for (const filePath of await listMarkdownFiles(specsPath)) {\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractFigmaUrls(content);\n if (found.length) {\n sources.push(relative(projectRoot, filePath).replaceAll(\"\\\\\", \"/\"));\n for (const url of found) {\n urls.add(url);\n }\n }\n }\n\n return { urls: [...urls], sources };\n}\n\nexport async function ensureChangeFigmaStopHandoff(options: {\n projectRoot: string;\n changeId: string;\n language: FetLanguage;\n enabled?: boolean;\n mode?: FigmaGuardMode;\n}): Promise<FigmaGuardHandoffResult | null> {\n const config =\n options.enabled === undefined\n ? await loadFigmaGuardConfig(options.projectRoot)\n : {\n enabled: options.enabled,\n mode: options.mode ?? \"require_before_ui\",\n onUncertainty: \"stop_and_ask\" as const\n };\n if (!config.enabled) {\n return null;\n }\n\n const { urls, sources } = await collectFigmaUrlsFromChange(options.projectRoot, options.changeId);\n if (!urls.length) {\n return null;\n }\n\n const generatedAt = new Date().toISOString();\n let written = false;\n\n const stopRelativePath = figmaStopHandoffRelativePath(options.changeId);\n const stopAbsolutePath = join(options.projectRoot, stopRelativePath);\n const stopContent = renderChangeFigmaStopHandoff({\n changeId: options.changeId,\n generatedAt,\n urls,\n sources,\n language: options.language\n });\n const existingStop = await readOptional(stopAbsolutePath);\n if (existingStop !== stopContent) {\n await atomicWrite(stopAbsolutePath, stopContent);\n written = true;\n }\n\n let applyInstructionsPath: string | undefined;\n if (config.mode === \"require_before_ui\") {\n applyInstructionsPath = figmaApplyInstructionsRelativePath(options.changeId);\n const applyAbsolutePath = join(options.projectRoot, applyInstructionsPath);\n const applyContent = renderChangeFigmaApplyInstructions({\n changeId: options.changeId,\n generatedAt,\n urls,\n sources,\n language: options.language\n });\n const existingApply = await readOptional(applyAbsolutePath);\n if (existingApply !== applyContent) {\n await atomicWrite(applyAbsolutePath, applyContent);\n written = true;\n }\n }\n\n return {\n path: stopRelativePath,\n applyInstructionsPath,\n written,\n urls,\n sources,\n mode: config.mode\n };\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n await walk(root, files);\n return files;\n}\n\nasync function walk(dir: string, files: string[]): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath, files);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n files.push(fullPath);\n }\n }\n } catch {\n return;\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n await stat(path);\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { parse, parseDocument } from \"yaml\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport { collectFigmaUrlsFromChange } from \"./figma-guard.js\";\nimport type { FetLanguage } from \"./language.js\";\nimport {\n renderUiDisplayContractYaml,\n renderUiFieldApplyInstructions,\n type UiDisplayContractApiSchema,\n type UiDisplayContractDocument,\n uiDisplayContractRelativePath,\n uiFieldApplyInstructionsRelativePath\n} from \"./templates/ui-display-contract.js\";\n\nexport interface UiDisplayContractConfig {\n enabled: boolean;\n}\n\nexport interface UiDisplayContractHandoffResult {\n contractPath: string;\n applyInstructionsPath: string;\n written: boolean;\n hasFigma: boolean;\n hasApi: boolean;\n apiFieldCount: number;\n}\n\nconst DEFAULT_CONFIG: UiDisplayContractConfig = {\n enabled: true\n};\n\nconst API_DOC_PATH_PATTERN =\n /(?:^|[\\s(`])([\\w./-]*(?:openapi|swagger|api-doc|api\\/docs)[\\w./-]*\\.(?:ya?ml|json))(?:[\\s)`.,;]|$)/gi;\nconst MARKDOWN_LINK_PATH_PATTERN = /\\[[^\\]]*\\]\\(([^)]+\\.(?:ya?ml|json))\\)/gi;\nconst BACKTICK_PATH_PATTERN = /`([^`]+\\.(?:ya?ml|json))`/gi;\nconst OPENAPI_BARE_PATTERN = /\\b(openapi\\.ya?ml|swagger\\.ya?ml|swagger\\.json)\\b/gi;\n\nexport async function loadUiDisplayContractConfig(projectRoot: string): Promise<UiDisplayContractConfig> {\n try {\n const raw = await readFile(join(projectRoot, \"openspec\", \"config.yaml\"), \"utf8\");\n const doc = parseDocument(raw);\n const fetNode = doc.get(\"fet\", true) as { get?: (key: string) => unknown } | undefined;\n const node = fetNode?.get?.(\"uiDisplayContract\") as { get?: (key: string) => unknown } | undefined;\n if (!node || typeof node.get !== \"function\") {\n return DEFAULT_CONFIG;\n }\n const enabled = node.get(\"enabled\");\n return {\n enabled: enabled === undefined ? true : Boolean(enabled)\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function collectApiSourcesFromChange(\n projectRoot: string,\n changeId: string\n): Promise<{ paths: string[]; sources: string[] }> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const paths = new Set<string>();\n const sources: string[] = [];\n\n const candidates = [\"proposal.md\", \"tasks.md\", \"design.md\"];\n for (const name of candidates) {\n const filePath = join(changePath, name);\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractApiDocPaths(content, projectRoot);\n if (found.length) {\n sources.push(`openspec/changes/${changeId}/${name}`);\n for (const path of found) {\n paths.add(path);\n }\n }\n }\n\n const specsPath = join(changePath, \"specs\");\n for (const filePath of await listMarkdownFiles(specsPath)) {\n const content = await readOptional(filePath);\n if (!content) {\n continue;\n }\n const found = extractApiDocPaths(content, projectRoot);\n if (found.length) {\n sources.push(relative(projectRoot, filePath).replaceAll(\"\\\\\", \"/\"));\n for (const path of found) {\n paths.add(path);\n }\n }\n }\n\n return { paths: [...paths], sources };\n}\n\nexport function extractApiDocPaths(content: string, projectRoot: string): string[] {\n const found = new Set<string>();\n const patterns = [API_DOC_PATH_PATTERN, MARKDOWN_LINK_PATH_PATTERN, BACKTICK_PATH_PATTERN, OPENAPI_BARE_PATTERN];\n\n for (const pattern of patterns) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const raw = (match[1] ?? match[0]).trim().replace(/^[\"']|[\"']$/g, \"\");\n const normalized = normalizeRepoPath(raw, projectRoot);\n if (normalized) {\n found.add(normalized);\n }\n }\n }\n\n if (/\\b(openapi|swagger|接口文档|API\\s*文档)\\b/i.test(content)) {\n const common = [\"openapi.yaml\", \"openapi.yml\", \"docs/openapi.yaml\", \"swagger.yaml\", \"swagger.json\"];\n for (const candidate of common) {\n const normalized = normalizeRepoPath(candidate, projectRoot);\n if (normalized && existsSync(join(projectRoot, normalized))) {\n found.add(normalized);\n }\n }\n }\n\n return [...found];\n}\n\nexport async function extractOpenApiSchemas(\n projectRoot: string,\n relativePaths: string[]\n): Promise<UiDisplayContractApiSchema[]> {\n const schemas: UiDisplayContractApiSchema[] = [];\n\n for (const rel of relativePaths) {\n const absolute = join(projectRoot, rel);\n const content = await readOptional(absolute);\n if (!content) {\n continue;\n }\n let doc: unknown;\n try {\n doc = rel.endsWith(\".json\") ? JSON.parse(content) : parse(content);\n } catch {\n continue;\n }\n const names = collectOpenApiSchemaPropertyNames(doc);\n for (const [name, fields] of names) {\n if (fields.length) {\n schemas.push({ name, fields: [...new Set(fields)].sort(), sourcePath: rel });\n }\n }\n }\n\n return schemas;\n}\n\nexport function buildUiDisplayContractDocument(options: {\n changeId: string;\n generatedAt: string;\n fetVersion: string;\n figmaUrls: string[];\n figmaSources: string[];\n apiPaths: string[];\n apiSources: string[];\n apiSchemas: UiDisplayContractApiSchema[];\n}): UiDisplayContractDocument {\n const allApiFields = [...new Set(options.apiSchemas.flatMap((schema) => schema.fields))].sort();\n const screenId = options.figmaUrls.length ? \"primary\" : \"default\";\n\n const omittedCandidates = allApiFields.map((field) => {\n const schema = options.apiSchemas.find((item) => item.fields.includes(field))?.name;\n return {\n field,\n schema,\n reason:\n \"Listed in API/OpenAPI schema; not yet in displayFields—confirm with Figma before rendering in UI.\"\n };\n });\n\n return {\n schemaVersion: 1,\n fetVersion: options.fetVersion,\n generatedAt: options.generatedAt,\n changeId: options.changeId,\n purpose: \"ui-display-contract\",\n status: \"draft\",\n precedence: [\n \"ui-display-contract.yaml displayFields\",\n \"Figma visible elements\",\n \"API/OpenAPI schema (data layer and types only)\"\n ],\n sources: {\n figma: {\n urls: options.figmaUrls,\n artifactPaths: options.figmaSources\n },\n api: options.apiPaths.map((path) => ({\n path,\n artifactPaths: options.apiSources,\n schemas: options.apiSchemas.filter((schema) => schema.sourcePath === path)\n }))\n },\n screens: [\n {\n id: screenId,\n title: options.figmaUrls.length ? \"Primary screen (confirm id with design)\" : \"Default screen\",\n figmaUrls: options.figmaUrls,\n displayFields: [],\n hiddenButUsed: [],\n omittedFromUi: [],\n needsReview: allApiFields.length\n ? [\n `Fill displayFields for screen \"${screenId}\" from Figma before UI implementation.`,\n ...omittedCandidates.slice(0, 12).map((item) => `API field \"${item.field}\"—omit from UI or add to displayFields?`)\n ]\n : options.figmaUrls.length\n ? [`Fill displayFields for screen \"${screenId}\" from Figma MCP/API.`]\n : [\"Add API doc paths to change artifacts or confirm this change has no API-backed UI.\"]\n }\n ],\n omittedCandidates\n };\n}\n\nexport async function ensureChangeUiDisplayContract(options: {\n projectRoot: string;\n changeId: string;\n language: FetLanguage;\n fetVersion: string;\n enabled?: boolean;\n}): Promise<UiDisplayContractHandoffResult | null> {\n const config =\n options.enabled === undefined ? await loadUiDisplayContractConfig(options.projectRoot) : { enabled: options.enabled };\n if (!config.enabled) {\n return null;\n }\n\n const figma = await collectFigmaUrlsFromChange(options.projectRoot, options.changeId);\n const api = await collectApiSourcesFromChange(options.projectRoot, options.changeId);\n const hasFigma = figma.urls.length > 0;\n const hasApi = api.paths.length > 0;\n\n if (!hasFigma && !hasApi) {\n return null;\n }\n\n const apiSchemas = hasApi ? await extractOpenApiSchemas(options.projectRoot, api.paths) : [];\n const generatedAt = new Date().toISOString();\n const contractRelativePath = uiDisplayContractRelativePath(options.changeId);\n const applyRelativePath = uiFieldApplyInstructionsRelativePath(options.changeId);\n\n const doc = buildUiDisplayContractDocument({\n changeId: options.changeId,\n generatedAt,\n fetVersion: options.fetVersion,\n figmaUrls: figma.urls,\n figmaSources: figma.sources,\n apiPaths: api.paths,\n apiSources: api.sources,\n apiSchemas\n });\n\n const contractContent = renderUiDisplayContractYaml(doc);\n const contractAbsolutePath = join(options.projectRoot, contractRelativePath);\n const existingContract = await readOptional(contractAbsolutePath);\n let written = false;\n if (existingContract !== contractContent) {\n await atomicWrite(contractAbsolutePath, contractContent);\n written = true;\n }\n\n const applyContent = renderUiFieldApplyInstructions({\n changeId: options.changeId,\n generatedAt,\n contractPath: contractRelativePath,\n language: options.language,\n hasFigma,\n hasApi\n });\n const applyAbsolutePath = join(options.projectRoot, applyRelativePath);\n const existingApply = await readOptional(applyAbsolutePath);\n if (existingApply !== applyContent) {\n await atomicWrite(applyAbsolutePath, applyContent);\n written = true;\n }\n\n return {\n contractPath: contractRelativePath,\n applyInstructionsPath: applyRelativePath,\n written,\n hasFigma,\n hasApi,\n apiFieldCount: apiSchemas.reduce((sum, schema) => sum + schema.fields.length, 0)\n };\n}\n\nfunction collectOpenApiSchemaPropertyNames(doc: unknown): Map<string, string[]> {\n const result = new Map<string, string[]>();\n if (!doc || typeof doc !== \"object\") {\n return result;\n }\n const root = doc as Record<string, unknown>;\n const components = root.components as Record<string, unknown> | undefined;\n const schemas = components?.schemas as Record<string, unknown> | undefined;\n if (schemas && typeof schemas === \"object\") {\n for (const [name, schema] of Object.entries(schemas)) {\n const fields = propertyNamesFromSchema(schema);\n if (fields.length) {\n result.set(name, fields);\n }\n }\n }\n return result;\n}\n\nfunction propertyNamesFromSchema(schema: unknown, depth = 0): string[] {\n if (!schema || typeof schema !== \"object\" || depth > 4) {\n return [];\n }\n const node = schema as Record<string, unknown>;\n if (node.$ref && typeof node.$ref === \"string\") {\n return [];\n }\n const properties = node.properties as Record<string, unknown> | undefined;\n if (properties && typeof properties === \"object\") {\n return Object.keys(properties).sort();\n }\n if (node.items) {\n return propertyNamesFromSchema(node.items, depth + 1);\n }\n if (node.allOf && Array.isArray(node.allOf)) {\n return node.allOf.flatMap((part) => propertyNamesFromSchema(part, depth + 1));\n }\n return [];\n}\n\nfunction normalizeRepoPath(raw: string, projectRoot: string): string | null {\n const cleaned = raw.replace(/^\\.\\//, \"\").replaceAll(\"\\\\\", \"/\");\n if (!cleaned || cleaned.includes(\"..\")) {\n return null;\n }\n return cleaned;\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n await walk(root, files);\n return files;\n}\n\nasync function walk(dir: string, files: string[]): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath, files);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n files.push(fullPath);\n }\n }\n } catch {\n return;\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n await stat(path);\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function isKebabId(value: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);\n}\n\nexport function toKebabId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function msg(language: FetLanguage, zh: string, en: string): string {\n return language === \"en\" ? en : zh;\n}\n\nexport async function resolveChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n if (global.activeChangeId) {\n return global.activeChangeId;\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: msg(ctx.language, \"无法确定目标 change\", \"Cannot determine which change to use\"),\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"fet <command> --change <change-id>\"\n });\n}\n\nexport async function assertChangeExists(ctx: FetCommandContext, changeId: string): Promise<void> {\n const inspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n if (!inspection.exists) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: msg(ctx.language, \"指定的 change 不存在\", \"The specified change does not exist\"),\n details: { changeId },\n suggestedCommand: `fet doctor`\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseDocument } from \"yaml\";\nimport type { TddConfig, TddGateMode, TddWhenNoTestScript } from \"./types.js\";\n\nconst DEFAULT_CONFIG: TddConfig = {\n enabled: true,\n mode: \"require_before_apply\",\n whenNoTestScript: \"block\"\n};\n\nexport async function loadTddConfig(projectRoot: string): Promise<TddConfig> {\n try {\n const raw = await readFile(join(projectRoot, \"openspec\", \"config.yaml\"), \"utf8\");\n const doc = parseDocument(raw);\n const fetNode = doc.get(\"fet\", true) as { get?: (key: string) => unknown } | undefined;\n const node = fetNode?.get?.(\"tdd\") as { get?: (key: string) => unknown } | undefined;\n if (!node || typeof node.get !== \"function\") {\n return DEFAULT_CONFIG;\n }\n const enabled = node.get(\"enabled\");\n const modeRaw = node.get(\"mode\");\n const whenNoTestScriptRaw = node.get(\"whenNoTestScript\");\n return {\n enabled: enabled === undefined ? true : Boolean(enabled),\n mode: parseGateMode(modeRaw),\n whenNoTestScript: parseWhenNoTestScript(whenNoTestScriptRaw)\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nfunction parseGateMode(value: unknown): TddGateMode {\n if (value === \"off\" || value === \"optional\" || value === \"require_before_apply\") {\n return value;\n }\n return DEFAULT_CONFIG.mode;\n}\n\nfunction parseWhenNoTestScript(value: unknown): TddWhenNoTestScript {\n if (value === \"warn\" || value === \"skip\") {\n return value;\n }\n return DEFAULT_CONFIG.whenNoTestScript;\n}\n\nexport function isTddRequired(config: TddConfig): boolean {\n return config.enabled && config.mode === \"require_before_apply\";\n}\n","import { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\n\nexport async function collectPlanningSources(projectRoot: string, changeId: string): Promise<string[]> {\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const sources: string[] = [];\n const rootFiles = [\"proposal.md\", \"tasks.md\", \"design.md\"];\n for (const name of rootFiles) {\n const path = join(changeRoot, name);\n if (await exists(path)) {\n sources.push(relative(projectRoot, path).replace(/\\\\/g, \"/\"));\n }\n }\n const specsDir = join(changeRoot, \"specs\");\n if (await exists(specsDir)) {\n for (const file of await walkFiles(specsDir)) {\n if (file.endsWith(\".md\")) {\n sources.push(relative(projectRoot, file).replace(/\\\\/g, \"/\"));\n }\n }\n }\n return sources.sort();\n}\n\nexport async function computePlanningFingerprint(projectRoot: string, changeId: string): Promise<string> {\n const sources = await collectPlanningSources(projectRoot, changeId);\n const hash = createHash(\"sha256\");\n for (const source of sources) {\n const content = await readFile(join(projectRoot, source), \"utf8\");\n hash.update(source);\n hash.update(\"\\0\");\n hash.update(content);\n hash.update(\"\\0\");\n }\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nasync function walkFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkFiles(path)));\n } else if (entry.isFile()) {\n files.push(path);\n }\n }\n return files;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { tddManifestRelativePath } from \"./paths.js\";\nimport type { TddManifest, TddResultsDocument } from \"./types.js\";\nimport { tddResultsRelativePath } from \"./paths.js\";\n\nexport function tddManifestPath(projectRoot: string, changeId: string): string {\n return join(projectRoot, tddManifestRelativePath(changeId));\n}\n\nexport function tddResultsPath(projectRoot: string, changeId: string): string {\n return join(projectRoot, tddResultsRelativePath(changeId));\n}\n\nexport async function readTddManifest(projectRoot: string, changeId: string): Promise<TddManifest | null> {\n const path = tddManifestPath(projectRoot, changeId);\n try {\n await stat(path);\n } catch {\n return null;\n }\n const doc = parse(await readFile(path, \"utf8\")) as TddManifest;\n if (!doc || doc.schemaVersion !== 1 || doc.changeId !== changeId) {\n return null;\n }\n return doc;\n}\n\nexport async function writeTddManifest(projectRoot: string, manifest: TddManifest): Promise<string> {\n const relative = tddManifestRelativePath(manifest.changeId);\n const path = join(projectRoot, relative);\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, stringify(manifest));\n return relative;\n}\n\nexport async function writeTddResults(projectRoot: string, results: TddResultsDocument): Promise<string> {\n const relative = tddResultsRelativePath(results.changeId);\n const path = join(projectRoot, relative);\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, `${JSON.stringify(results, null, 2)}\\n`);\n return relative;\n}\n\nexport function createTddManifest(input: {\n changeId: string;\n planningFingerprint: string;\n sources: string[];\n cases: TddManifest[\"cases\"];\n testCommand: string | null;\n}): TddManifest {\n return {\n schemaVersion: 1,\n changeId: input.changeId,\n generatedAt: new Date().toISOString(),\n fetVersion: FET_VERSION,\n planningFingerprint: input.planningFingerprint,\n sources: input.sources,\n cases: input.cases,\n run: {\n mode: input.cases.length ? \"manifest\" : \"workspace\",\n fallbackCommand: input.testCommand\n }\n };\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { msg, resolveChangeId } from \"../commands/change-id.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { ChangeState, TestRunRecord } from \"../state/types.js\";\nimport { loadTddConfig, isTddRequired } from \"./config.js\";\nimport { computePlanningFingerprint } from \"./fingerprint.js\";\nimport { readTddManifest } from \"./manifest.js\";\nimport { tddManifestRelativePath } from \"./paths.js\";\n\nexport async function assertTddReady(ctx: FetCommandContext, changeId: string): Promise<void> {\n const config = await loadTddConfig(ctx.projectRoot);\n if (!isTddRequired(config)) {\n return;\n }\n\n const manifest = await readTddManifest(ctx.projectRoot, changeId);\n if (!manifest) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(ctx.language, \"缺少 TDD 产物,无法进入 apply。\", \"TDD artifacts are missing; cannot run apply.\"),\n details: { changeId, expected: tddManifestRelativePath(changeId) },\n suggestedCommand: `fet tdd --change ${changeId}`,\n recoverable: true\n });\n }\n\n const fingerprint = await computePlanningFingerprint(ctx.projectRoot, changeId);\n if (manifest.planningFingerprint !== fingerprint) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(\n ctx.language,\n \"规划产物已变更,TDD 清单已过期,请重新生成。\",\n \"Planning artifacts changed; TDD manifest is stale. Regenerate it.\"\n ),\n details: { changeId, manifestFingerprint: manifest.planningFingerprint, currentFingerprint: fingerprint },\n suggestedCommand: `fet tdd --change ${changeId}`,\n recoverable: true\n });\n }\n}\n\nexport async function assertTestPassed(ctx: FetCommandContext, changeId: string): Promise<void> {\n const config = await loadTddConfig(ctx.projectRoot);\n if (!config.enabled || config.mode === \"off\") {\n return;\n }\n\n const change = await ctx.stateStore.readChange(changeId);\n const testRun = change?.testRun;\n if (testRun?.status === \"skipped\") {\n return;\n }\n if (testRun?.status === \"passed\" && (await fingerprintMatches(ctx, changeId, testRun))) {\n return;\n }\n\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(ctx.language, \"本 change 尚未通过 fet test。\", \"This change has not passed fet test yet.\"),\n details: { changeId, testRun: testRun ?? null },\n suggestedCommand: `fet test --change ${changeId}`,\n recoverable: true\n });\n}\n\nexport async function assertTddReadyForContext(ctx: FetCommandContext): Promise<string> {\n const changeId = await resolveChangeId(ctx);\n await assertTddReady(ctx, changeId);\n return changeId;\n}\n\nasync function fingerprintMatches(ctx: FetCommandContext, changeId: string, testRun: TestRunRecord): Promise<boolean> {\n const current = await computePlanningFingerprint(ctx.projectRoot, changeId);\n return testRun.planningFingerprint === current;\n}\n\nexport function invalidateTestRun(state: ChangeState): void {\n state.testRun = null;\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { ProjectIdentity } from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function detectProjectIdentity(projectRoot: string): Promise<ProjectIdentity> {\n const [gitRoot, branch, headCommit] = await Promise.all([\n git(projectRoot, [\"rev-parse\", \"--show-toplevel\"]),\n git(projectRoot, [\"branch\", \"--show-current\"]),\n git(projectRoot, [\"rev-parse\", \"HEAD\"])\n ]);\n\n return {\n gitRoot,\n worktreePath: projectRoot,\n branch,\n headCommit\n };\n}\n\nasync function git(cwd: string, args: string[]): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { assertChangeState, assertGlobalState, createChangeState, createGlobalState } from \"./schema.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nexport class StateStore {\n constructor(\n private readonly projectRoot: string,\n private readonly fetVersion: string,\n private readonly project: ProjectIdentity\n ) {}\n\n async readGlobal(): Promise<GlobalState | null> {\n try {\n const value = JSON.parse(await readFile(this.globalPath(), \"utf8\"));\n assertGlobalState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateGlobal(): Promise<GlobalState> {\n return (await this.readGlobal()) ?? createGlobalState(this.fetVersion, this.project);\n }\n\n async writeGlobal(state: GlobalState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\"), { recursive: true });\n await atomicWrite(this.globalPath(), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n async readChange(changeId: string): Promise<ChangeState | null> {\n try {\n const value = JSON.parse(await readFile(this.changePath(changeId), \"utf8\"));\n assertChangeState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateChange(changeId: string, phase: ChangePhase): Promise<ChangeState> {\n return (await this.readChange(changeId)) ?? createChangeState(this.fetVersion, changeId, phase);\n }\n\n async writeChange(state: ChangeState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\", \"changes\", state.changeId), { recursive: true });\n await atomicWrite(this.changePath(state.changeId), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n private globalPath(): string {\n return join(this.projectRoot, \"openspec\", \"fet-state.json\");\n }\n\n private changePath(changeId: string): string {\n return join(this.projectRoot, \"openspec\", \"changes\", changeId, \"fet-state.json\");\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n","export const DEFAULT_LANGUAGE = \"zh-CN\" as const;\n\nexport type FetLanguage = \"zh-CN\" | \"en\";\n\nexport interface LanguageState {\n current: FetLanguage;\n updatedAt: string;\n}\n\nexport function normalizeLanguage(value: string | null | undefined): FetLanguage {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return DEFAULT_LANGUAGE;\n }\n if ([\"en\", \"en-us\", \"english\"].includes(normalized)) {\n return \"en\";\n }\n return DEFAULT_LANGUAGE;\n}\n\nexport function languageLabel(language: FetLanguage): string {\n return language === \"en\" ? \"English\" : \"中文\";\n}\n\nexport function languageInstruction(language: FetLanguage): string {\n return language === \"en\"\n ? \"Use English for FET interaction messages, generated handoff documents, and IDE prompt output unless the user asks otherwise.\"\n : \"除非用户另有明确要求,FET 的交互信息、生成的交接文档和 IDE 提示产出均使用中文。\";\n}\n","import { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { DEFAULT_LANGUAGE } from \"../language.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nconst phases: ChangePhase[] = [\"explore\", \"propose\", \"implement\", \"verify\", \"sync\", \"archive\"];\n\nexport function createGlobalState(fetVersion: string, project: ProjectIdentity): GlobalState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n createdAt: now,\n updatedAt: now,\n project,\n language: {\n current: DEFAULT_LANGUAGE,\n updatedAt: now\n },\n openspec: null,\n activeChangeId: null,\n openChangeIds: [],\n context: {\n agentsMdUpdatedAt: null,\n configUpdatedAt: null,\n scannerVersion: 1\n },\n toolAdapters: {},\n graph: {},\n verifyAuthorization: null,\n lastDoctor: null\n };\n}\n\nexport function createChangeState(fetVersion: string, changeId: string, phase: ChangePhase): ChangeState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n changeId,\n createdAt: now,\n updatedAt: now,\n currentPhase: phase,\n phases: Object.fromEntries(phases.map((item) => [item, { status: item === phase ? \"in_progress\" : \"not_started\" }])) as ChangeState[\"phases\"],\n tasks: {\n source: \"tasks.md\",\n completedIds: [],\n lastSyncedAt: null\n },\n manualVerify: null,\n tdd: null,\n testRun: null,\n lastOpenSpecCommand: null,\n warnings: []\n };\n}\n\nexport function assertGlobalState(value: unknown): asserts value is GlobalState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"全局状态 schema 不受支持\");\n }\n if (!isRecord(value.language)) {\n value.language = {\n current: DEFAULT_LANGUAGE,\n updatedAt: typeof value.updatedAt === \"string\" ? value.updatedAt : new Date().toISOString()\n };\n }\n if (typeof value.fetVersion !== \"string\" || !isRecord(value.project)) {\n throw corruptedState(\"全局状态缺少必填字段\");\n }\n}\n\nexport function assertChangeState(value: unknown): asserts value is ChangeState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"变更状态 schema 不受支持\");\n }\n if (typeof value.fetVersion !== \"string\" || typeof value.changeId !== \"string\") {\n throw corruptedState(\"变更状态缺少必填字段\");\n }\n}\n\nfunction unsupportedSchema(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateSchemaUnsupported,\n message,\n suggestedCommand: \"npm update -g @nick848/fet\"\n });\n}\n\nfunction corruptedState(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateCorrupted,\n message,\n suggestedCommand: \"fet doctor --fix\"\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readCompletedTaskIds(tasksPath: string): Promise<string[]> {\n let content: string;\n try {\n content = await readFile(tasksPath, \"utf8\");\n } catch {\n return [];\n }\n\n const completed: string[] = [];\n const pattern = /^\\s*[-*]\\s+\\[[xX]\\]\\s+([0-9]+(?:\\.[0-9]+)*)/gm;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content))) {\n if (match[1]) {\n completed.push(match[1]);\n }\n }\n return completed;\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport const DEFAULT_FET_PACKAGE_NAME = \"@nick848/fet\";\n\nexport interface NpmRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal: NodeJS.Signals | null;\n stdout?: string;\n stderr?: string;\n}\n\nexport interface FetUpdateInstallOptions {\n cwd: string;\n json: boolean;\n language: \"en\" | \"zh-CN\";\n info: (message: string) => void;\n}\n\nexport function getFetPackageName(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_PACKAGE_NAME?.trim() || DEFAULT_FET_PACKAGE_NAME;\n}\n\nexport function getNpmExecutable(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_NPM_EXECUTABLE?.trim() || (process.platform === \"win32\" ? \"npm.cmd\" : \"npm\");\n}\n\nexport async function resolveLatestFetVersion(\n packageName = getFetPackageName(),\n npmExecutable = getNpmExecutable()\n): Promise<string> {\n const override = process.env.FET_UPDATE_LATEST_VERSION?.trim();\n if (override) {\n return override;\n }\n\n const result = await runNpm(npmExecutable, [\"view\", packageName, \"version\", \"--json\"], {\n cwd: process.cwd(),\n stdio: \"pipe\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to check the latest FET version from npm.\",\n details: result,\n suggestedCommand: `${npmExecutable} view ${packageName} version`\n });\n }\n\n const version = parseNpmVersion(result.stdout ?? \"\");\n if (!version) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"npm returned an invalid FET version.\",\n details: { stdout: result.stdout }\n });\n }\n return version;\n}\n\nexport async function performFetUpdate(\n currentVersion: string,\n latestVersion: string,\n options: FetUpdateInstallOptions\n): Promise<{ packageName: string; installCommand: string }> {\n const packageName = getFetPackageName();\n const npmExecutable = getNpmExecutable();\n const installArgs = [\"install\", \"-g\", `${packageName}@latest`];\n\n if (!options.json) {\n options.info(\n options.language === \"en\"\n ? `Updating FET from ${currentVersion} to ${latestVersion}...`\n : `正在将 FET 从 ${currentVersion} 升级到 ${latestVersion}...`\n );\n }\n\n const result = await runNpm(npmExecutable, installArgs, {\n cwd: options.cwd,\n stdio: options.json ? \"pipe\" : \"inherit\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: options.language === \"en\" ? \"FET update failed.\" : \"FET 升级失败。\",\n details: result,\n suggestedCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n });\n }\n\n return {\n packageName,\n installCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n };\n}\n\nfunction parseNpmVersion(stdout: string): string | null {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" && parsed.length > 0 ? parsed : null;\n } catch {\n return trimmed;\n }\n}\n\nexport function runNpm(\n command: string,\n args: string[],\n options: { cwd: string; stdio: \"inherit\" | \"pipe\" }\n): Promise<NpmRunResult> {\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(command, args, {\n cwd: options.cwd,\n stdio: options.stdio,\n shell: process.platform === \"win32\"\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to run npm for FET update.\",\n details: { command, args },\n cause: error,\n suggestedCommand: `${command} ${args.join(\" \")}`\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const diff = leftVersion.main[index] - rightVersion.main[index];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n\n if (!leftVersion.prerelease.length && rightVersion.prerelease.length) {\n return 1;\n }\n if (leftVersion.prerelease.length && !rightVersion.prerelease.length) {\n return -1;\n }\n\n const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftVersion.prerelease[index];\n const rightPart = rightVersion.prerelease[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const diff = comparePrereleasePart(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(version: string): { main: [number, number, number]; prerelease: string[] } {\n const [withoutBuild] = version.trim().replace(/^v/i, \"\").split(\"+\");\n const [mainValue = \"\", prereleaseValue = \"\"] = withoutBuild.split(\"-\");\n const mainParts = mainValue.split(\".\").map((part) => Number.parseInt(part, 10));\n return {\n main: [\n Number.isFinite(mainParts[0]) ? mainParts[0] : 0,\n Number.isFinite(mainParts[1]) ? mainParts[1] : 0,\n Number.isFinite(mainParts[2]) ? mainParts[2] : 0\n ],\n prerelease: prereleaseValue ? prereleaseValue.split(\".\") : []\n };\n}\n\nfunction comparePrereleasePart(left: string, right: string): number {\n const leftNumber = /^\\d+$/.test(left) ? Number.parseInt(left, 10) : null;\n const rightNumber = /^\\d+$/.test(right) ? Number.parseInt(right, 10) : null;\n\n if (leftNumber !== null && rightNumber !== null) {\n return Math.sign(leftNumber - rightNumber);\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return left.localeCompare(right);\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { compareVersions, getFetPackageName, performFetUpdate, resolveLatestFetVersion } from \"../update/npm.js\";\n\nexport async function updateCommand(ctx: FetCommandContext): Promise<void> {\n const packageName = getFetPackageName();\n const latestVersion = await resolveLatestFetVersion(packageName);\n const currentVersion = ctx.fetVersion;\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET is already up to date (${currentVersion}).`\n : `FET 已是最新版 (${currentVersion})。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: false\n }\n });\n return;\n }\n\n const install = await performFetUpdate(currentVersion, latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET updated from ${currentVersion} to ${latestVersion}.`\n : `FET 已从 ${currentVersion} 升级到 ${latestVersion}。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: true,\n installCommand: install.installCommand\n }\n });\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { assertChangeExists, msg, resolveChangeId } from \"./change-id.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { loadTddConfig } from \"../tdd/config.js\";\nimport { collectPlanningSources, computePlanningFingerprint } from \"../tdd/fingerprint.js\";\nimport { extractCasesFromChange } from \"../tdd/extract-cases.js\";\nimport { invalidateTestRun } from \"../tdd/gates.js\";\nimport { createTddManifest, writeTddManifest } from \"../tdd/manifest.js\";\nimport { tddInstructionsRelativePath, tddSpecRelativePath } from \"../tdd/paths.js\";\nimport { renderTddInstructions, renderTddSpec } from \"../templates/tdd.js\";\n\nexport async function tddCommand(ctx: FetCommandContext): Promise<void> {\n await withProjectLock(ctx.projectRoot, { command: \"tdd\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const changeId = await resolveChangeId(ctx);\n await assertChangeExists(ctx, changeId);\n const config = await loadTddConfig(ctx.projectRoot);\n\n const sources = await collectPlanningSources(ctx.projectRoot, changeId);\n if (!sources.length) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: msg(ctx.language, \"未找到可用于生成 TDD 的规划产物。\", \"No planning artifacts found for TDD generation.\"),\n details: { changeId },\n suggestedCommand: `fet continue --change ${changeId}`,\n recoverable: true\n });\n }\n\n const planningFingerprint = await computePlanningFingerprint(ctx.projectRoot, changeId);\n const cases = await extractCasesFromChange(ctx.projectRoot, changeId, sources);\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const testCommand = scan.commands.test?.command ?? scan.commands[\"test:unit\"]?.command ?? null;\n\n const manifest = createTddManifest({\n changeId,\n planningFingerprint,\n sources,\n cases,\n testCommand\n });\n const manifestPath = await writeTddManifest(ctx.projectRoot, manifest);\n\n const fetDir = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\");\n await mkdir(fetDir, { recursive: true });\n const instructionsPath = tddInstructionsRelativePath(changeId);\n const specPath = tddSpecRelativePath(changeId);\n await atomicWrite(join(ctx.projectRoot, instructionsPath), renderTddInstructions(changeId, manifest, ctx.language));\n await atomicWrite(join(ctx.projectRoot, specPath), renderTddSpec(changeId, manifest, ctx.language));\n\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, \"implement\");\n changeState.tdd = {\n status: \"ready\",\n generatedAt: manifest.generatedAt,\n planningFingerprint,\n manifestPath\n };\n invalidateTestRun(changeState);\n changeState.currentPhase = \"implement\";\n changeState.phases.implement = { status: \"in_progress\", updatedAt: manifest.generatedAt };\n await ctx.stateStore.writeChange(changeState);\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.activeChangeId = changeId;\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: \"tdd\",\n summary: msg(\n ctx.language,\n `已为 change \"${changeId}\" 生成 TDD 产物(${cases.length} 个用例)。`,\n `Generated TDD artifacts for change \"${changeId}\" (${cases.length} case(s)).`\n ),\n warnings:\n !testCommand && config.whenNoTestScript !== \"skip\"\n ? [\n msg(\n ctx.language,\n \"项目未配置 test 脚本;实现后可能无法运行 fet test。\",\n \"No test script found in the project; fet test may fail after implementation.\"\n )\n ]\n : undefined,\n nextSteps: [\n msg(ctx.language, `阅读 ${instructionsPath},由 IDE/AI 创建/更新清单中的测试文件。`, `Read ${instructionsPath} and create/update test files listed in the manifest.`),\n msg(ctx.language, `完成后运行 fet apply --change ${changeId}`, `Then run fet apply --change ${changeId}`),\n msg(ctx.language, `实现后运行 fet test --change ${changeId}`, `After implementation, run fet test --change ${changeId}`)\n ],\n data: {\n changeId,\n manifestPath,\n specPath,\n instructionsPath,\n caseCount: cases.length,\n planningFingerprint,\n testCommand\n }\n });\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { toKebabId } from \"../commands/change-id.js\";\nimport type { TddManifestCase } from \"./types.js\";\n\nexport async function extractCasesFromChange(projectRoot: string, changeId: string, sources: string[]): Promise<TddManifestCase[]> {\n const cases: TddManifestCase[] = [];\n const seen = new Set<string>();\n\n for (const source of sources) {\n const content = await readFile(join(projectRoot, source), \"utf8\");\n if (source.endsWith(\"tasks.md\")) {\n for (const item of extractTaskCases(content, changeId)) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n cases.push({ ...item, specRef: `${source} — ${item.specRef}` });\n }\n }\n }\n if (source.includes(\"/specs/\") && source.endsWith(\".md\")) {\n for (const item of extractScenarioCases(content, changeId, source)) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n cases.push(item);\n }\n }\n }\n }\n\n if (!cases.length) {\n cases.push({\n id: `${changeId}-smoke`,\n title: \"Change smoke test\",\n specRef: sources[0] ?? `openspec/changes/${changeId}/`,\n testFile: `tests/changes/${changeId}.test.ts`,\n testIds: [`${changeId}-smoke`],\n required: true\n });\n }\n\n return cases;\n}\n\nfunction extractTaskCases(content: string, changeId: string): Array<Omit<TddManifestCase, \"specRef\"> & { specRef: string }> {\n const cases: Array<Omit<TddManifestCase, \"specRef\"> & { specRef: string }> = [];\n const lines = content.split(/\\r?\\n/);\n for (const line of lines) {\n const numbered = line.match(/^\\s*[-*]\\s+\\[[ xX]?\\]\\s+((?:\\d+(?:\\.\\d+)*\\.?)?)\\s*(.+)$/);\n if (numbered) {\n const taskId = numbered[1] || String(cases.length + 1);\n const title = numbered[2]?.trim() ?? taskId;\n const id = toKebabId(`${changeId}-task-${taskId}`) || `${changeId}-task-${cases.length + 1}`;\n cases.push({\n id,\n title,\n specRef: title,\n testFile: suggestTestFile(changeId, id),\n testIds: [id],\n required: true\n });\n continue;\n }\n const plain = line.match(/^\\s*[-*]\\s+\\[[ xX]?\\]\\s+(.+)$/);\n if (plain?.[1]) {\n const title = plain[1].trim();\n const id = toKebabId(`${changeId}-${title}`) || `${changeId}-task-${cases.length + 1}`;\n cases.push({\n id,\n title,\n specRef: title,\n testFile: suggestTestFile(changeId, id),\n testIds: [id],\n required: true\n });\n }\n }\n return cases;\n}\n\nfunction extractScenarioCases(content: string, changeId: string, source: string): TddManifestCase[] {\n const cases: TddManifestCase[] = [];\n const lines = content.split(/\\r?\\n/);\n let currentRequirement = \"\";\n for (const line of lines) {\n const req = line.match(/^#{2,4}\\s+Requirement:\\s*(.+)$/i);\n if (req?.[1]) {\n currentRequirement = req[1].trim();\n }\n const scenario = line.match(/^#{2,4}\\s+Scenario:\\s*(.+)$/i);\n if (scenario?.[1]) {\n const title = scenario[1].trim();\n const id = toKebabId(`${changeId}-${title}`) || `${changeId}-scenario-${cases.length + 1}`;\n cases.push({\n id,\n title,\n specRef: currentRequirement ? `Requirement: ${currentRequirement} — Scenario: ${title}` : `Scenario: ${title}`,\n testFile: suggestTestFile(changeId, id),\n testIds: [id],\n required: true\n });\n }\n }\n if (!cases.length && content.trim()) {\n const id = `${changeId}-spec-smoke`;\n cases.push({\n id,\n title: `Spec coverage for ${source}`,\n specRef: source,\n testFile: suggestTestFile(changeId, id),\n testIds: [id],\n required: true\n });\n }\n return cases;\n}\n\nfunction suggestTestFile(changeId: string, caseId: string): string {\n const segment = caseId.replace(new RegExp(`^${changeId}-?`), \"\") || \"suite\";\n return `tests/changes/${changeId}/${segment}.test.ts`;\n}\n","import { spawn } from \"node:child_process\";\n\nexport interface ScriptRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n}\n\nexport async function runShellCommand(commandLine: string, cwd: string, extraArgs: string[] = []): Promise<ScriptRunResult> {\n const parts = splitCommandLine(commandLine);\n const executable = parts[0];\n if (!executable) {\n throw new Error(\"Empty command\");\n }\n const args = [...parts.slice(1), ...extraArgs];\n return runProcess(executable, args, cwd, commandLine);\n}\n\nexport async function runProcess(executable: string, args: string[], cwd: string, label = executable): Promise<ScriptRunResult> {\n return new Promise((resolve) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(executable, args, {\n cwd,\n shell: process.platform === \"win32\",\n env: process.env\n });\n child.stdout?.on(\"data\", (chunk) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk) => stderr.push(chunk));\n child.on(\"close\", (code, signal) => {\n resolve({\n command: label,\n args,\n exitCode: code ?? 1,\n signal,\n stdout: Buffer.concat(stdout).toString(\"utf8\"),\n stderr: Buffer.concat(stderr).toString(\"utf8\")\n });\n });\n child.on(\"error\", () => {\n resolve({\n command: label,\n args,\n exitCode: 1,\n signal: null,\n stdout: Buffer.concat(stdout).toString(\"utf8\"),\n stderr: Buffer.concat(stderr).toString(\"utf8\")\n });\n });\n });\n}\n\nfunction splitCommandLine(commandLine: string): string[] {\n return commandLine.trim().split(/\\s+/);\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { assertChangeExists, msg, resolveChangeId } from \"./change-id.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { withProjectLock } from \"../fs/index.js\";\nimport { runShellCommand } from \"./run-script.js\";\nimport { loadTddConfig } from \"../tdd/config.js\";\nimport { computePlanningFingerprint } from \"../tdd/fingerprint.js\";\nimport { readTddManifest, writeTddResults } from \"../tdd/manifest.js\";\nimport { tddManifestRelativePath, tddResultsRelativePath } from \"../tdd/paths.js\";\nimport type { TddCaseResult, TddManifest, TddResultsDocument } from \"../tdd/types.js\";\n\nexport async function testCommand(ctx: FetCommandContext, options: { plan?: boolean }): Promise<void> {\n await withProjectLock(ctx.projectRoot, { command: \"test\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const changeId = await resolveChangeId(ctx);\n await assertChangeExists(ctx, changeId);\n const config = await loadTddConfig(ctx.projectRoot);\n\n const manifest = await readTddManifest(ctx.projectRoot, changeId);\n if (!manifest) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(ctx.language, \"缺少 TDD 清单,无法运行 fet test。\", \"TDD manifest is missing; cannot run fet test.\"),\n details: { changeId },\n suggestedCommand: `fet tdd --change ${changeId}`,\n recoverable: true\n });\n }\n\n const planningFingerprint = await computePlanningFingerprint(ctx.projectRoot, changeId);\n if (manifest.planningFingerprint !== planningFingerprint) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(ctx.language, \"TDD 清单已过期,请重新运行 fet tdd。\", \"TDD manifest is stale; rerun fet tdd.\"),\n details: { changeId },\n suggestedCommand: `fet tdd --change ${changeId}`,\n recoverable: true\n });\n }\n\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const testCommand = manifest.run.fallbackCommand ?? scan.commands.test?.command ?? scan.commands[\"test:unit\"]?.command ?? null;\n\n if (!testCommand) {\n if (config.whenNoTestScript === \"skip\") {\n await recordSkippedTestRun(ctx, changeId, planningFingerprint, manifestPath(changeId));\n ctx.output.result({\n ok: true,\n command: \"test\",\n summary: msg(ctx.language, \"未配置 test 脚本,已跳过 fet test。\", \"No test script configured; fet test skipped.\"),\n warnings: [msg(ctx.language, \"跳过后可直接 fet verify(若项目策略允许)。\", \"You may proceed to fet verify if your policy allows.\")],\n data: { changeId, skipped: true }\n });\n return;\n }\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: msg(ctx.language, \"未找到 test 脚本,无法执行 fet test。\", \"No test script found; cannot run fet test.\"),\n suggestedCommand: \"在 package.json 中添加 scripts.test 或配置 openspec/config.yaml fet.tdd.whenNoTestScript: skip\"\n });\n }\n\n const extraArgs = buildTestArgs(manifest);\n const planLabel = `${testCommand}${extraArgs.length ? ` ${extraArgs.join(\" \")}` : \"\"}`;\n\n if (options.plan) {\n ctx.output.result({\n ok: true,\n command: \"test\",\n summary: msg(ctx.language, \"已生成 fet test 执行计划。\", \"Generated fet test execution plan.\"),\n data: {\n changeId,\n command: planLabel,\n cases: manifest.cases.map((item) => ({ id: item.id, testFile: item.testFile }))\n },\n nextSteps: [`fet test --change ${changeId}`]\n });\n return;\n }\n\n const result = await runShellCommand(testCommand, ctx.projectRoot, extraArgs);\n const caseResults: TddCaseResult[] = manifest.cases.map((item) => ({\n id: item.id,\n status: result.exitCode === 0 ? \"passed\" : \"failed\",\n exitCode: result.exitCode,\n message: result.exitCode === 0 ? undefined : msg(ctx.language, \"测试命令未通过\", \"Test command failed\")\n }));\n\n const resultsDoc: TddResultsDocument = {\n schemaVersion: 1,\n changeId,\n ranAt: new Date().toISOString(),\n command: planLabel,\n exitCode: result.exitCode,\n planningFingerprint,\n cases: caseResults\n };\n const resultsPath = await writeTddResults(ctx.projectRoot, resultsDoc);\n\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, \"implement\");\n changeState.testRun = {\n status: result.exitCode === 0 ? \"passed\" : \"failed\",\n ranAt: resultsDoc.ranAt,\n command: planLabel,\n exitCode: result.exitCode,\n planningFingerprint,\n manifestPath: manifestPath(changeId),\n resultsPath\n };\n await ctx.stateStore.writeChange(changeState);\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: msg(ctx.language, \"fet test 未通过。\", \"fet test failed.\"),\n details: {\n changeId,\n exitCode: result.exitCode,\n command: planLabel,\n resultsPath: tddResultsRelativePath(changeId),\n stderr: truncate(result.stderr)\n },\n suggestedCommand: `fet test --change ${changeId}`,\n recoverable: true\n });\n }\n\n ctx.output.result({\n ok: true,\n command: \"test\",\n summary: msg(ctx.language, `change \"${changeId}\" 的单测已通过。`, `Unit tests passed for change \"${changeId}\".`),\n nextSteps: [`fet verify --change ${changeId}`],\n data: {\n changeId,\n command: planLabel,\n resultsPath: tddResultsRelativePath(changeId),\n cases: caseResults\n }\n });\n });\n}\n\nfunction manifestPath(changeId: string): string {\n return tddManifestRelativePath(changeId);\n}\n\nfunction buildTestArgs(manifest: TddManifest): string[] {\n if (!manifest || manifest.run.mode === \"workspace\") {\n return [];\n }\n const files = [...new Set(manifest.cases.map((item) => item.testFile).filter(Boolean))];\n return files.length ? [\"--\", ...files] : [];\n}\n\nasync function recordSkippedTestRun(ctx: FetCommandContext, changeId: string, planningFingerprint: string, manifestPathValue: string): Promise<void> {\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, \"implement\");\n changeState.testRun = {\n status: \"skipped\",\n ranAt: new Date().toISOString(),\n command: \"(skipped)\",\n exitCode: 0,\n planningFingerprint,\n manifestPath: manifestPathValue,\n resultsPath: null\n };\n await ctx.stateStore.writeChange(changeState);\n}\n\nfunction truncate(value: string, max = 2000): string {\n return value.length > max ? `${value.slice(0, max)}…` : value;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { renderVerifyInstructions } from \"../templates/index.js\";\nimport { assertTestPassed } from \"../tdd/gates.js\";\nimport { assertChangeExists, msg, resolveChangeId } from \"./change-id.js\";\n\nexport async function verifyCommand(ctx: FetCommandContext, options: { done?: boolean; auto?: boolean }): Promise<void> {\n if (options.auto) {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const plan = {\n schemaVersion: 1,\n packageManager: scan.project.packageManager,\n workspaces: [\n {\n name: \"root\",\n cwd: \".\",\n commands: Object.entries(scan.commands)\n .filter(([name]) => [\"lint\", \"typecheck\", \"test\"].includes(name))\n .map(([dimension, command]) => ({\n dimension,\n command: command.command,\n source: command.source,\n required: command.required,\n statusIfMissing: command.required ? \"fail\" : \"warn\"\n }))\n }\n ],\n missing: [\"lint\", \"typecheck\", \"test\"].filter((name) => !scan.commands[name])\n };\n if (ctx.yes) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.verifyAuthorization = {\n schemaVersion: 1,\n approvedAt: new Date().toISOString(),\n commandFingerprint: fingerprint(plan),\n packageManager: plan.packageManager,\n plan: plan.workspaces.flatMap((workspace) =>\n workspace.commands.map((command) => ({\n cwd: workspace.cwd,\n dimension: command.dimension,\n command: command.command,\n source: command.source,\n required: command.required\n }))\n )\n };\n await ctx.stateStore.writeGlobal(global);\n }\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: ctx.yes ? \"已确认 verify --auto 执行计划;MVP 暂不执行仓库脚本。\" : \"已生成 verify --auto 执行计划;MVP 暂不执行仓库脚本。\",\n warnings: plan.missing.map((name) => `未发现 ${name} 脚本,将在自动执行版本中按配置处理。`),\n data: plan,\n nextSteps: ctx.yes ? [\"当前版本请运行 fet verify 进入手动验证模式\"] : [\"审核执行计划\", \"确认计划后可运行 fet verify --auto --yes\", \"当前版本请运行 fet verify 进入手动验证模式\"]\n });\n return;\n }\n\n await withProjectLock(\n ctx.projectRoot,\n { command: \"verify\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n const changeId = await resolveChangeId(ctx);\n if (options.done) {\n await markDone(ctx, changeId);\n } else {\n await writeInstructions(ctx, changeId);\n }\n }\n );\n}\n\nasync function writeInstructions(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n await assertTestPassed(ctx, changeId);\n const generatedAt = new Date().toISOString();\n const dir = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\");\n const instructionsPath = join(dir, \"verify-instructions.md\");\n await mkdir(dir, { recursive: true });\n await atomicWrite(instructionsPath, renderVerifyInstructions(changeId, generatedAt));\n\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"in_progress\", updatedAt: generatedAt };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已生成手动验证指令。\",\n nextSteps: [`阅读 openspec/changes/${changeId}/.fet/verify-instructions.md`, `完成后运行 fet verify --done --change ${changeId}`]\n });\n}\n\nasync function markDone(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n await assertTestPassed(ctx, changeId);\n const declaredAt = new Date().toISOString();\n const instructionsPath = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\", \"verify-instructions.md\");\n const instructions = await readInstructions(ctx, instructionsPath, changeId);\n const instructionsGeneratedAt = readFrontMatterValue(instructions, \"generatedAt\") ?? declaredAt;\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"done\", updatedAt: declaredAt };\n state.manualVerify = {\n mode: \"manual\",\n status: \"declared_done\",\n declaredAt,\n instructionsPath: `openspec/changes/${changeId}/.fet/verify-instructions.md`,\n instructionsGeneratedAt,\n evidence: null\n };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已记录手动验证完成声明。\",\n nextSteps: [`fet sync --change ${changeId}`, `fet archive --change ${changeId}`]\n });\n}\n\nasync function readInstructions(ctx: FetCommandContext, path: string, changeId: string): Promise<string> {\n try {\n await stat(path);\n const content = await readFile(path, \"utf8\");\n const fileChangeId = readFrontMatterValue(content, \"changeId\");\n if (fileChangeId !== changeId) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(\n ctx.language,\n \"验证指令文件与当前 change 不匹配\",\n \"Verify instructions do not match the current change\"\n ),\n details: { expected: changeId, actual: fileChangeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n return content;\n } catch (error) {\n if (error instanceof FetError) {\n throw error;\n }\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: msg(ctx.language, \"验证指令文件不存在或无法读取\", \"Verify instructions file is missing or unreadable\"),\n details: { path },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n\nfunction readFrontMatterValue(content: string, key: string): string | null {\n const match = content.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n return match?.[1]?.trim() ?? null;\n}\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\n","import type { FetLanguage } from \"./language.js\";\n\nconst HIGH_COST_MODEL_PATTERNS = [\n /gpt[-_ ]?5\\.5/i,\n /glm[-_ ]?5(?:\\.1)?/i,\n /claude.*opus/i,\n /opus/i,\n /claude.*sonnet/i,\n /sonnet/i\n];\n\nconst MODEL_ENV_KEYS = [\"FET_IDE_MODEL\", \"FET_MODEL\", \"CODEX_MODEL\", \"CURSOR_MODEL\", \"OPENCODE_MODEL\", \"OPENAI_MODEL\", \"ANTHROPIC_MODEL\"];\n\nexport type ModelPolicyMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface DetectedModel {\n source: string;\n name: string;\n}\n\nexport interface ModelPolicyMismatch {\n command: string;\n detected: DetectedModel;\n recommended: \"high-cost\" | \"low-cost\";\n reason: string;\n}\n\nexport function detectCurrentModel(env: NodeJS.ProcessEnv = process.env): DetectedModel | null {\n for (const key of MODEL_ENV_KEYS) {\n const value = env[key]?.trim();\n if (value) {\n return { source: key, name: value };\n }\n }\n return null;\n}\n\nexport function isHighCostModel(model: string): boolean {\n return HIGH_COST_MODEL_PATTERNS.some((pattern) => pattern.test(model));\n}\n\nexport function getModelPolicyMode(env: NodeJS.ProcessEnv = process.env): ModelPolicyMode {\n const value = env.FET_MODEL_POLICY?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_MODEL_POLICY === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n return \"confirm\";\n}\n\nexport function getCommandModelPolicyMismatch(command: string, env: NodeJS.ProcessEnv = process.env): ModelPolicyMismatch | null {\n if (getModelPolicyMode(env) === \"off\") {\n return null;\n }\n\n const detected = detectCurrentModel(env);\n if (!detected) {\n return null;\n }\n\n const highCost = isHighCostModel(detected.name);\n if (command === \"apply\") {\n if (!highCost) {\n return {\n command,\n detected,\n recommended: \"high-cost\",\n reason: \"fet apply is the implementation phase and is recommended to use a high-capability/high-cost model.\"\n };\n }\n return null;\n }\n\n if (highCost) {\n return {\n command,\n detected,\n recommended: \"low-cost\",\n reason: `fet ${command} is not the implementation phase and is recommended to use a lower-cost model.`\n };\n }\n return null;\n}\n\nexport function formatModelPolicyMismatch(mismatch: ModelPolicyMismatch, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"Recommended models include GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet.\"\n : \"Recommended action: switch to a lower-cost model and reserve high-cost models for fet apply.\";\n return `${mismatch.reason} Detected ${mismatch.detected.source}=\"${mismatch.detected.name}\". ${switchHint}`;\n }\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"建议模型包括 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。\"\n : \"建议切换到低成本模型,把高成本模型留给 fet apply。\";\n const reason =\n mismatch.recommended === \"high-cost\"\n ? \"fet apply 属于实施阶段,建议使用高能力/高成本模型。\"\n : `fet ${mismatch.command} 不是实施阶段,建议使用低成本模型。`;\n return `${reason} 检测到 ${mismatch.detected.source}=\"${mismatch.detected.name}\"。${switchHint}`;\n}\n\nexport function renderIdeModelPolicy(command: string, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (command === \"apply\") {\n return \"Model policy: this command is recommended to run with a high-capability/high-cost model such as GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet. If the current IDE model is lower-cost, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n return \"Model policy: this command is recommended to run with a low-cost model. If the current IDE model is GPT-5.5, GLM-5.1, GLM-5, Claude Opus, Claude Sonnet, or another high-cost model, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n if (command === \"apply\") {\n return \"模型策略:该命令建议使用高能力/高成本模型运行,例如 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。若当前 IDE 模型能力较低,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n }\n\n return \"模型策略:该命令建议使用低成本模型运行。若当前 IDE 模型是 GPT-5.5、GLM-5.1、GLM-5、Claude Opus、Claude Sonnet 或其他高成本模型,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n}\n","import { resolve } from \"node:path\";\nimport { CodexAdapter, CursorAdapter } from \"../adapters/index.js\";\nimport { normalizeLanguage, type FetLanguage } from \"../language.js\";\nimport { DefaultOpenSpecAdapter } from \"../openspec/index.js\";\nimport { ProjectScanner } from \"../scanner/index.js\";\nimport { detectProjectIdentity, StateStore } from \"../state/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { OutputWriter } from \"./output.js\";\n\nexport interface GlobalOptions {\n cwd?: string;\n json?: boolean;\n verbose?: boolean;\n yes?: boolean;\n change?: string;\n lang?: string;\n}\n\nexport async function createCommandContext(command: string, options: GlobalOptions) {\n const projectRoot = resolve(options.cwd ?? process.cwd());\n const project = await detectProjectIdentity(projectRoot);\n const stateStore = new StateStore(projectRoot, FET_VERSION, project);\n const savedState = await stateStore.readGlobal();\n const language: FetLanguage = normalizeLanguage(options.lang ?? savedState?.language.current);\n const output = new OutputWriter(Boolean(options.json), language);\n\n return {\n command,\n cwd: projectRoot,\n projectRoot,\n isTty: Boolean(process.stdout.isTTY),\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n yes: Boolean(options.yes),\n changeId: options.change,\n language,\n explicitLanguage: options.lang !== undefined,\n fetVersion: FET_VERSION,\n output,\n stateStore,\n openSpec: new DefaultOpenSpecAdapter(),\n scanner: new ProjectScanner(),\n toolAdapters: [new CursorAdapter(), new CodexAdapter()]\n };\n}\n\nexport type FetCommandContext = Awaited<ReturnType<typeof createCommandContext>>;\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { codexCommandFiles, codexGuideFile, codexSlashPromptFiles } from \"./templates.js\";\n\ninterface CodexToolFile {\n path: string;\n content: string;\n managed: boolean;\n root?: \"project\" | \"codex-home\";\n}\n\nexport class CodexAdapter implements ToolAdapter {\n readonly tool = \"codex\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".codex\")) || await exists(join(projectRoot, \"AGENTS.md\")),\n reason: \"Codex adapter is available for projects that use AGENTS.md\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [\n ...[codexGuideFile(language), ...codexCommandFiles(language)].map((file) => ({\n ...file,\n managed: true,\n root: \"project\" as const\n })),\n ...codexSlashPromptFiles(language).map((file) => ({\n ...file,\n managed: true,\n root: \"codex-home\" as const\n }))\n ]\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Codex adapter file already exists and is not managed by FET\",\n details: { path: displayPath },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(displayPath);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `codex:${displayPath}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${displayPath} is missing`\n : !managed\n ? `${displayPath} exists but is not managed by FET`\n : !versionMatches\n ? `${displayPath} adapterVersion is stale`\n : `${displayPath} is managed by FET`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nfunction resolveTarget(projectRoot: string, file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return join(resolveCodexHome(), file.path);\n }\n return join(projectRoot, file.path);\n}\n\nfunction displayPathFor(file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return `$CODEX_HOME/${file.path.replaceAll(\"\\\\\", \"/\")}`;\n }\n return file.path;\n}\n\nfunction resolveCodexHome(): string {\n return process.env.FET_CODEX_HOME ?? process.env.CODEX_HOME ?? join(homedir(), \".codex\");\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","export const FET_STANDALONE_COMMANDS = [\"tdd\", \"test\"] as const;\n\nexport const FET_WORKFLOW_COMMANDS = [\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n] as const;\n\nexport type FetWorkflowCommand = (typeof FET_WORKFLOW_COMMANDS)[number];\n\nexport const FET_GRAPH_COMMANDS = [\"graph-status\", \"graph-setup\", \"graph-init\", \"graph-refresh\", \"graph-doctor\", \"graph-handoff\"] as const;\n\nexport type FetGraphCommand = (typeof FET_GRAPH_COMMANDS)[number];\n\nexport const FET_ADAPTER_COMMANDS = [...FET_WORKFLOW_COMMANDS, ...FET_STANDALONE_COMMANDS, \"update\", \"fill-context\", \"passthrough\", ...FET_GRAPH_COMMANDS] as const;\n\nexport type FetAdapterCommand = (typeof FET_ADAPTER_COMMANDS)[number];\n\nexport function renderFetAdapterUsage(command: FetAdapterCommand, args = \"[...args]\"): string {\n if (command.startsWith(\"graph-\")) {\n const subcommand = command.slice(\"graph-\".length);\n return `fet graph ${subcommand}${args ? ` ${args}` : \"\"}`;\n }\n if (command === \"passthrough\") {\n return `fet passthrough <openspec-command>${args ? ` ${args}` : \"\"}`;\n }\n return `fet ${command}${args ? ` ${args}` : \"\"}`;\n}\n","import { FET_VERSION } from \"../../version.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderCodexFigmaStopGuide } from \"../../templates/figma-guard.js\";\nimport { renderCodexUiDisplayContractGuide } from \"../../templates/ui-display-contract.js\";\nimport {\n renderCodexSpecLanguageGuide,\n renderPlanningArtifactSpecBlock,\n renderSpecArtifactGuardrail\n} from \"../../templates/spec-language.js\";\nimport { renderUiDisplayContractGuardrail } from \"../../templates/ui-display-contract.js\";\nimport { renderKarpathyGuidelinesBody } from \"../../templates/index.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function codexGuideFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n const body =\n language === \"en\"\n ? `# FET For Codex\n\n## Language\n\n${languageInstruction(language)}\n\nBefore doing FET or OpenSpec work in Codex, read:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- .codex/fet/figma-stop.md when implementing UI from Figma\n- .codex/fet/spec-language.md when writing or updating OpenSpec specs\n- openspec/changes/<change-id>/.fet/figma-apply-instructions.md before UI work when FET apply reports Figma links\n- .codex/fet/ui-display-contract.md when UI binds API data; openspec/changes/<change-id>/.fet/ui-display-contract.yaml when present\n- the active change files under openspec/changes/<change-id>/, when a change is selected\n\nIf GitNexus code graph context is available in the IDE or MCP tools, prefer it before broad repository scans. Use it to identify relevant modules, dependencies, and insertion points, then read only the concrete source files needed. If GitNexus is unavailable, continue with the normal FET/OpenSpec workflow.\n\nUse the terminal command \\`fet <command>\\` as the source of truth for workflow transitions. These files are Codex-readable guidance; they do not register native slash commands.\n\nCommand guides live in .codex/fet/commands/.\n`\n : `# Codex 的 FET 使用指南\n\n## 语言\n\n${languageInstruction(language)}\n\n在 Codex 中执行 FET 或 OpenSpec 工作前,先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- 按 Figma 实现 UI 时阅读 .codex/fet/figma-stop.md;有 figma-apply-instructions.md 时必须在改 UI 前完整执行\n- 编写或更新 spec 时阅读 .codex/fet/spec-language.md(英文规范 + 同次编辑维护中文注释)\n- 绑定接口的 UI 阅读 .codex/fet/ui-display-contract.md;存在 ui-display-contract.yaml 时实施前须确认 displayFields\n- 如果已选择 change,阅读 openspec/changes/<change-id>/ 下的当前产物\n\n如果 IDE 或 MCP 工具中可用 GitNexus 代码图上下文,先用它缩小仓库扫描范围;用图识别相关模块、依赖和插入点,再只读取需要确认行为的具体源码文件。GitNexus 不可用时,按普通 FET/OpenSpec 工作流继续。\n\n工作流流转以终端命令 \\`fet <command>\\` 为准。这些文件是给 Codex 阅读的指导,不注册原生 slash command。\n\n命令指南位于 .codex/fet/commands/。\n`;\n\n return {\n path: \".codex/fet/context.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n${body}`\n };\n}\n\nexport function codexFigmaStopFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/figma-stop.md\",\n content: renderCodexFigmaStopGuide(language)\n };\n}\n\nexport function codexSpecLanguageFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/spec-language.md\",\n content: renderCodexSpecLanguageGuide(language)\n };\n}\n\nexport function codexUiDisplayContractFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".codex/fet/ui-display-contract.md\",\n content: renderCodexUiDisplayContractGuide(language)\n };\n}\n\nexport function codexCommandFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return [\n codexKarpathyGuidelinesFile(language),\n codexFigmaStopFile(language),\n codexUiDisplayContractFile(language),\n codexSpecLanguageFile(language),\n ...FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.codex/fet/commands/${command}.md`,\n content: renderCommand(command, language)\n }))\n ];\n}\n\nexport function codexSlashPromptFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `prompts/fet-${command}.md`,\n content: renderSlashPrompt(command, language)\n }));\n}\n\nfunction codexKarpathyGuidelinesFile(language: FetLanguage): { path: string; content: string } {\n return {\n path: \".codex/fet/karpathy-guidelines.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`\n };\n}\n\nfunction renderCommand(command: FetAdapterCommand, language: FetLanguage): string {\n if (language !== \"en\") {\n return renderCommandZh(command);\n }\n if (command === \"fill-context\") {\n return renderFillContextCommand(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughCommand(language);\n }\n if (command.startsWith(\"graph-\")) {\n return renderGraphCommand(command, language);\n }\n\n const usage = renderFetAdapterUsage(command, \"\");\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run the FET ${command} workflow, first make sure the project context is loaded from AGENTS.md and openspec/config.yaml.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nIf the command needs a change id, pass it with \\`--change <change-id>\\` or use the active OpenSpec change from the user's request.\n\nAfter the command completes, report the important next steps from the FET output and keep any generated OpenSpec artifacts in the normal project workflow.\n`;\n}\n\nfunction renderCommandZh(command: FetAdapterCommand): string {\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"\");\n const title = commandTitleZh(command);\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n用于指导当前 IDE LLM 在用户确认下安装 GitNexus。\n\n先运行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n然后阅读 .fet/graph-setup.md,并以它作为安装任务书。只读检测命令可以直接运行;任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证。合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,报告失败命令、stderr 和下一步人工处理建议。\n`;\n }\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 用途\n\n${title}\n\n## 执行方式\n\n在执行前阅读 AGENTS.md、openspec/config.yaml、.codex/fet/karpathy-guidelines.md,以及当前 change 目录下已有的 OpenSpec 产物。\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n如果命令需要 change id,优先使用用户输入、\\`--change <change-id>\\`、FET active change 或唯一打开的 change。存在歧义时先询问用户。\n\n执行完成后,用中文总结关键输出、生成或更新的文件,以及下一步建议。\n`;\n}\n\nfunction renderPassthroughCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet passthrough <openspec-command>\nFET:END -->\n\n# fet passthrough\n\n${renderIdeModelPolicy(\"passthrough\", language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run an OpenSpec command that FET does not manage as a first-class workflow command, use FET passthrough instead of calling OpenSpec directly.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\nfet passthrough <openspec-command> [...args]\n\\`\\`\\`\n\nThis preserves the FET entry point while allowing access to unmanaged or newly added OpenSpec commands. Passthrough does not update FET lifecycle state.\n`;\n}\n\nfunction renderGraphCommand(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, \"\");\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nUse this command to guide IDE-assisted GitNexus installation with user approval.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nThen read .fet/graph-setup.md and follow it as the source of truth. You may run read-only detection commands directly. Before downloading software, installing globally, changing PATH, writing user-level files, or modifying IDE/MCP configuration, show the exact command and wait for user approval.\n\nAfter installation, verify \\`gitnexus --version\\`. If appropriate, continue with \\`fet graph init\\` and \\`fet graph handoff\\`. If installation fails, report the failing command, stderr, and next manual step.\n`;\n }\n const subcommand = command.slice(\"graph-\".length);\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to work with optional GitNexus graph support, use FET as the entry point.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nFor graph init or refresh, pass extra GitNexus analyze arguments only when the user provides them.\n\nAfter the command completes, report the GitNexus state, generated handoff files, and next steps.\n`;\n}\n\nfunction renderSlashPrompt(command: FetAdapterCommand, language: FetLanguage): string {\n if (command === \"ff\") {\n return renderFastForwardSlashPrompt(language);\n }\n if (language !== \"en\") {\n return renderSlashPromptZh(command);\n }\n if (command === \"propose\") {\n return renderProposeSlashPrompt(language);\n }\n if (command === \"continue\") {\n return renderContinueSlashPrompt(language);\n }\n if (command === \"explore\") {\n return renderExploreSlashPrompt(language);\n }\n if (command === \"new\") {\n return renderNewSlashPrompt(language);\n }\n if (command === \"apply\") {\n return renderApplySlashPrompt(language);\n }\n if (command === \"verify\") {\n return renderVerifySlashPrompt(language);\n }\n if (command === \"sync\") {\n return renderSyncSlashPrompt(language);\n }\n if (command === \"archive\") {\n return renderArchiveSlashPrompt(language);\n }\n if (command === \"bulk-archive\") {\n return renderBulkArchiveSlashPrompt(language);\n }\n if (command === \"onboard\") {\n return renderOnboardSlashPrompt(language);\n }\n if (command === \"fill-context\") {\n return renderFillContextSlashPrompt(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughSlashPrompt(language);\n }\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(language);\n }\n\n const usage = renderFetAdapterUsage(command);\n const isGraph = command.startsWith(\"graph-\");\n const shellCommand = isGraph ? `${renderFetAdapterUsage(command, \"\")} $ARGUMENTS` : `fet ${command} $ARGUMENTS`;\n const description = isGraph\n ? `Run optional GitNexus graph ${command.slice(\"graph-\".length)} through FET`\n : `Run the FET-managed OpenSpec ${command} workflow`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${description}\n---\n\nUse FET as the entry point for this OpenSpec workflow.\n\nBefore running the command, make sure the relevant project context is loaded from AGENTS.md and openspec/config.yaml. If a change id is needed and was not provided, infer it from the active FET/OpenSpec state when unambiguous; otherwise ask the user for the change id.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${shellCommand}\n\\`\\`\\`\n\nAfter it completes, summarize the important FET output and next steps.\n`;\n}\n\nfunction renderSlashPromptZh(command: FetAdapterCommand): string {\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(\"zh-CN\");\n }\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"[...args]\");\n const argumentHint = command === \"passthrough\" ? \"openspec-command [...args]\" : undefined;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${commandTitleZh(command)}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 目标\n\n${commandGoalZh(command)}\n\n## 步骤\n\n1. 阅读 AGENTS.md、openspec/config.yaml 和 .codex/fet/karpathy-guidelines.md。\n2. 如果存在当前 OpenSpec change,阅读 openspec/changes/<change-id>/ 下的相关产物。\n3. 运行 FET 命令:\n \\`\\`\\`sh\n ${usage}\n \\`\\`\\`\n4. 按 FET/OpenSpec 输出继续;需要写产物时,只写到 OpenSpec 指定路径,不要把提示包装文本复制进产物。\n5. 用中文总结本次动作、文件路径、状态和下一步。\n\n## 约束\n\n- 默认使用中文产出。\n- 不要绕过 FET 直接调用 openspec,除非 FET 命令本身不可用。\n- change 不明确时先询问用户。\n${command === \"fill-context\" ? \"- fet fill-context 可能已写入小程序包体积与 2MB 约束,不要覆盖该节中的扫描结果,除非仓库结构已变。\\n- 替换 AGENTS.md 中其余 [NEEDS LLM INPUT] 占位符,保留 FET 托管标记,不要修改业务代码。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? \"- 一次只创建一个 ready artifact,并在写入前阅读依赖文件。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? \"- 不要在用户审阅当前产物前自动运行 fet continue、fet ff 或循环生成后续产物;需要用户明确确认后再推进。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" || command === \"sync\" ? `${renderSpecArtifactGuardrail(\"zh-CN\")}\\n` : \"\"}${command === \"propose\" || command === \"continue\" || command === \"ff\" ? `${renderUiDisplayContractGuardrail(\"zh-CN\")}\\n` : \"\"}${command === \"apply\" ? \"- 不要在未完成真实实现前勾选 tasks.md;不要从 apply 阶段直接 sync 或 archive。\\n- 若存在 openspec/changes/<change-id>/.fet/figma-apply-instructions.md,必须先读 Figma(MCP/API)再改 UI;失败则停下问用户,禁止猜样式。\\n- 若存在 openspec/changes/<change-id>/.fet/ui-display-contract.yaml,实施绑定接口的 UI 前须确认 displayFields,禁止按 OpenAPI 全量展示。\\n\" : \"\"}`;\n}\n\nfunction commandTitleZh(command: FetAdapterCommand): string {\n const titles: Partial<Record<FetAdapterCommand, string>> = {\n explore: \"探索 FET/OpenSpec 需求\",\n propose: \"创建 FET/OpenSpec change 并生成首个规划产物\",\n new: \"创建新的 FET/OpenSpec change 骨架\",\n continue: \"推进当前 FET/OpenSpec change 的下一个产物\",\n ff: \"快速生成 FET/OpenSpec 所需产物\",\n apply: \"实施 FET/OpenSpec change 中的任务\",\n verify: \"验证 FET/OpenSpec change\",\n sync: \"同步 delta specs 到主规范\",\n archive: \"归档已验证的 FET/OpenSpec change\",\n \"bulk-archive\": \"批量归档 FET/OpenSpec changes\",\n onboard: \"加载 FET/OpenSpec 项目上下文\",\n \"fill-context\": \"填充 FET AGENTS.md 占位符\",\n passthrough: \"通过 FET 透传未接管的 OpenSpec 命令\",\n \"graph-status\": \"查看 GitNexus 代码图状态\",\n \"graph-setup\": \"生成 GitNexus 安装交接说明\",\n \"graph-init\": \"初始化 GitNexus 代码图\",\n \"graph-refresh\": \"刷新 GitNexus 代码图\",\n \"graph-doctor\": \"诊断 GitNexus 代码图\",\n \"graph-handoff\": \"生成 GitNexus 代码图使用说明\"\n };\n return titles[command] ?? `运行 FET ${command} 工作流`;\n}\n\nfunction commandGoalZh(command: FetAdapterCommand): string {\n if (command === \"fill-context\") {\n return \"补齐 FET 自动生成的项目上下文,让后续 AI 编码和 OpenSpec 工作流拥有稳定的项目事实。\";\n }\n if (command === \"propose\") {\n return \"根据 change id 或描述创建 OpenSpec change(如不存在),并只生成当前第一个 ready 的规划产物。\";\n }\n if (command === \"continue\") {\n return \"基于 active change 或用户指定的 change,创建下一个 ready 的 OpenSpec 规划产物。\";\n }\n if (command === \"ff\") {\n return \"在用户明确要求快进时,一次性生成 change 所需的全部规划产物。\";\n }\n if (command === \"apply\") {\n return \"读取 OpenSpec 产物;有 Figma 时先读稿再实施 UI;有 ui-display-contract.yaml 时只展示 displayFields,禁止按 OpenAPI 全量渲染。\";\n }\n if (command.startsWith(\"graph-\")) {\n return \"管理可选的 GitNexus 代码图,让 AI 在大范围扫描前优先获得结构化代码上下文。\";\n }\n return commandTitleZh(command);\n}\n\nfunction renderFillContextCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet fill-context\nFET:END -->\n\n# fet fill-context\n\n${renderIdeModelPolicy(\"fill-context\", language)}\n\n${languageInstruction(language)}\n\nUse this command to complete FET-generated project context placeholders with Codex.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nFirst run:\n\n\\`\\`\\`sh\nfet fill-context\n\\`\\`\\`\n\nThen read AGENTS.md and openspec/config.yaml, inspect the project, and replace every [NEEDS LLM INPUT] or [NEED LLM INPUT] placeholder in AGENTS.md with concrete project-specific content. Preserve FET managed markers and do not modify business code.\n`;\n}\n\nfunction renderFillContextSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet fill-context\",\n \"Fill FET AGENTS.md placeholders with Codex\",\n `Complete FET-generated project context placeholders.\n\nSteps:\n\n1. Refresh FET IDE handoff files:\n \\`\\`\\`sh\n fet fill-context\n \\`\\`\\`\n2. Read AGENTS.md and openspec/config.yaml.\n3. Read .codex/fet/karpathy-guidelines.md.\n4. Inspect the project to understand:\n - source structure and major modules\n - framework and routing conventions\n - scripts, test commands, and build commands\n - coding conventions and project-specific patterns\n - important docs such as README files\n5. \\`fet fill-context\\` may already fill the mini program package-size table and 2MB constraints. Do not overwrite those subsections unless the repo changed.\n6. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete, concise project-specific content.\n7. Preserve FET managed markers such as \\`FET:BEGIN AUTO\\`, \\`FET:END AUTO\\`, \\`FET:BEGIN USER\\`, and \\`FET:END USER\\`.\n8. Do not modify business code.\n9. Run:\n \\`\\`\\`sh\n fet doctor\n \\`\\`\\`\n Confirm that no AGENTS.md placeholder warning remains.\n\nGuardrails:\n- Do not invent facts that cannot be inferred from the repo.\n- Use [UNKNOWN] only when the repository does not contain enough evidence.\n- Keep generated context stable and useful for future AI coding sessions.`,\n undefined,\n language\n );\n}\n\nfunction renderNewSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet new [...args]\",\n \"Create a new FET/OpenSpec change scaffold\",\n `Create a new FET-managed OpenSpec change scaffold.\n\nInput after the slash command should be a kebab-case change id or a short description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. If no input was provided, ask what change the user wants to build or fix.\n3. Derive a kebab-case change id when the user provided a description.\n4. Create the change through FET:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Show current artifact status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n6. Get the first ready artifact instructions:\n \\`\\`\\`sh\n fet continue <first-ready-artifact-id> --change <change-id>\n \\`\\`\\`\n\nGuardrails:\n- Do not create artifact files in /prompts:fet-new.\n- If the change already exists, suggest /prompts:fet-continue <change-id>.\n- Show the change location and the next command to create the first artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderApplySlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet apply [...args]\",\n \"Implement tasks from a FET/OpenSpec change\",\n `Implement a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change, for example a change id or --change <change-id>. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Run the native OpenSpec apply flow through FET:\n \\`\\`\\`sh\n fet apply --change <change-id> --json\n \\`\\`\\`\n3. Follow the native apply output. If JSON output is unavailable, read the files referenced by the terminal output and the artifacts under openspec/changes/<change-id>/.\n4. If \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\` exists (or apply nextSteps mention Figma):\n - Read it and \\`figma-stop.md\\` in the same folder before any UI code.\n - Use Figma MCP/API to read every linked frame; briefly confirm design facts in your reply.\n - If Figma access fails or design details are unclear, stop and ask the user—do not guess styles or implement UI.\n5. If \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` exists (or apply nextSteps mention UI display contract):\n - Read it and \\`ui-field-apply-instructions.md\\` in the same folder before UI that binds API data.\n - Confirm \\`displayFields\\` from Figma; list API-only fields under \\`omittedFromUi\\`.\n - Do not render every OpenAPI property—only fields in \\`displayFields\\`.\n6. If apply is blocked because required artifacts are missing, stop and suggest /prompts:fet-continue <change-id> or /prompts:fet-ff <change-id>.\n7. Implement pending tasks one by one:\n - Keep code changes minimal and scoped to the task.\n - Follow proposal, specs, design, and tasks.\n - Mark each completed task checkbox in tasks.md from \\`- [ ]\\` to \\`- [x]\\`.\n - Pause and ask if a task is ambiguous or reveals a design conflict.\n8. After completing or pausing, summarize completed tasks, remaining tasks, and blockers.\n\nGuardrails:\n- Never skip reading OpenSpec artifacts before implementation.\n- When Figma links exist for this change, never implement or restyle UI without reading Figma first.\n- When ui-display-contract.yaml exists, API schemas are not UI checklists—only displayFields may render.\n- Do not mark a task complete until the code change is actually done.\n- Do not run sync or archive from apply.`,\n undefined,\n language\n );\n}\n\nfunction renderVerifySlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet verify [...args]\",\n \"Verify a FET/OpenSpec change before sync or archive\",\n `Verify a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous. If the user passes --done, declare verification complete only after checks have been performed or explicitly accepted by the user.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Generate FET verification instructions:\n \\`\\`\\`sh\n fet verify --change <change-id>\n \\`\\`\\`\n3. Read openspec/changes/<change-id>/.fet/verify-instructions.md.\n4. Read available artifacts for the change: proposal.md, design.md, tasks.md, and delta specs.\n5. Verify:\n - Completeness: tasks and required artifacts are present and checked off where appropriate.\n - Correctness: implementation evidence matches specs and proposal.\n - Coherence: code follows design decisions and project patterns.\n6. Report critical issues, warnings, and suggestions with file references.\n7. If there are no critical issues, or the user explicitly accepts the remaining risk, mark FET verification done:\n \\`\\`\\`sh\n fet verify --done --change <change-id>\n \\`\\`\\`\n\nGuardrails:\n- Do not run --done before producing a verification assessment.\n- Treat incomplete tasks or missing required behavior as critical unless user explicitly accepts them.\n- Suggest /prompts:fet-sync <change-id> and /prompts:fet-archive <change-id> only after verification is done.`,\n undefined,\n language\n );\n}\n\nfunction renderSyncSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet sync [...args]\",\n \"Sync delta specs and validate a FET/OpenSpec change\",\n `Sync a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Confirm FET verification is complete or run /prompts:fet-verify <change-id> first.\n3. Find delta specs under openspec/changes/<change-id>/specs/*/spec.md.\n4. If delta specs exist, intelligently merge them into openspec/specs/<capability>/spec.md:\n - Add ADDED requirements.\n - Apply MODIFIED requirements without deleting unrelated existing scenarios.\n - Remove REMOVED requirements.\n - Apply RENAMED requirements.\n - Preserve main-spec content not mentioned in the delta.\n - Follow .codex/fet/spec-language.md: keep English normative text; carry over or refresh \\`<!-- 中文:... -->\\` for every touched Requirement in the same edit.\n5. If no delta specs exist, state that there is nothing to merge.\n6. Run the FET sync gate and strict OpenSpec validation:\n \\`\\`\\`sh\n fet sync --change <change-id>\n \\`\\`\\`\n7. Summarize updated capabilities and validation result.\n\nGuardrails:\n- Read both delta and main specs before editing.\n- Make sync idempotent where possible.\n- If FET reports verify is not done, stop and run/ask for verification instead of bypassing the gate.`,\n undefined,\n language\n );\n}\n\nfunction renderArchiveSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet archive [...args]\",\n \"Archive a verified FET/OpenSpec change\",\n `Archive a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Check artifact and task status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n3. If tasks or required artifacts are incomplete, show the warning and ask whether to continue.\n4. If delta specs exist, assess whether they have been synced. If not, recommend /prompts:fet-sync <change-id> before archiving.\n5. Confirm FET verification is complete. If not, run or suggest /prompts:fet-verify <change-id>.\n6. Archive through FET:\n \\`\\`\\`sh\n fet archive --change <change-id>\n \\`\\`\\`\n7. Report archive result, sync status, and any warnings.\n\nGuardrails:\n- Do not move change directories manually; use fet archive.\n- Do not bypass the FET verify gate.\n- Ask before archiving with incomplete tasks or unsynced delta specs.`,\n undefined,\n language\n );\n}\n\nfunction renderBulkArchiveSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet bulk-archive [...args]\",\n \"Archive multiple FET/OpenSpec changes safely\",\n `Bulk archive FET-managed OpenSpec changes.\n\nSteps:\n\n1. List active changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n2. Ask the user which changes to archive. Do not auto-select.\n3. For each selected change:\n - Check artifact/task status.\n - Confirm verification is done.\n - Recommend sync if delta specs are unsynced.\n - Run \\`fet archive --change <change-id>\\`.\n4. If \\`fet bulk-archive\\` reports that the current OpenSpec version does not support a native bulk command, archive selected changes one by one through \\`fet archive --change <change-id>\\`.\n5. Summarize successes, skipped changes, and failures.\n\nGuardrails:\n- Never archive all changes without explicit user selection.\n- Do not bypass verify or warnings for individual changes.\n- Continue with remaining selected changes if one archive fails, then report the failure clearly.`,\n undefined,\n language\n );\n}\n\nfunction renderOnboardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet onboard [...args]\",\n \"Load FET/OpenSpec onboarding context\",\n `Onboard the user or Codex into the FET/OpenSpec workflow for this project.\n\nSteps:\n\n1. Read AGENTS.md and openspec/config.yaml.\n2. Run FET onboarding:\n \\`\\`\\`sh\n fet onboard\n \\`\\`\\`\n3. Summarize:\n - Project context.\n - Available active changes.\n - Core commands: new, continue, ff, apply, verify, sync, archive.\n - Where Codex prompts live.\n\nGuardrails:\n- Do not create or modify artifacts during onboard.\n- Use this command to orient the session, then suggest the next concrete FET command.`,\n undefined,\n language\n );\n}\n\nfunction renderPassthroughSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet passthrough <openspec-command> [...args]\",\n \"Run an unmanaged OpenSpec command through FET\",\n `Run an OpenSpec command that FET does not manage as a first-class workflow command.\n\nSteps:\n\n1. Identify the OpenSpec command and arguments from the user's input.\n2. Run it through FET:\n \\`\\`\\`sh\n fet passthrough <openspec-command> [...args]\n \\`\\`\\`\n3. Report the output and whether FET lifecycle state was updated.\n\nGuardrails:\n- Do not call openspec directly unless FET passthrough itself is unavailable.\n- Remember that passthrough does not update FET lifecycle state.\n- For managed workflows, prefer the specific FET prompt instead of passthrough.`,\n \"openspec-command [...args]\",\n language\n );\n}\n\nfunction renderGraphSetupSlashPrompt(language: FetLanguage): string {\n if (language === \"en\") {\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"Guide IDE-assisted GitNexus installation with user approval\",\n `Guide optional GitNexus installation for this project.\n\nSteps:\n\n1. Run:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. Read .fet/graph-setup.md and follow it as the source of truth.\n3. Run read-only detection commands as needed, such as checking the shell, PATH, package managers, and \\`gitnexus --version\\`.\n4. If GitNexus is missing, use the configured \\`FET_GITNEXUS_INSTALL_COMMAND\\` when present; otherwise find the official GitNexus installation instructions or ask the user for the preferred method.\n5. Before any command that downloads software, installs globally, changes PATH, writes user-level files, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n6. Verify installation with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, explain \\`gitnexus setup\\` and run it only after approval.\n8. Run \\`fet graph init\\` and then \\`fet graph handoff\\` when GitNexus is available.\n\nGuardrails:\n- GitNexus is optional; do not block FET/OpenSpec workflows if installation fails.\n- Do not modify application code during setup.\n- Report the failing command, stderr, and next manual step if blocked.`,\n undefined,\n language\n );\n }\n\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"指导 IDE LLM 在用户确认下安装 GitNexus\",\n `为当前项目引导可选的 GitNexus 安装。\n\n步骤:\n\n1. 运行:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. 阅读 .fet/graph-setup.md,并以它作为安装任务书。\n3. 按需运行只读检测命令,例如检查 shell、PATH、包管理器和 \\`gitnexus --version\\`。\n4. 如果 GitNexus 缺失,优先使用已配置的 \\`FET_GITNEXUS_INSTALL_COMMAND\\`;没有配置时,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n6. 用 \\`gitnexus --version\\` 验证安装。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\`,获得确认后再运行。\n8. GitNexus 可用后运行 \\`fet graph init\\`,再运行 \\`fet graph handoff\\`。\n\n约束:\n- GitNexus 是可选能力;安装失败时不要阻塞 FET/OpenSpec 主流程。\n- 安装过程中不要修改业务代码。\n- 如果受阻,报告失败命令、stderr 和下一步人工处理建议。`,\n undefined,\n language\n );\n}\n\nfunction renderExploreSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet explore [...args]\",\n \"Explore requirements for a FET/OpenSpec change\",\n `Enter exploration mode for a FET-managed OpenSpec change.\n\nUse this command for thinking and proposal shaping, not application implementation.\n\nInput after the slash command may be a change id, a feature idea, or a problem description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Check existing changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n3. If the input names an existing change, read its current artifacts under openspec/changes/<change-id>/.\n4. If the input is a new idea and the user wants to capture it, derive a kebab-case change id and create the change:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Run the native OpenSpec exploration flow through FET so clarification prompts stay interactive:\n \\`\\`\\`sh\n fet explore --change <change-id>\n \\`\\`\\`\n6. If OpenSpec or the user asks to generate or capture the proposal, create openspec/changes/<change-id>/proposal.md using the interactive answers, conversation, and project context.\n\nGuardrails:\n- Do not write application code in explore mode.\n- Ask a clarifying question if the proposal would otherwise be mostly guesswork.\n- Creating or updating OpenSpec artifacts is allowed when the user asks to capture the thinking.\n- After creating proposal.md, show the path and suggest /prompts:fet-continue <change-id> for the next artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderProposeSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet propose [...args]\",\n \"Create a FET/OpenSpec change and its first ready artifact\",\n `Start proposal planning for a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id or a short description of what the user wants to build. If omitted, ask the user.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Derive a kebab-case change id when the user provided a description. If ambiguous, ask the user.\n3. Run the native OpenSpec propose flow through FET. This creates the change when needed and returns instructions for only the next ready artifact:\n \\`\\`\\`sh\n fet propose <change-id-or-description> --json\n \\`\\`\\`\n4. Follow the native output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n5. Read dependency files before writing.\n6. Create only that artifact file at outputPath. Do not copy context/rules wrapper text into the artifact.\n - If the artifact is specs/<capability>/spec.md, follow .codex/fet/spec-language.md: English Requirements/Scenario plus \\`<!-- 中文:... -->\\` after each Requirement title; update Chinese notes in the same edit when English changes.\n7. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- Change id and location.\n- Which single artifact was created and its file path.\n- Current status.\n- Tell the user to review the artifact and run /prompts:fet-continue <change-id> when ready for the next artifact. Mention /prompts:fet-ff <change-id> only if they explicitly want to fast-forward all remaining artifacts.\n\nGuardrails:\n- Create one artifact per invocation. Do not run fet continue or fet ff in the same session unless the user explicitly asks after reviewing the artifact just created.\n- Never skip dependency order.\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderContinueSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet continue [...args]\",\n \"Create the next FET/OpenSpec artifact\",\n `Continue a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id, optionally followed by an artifact id. If omitted, use the active OpenSpec change and continue the next ready artifact.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n3. Check status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n4. Pick the first artifact whose status is ready, unless the user specified an artifact id.\n5. Run the native OpenSpec continue flow through FET:\n \\`\\`\\`sh\n fet continue [artifact-id] --change <change-id> --json\n \\`\\`\\`\n6. Follow the native continue output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n7. Read dependency files before writing.\n8. Create the artifact file at outputPath. Do not copy context/rules wrapper text into the artifact; use those fields only as constraints.\n - If the artifact is specs/<capability>/spec.md, follow .codex/fet/spec-language.md: English Requirements/Scenario plus \\`<!-- 中文:... -->\\` after each Requirement title; update Chinese notes in the same edit when English changes.\n9. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- State which artifact was created.\n- Show the file path.\n- Show the current status and what to run next.\n\nGuardrails:\n- Create one artifact per invocation.\n- Never skip dependency order.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderFastForwardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet ff [...args]\",\n language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\",\n `${language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\"}.\n\nUse this command only when the user explicitly wants to generate all remaining planning artifacts in one session without reviewing each artifact between steps. For step-by-step review, use /prompts:fet-propose or /prompts:fet-continue instead.\n\nInput after the slash command may be a change id. It may be omitted when the active OpenSpec change is unambiguous.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id. If ambiguous, ask the user.\n3. Run the native OpenSpec ff flow through FET:\n \\`\\`\\`sh\n fet ff --change <change-id>\n \\`\\`\\`\n4. Follow the native output. If it asks for clarification, ask the user rather than inventing details.\n5. If the native output includes artifact paths or templates to write, create those files and preserve OpenSpec structure.\n6. If FET reports that the OpenSpec CLI does not expose the requested command, stop immediately. Do not run \\`fet continue\\`, \\`openspec change\\`, or any alternative workflow command unless the user explicitly chooses that fallback after seeing the error.\n\nArtifact rules:\n- Follow the instruction field from OpenSpec/FET for each artifact.\n- Use template as structure, filling it with concrete project-specific content.\n- Do not copy context/rules wrapper text into artifact files.\n- For specs/<capability>/spec.md, follow .codex/fet/spec-language.md (English canonical + \\`<!-- 中文:... -->\\`; update Chinese notes in the same edit when English changes).\n- Verify each file exists after writing.\n\nOutput:\n- Change id and location.\n- Artifacts created.\n- Current status.\n- Next recommended command, usually /prompts:fet-apply <change-id>.\n\nGuardrails:\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- If OpenSpec appears outdated or incompatible, report the detected version and suggest \\`npm install -g @fission-ai/openspec@latest\\` or \\`fet doctor\\`, then wait for the user's decision.`,\n undefined,\n language\n );\n}\n\nfunction renderManagedSlashPrompt(command: string, description: string, body: string, argumentHint?: string, language: FetLanguage = DEFAULT_LANGUAGE): string {\n const policyCommand = command.split(/\\s+/)[1] ?? command;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n const graphContextInstruction =\n language === \"en\"\n ? \"If GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\"\n : \"如果 GitNexus 代码图上下文可用,先用它缩小源码扫描范围;不可用时按普通流程继续。\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${command}\nFET:END -->\n\n---\ndescription: ${description}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(policyCommand, language)}\n\n${languageInstruction(language)}\n\n${graphContextInstruction}\n\n${body}\n`;\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { cursorRuleFiles, cursorSkillFiles } from \"./templates.js\";\n\nexport class CursorAdapter implements ToolAdapter {\n readonly tool = \"cursor\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".cursor\")),\n reason: \"Cursor adapter is available for any project\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [...cursorSkillFiles(language), ...cursorRuleFiles(language)].map((file) => ({\n ...file,\n managed: true\n }))\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files) {\n const target = join(projectRoot, file.path);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Cursor 配置文件已存在,且不由 FET 管理。\",\n details: { path: file.path },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(file.path);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files) {\n const target = join(projectRoot, file.path);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `cursor:${file.path}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${file.path} 缺失`\n : !managed\n ? `${file.path} 已存在,但不由 FET 管理`\n : !versionMatches\n ? `${file.path} adapterVersion 已过期`\n : `${file.path} 已存在且版本匹配`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { FET_VERSION } from \"../../version.js\";\nimport { renderCursorFigmaStopRule } from \"../../templates/figma-guard.js\";\nimport { renderCursorUiDisplayContractRule } from \"../../templates/ui-display-contract.js\";\nimport {\n renderCursorSpecLanguageRule,\n renderPlanningArtifactSpecBlock,\n renderSpecArtifactGuardrail\n} from \"../../templates/spec-language.js\";\nimport { renderUiDisplayContractGuardrail } from \"../../templates/ui-display-contract.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function cursorFigmaStopRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-figma-stop.mdc\",\n content: renderCursorFigmaStopRule(language)\n };\n}\n\nexport function cursorSpecLanguageRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-spec-language.mdc\",\n content: renderCursorSpecLanguageRule(language)\n };\n}\n\nexport function cursorUiDisplayContractRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-ui-display-contract.mdc\",\n content: renderCursorUiDisplayContractRule(language)\n };\n}\n\nexport function cursorRuleFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return [\n cursorRuleFile(language),\n cursorFigmaStopRuleFile(language),\n cursorUiDisplayContractRuleFile(language),\n cursorSpecLanguageRuleFile(language)\n ];\n}\n\nexport function cursorSkillFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.cursor/skills/fet-${command}/SKILL.md`,\n content: renderSkill(command, language)\n }));\n}\n\nexport function cursorRuleFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n return {\n path: \".cursor/rules/fet-context.mdc\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Load FET project context for implementation tasks\" : \"为实现任务加载 FET 项目上下文\"}\nalwaysApply: false\n---\n\n${languageInstruction(language)}\n\n当用户请求修改项目、实现 OpenSpec change、运行 FET 工作流或解释项目结构时,优先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- 可用时的 GitNexus 代码图上下文。优先用它缩小范围;不可用时按普通 FET/OpenSpec 工作流继续。\n- 当前 change 目录下的 OpenSpec 规划产物。\n- 按 Figma 实现 UI 时遵守 \\`.cursor/rules/fet-figma-stop.mdc\\`;若存在 \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\` 必须在改 UI 前完整执行;同目录 \\`figma-stop.md\\` 含链接与停止规则。\n- 编写或修改 OpenSpec \\`specs/**/spec.md\\` 时遵守 \\`.cursor/rules/fet-spec-language.mdc\\`(英文规范 + \\`<!-- 中文:... -->\\`,同次编辑同步更新中文说明)。\n- 绑定接口的 UI 遵守 \\`.cursor/rules/fet-ui-display-contract.mdc\\`;存在 \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` 时实施前须确认 displayFields。\n\n如果用户输入类似 \\`/fet apply\\` 的请求,请把它视为工作流意图,并提示或执行对应的终端命令 \\`fet <cmd>\\`。\n`\n };\n}\n\nfunction renderSkill(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, command === \"passthrough\" ? \"[...args]\" : \"\");\n if (command === \"fill-context\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet fill-context\nFET:END -->\n\n---\nname: fet-fill-context\ndescription: ${language === \"en\" ? \"Fill FET AGENTS.md placeholders with Cursor AI\" : \"使用 Cursor AI 填充 FET AGENTS.md 占位符\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n如果 IDE 命令需要刷新,先运行 \\`fet fill-context\\`。\n\n然后阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n\n\\`fet fill-context\\` 可能已写入小程序包体积表与 2MB 开发约束,不要覆盖 AGENTS.md「小程序」节中的扫描结果,除非仓库结构已变。\n\n检查 README、package scripts、路由、测试、源码结构和现有约定后,把 AGENTS.md 中**其余** \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、简洁、项目相关的内容。保留 FET 托管标记,不要修改业务代码。\n`;\n }\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet graph setup\nFET:END -->\n\n---\nname: fet-graph-setup\ndescription: ${language === \"en\" ? \"Guide IDE-assisted GitNexus installation with user approval\" : \"指导 IDE LLM 在用户确认下安装 GitNexus\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n${\n language === \"en\"\n ? `Run \\`fet graph setup\\`, then read .fet/graph-setup.md and follow it as an installation playbook.\n\nYou may run read-only detection commands without extra confirmation. Before any command that downloads software, installs globally, changes PATH, writes user-level config, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n\nAfter installation, verify with \\`gitnexus --version\\`, then run \\`fet graph init\\` and \\`fet graph handoff\\` when appropriate. If installation fails, summarize the failing command and next manual step.`\n : `先运行 \\`fet graph setup\\`,再阅读 .fet/graph-setup.md,并把它作为安装任务书执行。\n\n只读检测命令可以直接运行。任何会下载软件、全局安装、修改 PATH、写入用户级配置或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证;合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,汇总失败命令和下一步人工处理建议。`\n}\n`;\n }\n\n if (command === \"apply\") {\n return renderApplySkill(usage, language);\n }\n\n if (command === \"tdd\" || command === \"test\") {\n return renderTddTestSkill(command, usage, language);\n }\n\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n return renderPlanningSkill(command, usage, language);\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-${command}\ndescription: ${language === \"en\" ? `Run FET-managed OpenSpec ${command} workflow from the terminal` : `从终端运行 FET 托管的 OpenSpec ${command} 工作流`}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n此文件采用 Cursor Skill 目录结构,提供 \\`/fet-${command}\\` 风格的工作流说明,不承诺注册 \\`/fet ${command}\\` 这种带空格的原生 slash command。\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n执行前请确认已阅读 AGENTS.md 和 openspec/config.yaml。\n`;\n}\n\nfunction renderPlanningSkill(command: FetAdapterCommand, usage: string, language: FetLanguage): string {\n const title =\n command === \"propose\"\n ? language === \"en\"\n ? \"Create OpenSpec change and first artifact\"\n : \"创建 OpenSpec change 并生成首个规划产物\"\n : command === \"ff\"\n ? language === \"en\"\n ? \"Fast-forward OpenSpec artifacts\"\n : \"快进生成 OpenSpec 规划产物\"\n : language === \"en\"\n ? \"Create next OpenSpec artifact\"\n : \"生成下一个 OpenSpec 规划产物\";\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-${command}\ndescription: ${title}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n${renderPlanningArtifactSpecBlock(language)}\n\n${renderSpecArtifactGuardrail(language)}\n\n${renderUiDisplayContractGuardrail(language)}\n\n执行前请阅读 AGENTS.md、openspec/config.yaml(含 \\`fet.specLanguage\\`)与当前 change 已有产物。\n`;\n}\n\nfunction renderApplySkill(usage: string, language: FetLanguage): string {\n const uiContractBlock =\n language === \"en\"\n ? `If \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\` exists:\n\n1. Read it and \\`ui-field-apply-instructions.md\\` in the same folder before UI that binds API data.\n2. Confirm \\`displayFields\\` from Figma; put API-only fields in \\`omittedFromUi\\`.\n3. Do not render every OpenAPI property—only contracted display fields.`\n : `若存在 \\`openspec/changes/<change-id>/.fet/ui-display-contract.yaml\\`:\n\n1. 在绑定接口的 UI 实施前阅读该文件与同目录 \\`ui-field-apply-instructions.md\\`。\n2. 按 Figma 确认 \\`displayFields\\`;仅接口有的字段放入 \\`omittedFromUi\\`。\n3. 禁止按 OpenAPI 全量展示—只渲染契约中的 displayFields。`;\n\n const figmaBlock =\n language === \"en\"\n ? `If \\`fet apply\\` output or the change has \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\`:\n\n1. Read that file and \\`figma-stop.md\\` in the same folder before any UI code.\n2. Use Figma MCP/API to read every linked frame; do not invent colors, spacing, or layout.\n3. If Figma fails or design is unclear, stop and ask the user—do not guess styles or mark UI tasks done.\n4. After design is confirmed, implement tasks from \\`tasks.md\\`.`\n : `若 \\`fet apply\\` 输出或 change 中存在 \\`openspec/changes/<change-id>/.fet/figma-apply-instructions.md\\`:\n\n1. 在改任何 UI 代码前,先阅读该文件与同目录 \\`figma-stop.md\\`。\n2. 用 Figma MCP/API 读取每个链接的画板;禁止自创颜色、间距、布局。\n3. Figma 失败或设计不清时立即停止并向用户提问,不要猜样式,不要把 UI 任务标为完成。\n4. 设计确认后,再按 \\`tasks.md\\` 实施任务。`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-apply\ndescription: ${language === \"en\" ? \"Implement OpenSpec tasks; require Figma when design links exist\" : \"实施 OpenSpec 任务;有 Figma 链接时必须先按稿实现\"}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(\"apply\", language)}\n\n${languageInstruction(language)}\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n${figmaBlock}\n\n${uiContractBlock}\n\n执行前请阅读 AGENTS.md、openspec/config.yaml 与当前 change 下的 OpenSpec 产物。\n\n实施前须已运行 \\`fet tdd\\`;存在 \\`openspec/changes/<change-id>/.fet/tdd-manifest.yaml\\` 时按清单编写测试与实现,并在 \\`fet verify\\` 前先 \\`fet test\\`。\n`;\n}\n\nfunction renderTddTestSkill(command: \"tdd\" | \"test\", usage: string, language: FetLanguage): string {\n const description =\n command === \"tdd\"\n ? language === \"en\"\n ? \"Generate per-change TDD manifest and test instructions\"\n : \"生成本 change 的 TDD 清单与测试指引\"\n : language === \"en\"\n ? \"Run unit tests scoped to the change TDD manifest\"\n : \"按 change TDD 清单运行单测\";\n\n const body =\n command === \"tdd\"\n ? language === \"en\"\n ? `After planning artifacts exist, run this before \\`fet apply\\`. It writes \\`openspec/changes/<change-id>/.fet/tdd-manifest.yaml\\`, \\`tdd-spec.md\\`, and \\`tdd-instructions.md\\`. Then create failing tests in the repo before implementation.`\n : `规划产物就绪后、\\`fet apply\\` 之前运行。会写入 \\`openspec/changes/<change-id>/.fet/tdd-manifest.yaml\\`、\\`tdd-spec.md\\`、\\`tdd-instructions.md\\`,再在仓库中编写预期失败的测试。`\n : language === \"en\"\n ? `Run after implementation. Requires a current \\`tdd-manifest.yaml\\`. Records pass/fail in FET state; \\`fet verify\\` is blocked until this passes (unless configured to skip).`\n : `实现完成后运行。需要有效的 \\`tdd-manifest.yaml\\`。结果写入 FET 状态;未通过前 \\`fet verify\\` 会被拦截(除非配置为 skip)。`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\nname: fet-${command}\ndescription: ${description}\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n请在终端中执行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n${body}\n`;\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\nimport { inspectOpenSpecChange, inspectOpenSpecProject } from \"./inspector.js\";\nimport { resolveOpenSpecExecutable } from \"./resolver.js\";\nimport { runOpenSpec } from \"./runner.js\";\nimport type {\n OpenSpecAdapter,\n OpenSpecCapabilities,\n OpenSpecChangeInspection,\n OpenSpecProjectInspection,\n OpenSpecRunOptions,\n OpenSpecRunResult\n} from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport class DefaultOpenSpecAdapter implements OpenSpecAdapter {\n private identity?: OpenSpecIdentity;\n\n async resolveExecutable(): Promise<OpenSpecIdentity> {\n this.identity ??= await resolveOpenSpecExecutable();\n return this.identity;\n }\n\n async getCapabilities(): Promise<OpenSpecCapabilities> {\n const identity = await this.resolveExecutable();\n const executable = identity.executablePath === \"npx openspec\" ? \"npx\" : identity.executablePath;\n const args = identity.executablePath === \"npx openspec\" ? [\"openspec\", \"--help\"] : [\"--help\"];\n\n try {\n const { stdout } = await execFileAsync(executable, args, { shell: process.platform === \"win32\" });\n return {\n version: identity.version,\n commands: parseCommands(stdout),\n supported: true\n };\n } catch {\n return {\n version: identity.version,\n commands: [],\n supported: false\n };\n }\n }\n\n async run(command: string, args: string[], options: OpenSpecRunOptions): Promise<OpenSpecRunResult> {\n const identity = await this.resolveExecutable();\n return runOpenSpec(identity.executablePath, command, args, options);\n }\n\n inspectProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n return inspectOpenSpecProject(projectRoot);\n }\n\n inspectChange(projectRoot: string, changeId: string): Promise<OpenSpecChangeInspection> {\n return inspectOpenSpecChange(projectRoot, changeId);\n }\n}\n\nfunction parseCommands(help: string): string[] {\n const known = [\n \"init\",\n \"update\",\n \"list\",\n \"view\",\n \"change\",\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\",\n \"spec\",\n \"config\",\n \"schema\",\n \"validate\",\n \"show\",\n \"feedback\",\n \"completion\",\n \"status\",\n \"instructions\",\n \"templates\",\n \"schemas\"\n ];\n return known.filter((command) => new RegExp(`\\\\b${escapeRegExp(command)}\\\\b`).test(help));\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OpenSpecChangeInspection, OpenSpecProjectInspection } from \"./types.js\";\n\nexport async function inspectOpenSpecProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n const openspecPath = join(projectRoot, \"openspec\");\n const changesPath = join(openspecPath, \"changes\");\n const legacyArchivePath = join(openspecPath, \"archive\");\n const changesArchivePath = join(changesPath, \"archive\");\n\n return {\n exists: await exists(openspecPath),\n changes: await listDirectories(changesPath, { exclude: [\"archive\"] }),\n archived: [...new Set([...(await listDirectories(legacyArchivePath)), ...(await listDirectories(changesArchivePath))])]\n };\n}\n\nexport async function inspectOpenSpecChange(\n projectRoot: string,\n changeId: string\n): Promise<OpenSpecChangeInspection> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const tasksPath = join(changePath, \"tasks.md\");\n const specsPath = join(changePath, \"specs\");\n\n return {\n changeId,\n exists: await exists(changePath),\n hasProposal: await exists(join(changePath, \"proposal.md\")),\n hasTasks: await exists(tasksPath),\n hasSpecs: await exists(specsPath),\n tasksPath,\n changePath\n };\n}\n\nasync function listDirectories(path: string, options: { exclude?: string[] } = {}): Promise<string[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n const excluded = new Set(options.exclude ?? []);\n return entries.filter((entry) => entry.isDirectory() && !excluded.has(entry.name)).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function resolveOpenSpecExecutable(): Promise<OpenSpecIdentity> {\n const executablePath = await findExecutable();\n const version = await readVersion(executablePath);\n return {\n executablePath,\n version,\n adapterVersion: 1\n };\n}\n\nasync function findExecutable(): Promise<string> {\n const command = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const { stdout } = await exec(command, [\"openspec\"]);\n const first = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .sort((left, right) => executablePreference(left) - executablePreference(right))\n .find(Boolean);\n if (first) {\n return first;\n }\n } catch {\n // Try npx below.\n }\n\n try {\n await exec(\"npx\", [\"openspec\", \"--version\"]);\n return \"npx openspec\";\n } catch {\n throw new FetError({\n code: ErrorCode.OpenSpecNotFound,\n message: \"OpenSpec CLI 未安装\",\n suggestedCommand: \"npm install -g @fission-ai/openspec\"\n });\n }\n}\n\nfunction executablePreference(path: string): number {\n if (process.platform === \"win32\" && path.toLowerCase().endsWith(\".cmd\")) {\n return 0;\n }\n return 1;\n}\n\nasync function readVersion(executablePath: string): Promise<string> {\n const command = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const args = executablePath === \"npx openspec\" ? [\"openspec\", \"--version\"] : [\"--version\"];\n try {\n const { stdout, stderr } = await exec(command, args);\n return stdout.trim() || stderr.trim() || \"unknown\";\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: \"无法读取 OpenSpec 版本\",\n details: { executablePath },\n cause: error\n });\n }\n}\n\nfunction exec(command: string, args: string[]) {\n return execFileAsync(command, args, { shell: process.platform === \"win32\" });\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecRunOptions, OpenSpecRunResult } from \"./types.js\";\n\nexport async function runOpenSpec(\n executablePath: string,\n command: string,\n args: string[],\n options: OpenSpecRunOptions\n): Promise<OpenSpecRunResult> {\n const spawnCommand = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const spawnArgs = executablePath === \"npx openspec\" ? [\"openspec\", command, ...args] : [command, ...args];\n\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(spawnCommand, spawnArgs, {\n cwd: options.cwd,\n stdio: options.stdio ?? \"inherit\",\n shell: process.platform === \"win32\"\n });\n\n if (child.stdout) {\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n }\n if (child.stderr) {\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n }\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec 命令启动失败\",\n details: { command, args },\n cause: error\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { ScannedRoute } from \"./types.js\";\n\nexport async function scanRoutes(projectRoot: string): Promise<ScannedRoute[]> {\n const candidates = [\"src/routes\", \"src/pages\", \"app\", \"pages\"];\n const routes: ScannedRoute[] = [];\n\n for (const candidate of candidates) {\n const root = join(projectRoot, candidate);\n if (!(await exists(root))) {\n continue;\n }\n for (const file of await listFiles(root)) {\n if (!/\\.(tsx?|jsx?|vue|svelte)$/.test(file)) {\n continue;\n }\n routes.push({\n path: inferRoutePath(relative(root, file)),\n source: relative(projectRoot, file).split(sep).join(\"/\"),\n inferred: true,\n confidence: \"medium\"\n });\n }\n }\n\n return routes.slice(0, 100);\n}\n\nfunction inferRoutePath(relativePath: string): string {\n const normalized = relativePath.split(sep).join(\"/\");\n const withoutExt = normalized.replace(/\\.(tsx?|jsx?|vue|svelte)$/, \"\");\n const withoutIndex = withoutExt.replace(/\\/index$/, \"\").replace(/^index$/, \"\");\n return `/${withoutIndex}`.replace(/\\/+/g, \"/\");\n}\n\nasync function listFiles(root: string): Promise<string[]> {\n const entries = await readdir(root, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFiles(path)));\n } else {\n files.push(path);\n }\n }\n return files;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { detectMiniprogramProject } from \"./miniprogram.js\";\nimport { detectFramework, detectLanguage, detectPackageManager, detectWorkspaces, extractCommands, readPackageJson } from \"./package.js\";\nimport { scanRoutes } from \"./routes.js\";\nimport type { ProjectScanResult, ScanOptions } from \"./types.js\";\n\nexport class ProjectScanner {\n async scan(projectRoot: string, _options: ScanOptions = {}): Promise<ProjectScanResult> {\n const pkg = await readPackageJson(projectRoot);\n const packageManager = await detectPackageManager(projectRoot, pkg);\n const framework = detectFramework(pkg);\n const workspaces = await detectWorkspaces(projectRoot, pkg);\n const language = await detectLanguage(projectRoot, pkg);\n const miniprogram = await detectMiniprogramProject(projectRoot);\n const warnings = [...packageManager.warnings];\n if (framework.name === \"unknown\") {\n warnings.push(\"未能从 package.json 识别主要框架\");\n }\n if (miniprogram.supported) {\n warnings.push(...miniprogram.warnings);\n }\n\n return {\n generatedAt: new Date().toISOString(),\n scannerVersion: 1,\n project: {\n name: pkg?.name ?? \"unknown\",\n packageManager: packageManager.manager,\n packageManagerConfidence: packageManager.confidence,\n framework,\n language,\n monorepo: workspaces.length > 0,\n workspaces\n },\n commands: extractCommands(pkg, packageManager.manager),\n routes: await scanRoutes(projectRoot),\n conventions: [],\n skippedFiles: [],\n warnings,\n miniprogram\n };\n }\n}\n\nexport type { MiniprogramDetection, MiniprogramScanResult } from \"./miniprogram.js\";\n\nexport type {\n ProjectScanResult,\n ScanOptions,\n ScannedCommand,\n ScannedConvention,\n ScannedProjectMetadata,\n ScannedRoute,\n ScannedWorkspace,\n SkippedFile\n} from \"./types.js\";\n","import type { FetLanguage } from \"../language.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface CommandResult {\n ok: true;\n command: string;\n summary: string;\n warnings?: string[];\n nextSteps?: string[];\n data?: unknown;\n}\n\nexport class OutputWriter {\n constructor(\n private readonly json: boolean,\n private readonly language: FetLanguage = \"zh-CN\"\n ) {}\n\n info(message: string, details?: unknown): void {\n if (!this.json) {\n process.stdout.write(`${message}${formatDetails(details)}\\n`);\n }\n }\n\n warn(message: string, details?: unknown): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: true, warning: message, details }, null, 2)}\\n`);\n return;\n }\n process.stderr.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${message}${formatDetails(details)}\\n`);\n }\n\n error(error: FetError): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: false, error: error.toJSON() }, null, 2)}\\n`);\n return;\n }\n\n process.stderr.write(`${this.language === \"en\" ? \"FET cannot continue\" : \"FET 无法继续\"}:${error.message}\\n`);\n if (error.details !== undefined) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Details\" : \"详情\"}:\\n${formatBlock(error.details)}\\n`);\n }\n if (error.suggestedCommand) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Suggestion\" : \"建议\"}:\\n ${error.suggestedCommand}\\n`);\n }\n }\n\n result(result: CommandResult): void {\n if (this.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`${result.summary}\\n`);\n for (const warning of result.warnings ?? []) {\n process.stdout.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${warning}\\n`);\n }\n if (result.nextSteps?.length) {\n process.stdout.write(`\\n${this.language === \"en\" ? \"Next steps\" : \"下一步\"}:\\n`);\n for (const step of result.nextSteps) {\n process.stdout.write(` ${step}\\n`);\n }\n }\n }\n}\n\nfunction formatDetails(details: unknown): string {\n if (details === undefined) {\n return \"\";\n }\n return ` ${JSON.stringify(details)}`;\n}\n\nfunction formatBlock(details: unknown): string {\n if (typeof details === \"string\") {\n return ` ${details}`;\n }\n return JSON.stringify(details, null, 2)\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { FetCommandContext } from \"./context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport {\n formatFetUpdateWarning,\n getFetUpdateCheckMode,\n rememberDismissedFetUpdate,\n resolveFetUpdateAvailability,\n shouldCheckFetUpdateForCommand,\n type FetUpdateAvailability\n} from \"../update/check.js\";\nimport { performFetUpdate } from \"../update/npm.js\";\n\nexport async function handleFetUpdateCheck(ctx: FetCommandContext): Promise<void> {\n if (!shouldCheckFetUpdateForCommand(ctx.command)) {\n return;\n }\n\n const mode = getFetUpdateCheckMode();\n if (mode === \"off\") {\n return;\n }\n\n const availability = await resolveFetUpdateAvailability(ctx.fetVersion);\n if (!availability) {\n return;\n }\n\n const warning = formatFetUpdateWarning(availability, ctx.language);\n ctx.output.warn(warning);\n\n const forceConfirm = process.env.FET_UPDATE_CHECK_FORCE_CONFIRM === \"1\";\n const interactive =\n mode === \"confirm\" && !ctx.json && !ctx.yes && (forceConfirm || (process.stdin.isTTY && process.stderr.isTTY));\n if (!interactive) {\n return;\n }\n\n const choice = await promptFetUpdateChoice(availability, ctx.language);\n if (choice === \"skip\") {\n await rememberDismissedFetUpdate(availability.latestVersion);\n return;\n }\n if (choice === \"cancel\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled before FET update.\" : \"命令已取消,未执行 FET 升级。\",\n details: availability,\n suggestedCommand: ctx.language === \"en\" ? `fet update` : \"fet update\"\n });\n }\n\n await performFetUpdate(availability.currentVersion, availability.latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? `FET updated to ${availability.latestVersion}. Rerun this command to use the new version.`\n : `FET 已升级到 ${availability.latestVersion}。请重新运行当前命令以使用新版本。`,\n details: availability,\n suggestedCommand: `fet ${ctx.command}`\n });\n}\n\nasync function promptFetUpdateChoice(\n availability: FetUpdateAvailability,\n language: FetCommandContext[\"language\"]\n): Promise<\"update\" | \"skip\" | \"cancel\"> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n language === \"en\"\n ? `Update FET now (${availability.currentVersion} -> ${availability.latestVersion})? [U]pdate / [S]kip / [C]ancel [s]: `\n : `是否现在升级 FET(${availability.currentVersion} -> ${availability.latestVersion})?[U]升级 / [S]跳过 / [C]取消 [s]: `;\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"u\" || answer === \"update\" || answer === \"升级\") {\n return \"update\";\n }\n if (answer === \"c\" || answer === \"cancel\" || answer === \"取消\") {\n return \"cancel\";\n }\n return \"skip\";\n } finally {\n rl.close();\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { FetLanguage } from \"../language.js\";\nimport { compareVersions, getFetPackageName, resolveLatestFetVersion } from \"./npm.js\";\n\nexport type FetUpdateCheckMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface FetUpdateAvailability {\n packageName: string;\n currentVersion: string;\n latestVersion: string;\n}\n\ninterface UpdateCheckCache {\n latestVersion: string;\n checkedAt: string;\n dismissedLatestVersion?: string;\n}\n\nconst DEFAULT_CACHE_TTL_MS = 6 * 60 * 60 * 1000;\n\nexport function getFetUpdateCheckMode(env: NodeJS.ProcessEnv = process.env): FetUpdateCheckMode {\n const value = env.FET_UPDATE_CHECK?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_UPDATE_CHECK === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n if (value === \"confirm\") {\n return \"confirm\";\n }\n return \"confirm\";\n}\n\nexport function shouldCheckFetUpdateForCommand(command: string): boolean {\n return command !== \"update\";\n}\n\nexport async function resolveFetUpdateAvailability(currentVersion: string): Promise<FetUpdateAvailability | null> {\n const packageName = getFetPackageName();\n const cache = await readUpdateCheckCache();\n const ttlMs = Number.parseInt(process.env.FET_UPDATE_CHECK_TTL_MS ?? \"\", 10);\n const cacheTtlMs = Number.isFinite(ttlMs) && ttlMs > 0 ? ttlMs : DEFAULT_CACHE_TTL_MS;\n\n let latestVersion = cache?.latestVersion;\n const cacheFresh = cache?.checkedAt ? Date.now() - Date.parse(cache.checkedAt) < cacheTtlMs : false;\n\n if (!latestVersion || !cacheFresh) {\n try {\n latestVersion = await resolveLatestFetVersion(packageName);\n await writeUpdateCheckCache({\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: cache?.dismissedLatestVersion\n });\n } catch {\n if (cache?.latestVersion) {\n latestVersion = cache.latestVersion;\n } else {\n return null;\n }\n }\n }\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n return null;\n }\n\n if (cache?.dismissedLatestVersion === latestVersion) {\n return null;\n }\n\n return {\n packageName,\n currentVersion,\n latestVersion\n };\n}\n\nexport async function rememberDismissedFetUpdate(latestVersion: string): Promise<void> {\n const cache = (await readUpdateCheckCache()) ?? {\n latestVersion,\n checkedAt: new Date().toISOString()\n };\n await writeUpdateCheckCache({\n ...cache,\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: latestVersion\n });\n}\n\nexport function formatFetUpdateWarning(availability: FetUpdateAvailability, language: FetLanguage): string {\n if (language === \"en\") {\n return `A newer FET release is available (${availability.currentVersion} -> ${availability.latestVersion}). Run \\`fet update\\` or choose update when prompted.`;\n }\n return `检测到 FET 有新版本(当前 ${availability.currentVersion},最新 ${availability.latestVersion})。可运行 \\`fet update\\`,或在提示时选择升级。`;\n}\n\nfunction cachePath(): string {\n const home = process.env.FET_UPDATE_CHECK_CACHE_HOME?.trim() || homedir();\n return join(home, \".fet\", \"update-check-cache.json\");\n}\n\nasync function readUpdateCheckCache(): Promise<UpdateCheckCache | null> {\n try {\n const raw = await readFile(cachePath(), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<UpdateCheckCache>;\n if (typeof parsed.latestVersion !== \"string\" || typeof parsed.checkedAt !== \"string\") {\n return null;\n }\n return {\n latestVersion: parsed.latestVersion,\n checkedAt: parsed.checkedAt,\n dismissedLatestVersion: typeof parsed.dismissedLatestVersion === \"string\" ? parsed.dismissedLatestVersion : undefined\n };\n } catch {\n return null;\n }\n}\n\nasync function writeUpdateCheckCache(cache: UpdateCheckCache): Promise<void> {\n const path = cachePath();\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(cache, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":"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","names":["createInterface","stat","join","count","dirname","join","dirname","join","mkdir","open","readFile","join","mkdir","dirname","open","readFile","join","readFile","join","stat","join","relative","graph","join","count","stat","mkdir","dirname","join","readFile","join","readFile","stat","join","readFile","stat","join","locks","exists","join","exists","readFile","stat","formatBytes","join","readFile","join","mkdir","dirname","mkdir","dirname","join","mkdir","readdir","readFile","dirname","join","join","graph","mkdir","dirname","readdir","readFile","join","graph","firstLine","mkdir","dirname","stat","join","readFile","join","readFile","dirname","join","parse","manifestPath","stringify","stringify","join","readOptional","readFile","exists","join","stat","readFile","join","readdir","readFile","stat","join","relative","parseDocument","readFile","join","parseDocument","readOptional","relative","readdir","stat","existsSync","readdir","readFile","stat","join","relative","parse","parseDocument","DEFAULT_CONFIG","readFile","join","parseDocument","readOptional","listMarkdownFiles","relative","existsSync","parse","walk","readdir","stat","readFile","join","parseDocument","DEFAULT_CONFIG","readdir","readFile","stat","join","relative","exists","mkdir","readFile","stat","dirname","join","parse","stringify","join","stat","parse","readFile","relative","join","mkdir","dirname","stringify","fingerprint","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","toKebabId","join","readOptional","readFile","resolve","mkdir","join","readFile","join","readFile","join","testCommand","manifestPath","join","mkdir","spawn","resolve","testCommand","createHash","mkdir","readFile","stat","join","join","mkdir","stat","readFile","createHash","switchHint","mkdir","readFile","stat","dirname","join","exists","join","mkdir","dirname","readFile","stat","mkdir","readFile","stat","dirname","join","exists","join","readExisting","mkdir","dirname","readFile","stat","execFile","promisify","readdir","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","spawn","resolve","spawn","execFileAsync","promisify","execFile","readdir","stat","join","relative","exists","createInterface","mkdir","readFile","homedir","dirname","join","homedir","join","readFile","mkdir","dirname","createInterface","createInterface","count"]}
|