@nick848/fet 1.0.5 → 1.0.7
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 +83 -183
- package/README_en.md +196 -0
- package/dist/cli/index.js +1447 -900
- package/dist/cli/index.js.map +1 -1
- package/package.json +4 -2
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/init.ts","../../src/fs/atomic-write.ts","../../src/fs/backup.ts","../../src/fs/lock.ts","../../src/fs/journal.ts","../../src/gitnexus.ts","../../src/version.ts","../../src/templates/markers.ts","../../src/templates/agents-md.ts","../../src/templates/config-yaml.ts","../../src/templates/verify-instructions.ts","../../src/templates/gitignore.ts","../../src/commands/update-context.ts","../../src/config/yaml.ts","../../src/context-placeholders.ts","../../src/commands/doctor.ts","../../src/commands/fill-context.ts","../../src/commands/graph.ts","../../src/commands/proxy.ts","../../src/state/project.ts","../../src/state/store.ts","../../src/state/schema.ts","../../src/state/tasks.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/package.ts","../../src/scanner/routes.ts","../../src/scanner/index.ts","../../src/cli/output.ts"],"sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { initCommand } from \"../commands/init.js\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { fillContextCommand } from \"../commands/fill-context.js\";\nimport { graphCommand, type GraphAction } from \"../commands/graph.js\";\nimport { proxyCommand, passthroughCommand } from \"../commands/proxy.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 } from \"../errors/fet-error.js\";\nimport { toFetError } from \"../errors/fet-error.js\";\nimport { formatModelPolicyMismatch, getCommandModelPolicyMismatch } from \"../model-policy.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { createCommandContext, type GlobalOptions } from \"./context.js\";\nimport { OutputWriter } from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"fet\")\n .description(\"Frontend workflow orchestration tool built around OpenSpec.\")\n .enablePositionalOptions()\n .version(FET_VERSION)\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\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-context\")).description(\"更新项目上下文\").action(wrap(\"update-context\", updateContextCommand));\naddGlobalOptions(program.command(\"fill-context\")).description(\"Refresh IDE prompts for filling AGENTS.md placeholders\").action(wrap(\"fill-context\", fillContextCommand));\n\nconst graph = addGlobalOptions(program.command(\"graph\").description(\"Manage optional GitNexus code graph support\"));\nfor (const action of [\"status\", \"setup\", \"doctor\", \"handoff\"] as const) {\n addGlobalOptions(graph.command(action).description(`Run fet graph ${action}`)).action(wrap(\"graph\", (ctx) => graphCommand(ctx, action)));\n}\nfor (const action of [\"init\", \"refresh\"] as const) {\n addGlobalOptions(graph\n .command(`${action} [args...]`)\n .description(`Run GitNexus analyze for graph ${action}`)\n .allowUnknownOption(true)\n .passThroughOptions())\n .action(wrap(\"graph\", (ctx, args: string[] = []) => graphCommand(ctx, action as GraphAction, args)));\n}\naddGlobalOptions(program\n .command(\"doctor\")\n .description(\"诊断状态、配置与一致性\")\n .option(\"--fix-lock\", \"清理 FET 锁文件\"))\n .action(\n wrap(\"doctor\", (ctx, options: { fixLock?: boolean }) => doctorCommand(ctx, { fixLock: Boolean(options.fixLock) }))\n );\n\naddGlobalOptions(program\n .command(\"verify\")\n .description(\"最终质量验证\")\n .option(\"--done\", \"声明手动验证已完成\")\n .option(\"--auto\", \"生成或执行自动验证计划\"))\n .action(wrap(\"verify\", verifyCommand));\n\nfor (const command of [\"explore\", \"propose\", \"new\", \"continue\", \"ff\", \"apply\", \"sync\", \"archive\", \"bulk-archive\", \"onboard\"]) {\n addGlobalOptions(program\n .command(`${command} [args...]`)\n .description(`代理执行 openspec ${command}`)\n .allowUnknownOption(true)\n .passThroughOptions())\n .action(wrap(command, (ctx, args: string[] = []) => proxyCommand(ctx, command, args)));\n}\n\naddGlobalOptions(program\n .command(\"passthrough <command> [args...]\")\n .description(\"透传暂未接管的 OpenSpec 命令\")\n .allowUnknownOption(true)\n .passThroughOptions())\n .action(wrap(\"passthrough\", (ctx, command: string, args: string[] = []) => passthroughCommand(ctx, command, args)));\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 confirmModelPolicyRecommendation(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 confirmModelPolicyRecommendation(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);\n ctx.output.warn(`${warning} You can stop now to switch models, or continue this command.`);\n\n if (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 answer = (await rl.question(\"Continue anyway? [y/N] \")).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: \"Command cancelled so you can switch IDE model.\",\n details: { command: ctx.command, detected: mismatch.detected, recommended: mismatch.recommended },\n suggestedCommand: `Switch IDE model, then rerun fet ${ctx.command}.`\n });\n }\n } finally {\n rl.close();\n }\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"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));\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(\"--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 === \"--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 { atomicWrite, createInitJournal, withProjectLock, writeInitJournal } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, renderGitNexusRecommendation, toGitNexusState } from \"../gitnexus.js\";\nimport { mergeGitignore } from \"../templates/index.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(\n ctx.projectRoot,\n { command: \"init\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n 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 await ensureGitignore(ctx);\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openspec = identity;\n state.graph ??= {};\n const gitnexus = mergeGitNexusGraphInfo(\n toGitNexusState(await detectGitNexus(), state.graph.gitnexus),\n await inspectGitNexusGraph(ctx.projectRoot)\n );\n if (!gitnexus.installed && !gitnexus.recommendationShownAt) {\n warnings.push(renderGitNexusRecommendation(gitnexus));\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);\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\n ctx.output.result({\n ok: true,\n command: \"init\",\n summary: \"FET 初始化完成。\",\n warnings,\n nextSteps: [\"使用 fet propose/new 创建 OpenSpec change\", \"使用 fet doctor 检查项目状态\"]\n });\n}\n\nasync function ensureGitignore(ctx: FetCommandContext): Promise<void> {\n const gitignorePath = join(ctx.projectRoot, \".gitignore\");\n const existing = await readOptional(gitignorePath);\n await atomicWrite(gitignorePath, mergeGitignore(existing));\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\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 { 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\";\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}\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 };\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): string {\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\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\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 return { file, 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 { 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) => [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(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\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 { AUTO_BEGIN, AUTO_END, USER_BEGIN, USER_END } from \"./markers.js\";\n\nexport function renderAgentsMd(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## 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\";\n\nexport function renderFetConfig(scan: ProjectScanResult): string {\n return stringify({\n fet: {\n schemaVersion: 1,\n generatedAt: scan.generatedAt,\n fetVersion: FET_VERSION,\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 }\n });\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","const BEGIN = \"# FET:BEGIN LOCAL STATE\";\nconst END = \"# FET:END LOCAL STATE\";\n\nconst RULES = [\n \"openspec/fet-state.json\",\n \"openspec/.fet.lock\",\n \"openspec/.fet-init-journal.json\",\n \"openspec/changes/*/fet-state.json\",\n \"openspec/changes/*/.fet/\",\n \".gitnexus/\"\n];\n\nexport function mergeGitignore(existing: string | null): string {\n const block = `${BEGIN}\\n${RULES.join(\"\\n\")}\\n${END}`;\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","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { mergeFetConfig } from \"../config/index.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { atomicWrite, createBackup, withProjectLock } from \"../fs/index.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { hasInvalidManagedAutoRegion, hasManagedAutoRegion, renderAgentsMd, renderFetConfig, replaceManagedRegion } from \"../templates/index.js\";\nimport type { FetCommandContext } from \"../cli/context.js\";\n\nexport async function updateContextCommand(ctx: FetCommandContext): Promise<void> {\n let contextResult: { warnings: string[] } = { warnings: [] };\n await withProjectLock(\n ctx.projectRoot,\n { command: \"update-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n contextResult = await updateContextFiles(ctx);\n }\n );\n\n ctx.output.result({\n ok: true,\n command: \"update-context\",\n summary: \"已更新 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\n const existingAgents = await readOptional(agentsPath);\n const warnings = [...scan.warnings];\n if (existingAgents && hasInvalidManagedAutoRegion(existingAgents)) {\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: \"AGENTS.md 的 FET 托管标记损坏或重复\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand: \"手动修复 FET:BEGIN AUTO / FET:END AUTO 标记后重试\"\n });\n }\n if (existingAgents && !hasManagedAutoRegion(existingAgents)) {\n if (!ctx.yes) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"AGENTS.md 已存在且不包含 FET 托管区域\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.command === \"init\"\n ? \"确认可备份并替换后运行 fet init --yes\"\n : \"确认可备份并替换后运行 fet update-context --yes\"\n });\n }\n const backupPath = await createBackup(agentsPath);\n if (backupPath) {\n warnings.push(`已备份非托管 AGENTS.md 到 ${backupPath}`);\n }\n }\n await atomicWrite(agentsPath, replaceManagedRegion(existingAgents, renderAgentsMd(scan)));\n await atomicWrite(configPath, await mergeFetConfig(configPath, renderFetConfig(scan)));\n const placeholderCount = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (placeholderCount > 0) {\n warnings.push(renderAgentsPlaceholderWarning(placeholderCount));\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 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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\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): string {\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","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.projectRoot));\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: `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: \"Optional GitNexus code graph support is not installed\",\n suggestedCommand: \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\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(projectRoot: string): Promise<DoctorCheck> {\n try {\n await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n const count = await countAgentsLlmPlaceholders(projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: `AGENTS.md has ${count} LLM placeholder(s)`,\n suggestedCommand: \"fet fill-context\"\n }\n : { id: \"context-placeholders\", status: \"pass\", message: \"AGENTS.md placeholders resolved\" };\n } catch {\n return { id: \"context-placeholders\", status: \"warn\", message: \"AGENTS.md missing\", suggestedCommand: \"fet update-context\" };\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 { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\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\";\n\nexport async function fillContextCommand(ctx: FetCommandContext): Promise<void> {\n await withProjectLock(\n ctx.projectRoot,\n { command: \"fill-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n const handoffPath = join(ctx.projectRoot, \".fet\", \"fill-context.md\");\n await mkdir(dirname(handoffPath), { recursive: true });\n await atomicWrite(handoffPath, renderGenericHandoff());\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot);\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(`Updated ${adapter.tool} adapter`, { written: result.written });\n }\n }\n }\n );\n\n const placeholders = await countAgentsLlmPlaceholders(ctx.projectRoot);\n ctx.output.result({\n ok: true,\n command: \"fill-context\",\n summary: placeholders\n ? `Found ${placeholders} AGENTS.md placeholder(s). Use your IDE AI to fill them.`\n : \"No AGENTS.md placeholders found. IDE fill-context commands were refreshed.\",\n nextSteps: 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 data: {\n placeholders,\n cursorCommand: \"/fet-fill-context\",\n codexCommand: \"/prompts:fet-fill-context\"\n }\n });\n}\n\nfunction renderGenericHandoff(): string {\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. Inspect README files, package scripts, routes, tests, source layout, and project conventions.\n3. Replace every \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content.\n4. Preserve FET managed markers.\n5. Do not modify business code.\n6. Run \\`fet doctor\\` and confirm no AGENTS.md placeholder warning remains.\n`;\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 {\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 ? [] : [\"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary: 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 warnings,\n nextSteps: result.state.installed && !result.state.graphExists ? [\"Run fet graph init to build the first GitNexus graph\"] : 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 ? [\"GitNexus is not installed.\"] : []),\n ...(result.state.installed && !result.state.graphExists ? [\"GitNexus is installed but no graph directory was found.\"] : []),\n ...(!result.state.handoffPath ? [\"Graph handoff instructions have not been generated.\"] : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary: warnings.length ? `Graph doctor completed with ${warnings.length} warning(s).` : \"Graph doctor completed without warnings.\",\n warnings,\n nextSteps: warnings.length ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"] : 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 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));\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: \"GitNexus setup handoff generated.\",\n warnings: result.state.installed ? [] : [\"GitNexus is not installed. The handoff explains installation and IDE-assisted setup options.\"],\n nextSteps: result.state.installed ? [\"Run gitnexus setup if you want to configure IDE/MCP integrations\", \"Run fet graph init\"] : [\"Open .fet/graph-setup.md in your IDE AI\"],\n data: {\n path: \".fet/graph-setup.md\",\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));\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: \"GitNexus graph usage handoff generated.\",\n warnings: result.state.installed ? [] : [\"GitNexus is not installed. The handoff still documents the fallback behavior.\"],\n nextSteps: [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"],\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: \"GitNexus is not installed or is not available on 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: \"GitNexus analyze failed.\",\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 global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary: mode === \"init\" ? \"GitNexus graph initialized.\" : \"GitNexus graph refreshed.\",\n warnings: result.state.graphExists ? [] : [\"GitNexus analyze completed, but the configured graph directory was not found.\"],\n nextSteps: [\"Run fet graph status\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"],\n data: {\n gitnexus: global.graph.gitnexus,\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(state: GitNexusState): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET Graph Setup\n\nGitNexus graph support is optional. FET does not install GitNexus automatically and does not require graph support for OpenSpec workflows.\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\nSuggested setup flow:\n\n1. If GitNexus is not installed, install it using the method recommended by the GitNexus project.\n2. If you want GitNexus MCP or IDE integration, run \\`gitnexus setup\\` yourself after reviewing what it changes.\n3. Return to this project and run \\`fet graph init\\` to build the first graph.\n4. Run \\`fet graph handoff\\` so IDE AI 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 run global IDE configuration commands unless the user explicitly approves them.\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState): string {\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\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\nimport type { FetCommandContext } from \"../cli/context.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 const openSpecArgs = stripFetOptions(args);\n await withProjectLock(\n ctx.projectRoot,\n { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? null) : (ctx.changeId ?? null);\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} 执行失败`,\n details: result,\n recoverable: true\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 {\n 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 }\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\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} 完成。`\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 block = `updateTime: ${entry.updateTime}\\n更新内容:${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 || \"未提供变更需求\";\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} 执行失败`,\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(\n ctx: FetCommandContext,\n command: string,\n args: string[]\n): Promise<{ command: string; args: string[] }> {\n switch (command) {\n case \"propose\":\n case \"continue\":\n case \"ff\":\n case \"apply\":\n case \"sync\":\n case \"bulk-archive\":\n case \"explore\":\n case \"onboard\":\n return { command, args: withGlobalChange(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 /*\n case \"bulk-archive\":\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"OpenSpec 1.2.0 不提供 bulk-archive 顶层命令\",\n suggestedCommand: \"逐个执行 fet archive --change <change-id>\"\n });\n case \"explore\":\n return { command: \"explore\", args: ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args };\n case \"onboard\":\n return { command: \"instructions\", args: [] };\n */\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 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: \"该命令需要明确的 change\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"添加 --change <change-id>\"\n });\n}\n\nfunction withoutUndefined(values: string[]): string[] {\n return values.filter(Boolean);\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: \"未指定 change,无法检查 verify 状态\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\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: \"指定的 change 不存在或已归档\",\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: \"当前 change 尚未通过 FET verify\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\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","import { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.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 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(\n phases.map((item) => [item, { status: item === phase ? \"in_progress\" : \"not_started\" }])\n ) 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 (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 { 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","const 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 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 getCommandModelPolicyMismatch(command: string, env: NodeJS.ProcessEnv = process.env): ModelPolicyMismatch | null {\n if (env.FET_MODEL_POLICY === \"off\" || env.FET_SKIP_MODEL_POLICY === \"1\") {\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): string {\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\nexport function renderIdeModelPolicy(command: string): string {\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.\";\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.\";\n}\n","import { resolve } from \"node:path\";\nimport { CodexAdapter, CursorAdapter } from \"../adapters/index.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}\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 output = new OutputWriter(Boolean(options.json));\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 fetVersion: FET_VERSION,\n output,\n stateStore: new StateStore(projectRoot, FET_VERSION, project),\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 { 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): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [\n ...[codexGuideFile(), ...codexCommandFiles()].map((file) => ({\n ...file,\n managed: true,\n root: \"project\" as const\n })),\n ...codexSlashPromptFiles().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, \"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 { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function codexGuideFile(): { path: string; content: string } {\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# FET For Codex\n\nBefore doing FET or OpenSpec work in Codex, read:\n\n- AGENTS.md\n- openspec/config.yaml\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 };\n}\n\nexport function codexCommandFiles(): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.codex/fet/commands/${command}.md`,\n content: renderCommand(command)\n }));\n}\n\nexport function codexSlashPromptFiles(): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `prompts/fet-${command}.md`,\n content: renderSlashPrompt(command)\n }));\n}\n\nfunction renderCommand(command: FetAdapterCommand): string {\n if (command === \"fill-context\") {\n return renderFillContextCommand();\n }\n if (command === \"passthrough\") {\n return renderPassthroughCommand();\n }\n if (command.startsWith(\"graph-\")) {\n return renderGraphCommand(command);\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)}\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\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 renderPassthroughCommand(): 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\")}\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\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): string {\n const usage = renderFetAdapterUsage(command, \"\");\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)}\n\nWhen the user asks Codex to work with optional GitNexus graph support, use FET as the entry point.\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): string {\n if (command === \"continue\") {\n return renderContinueSlashPrompt();\n }\n if (command === \"ff\" || command === \"propose\") {\n return renderFastForwardSlashPrompt(command);\n }\n if (command === \"explore\") {\n return renderExploreSlashPrompt();\n }\n if (command === \"new\") {\n return renderNewSlashPrompt();\n }\n if (command === \"apply\") {\n return renderApplySlashPrompt();\n }\n if (command === \"verify\") {\n return renderVerifySlashPrompt();\n }\n if (command === \"sync\") {\n return renderSyncSlashPrompt();\n }\n if (command === \"archive\") {\n return renderArchiveSlashPrompt();\n }\n if (command === \"bulk-archive\") {\n return renderBulkArchiveSlashPrompt();\n }\n if (command === \"onboard\") {\n return renderOnboardSlashPrompt();\n }\n if (command === \"fill-context\") {\n return renderFillContextSlashPrompt();\n }\n if (command === \"passthrough\") {\n return renderPassthroughSlashPrompt();\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}\nargument-hint: command arguments\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\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 renderFillContextCommand(): 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\")}\n\nUse this command to complete FET-generated project context placeholders with Codex.\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(): 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. 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\n4. Replace every \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete, concise project-specific content.\n5. Preserve FET managed markers such as \\`FET:BEGIN AUTO\\`, \\`FET:END AUTO\\`, \\`FET:BEGIN USER\\`, and \\`FET:END USER\\`.\n6. Do not modify business code.\n7. 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 );\n}\n\nfunction renderNewSlashPrompt(): 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 );\n}\n\nfunction renderApplySlashPrompt(): 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 should identify the change, for example a change id or --change <change-id>.\n\nSteps:\n\n1. Resolve the change id. 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 apply is blocked because required artifacts are missing, stop and suggest /prompts:fet-continue <change-id> or /prompts:fet-ff <change-id>.\n5. 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.\n6. After completing or pausing, summarize completed tasks, remaining tasks, and blockers.\n\nGuardrails:\n- Never skip reading OpenSpec artifacts before implementation.\n- Do not mark a task complete until the code change is actually done.\n- Do not run sync or archive from apply.`\n );\n}\n\nfunction renderVerifySlashPrompt(): 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 should identify the change. 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. 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 );\n}\n\nfunction renderSyncSlashPrompt(): 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 should identify the change.\n\nSteps:\n\n1. Resolve the change id. 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.\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 );\n}\n\nfunction renderArchiveSlashPrompt(): 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 should identify the change.\n\nSteps:\n\n1. Resolve the change id. 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 );\n}\n\nfunction renderBulkArchiveSlashPrompt(): 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 );\n}\n\nfunction renderOnboardSlashPrompt(): 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 $ARGUMENTS\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 );\n}\n\nfunction renderPassthroughSlashPrompt(): 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 );\n}\n\nfunction renderExploreSlashPrompt(): 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 );\n}\n\nfunction renderContinueSlashPrompt(): 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 should be a change id, optionally followed by an artifact id.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id. If it is missing and cannot be inferred unambiguously, 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.\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 );\n}\n\nfunction renderFastForwardSlashPrompt(command: \"ff\" | \"propose\"): string {\n const title = command === \"propose\" ? \"Propose a new FET/OpenSpec change\" : \"Fast-forward FET/OpenSpec artifact creation\";\n const commandLine = command === \"propose\" ? \"fet propose <change-id-or-description>\" : \"fet ff --change <change-id>\";\n return renderManagedSlashPrompt(\n `fet ${command} [...args]`,\n command === \"propose\" ? \"Create a change and generate required OpenSpec artifacts\" : \"Generate required OpenSpec artifacts for a change\",\n `${title}.\n\nInput after the slash command may be a change id or a description of what the user wants to build.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id or description. If ambiguous, ask the user.\n3. Run the native OpenSpec ${command} flow through FET:\n \\`\\`\\`sh\n ${commandLine}\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 only those files and preserve OpenSpec structure.\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- 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 );\n}\n\nfunction renderManagedSlashPrompt(command: string, description: string, body: string): string {\n const policyCommand = command.split(/\\s+/)[1] ?? command;\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${command}\nFET:END -->\n\n---\ndescription: ${description}\nargument-hint: command arguments\n---\n\n${renderIdeModelPolicy(policyCommand)}\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\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 { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { cursorRuleFile, 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): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [...cursorSkillFiles(), cursorRuleFile()].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 { FET_VERSION } from \"../../version.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function cursorSkillFiles(): Array<{ path: string; content: string }> {\n return FET_ADAPTER_COMMANDS.map((command) => ({\n path: `.cursor/skills/fet-${command}/SKILL.md`,\n content: renderSkill(command)\n }));\n}\n\nexport function cursorRuleFile(): { 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: Load FET project context for implementation tasks\nalwaysApply: false\n---\n\n当用户请求修改项目、实现 OpenSpec change、运行 FET 工作流或解释项目结构时,优先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- GitNexus code graph context, when available. Prefer it before broad repository scans; if it is unavailable, continue normally.\n- 当前 change 目录下的 OpenSpec 规划产物\n\n如果用户输入类似 \\`/fet apply\\` 的请求,Cursor 当前版本未必会把本文件注册为原生 slash command。此时请把它当作工作流意图,并提示用户在终端执行对应的 \\`fet <cmd>\\` 命令。\n`\n };\n}\n\nfunction renderSkill(command: FetAdapterCommand): 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: Fill FET AGENTS.md placeholders with Cursor AI\ndisable-model-invocation: false\n---\n\nRun \\`fet fill-context\\` first if the IDE commands need refreshing.\n\n${renderIdeModelPolicy(command)}\n\nIf GitNexus code graph context is available in Cursor, prefer it before broad repository scans. If it is unavailable, continue normally.\n\nThen read:\n\n- AGENTS.md\n- openspec/config.yaml\n\nReplace every \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content. Inspect README files, package scripts, routes, tests, source layout, and existing conventions before writing. Preserve FET managed markers and do not modify business code.\n`;\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: Run FET-managed OpenSpec ${command} workflow from the terminal\ndisable-model-invocation: true\n---\n\n${renderIdeModelPolicy(command)}\n\nIf GitNexus code graph context is available in Cursor, prefer it before broad repository scans. If it is unavailable, continue normally.\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","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 \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n ];\n return known.filter((command) => help.includes(command));\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 .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\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 { 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 { 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 { 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 warnings = [...packageManager.warnings];\n if (framework.name === \"unknown\") {\n warnings.push(\"未能从 package.json 识别主要框架\");\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 };\n }\n}\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 { 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(private readonly json: boolean) {}\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 if (!this.json) {\n process.stderr.write(`警告:${message}${formatDetails(details)}\\n`);\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(`FET 无法继续:${error.message}\\n`);\n if (error.details !== undefined) {\n process.stderr.write(`\\n详情:\\n${formatBlock(error.details)}\\n`);\n }\n if (error.suggestedCommand) {\n process.stderr.write(`\\n建议:\\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(`警告:${warning}\\n`);\n }\n if (result.nextSteps?.length) {\n process.stdout.write(\"\\n下一步:\\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"],"mappings":"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","names":["readFile","stat","join","dirname","dirname","join","mkdir","open","join","mkdir","dirname","open","join","readFile","join","stat","join","relative","graph","dirname","join","readFile","join","readFile","readFile","join","count","join","readFile","join","readOptional","readFile","stat","readFile","stat","join","join","exists","readFile","count","stat","mkdir","dirname","join","join","mkdir","dirname","mkdir","dirname","join","join","graph","mkdir","dirname","readFile","join","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","join","readOptional","readFile","mkdir","readFile","stat","join","join","mkdir","stat","readFile","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","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","resolve","execFileAsync","promisify","execFile","readFile","stat","join","parse","locks","exists","readdir","stat","join","exists","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/commands/graph.ts","../../src/commands/init.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/gitignore.ts","../../src/commands/update-context.ts","../../src/config/yaml.ts","../../src/commands/proxy.ts","../../src/state/project.ts","../../src/state/store.ts","../../src/language.ts","../../src/state/schema.ts","../../src/state/tasks.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/package.ts","../../src/scanner/routes.ts","../../src/scanner/index.ts","../../src/cli/output.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 { 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\";\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-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 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; the command will continue. Set FET_MODEL_POLICY=confirm if you want an explicit stop/continue prompt.\"\n : \"该提醒仅作为建议,命令会继续执行。如需显式选择停止或继续,可设置 FET_MODEL_POLICY=confirm。\";\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"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.projectRoot));\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: `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: \"Optional GitNexus code graph support is not installed\",\n suggestedCommand: \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\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(projectRoot: string): Promise<DoctorCheck> {\n try {\n await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n const count = await countAgentsLlmPlaceholders(projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: `AGENTS.md has ${count} LLM placeholder(s)`,\n suggestedCommand: \"fet fill-context\"\n }\n : { id: \"context-placeholders\", status: \"pass\", message: \"AGENTS.md placeholders resolved\" };\n } catch {\n return { id: \"context-placeholders\", status: \"warn\", message: \"AGENTS.md missing\", suggestedCommand: \"fet update-context\" };\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}\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 };\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 return { file, 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 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 await withProjectLock(ctx.projectRoot, { command: \"fill-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const handoffPath = join(ctx.projectRoot, \".fet\", \"fill-context.md\");\n await mkdir(dirname(handoffPath), { recursive: true });\n await atomicWrite(handoffPath, renderGenericHandoff(ctx.language));\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 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 them.`\n : \"No AGENTS.md placeholders found. IDE fill-context commands were refreshed.\"\n : placeholders\n ? `发现 ${placeholders} 个 AGENTS.md 占位符。请使用 IDE AI 补齐。`\n : \"未发现 AGENTS.md 占位符,已刷新 IDE fill-context 命令。\",\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): string {\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. Replace every \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content.\n5. Preserve FET managed markers.\n6. Do not modify business code.\n7. 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. 将 AGENTS.md 中每个 \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、项目相关的内容。\n5. 保留 FET 托管标记。\n6. 不要修改业务代码。\n7. 运行 \\`fet doctor\\`,确认不再有 AGENTS.md 占位符警告。\n`;\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 {\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 ? [] : [\"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary: 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 warnings,\n nextSteps: result.state.installed && !result.state.graphExists ? [\"Run fet graph init to build the first GitNexus graph\"] : 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 ? [\"GitNexus is not installed.\"] : []),\n ...(result.state.installed && !result.state.graphExists ? [\"GitNexus is installed but no graph directory was found.\"] : []),\n ...(!result.state.handoffPath ? [\"Graph handoff instructions have not been generated.\"] : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary: warnings.length ? `Graph doctor completed with ${warnings.length} warning(s).` : \"Graph doctor completed without warnings.\",\n warnings,\n nextSteps: warnings.length ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"] : 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 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));\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: \"GitNexus setup handoff generated.\",\n warnings: result.state.installed ? [] : [\"GitNexus is not installed. The handoff explains installation and IDE-assisted setup options.\"],\n nextSteps: result.state.installed ? [\"Run gitnexus setup if you want to configure IDE/MCP integrations\", \"Run fet graph init\"] : [\"Open .fet/graph-setup.md in your IDE AI\"],\n data: {\n path: \".fet/graph-setup.md\",\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));\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: \"GitNexus graph usage handoff generated.\",\n warnings: result.state.installed ? [] : [\"GitNexus is not installed. The handoff still documents the fallback behavior.\"],\n nextSteps: [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"],\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: \"GitNexus is not installed or is not available on 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: \"GitNexus analyze failed.\",\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 global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary: mode === \"init\" ? \"GitNexus graph initialized.\" : \"GitNexus graph refreshed.\",\n warnings: result.state.graphExists ? [] : [\"GitNexus analyze completed, but the configured graph directory was not found.\"],\n nextSteps: [\"Run fet graph status\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"],\n data: {\n gitnexus: global.graph.gitnexus,\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(state: GitNexusState): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET Graph Setup\n\nGitNexus graph support is optional. FET does not install GitNexus automatically and does not require graph support for OpenSpec workflows.\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\nSuggested setup flow:\n\n1. If GitNexus is not installed, install it using the method recommended by the GitNexus project.\n2. If you want GitNexus MCP or IDE integration, run \\`gitnexus setup\\` yourself after reviewing what it changes.\n3. Return to this project and run \\`fet graph init\\` to build the first graph.\n4. Run \\`fet graph handoff\\` so IDE AI 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 run global IDE configuration commands unless the user explicitly approves them.\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState): string {\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\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { atomicWrite, createInitJournal, withProjectLock, writeInitJournal } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, renderGitNexusRecommendation, toGitNexusState } from \"../gitnexus.js\";\nimport { mergeGitignore } from \"../templates/index.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 await ensureGitignore(ctx);\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 ensureGitignore(ctx: FetCommandContext): Promise<void> {\n const gitignorePath = join(ctx.projectRoot, \".gitignore\");\n const existing = await readOptional(gitignorePath);\n await atomicWrite(gitignorePath, mergeGitignore(existing));\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\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 { 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 \"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 { 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## 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## 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 }\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): string {\n const block = renderManagedBlock(renderKarpathyClaudeGuidelines());\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(): string {\n return `# Andrej Karpathy Inspired Coding Guidelines\n\n${renderKarpathyGuidelinesBody()}`;\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","const BEGIN = \"# FET:BEGIN LOCAL STATE\";\nconst END = \"# FET:END LOCAL STATE\";\n\nconst RULES = [\n \"openspec/fet-state.json\",\n \"openspec/.fet.lock\",\n \"openspec/.fet-init-journal.json\",\n \"openspec/changes/*/fet-state.json\",\n \"openspec/changes/*/.fet/\",\n \".gitnexus/\"\n];\n\nexport function mergeGitignore(existing: string | null): string {\n const block = `${BEGIN}\\n${RULES.join(\"\\n\")}\\n${END}`;\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","import { readFile } from \"node:fs/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) {\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));\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 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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\nimport type { FetCommandContext } from \"../cli/context.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 const openSpecArgs = stripFetOptions(args);\n await withProjectLock(\n ctx.projectRoot,\n { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? null) : (ctx.changeId ?? null);\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} 执行失败`,\n details: result,\n recoverable: true\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 {\n 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 }\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\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} 完成。`\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 block = `updateTime: ${entry.updateTime}\\n更新内容:${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 || \"未提供变更需求\";\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} 执行失败`,\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(\n ctx: FetCommandContext,\n command: string,\n args: string[]\n): 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 /*\n case \"bulk-archive\":\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"OpenSpec 1.2.0 不提供 bulk-archive 顶层命令\",\n suggestedCommand: \"逐个执行 fet archive --change <change-id>\"\n });\n case \"explore\":\n return { command: \"explore\", args: ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args };\n case \"onboard\":\n return { command: \"instructions\", args: [] };\n */\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\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: \"该命令需要明确的 change\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"添加 --change <change-id>\"\n });\n}\n\nfunction withoutUndefined(values: string[]): string[] {\n return values.filter(Boolean);\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: \"未指定 change,无法检查 verify 状态\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\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: \"指定的 change 不存在或已归档\",\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: \"当前 change 尚未通过 FET verify\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\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 { 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 === \"confirm\") {\n return \"confirm\";\n }\n return \"warn\";\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. Treat this as advisory: do not interrupt the workflow solely to ask about switching models. Run the FET command unless the user explicitly asks to pause for a model switch, and report any FET model warning in the summary.\";\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, treat it as an advisory warning: do not interrupt the workflow solely to ask about switching models. Run the FET command unless the user explicitly asks to pause for a model switch, and report any FET model warning in the summary.\";\n }\n\n if (command === \"apply\") {\n return \"模型策略:该命令建议使用高能力/高成本模型运行,例如 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。此提示仅作为建议,不要仅因模型策略而打断流程询问是否切换模型;除非用户明确要求先切换模型,否则继续运行 FET 命令,并在总结中说明 FET 输出的模型提醒。\";\n }\n\n return \"模型策略:该命令建议使用低成本模型运行。若当前 IDE 模型是 GPT-5.5、GLM-5.1、GLM-5、Claude Opus、Claude Sonnet 或其他高成本模型,此提示仅作为建议;不要仅因模型策略而打断流程询问是否切换模型。除非用户明确要求先切换模型,否则继续运行 FET 命令,并在总结中说明 FET 输出的模型提醒。\";\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, \"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 { 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 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# FET For Codex\n\n## 语言\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- 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 };\n}\n\nexport function codexCommandFiles(language: FetLanguage = DEFAULT_LANGUAGE): Array<{ path: string; content: string }> {\n return [\n codexKarpathyGuidelinesFile(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# Andrej Karpathy Inspired Coding Guidelines\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 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 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 (language !== \"en\") {\n return renderSlashPromptZh(command);\n }\n if (command === \"continue\") {\n return renderContinueSlashPrompt(language);\n }\n if (command === \"ff\" || command === \"propose\") {\n return renderFastForwardSlashPrompt(command, 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\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 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\" ? \"- 替换 AGENTS.md 中每个 `[NEEDS LLM INPUT]` 或 `[NEED LLM INPUT]` 占位符,保留 FET 托管标记,不要修改业务代码。\\n\" : \"\"}${command === \"continue\" ? \"- 一次只创建一个 ready artifact,并在写入前阅读依赖文件。\\n\" : \"\"}${command === \"apply\" ? \"- 不要在未完成真实实现前勾选 tasks.md;不要从 apply 阶段直接 sync 或 archive。\\n\" : \"\"}`;\n}\n\nfunction commandTitleZh(command: FetAdapterCommand): string {\n const titles: Partial<Record<FetAdapterCommand, string>> = {\n explore: \"探索 FET/OpenSpec 需求\",\n propose: \"创建并补齐 FET/OpenSpec 提案产物\",\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 === \"continue\") {\n return \"基于 active change 或用户指定的 change,创建下一个 ready 的 OpenSpec 规划产物。\";\n }\n if (command === \"apply\") {\n return \"读取 OpenSpec 产物并按 tasks.md 实施代码变更。\";\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. Replace every \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete, concise project-specific content.\n6. Preserve FET managed markers such as \\`FET:BEGIN AUTO\\`, \\`FET:END AUTO\\`, \\`FET:BEGIN USER\\`, and \\`FET:END USER\\`.\n7. Do not modify business code.\n8. 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 apply is blocked because required artifacts are missing, stop and suggest /prompts:fet-continue <change-id> or /prompts:fet-ff <change-id>.\n5. 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.\n6. After completing or pausing, summarize completed tasks, remaining tasks, and blockers.\n\nGuardrails:\n- Never skip reading OpenSpec artifacts before implementation.\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.\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 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 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.\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(command: \"ff\" | \"propose\", language: FetLanguage): string {\n const title = command === \"propose\" ? \"Propose a new FET/OpenSpec change\" : \"Fast-forward FET/OpenSpec artifact creation\";\n const commandLine = command === \"propose\" ? \"fet propose <change-id-or-description>\" : \"fet ff --change <change-id>\";\n return renderManagedSlashPrompt(\n `fet ${command} [...args]`,\n command === \"propose\" ? \"Create a change and generate required OpenSpec artifacts\" : \"Generate required OpenSpec artifacts for a change\",\n `${title}.\n\nInput after the slash command may be a change id or a description of what the user wants to build. For ff, 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 or description. If ambiguous, ask the user.\n3. Run the native OpenSpec ${command} flow through FET:\n \\`\\`\\`sh\n ${commandLine}\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 only those files and preserve OpenSpec structure.\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- 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 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 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\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\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 { cursorRuleFile, 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), cursorRuleFile(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 { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\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\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检查 README、package scripts、路由、测试、源码结构和现有约定后,把 AGENTS.md 中每个 \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、简洁、项目相关的内容。保留 FET 托管标记,不要修改业务代码。\n`;\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","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 \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n ];\n return known.filter((command) => help.includes(command));\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 .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\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 { 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 { 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 { 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 warnings = [...packageManager.warnings];\n if (framework.name === \"unknown\") {\n warnings.push(\"未能从 package.json 识别主要框架\");\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 };\n }\n}\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"],"mappings":"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","names":["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","join","mkdir","dirname","mkdir","dirname","join","join","graph","mkdir","dirname","readFile","stat","join","dirname","join","BEGIN","END","readFile","join","readFile","join","readFile","exists","join","readOptional","readFile","stat","readFile","join","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","join","readOptional","readFile","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","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","resolve","execFileAsync","promisify","execFile","readFile","stat","join","parse","locks","exists","readdir","stat","join","exists","count"]}
|