@nick848/fet 1.1.4 → 1.1.6
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 +17 -2
- package/README_en.md +16 -1
- package/dist/cli/index.js +1068 -374
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/doctor.ts","../../src/context-placeholders.ts","../../src/fs/atomic-write.ts","../../src/fs/backup.ts","../../src/fs/lock.ts","../../src/fs/journal.ts","../../src/gitnexus.ts","../../src/commands/fill-context.ts","../../src/commands/graph.ts","../../src/graph-context.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/update.ts","../../src/commands/verify.ts","../../src/model-policy.ts","../../src/cli/context.ts","../../src/adapters/codex/index.ts","../../src/adapters/commands.ts","../../src/adapters/codex/templates.ts","../../src/adapters/cursor/index.ts","../../src/adapters/cursor/templates.ts","../../src/openspec/adapter.ts","../../src/openspec/inspector.ts","../../src/openspec/resolver.ts","../../src/openspec/runner.ts","../../src/scanner/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 { updateCommand } from \"../commands/update.js\";\nimport { updateContextCommand } from \"../commands/update-context.js\";\nimport { verifyCommand } from \"../commands/verify.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError, toFetError } from \"../errors/fet-error.js\";\nimport { formatModelPolicyMismatch, getCommandModelPolicyMismatch, getModelPolicyMode } from \"../model-policy.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { createCommandContext, type GlobalOptions } from \"./context.js\";\nimport { OutputWriter } from \"./output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"fet\")\n .description(\"围绕 OpenSpec 的前端开发工作流编排工具。\")\n .enablePositionalOptions()\n .version(FET_VERSION)\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n\naddGlobalOptions(program.command(\"init\")).description(\"初始化 FET + OpenSpec\").action(wrap(\"init\", initCommand));\naddGlobalOptions(program.command(\"update\")).description(\"检查 FET 是否为最新版,并在需要时自动升级\").action(wrap(\"update\", updateCommand));\naddGlobalOptions(program.command(\"update-context\")).description(\"更新项目上下文\").action(wrap(\"update-context\", updateContextCommand));\naddGlobalOptions(program.command(\"fill-context\")).description(\"刷新 IDE 填充 AGENTS.md 占位符的提示文件\").action(wrap(\"fill-context\", fillContextCommand));\n\nconst graph = addGlobalOptions(program.command(\"graph\").description(\"管理可选的 GitNexus 代码图支持\"));\nfor (const action of [\"status\", \"setup\", \"doctor\", \"handoff\"] as const) {\n addGlobalOptions(graph.command(action).description(`运行 fet graph ${action}`)).action(wrap(\"graph\", (ctx) => graphCommand(ctx, action)));\n}\nfor (const action of [\"init\", \"refresh\"] as const) {\n addGlobalOptions(\n graph\n .command(`${action} [args...]`)\n .description(`通过 GitNexus analyze 执行 graph ${action}`)\n .allowUnknownOption(true)\n .passThroughOptions()\n ).action(wrap(\"graph\", (ctx, args: string[] = []) => graphCommand(ctx, action as GraphAction, args)));\n}\n\naddGlobalOptions(program.command(\"doctor\").description(\"诊断状态、配置与一致性\").option(\"--fix-lock\", \"清理 FET 锁文件\")).action(\n wrap(\"doctor\", (ctx, options: { fixLock?: boolean }) => doctorCommand(ctx, { fixLock: Boolean(options.fixLock) }))\n);\n\naddGlobalOptions(program.command(\"verify\").description(\"最终质量验证\").option(\"--done\", \"声明手动验证已完成\").option(\"--auto\", \"生成或执行自动验证计划\")).action(\n wrap(\"verify\", verifyCommand)\n);\n\nfor (const command of [\"explore\", \"propose\", \"new\", \"continue\", \"ff\", \"apply\", \"sync\", \"archive\", \"bulk-archive\", \"onboard\"]) {\n addGlobalOptions(program.command(`${command} [args...]`).description(`代理执行 openspec ${command}`).allowUnknownOption(true).passThroughOptions()).action(\n wrap(command, (ctx, args: string[] = []) => proxyCommand(ctx, command, args))\n );\n}\n\naddGlobalOptions(program.command(\"passthrough <command> [args...]\").description(\"透传暂未接管的 OpenSpec 命令\").allowUnknownOption(true).passThroughOptions()).action(\n wrap(\"passthrough\", (ctx, command: string, args: string[] = []) => passthroughCommand(ctx, command, args))\n);\n\nprogram.parseAsync(process.argv).catch((error) => {\n const json = process.argv.includes(\"--json\");\n const output = new OutputWriter(json);\n const fetError = toFetError(error);\n output.error(fetError);\n process.exitCode = fetError.exitCode;\n});\n\nfunction wrap<T extends unknown[]>(\n command: string,\n handler: (ctx: Awaited<ReturnType<typeof createCommandContext>>, ...args: T) => Promise<void>\n) {\n return async (...args: T) => {\n const maybeCommand = args[args.length - 1] as unknown;\n const opts = isCommandLike(maybeCommand)\n ? ({ ...(maybeCommand.parent?.opts() as GlobalOptions), ...(maybeCommand.opts() as GlobalOptions) } as GlobalOptions)\n : (program.opts() as GlobalOptions);\n const ctx = await createCommandContext(command, { ...opts, ...extractGlobalOptions(args) });\n try {\n await handleModelPolicyRecommendation(ctx);\n await warnIfContextPlaceholdersRemain(ctx);\n await handler(ctx, ...args);\n } catch (error) {\n const fetError = toFetError(error);\n ctx.output.error(fetError);\n process.exitCode = fetError.exitCode;\n }\n };\n}\n\nasync function handleModelPolicyRecommendation(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n const mismatch = getCommandModelPolicyMismatch(ctx.command);\n if (!mismatch) {\n return;\n }\n\n const warning = formatModelPolicyMismatch(mismatch, ctx.language);\n const policyMode = getModelPolicyMode();\n ctx.output.warn(`${warning} ${renderModelPolicyActionHint(policyMode, ctx.language)}`);\n\n if (policyMode !== \"confirm\" || ctx.yes || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question = ctx.language === \"en\" ? \"Continue anyway? [y/N] \" : \"仍然继续?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled so you can switch IDE model.\" : \"命令已取消,你可以先切换 IDE 模型。\",\n details: { command: ctx.command, detected: mismatch.detected, recommended: mismatch.recommended },\n suggestedCommand: ctx.language === \"en\" ? `Switch IDE model, then rerun fet ${ctx.command}.` : `切换 IDE 模型后重新运行 fet ${ctx.command}。`\n });\n }\n } finally {\n rl.close();\n }\n}\n\nfunction renderModelPolicyActionHint(policyMode: ReturnType<typeof getModelPolicyMode>, language: Awaited<ReturnType<typeof createCommandContext>>[\"language\"]): string {\n if (policyMode === \"confirm\") {\n return language === \"en\"\n ? \"Choose whether to continue this command or stop and switch models.\"\n : \"请选择继续执行本命令,或停止后手动切换模型。\";\n }\n return language === \"en\"\n ? \"This is advisory because FET_MODEL_POLICY=warn; the command will continue.\"\n : \"当前设置 FET_MODEL_POLICY=warn,该提醒仅作为建议,命令会继续执行。\";\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"update\", \"update-context\", \"fill-context\", \"doctor\"].includes(ctx.command)) {\n return;\n }\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (count > 0) {\n ctx.output.warn(renderAgentsPlaceholderWarning(count, ctx.language));\n }\n}\n\nfunction isCommandLike(value: unknown): value is Command {\n return value instanceof Command;\n}\n\nfunction addGlobalOptions(command: Command): Command {\n return command\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n}\n\nfunction extractGlobalOptions(args: unknown[]): GlobalOptions {\n const values = args.flatMap((arg) => (Array.isArray(arg) ? arg : []));\n const options: GlobalOptions = {};\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (typeof value !== \"string\") {\n continue;\n }\n if (value === \"--cwd\" && typeof values[index + 1] === \"string\") {\n options.cwd = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--cwd=\")) {\n options.cwd = value.slice(\"--cwd=\".length);\n } else if (value === \"--change\" && typeof values[index + 1] === \"string\") {\n options.change = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--change=\")) {\n options.change = value.slice(\"--change=\".length);\n } else if (value === \"--lang\" && typeof values[index + 1] === \"string\") {\n options.lang = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--lang=\")) {\n options.lang = value.slice(\"--lang=\".length);\n } else if (value === \"--yes\") {\n options.yes = true;\n } else if (value === \"--json\") {\n options.json = true;\n } else if (value === \"--verbose\") {\n options.verbose = true;\n }\n }\n return options;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { clearLock } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, toGitNexusState } from \"../gitnexus.js\";\nimport type { DoctorCheck } from \"../adapters/index.js\";\n\nexport async function doctorCommand(ctx: FetCommandContext, options: { fixLock?: boolean } = {}): Promise<void> {\n const checks: DoctorCheck[] = [];\n\n checks.push(await checkOpenSpec(ctx));\n checks.push(await checkState(ctx));\n checks.push(await checkFile(\"agents\", join(ctx.projectRoot, \"AGENTS.md\"), \"AGENTS.md 缺失\", \"fet update-context\"));\n checks.push(await checkFile(\"config\", join(ctx.projectRoot, \"openspec\", \"config.yaml\"), \"openspec/config.yaml 缺失\", \"fet init\"));\n\n checks.push(await checkPlaceholders(ctx));\n checks.push(await checkGitNexus(ctx));\n\n for (const adapter of ctx.toolAdapters) {\n checks.push(...(await adapter.doctor(ctx.projectRoot)));\n }\n\n const lockPath = join(ctx.projectRoot, \"openspec\", \".fet.lock\");\n if (await exists(lockPath)) {\n if (options.fixLock) {\n await clearLock(ctx.projectRoot);\n checks.push({ id: \"lock\", status: \"pass\", message: \"已清理 openspec/.fet.lock\" });\n } else {\n checks.push({ id: \"lock\", status: \"warn\", message: \"存在 openspec/.fet.lock\", suggestedCommand: \"fet doctor --fix-lock\" });\n }\n }\n\n const warnings = checks.filter((check) => check.status !== \"pass\").map((check) => check.message);\n ctx.output.result({\n ok: true,\n command: \"doctor\",\n summary: warnings.length ? `诊断完成,发现 ${warnings.length} 个需要关注的问题。` : \"诊断完成,未发现明显问题。\",\n warnings,\n data: checks\n });\n}\n\nasync function checkGitNexus(ctx: FetCommandContext): Promise<DoctorCheck> {\n const global = await ctx.stateStore.readGlobal();\n const state = mergeGitNexusGraphInfo(\n toGitNexusState(await detectGitNexus(), global?.graph?.gitnexus),\n await inspectGitNexusGraph(ctx.projectRoot)\n );\n if (global) {\n global.graph ??= {};\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return state.installed\n ? {\n id: \"gitnexus\",\n status: \"pass\",\n message:\n ctx.language === \"en\"\n ? `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n : `检测到 GitNexus:${state.executablePath ?? \"gitnexus\"}(${state.version ?? \"unknown\"}),代码图${state.graphExists ? \"已找到\" : \"未找到\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"Optional GitNexus code graph support is not installed\" : \"尚未安装可选的 GitNexus 代码图支持\",\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\n : \"如果希望 OpenSpec 产物优先参考仓库代码图,可以稍后安装 GitNexus\"\n };\n}\n\nasync function checkOpenSpec(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const identity = await ctx.openSpec.resolveExecutable();\n return { id: \"openspec\", status: \"pass\", message: `OpenSpec: ${identity.executablePath} (${identity.version})` };\n } catch (error) {\n return { id: \"openspec\", status: \"fail\", message: error instanceof Error ? error.message : \"OpenSpec 检测失败\" };\n }\n}\n\nasync function checkState(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const state = await ctx.stateStore.readGlobal();\n return state\n ? { id: \"state\", status: \"pass\", message: \"FET 全局状态可读取\" }\n : { id: \"state\", status: \"warn\", message: \"FET 全局状态尚未初始化\", suggestedCommand: \"fet init\" };\n } catch (error) {\n return { id: \"state\", status: \"fail\", message: error instanceof Error ? error.message : \"FET 状态读取失败\" };\n }\n}\n\nasync function checkFile(id: string, path: string, missing: string, suggestedCommand: string): Promise<DoctorCheck> {\n return (await exists(path))\n ? { id, status: \"pass\", message: `${id} 存在` }\n : { id, status: \"warn\", message: missing, suggestedCommand };\n}\n\nasync function checkPlaceholders(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n await readFile(join(ctx.projectRoot, \"AGENTS.md\"), \"utf8\");\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? `AGENTS.md has ${count} LLM placeholder(s)` : `AGENTS.md 仍有 ${count} 个 LLM 占位符`,\n suggestedCommand: \"fet fill-context\"\n }\n : {\n id: \"context-placeholders\",\n status: \"pass\",\n message: ctx.language === \"en\" ? \"AGENTS.md placeholders resolved\" : \"AGENTS.md 占位符已处理\"\n };\n } catch {\n return {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"AGENTS.md missing\" : \"AGENTS.md 缺失\",\n suggestedCommand: \"fet update-context\"\n };\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\n\nexport const AGENTS_LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/g;\n\nexport async function countAgentsLlmPlaceholders(projectRoot: string): Promise<number> {\n try {\n const content = await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n return [...content.matchAll(AGENTS_LLM_PLACEHOLDER_PATTERN)].length;\n } catch {\n return 0;\n }\n}\n\nexport function renderAgentsPlaceholderWarning(count: number, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return `AGENTS.md still contains ${count} LLM placeholder(s). Run fet fill-context first so your IDE AI can replace them. Continuing current command.`;\n }\n return `AGENTS.md 仍有 ${count} 个 LLM 占位符。建议先运行 fet fill-context,让 IDE AI 补齐项目上下文;当前命令会继续执行。`;\n}\n","import { dirname } from \"node:path\";\nimport { open, rename, mkdir } from \"node:fs/promises\";\n\nexport interface AtomicWriteResult {\n path: string;\n tempPath: string;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array\n): Promise<AtomicWriteResult> {\n await mkdir(dirname(targetPath), { recursive: true });\n const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;\n const handle = await open(tempPath, \"wx\");\n\n try {\n await handle.writeFile(content);\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await rename(tempPath, targetPath);\n return { path: targetPath, tempPath };\n}\n","import { copyFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport async function createBackup(filePath: string): Promise<string | null> {\n try {\n await stat(filePath);\n } catch {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\..+$/, \"\")\n .replace(\"T\", \"-\");\n const backupPath = join(dirname(filePath), `${basename(filePath)}.fet-backup-${timestamp}`);\n await copyFile(filePath, backupPath);\n return backupPath;\n}\n","import { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { mkdir, open, readFile, rm } from \"node:fs/promises\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface LockMetadata {\n command: string;\n cwd: string;\n fetVersion: string;\n}\n\ninterface LockFile {\n pid: number;\n hostname: string;\n cwd: string;\n command: string;\n startedAt: string;\n fetVersion: string;\n}\n\nexport async function withProjectLock<T>(\n projectRoot: string,\n metadata: LockMetadata,\n fn: () => Promise<T>\n): Promise<T> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n const lock: LockFile = {\n pid: process.pid,\n hostname: hostname(),\n cwd: metadata.cwd,\n command: metadata.command,\n startedAt: new Date().toISOString(),\n fetVersion: metadata.fetVersion\n };\n\n let handle;\n try {\n await mkdir(dirname(lockPath), { recursive: true });\n handle = await open(lockPath, \"wx\");\n await handle.writeFile(JSON.stringify(lock, null, 2));\n } catch {\n throw new FetError({\n code: ErrorCode.LockHeld,\n message: \"另一个 FET 写命令正在运行\",\n details: await readExistingLock(lockPath),\n suggestedCommand: \"fet doctor --fix-lock\"\n });\n } finally {\n await handle?.close();\n }\n\n try {\n return await fn();\n } finally {\n await rm(lockPath, { force: true });\n }\n}\n\nasync function readExistingLock(lockPath: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(lockPath, \"utf8\"));\n } catch {\n return { path: lockPath };\n }\n}\n\nexport async function clearLock(projectRoot: string): Promise<boolean> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n try {\n await rm(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { atomicWrite } from \"./atomic-write.js\";\n\nexport interface JournalStep {\n operation: \"write\" | \"backup\" | \"mkdir\" | \"skip\";\n path: string;\n backupPath?: string | null;\n status: \"done\" | \"failed\" | \"skipped\";\n message?: string;\n}\n\nexport interface InitJournal {\n schemaVersion: 1;\n startedAt: string;\n completedAt: string | null;\n fetVersion: string;\n steps: JournalStep[];\n}\n\nexport function createInitJournal(fetVersion: string): InitJournal {\n return {\n schemaVersion: 1,\n startedAt: new Date().toISOString(),\n completedAt: null,\n fetVersion,\n steps: []\n };\n}\n\nexport async function writeInitJournal(projectRoot: string, journal: InitJournal): Promise<void> {\n await atomicWrite(\n join(projectRoot, \"openspec\", \".fet-init-journal.json\"),\n `${JSON.stringify(journal, null, 2)}\\n`\n );\n}\n\nexport async function readInitJournal(projectRoot: string): Promise<InitJournal | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"openspec\", \".fet-init-journal.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { FetLanguage } from \"./language.js\";\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_GRAPH_PATH = \".gitnexus\";\n\nexport interface GitNexusDetection {\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n error?: string;\n}\n\nexport interface GitNexusState {\n provider: \"gitnexus\";\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n recommendationShownAt: string | null;\n graphPath?: string | null;\n graphExists?: boolean;\n lastIndexedAt?: string | null;\n lastRefreshAt?: string | null;\n lastStatus?: string | null;\n setupHandoffPath?: string | null;\n setupHandoffUpdatedAt?: string | null;\n handoffPath?: string | null;\n handoffUpdatedAt?: string | null;\n projectContextPath?: string | null;\n projectContextUpdatedAt?: string | null;\n workflowContextPath?: string | null;\n workflowContextUpdatedAt?: string | null;\n lastWorkflowGraphQuery?: string | null;\n}\n\nexport interface GitNexusGraphInfo {\n graphPath: string;\n graphExists: boolean;\n lastIndexedAt: string | null;\n}\n\nexport interface GitNexusRunResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n command: string[];\n}\n\nexport async function detectGitNexus(env: NodeJS.ProcessEnv = process.env): Promise<GitNexusDetection> {\n const checkedAt = new Date().toISOString();\n const command = resolveGitNexusCommand(env);\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, \"--version\"], { shell: process.platform === \"win32\" });\n return {\n installed: true,\n executablePath: command.label,\n version: (stdout.trim() || stderr.trim() || \"unknown\").split(/\\r?\\n/)[0] ?? \"unknown\",\n checkedAt\n };\n } catch (error) {\n return {\n installed: false,\n executablePath: command.label,\n version: null,\n checkedAt,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function toGitNexusState(detection: GitNexusDetection, previous?: GitNexusState | null): GitNexusState {\n return {\n provider: \"gitnexus\",\n installed: detection.installed,\n executablePath: detection.installed ? detection.executablePath : null,\n version: detection.version,\n checkedAt: detection.checkedAt,\n recommendationShownAt: previous?.recommendationShownAt ?? null,\n graphPath: previous?.graphPath ?? null,\n graphExists: previous?.graphExists ?? false,\n lastIndexedAt: previous?.lastIndexedAt ?? null,\n lastRefreshAt: previous?.lastRefreshAt ?? null,\n lastStatus: previous?.lastStatus ?? null,\n setupHandoffPath: previous?.setupHandoffPath ?? null,\n setupHandoffUpdatedAt: previous?.setupHandoffUpdatedAt ?? null,\n handoffPath: previous?.handoffPath ?? null,\n handoffUpdatedAt: previous?.handoffUpdatedAt ?? null,\n projectContextPath: previous?.projectContextPath ?? null,\n projectContextUpdatedAt: previous?.projectContextUpdatedAt ?? null,\n workflowContextPath: previous?.workflowContextPath ?? null,\n workflowContextUpdatedAt: previous?.workflowContextUpdatedAt ?? null,\n lastWorkflowGraphQuery: previous?.lastWorkflowGraphQuery ?? null\n };\n}\n\nexport async function inspectGitNexusGraph(projectRoot: string, env: NodeJS.ProcessEnv = process.env): Promise<GitNexusGraphInfo> {\n const relative = env.FET_GITNEXUS_GRAPH_PATH?.trim() || DEFAULT_GRAPH_PATH;\n const graphPath = join(projectRoot, relative);\n try {\n const info = await stat(graphPath);\n return {\n graphPath: relative,\n graphExists: true,\n lastIndexedAt: info.mtime.toISOString()\n };\n } catch {\n return {\n graphPath: relative,\n graphExists: false,\n lastIndexedAt: null\n };\n }\n}\n\nexport async function runGitNexus(args: string[], options: { cwd: string; env?: NodeJS.ProcessEnv }): Promise<GitNexusRunResult> {\n const command = resolveGitNexusCommand(options.env ?? process.env);\n const fullCommand = [command.file, ...command.args, ...args];\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, ...args], {\n cwd: options.cwd,\n shell: process.platform === \"win32\"\n });\n return {\n exitCode: 0,\n stdout,\n stderr,\n command: fullCommand\n };\n } catch (error) {\n const maybe = error as { code?: number | string; stdout?: string; stderr?: string };\n return {\n exitCode: typeof maybe.code === \"number\" ? maybe.code : 1,\n stdout: maybe.stdout ?? \"\",\n stderr: maybe.stderr ?? (error instanceof Error ? error.message : String(error)),\n command: fullCommand\n };\n }\n}\n\nexport function mergeGitNexusGraphInfo(state: GitNexusState, graph: GitNexusGraphInfo): GitNexusState {\n return {\n ...state,\n graphPath: graph.graphPath,\n graphExists: graph.graphExists,\n lastIndexedAt: graph.lastIndexedAt\n };\n}\n\nexport function renderGitNexusRecommendation(state: GitNexusState, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (state.installed) {\n return `Optional GitNexus detected (${state.version ?? \"unknown\"}). You can generate a code graph after init; future OpenSpec artifacts should prefer the graph when it is available.`;\n }\n return \"Optional GitNexus code graph support is not installed. Consider installing GitNexus later to speed up OpenSpec artifact generation and improve code insertion context.\";\n }\n if (state.installed) {\n return `检测到可选 GitNexus(${state.version ?? \"unknown\"})。初始化后可以生成代码图;后续 OpenSpec 产物在图可用时应优先参考它。`;\n }\n\n return \"未安装可选的 GitNexus 代码图支持。可以稍后安装 GitNexus,以加速 OpenSpec 产物生成并改善代码插入上下文。\";\n}\n\nfunction resolveGitNexusCommand(env: NodeJS.ProcessEnv): { file: string; args: string[]; label: string } {\n const raw = env.FET_GITNEXUS_COMMAND?.trim() || env.FET_GITNEXUS_EXECUTABLE?.trim() || \"gitnexus\";\n const parts = splitCommand(raw);\n const [file = \"gitnexus\", ...args] = parts;\n const resolvedFile = process.platform === \"win32\" && raw === \"gitnexus\" ? \"gitnexus.cmd\" : file;\n return { file: resolvedFile, args, label: raw };\n}\n\nfunction splitCommand(value: string): string[] {\n const matches = value.match(/\"[^\"]+\"|'[^']+'|\\S+/g);\n return (matches?.length ? matches : [value]).map((part) => part.replace(/^[\"']|[\"']$/g, \"\"));\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport 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 { buildProjectGraphContext } from \"../graph-context.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"../gitnexus.js\";\n\nexport type GraphAction = \"status\" | \"setup\" | \"init\" | \"refresh\" | \"doctor\" | \"handoff\";\n\nexport async function graphCommand(ctx: FetCommandContext, action: GraphAction, args: string[] = []): Promise<void> {\n switch (action) {\n case \"status\":\n await graphStatusCommand(ctx);\n return;\n case \"doctor\":\n await graphDoctorCommand(ctx);\n return;\n case \"setup\":\n await graphSetupCommand(ctx);\n return;\n case \"handoff\":\n await graphHandoffCommand(ctx);\n return;\n case \"init\":\n await graphAnalyzeCommand(ctx, \"init\", args);\n return;\n case \"refresh\":\n await graphAnalyzeCommand(ctx, \"refresh\", args);\n return;\n }\n}\n\nasync function graphStatusCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"\n : \"尚未安装 GitNexus。运行 fet graph setup 获取安装交接说明。\"\n ];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary:\n ctx.language === \"en\"\n ? result.state.installed\n ? `GitNexus graph status checked. Graph ${result.state.graphExists ? \"exists\" : \"does not exist\"} at ${result.state.graphPath ?? \".gitnexus\"}.`\n : \"GitNexus is not installed. Graph support remains optional.\"\n : result.state.installed\n ? `已检查 GitNexus 代码图状态。代码图${result.state.graphExists ? \"存在\" : \"不存在\"},路径为 ${result.state.graphPath ?? \".gitnexus\"}。`\n : \"尚未安装 GitNexus。代码图能力保持可选。\",\n warnings,\n nextSteps:\n result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"Run fet graph init to build the first GitNexus graph\" : \"运行 fet graph init 生成第一份 GitNexus 代码图\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphDoctorCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = [\n ...(!result.state.installed ? [ctx.language === \"en\" ? \"GitNexus is not installed.\" : \"尚未安装 GitNexus。\"] : []),\n ...(result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"GitNexus is installed but no graph directory was found.\" : \"已安装 GitNexus,但未发现代码图目录。\"]\n : []),\n ...(!result.state.handoffPath\n ? [ctx.language === \"en\" ? \"Graph handoff instructions have not been generated.\" : \"尚未生成代码图使用交接说明。\"]\n : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary:\n ctx.language === \"en\"\n ? warnings.length\n ? `Graph doctor completed with ${warnings.length} warning(s).`\n : \"Graph doctor completed without warnings.\"\n : warnings.length\n ? `代码图诊断完成,发现 ${warnings.length} 个警告。`\n : \"代码图诊断完成,未发现警告。\",\n warnings,\n nextSteps:\n warnings.length\n ? ctx.language === \"en\"\n ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"]\n : [\"运行 fet graph setup\", \"运行 fet graph handoff\", \"安装 GitNexus 后运行 fet graph init\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphSetupCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-setup.md\");\n const installCommand = process.env.FET_GITNEXUS_INSTALL_COMMAND?.trim() || null;\n await withProjectLock(ctx.projectRoot, { command: \"graph setup\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { write: false });\n await writeHandoffFile(handoffPath, renderGraphSetupHandoff(result.state, { installCommand, language: ctx.language }));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n setupHandoffPath: \".fet/graph-setup.md\",\n setupHandoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph setup\",\n summary:\n ctx.language === \"en\"\n ? \"GitNexus IDE-assisted setup playbook generated.\"\n : \"已生成 GitNexus IDE LLM 辅助安装任务书。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The playbook lets the current IDE LLM guide installation with user confirmation before risky commands.\"\n : \"尚未安装 GitNexus。任务书会指导当前 IDE LLM 推进安装,并在高风险命令前请求用户确认。\"\n ],\n nextSteps: result.state.installed\n ? [\n ctx.language === \"en\"\n ? \"Ask your IDE AI to read .fet/graph-setup.md and run the optional gitnexus setup flow if you want IDE/MCP integration\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并在需要 IDE/MCP 集成时按确认流程运行 gitnexus setup\",\n \"fet graph init\"\n ]\n : [\n ctx.language === \"en\"\n ? \"Ask your current IDE AI to read .fet/graph-setup.md and follow the installation playbook\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并按安装任务书推进\"\n ],\n data: {\n path: \".fet/graph-setup.md\",\n installCommandConfigured: Boolean(installCommand),\n gitnexus: result.state\n }\n });\n}\n\nasync function graphHandoffCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-handoff.md\");\n await withProjectLock(ctx.projectRoot, { command: \"graph handoff\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { runStatus: true, write: false });\n await writeHandoffFile(handoffPath, renderGraphUsageHandoff(result.state, ctx.language));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n handoffPath: \".fet/graph-handoff.md\",\n handoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph handoff\",\n summary: ctx.language === \"en\" ? \"GitNexus graph usage handoff generated.\" : \"已生成 GitNexus 代码图使用交接说明。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The handoff still documents the fallback behavior.\"\n : \"尚未安装 GitNexus。交接说明仍会记录回退行为。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"]\n : [\"Cursor/Codex/OpenCode:大范围扫描仓库前先阅读 .fet/graph-handoff.md\"],\n data: {\n path: \".fet/graph-handoff.md\",\n gitnexus: result.state\n }\n });\n}\n\nasync function graphAnalyzeCommand(ctx: FetCommandContext, mode: \"init\" | \"refresh\", args: string[]): Promise<void> {\n const detection = await detectGitNexus();\n if (!detection.installed) {\n throw new FetError({\n code: ErrorCode.GraphProviderNotFound,\n message: ctx.language === \"en\" ? \"GitNexus is not installed or is not available on PATH.\" : \"尚未安装 GitNexus,或 GitNexus 不在 PATH 中。\",\n details: { executable: detection.executablePath, error: detection.error },\n suggestedCommand: \"fet graph setup\"\n });\n }\n\n const run = await runGitNexus([\"analyze\", ...args], { cwd: ctx.projectRoot });\n if (run.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.GraphCommandFailed,\n message: ctx.language === \"en\" ? \"GitNexus analyze failed.\" : \"GitNexus analyze 执行失败。\",\n details: { command: run.command.join(\" \"), exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr },\n suggestedCommand: \"fet graph doctor\"\n });\n }\n\n const result = await refreshGraphState(ctx, { write: false });\n const graphContext = await buildProjectGraphContext(ctx, result.state, `fet graph ${mode}`);\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString(),\n projectContextPath: graphContext.path,\n projectContextUpdatedAt: graphContext.generated ? new Date().toISOString() : result.state.projectContextUpdatedAt ?? null\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary:\n ctx.language === \"en\"\n ? mode === \"init\"\n ? \"GitNexus graph initialized.\"\n : \"GitNexus graph refreshed.\"\n : mode === \"init\"\n ? \"已初始化 GitNexus 代码图。\"\n : \"已刷新 GitNexus 代码图。\",\n warnings: result.state.graphExists\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus analyze completed, but the configured graph directory was not found.\"\n : \"GitNexus analyze 已完成,但未发现配置的代码图目录。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Run fet graph status\", \"Read .fet/graph-context/project.md before broad scans\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"]\n : [\"运行 fet graph status\", \"使用 .fet/graph-handoff.md 或生成的 IDE 提示,优先参考代码图上下文\"],\n data: {\n gitnexus: global.graph.gitnexus,\n graphContext,\n run: {\n command: run.command,\n stdout: run.stdout.trim(),\n stderr: run.stderr.trim()\n }\n }\n });\n}\n\nasync function refreshGraphState(ctx: FetCommandContext, options: { runStatus?: boolean; write?: boolean } = {}) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n let state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n let gitnexusStatus: Awaited<ReturnType<typeof runGitNexus>> | null = null;\n\n if (options.runStatus && detection.installed) {\n gitnexusStatus = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n state = {\n ...state,\n lastStatus: firstLine(gitnexusStatus.stdout) || firstLine(gitnexusStatus.stderr) || `exit ${gitnexusStatus.exitCode}`\n };\n }\n\n if (options.write ?? true) {\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return {\n state,\n gitnexusStatus: gitnexusStatus\n ? {\n exitCode: gitnexusStatus.exitCode,\n command: gitnexusStatus.command,\n stdout: gitnexusStatus.stdout.trim(),\n stderr: gitnexusStatus.stderr.trim()\n }\n : null\n };\n}\n\nasync function writeHandoffFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderGraphSetupHandoff(\n state: GitNexusState,\n options: { installCommand: string | null; language: FetCommandContext[\"language\"] }\n): string {\n if (options.language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE Setup Playbook\n\nThis file is written for the current IDE LLM. Use it to help the user install and verify optional GitNexus graph support. GitNexus is optional; FET/OpenSpec workflows must continue to work when it is unavailable.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Executable: ${state.executablePath ?? \"gitnexus\"}\n- Version: ${state.version ?? \"unknown\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Configured install command: ${options.installCommand ?? \"none\"}\n\nIDE LLM setup flow:\n\n1. Check the shell, operating system, package managers, and PATH. Run only read-only detection commands at first.\n2. Run \\`gitnexus --version\\` or the executable shown above. If it succeeds, skip installation and continue to verification.\n3. If GitNexus is missing and \\`FET_GITNEXUS_INSTALL_COMMAND\\` is configured, explain that command to the user and ask for approval before running it.\n4. If no install command is configured, find the official GitNexus installation instructions or ask the user for the preferred install method. Do not invent an installer.\n5. Before running any command that downloads software, installs globally, changes PATH, modifies user home files, or changes IDE/MCP configuration, show the exact command and wait for user approval.\n6. After installation, verify with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, run \\`gitnexus setup\\` only after explaining what it may change and receiving approval.\n8. Return to this project and run \\`fet graph init\\` to build the first graph.\n9. Run \\`fet graph handoff\\` so future IDE AI work can prefer graph context before broad repository scans.\n\nGuardrails:\n\n- Do not block FET/OpenSpec commands when GitNexus is unavailable.\n- Do not generate or modify application code during setup.\n- Do not silently install software or modify global/user-level configuration.\n- If installation fails, summarize the failing command, stderr, and the next manual step.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE 安装任务书\n\n本文档写给当前 IDE LLM。请用它帮助用户安装并验证可选的 GitNexus 代码图能力。GitNexus 是可选能力;即使不可用,FET/OpenSpec 主流程也必须继续可用。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 可执行文件:${state.executablePath ?? \"gitnexus\"}\n- 版本:${state.version ?? \"unknown\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 已配置安装命令:${options.installCommand ?? \"无\"}\n\nIDE LLM 安装流程:\n\n1. 先检测 shell、操作系统、包管理器和 PATH。起步阶段只运行只读检测命令。\n2. 运行 \\`gitnexus --version\\` 或上方显示的可执行文件。如果成功,跳过安装并进入验证。\n3. 如果 GitNexus 缺失且已配置 \\`FET_GITNEXUS_INSTALL_COMMAND\\`,先向用户解释该命令,再等待用户批准后执行。\n4. 如果没有配置安装命令,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。不要臆造安装命令。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户目录或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n6. 安装后运行 \\`gitnexus --version\\` 验证。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\` 可能修改的内容,获得确认后再运行。\n8. 回到本项目运行 \\`fet graph init\\`,生成第一份代码图。\n9. 运行 \\`fet graph handoff\\`,让后续 IDE AI 在大范围扫描前优先使用代码图上下文。\n\n约束:\n\n- GitNexus 不可用时,不要阻塞 FET/OpenSpec 命令。\n- 安装过程中不要生成或修改业务代码。\n- 不要静默安装软件,也不要静默修改全局或用户级配置。\n- 如果安装失败,汇总失败命令、stderr 和下一步人工处理建议。\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState, language: FetCommandContext[\"language\"]): string {\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET Graph Handoff\n\nUse GitNexus graph context as an optional first pass before broad repository scans.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${state.lastIndexedAt ?? \"unknown\"}\n- Last status: ${state.lastStatus ?? \"unknown\"}\n\nWhen graph context is available:\n\n1. Use the graph to identify likely modules, dependencies, and insertion points.\n2. Read only the concrete source files needed to confirm behavior.\n3. Prefer OpenSpec artifacts and AGENTS.md over graph guesses when they conflict.\n4. Fall back to normal repository inspection if the graph is missing, stale, or incomplete.\n\nWhen producing OpenSpec artifacts:\n\n- Use graph context to make proposal, design, specs, and tasks more precise.\n- Avoid large repository scans when the graph already narrows the relevant area.\n- Keep all generated artifacts in the normal OpenSpec change directory.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET 代码图交接说明\n\n在大范围扫描仓库前,优先把 GitNexus 代码图上下文作为可选的第一轮线索。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 最后索引时间:${state.lastIndexedAt ?? \"unknown\"}\n- 最后状态:${state.lastStatus ?? \"unknown\"}\n\n代码图上下文可用时:\n\n1. 用代码图识别可能相关的模块、依赖和插入点。\n2. 只读取需要确认行为的具体源码文件。\n3. 当代码图推断与 OpenSpec 产物或 AGENTS.md 冲突时,优先相信 OpenSpec 产物和 AGENTS.md。\n4. 如果代码图缺失、过期或不完整,回退到普通仓库检查。\n\n生成 OpenSpec 产物时:\n\n- 用代码图上下文让 proposal、design、specs 和 tasks 更精确。\n- 当代码图已经缩小相关范围时,避免大范围仓库扫描。\n- 所有生成产物仍写入正常的 OpenSpec change 目录。\n`;\n}\n\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"./cli/context.js\";\nimport { atomicWrite } from \"./fs/index.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"./gitnexus.js\";\n\nconst MAX_SOURCE_CONTEXT = 8000;\nconst MAX_GRAPH_OUTPUT = 20000;\n\nexport interface GraphContextResult {\n generated: boolean;\n path: string | null;\n query: string | null;\n warnings: string[];\n}\n\nexport async function buildProjectGraphContext(\n ctx: FetCommandContext,\n state: GitNexusState,\n trigger: string\n): Promise<GraphContextResult> {\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: [\"GitNexus graph exists check did not pass; project graph context was not generated.\"]\n };\n }\n\n const query = \"FET OpenSpec workflow architecture commands adapters graph integration project structure\";\n const goal = \"Summarize the repository modules, workflow entry points, and likely insertion points for future FET/OpenSpec work.\";\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const status = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n const warnings = commandWarnings([[\"gitnexus query\", graphQuery], [\"gitnexus status\", status]]);\n const relativePath = \".fet/graph-context/project.md\";\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderProjectContext({\n trigger,\n state,\n query,\n goal,\n status: commandText(status),\n graphOutput: commandText(graphQuery),\n warnings\n })\n );\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nexport async function buildWorkflowGraphContext(\n ctx: FetCommandContext,\n options: { command: string; args: string[]; changeId: string | null }\n): Promise<GraphContextResult> {\n const existing = await ctx.stateStore.getOrCreateGlobal();\n if (!existing.graph?.gitnexus?.graphExists) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const state = await refreshGitNexusState(ctx);\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const sourceContext = await collectOpenSpecContext(ctx.projectRoot, options.changeId);\n const query = buildWorkflowQuery(options, sourceContext);\n const goal = workflowGoal(options.command);\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const detectChanges = shouldDetectChanges(options.command)\n ? await runGitNexus([\"detect-changes\", \"--scope\", \"all\"], { cwd: ctx.projectRoot })\n : null;\n const warnings = commandWarnings([\n [\"gitnexus query\", graphQuery],\n ...(detectChanges ? ([[\"gitnexus detect-changes\", detectChanges]] as const) : [])\n ]);\n const relativePath = `.fet/graph-context/${sanitizePathPart(options.changeId ?? options.command)}.md`;\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderWorkflowContext({\n state,\n command: options.command,\n args: options.args,\n changeId: options.changeId,\n query,\n goal,\n sourceContext,\n graphOutput: commandText(graphQuery),\n detectChanges: detectChanges ? commandText(detectChanges) : null,\n warnings\n })\n );\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...state,\n workflowContextPath: relativePath,\n workflowContextUpdatedAt: new Date().toISOString(),\n lastWorkflowGraphQuery: query\n };\n await ctx.stateStore.writeGlobal(global);\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nasync function refreshGitNexusState(ctx: FetCommandContext): Promise<GitNexusState> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n const state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n return state;\n}\n\nfunction isGraphReadable(state: GitNexusState): boolean {\n return Boolean(state.installed && state.graphExists);\n}\n\nasync function writeGraphContext(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderProjectContext(options: {\n trigger: string;\n state: GitNexusState;\n query: string;\n goal: string;\n status: string;\n graphOutput: string;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: project\nFET:END -->\n\n# FET GitNexus Project Graph Context\n\nGenerated at: ${new Date().toISOString()}\nTrigger: ${options.trigger}\n\nUse this file before broad repository scans in FET/OpenSpec work. Treat it as graph-derived context: confirm concrete behavior by reading the source files it points to.\n\n## Graph State\n\n- Provider: GitNexus\n- Installed: ${options.state.installed ? \"yes\" : \"no\"}\n- Version: ${options.state.version ?? \"unknown\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${options.state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## GitNexus Status\n\n\\`\\`\\`text\n${clip(options.status, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n\n## Project Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWorkflowContext(options: {\n state: GitNexusState;\n command: string;\n args: string[];\n changeId: string | null;\n query: string;\n goal: string;\n sourceContext: string;\n graphOutput: string;\n detectChanges: string | null;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: workflow\nFET:END -->\n\n# FET GitNexus Workflow Graph Context\n\nGenerated at: ${new Date().toISOString()}\n\nRead this before editing or generating OpenSpec artifacts for this workflow. Use the graph output to narrow likely files, symbols, dependencies, and impact areas. If it conflicts with OpenSpec artifacts or source code, OpenSpec artifacts and source code win.\n\n## Workflow\n\n- FET command: ${options.command}\n- Args: ${options.args.length ? options.args.join(\" \") : \"(none)\"}\n- Change: ${options.changeId ?? \"(none)\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## OpenSpec Context Used For Query\n\n\\`\\`\\`text\n${clip(options.sourceContext || \"(no change artifacts found yet)\", MAX_SOURCE_CONTEXT)}\n\\`\\`\\`\n\n## GitNexus Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${options.detectChanges ? `\n## GitNexus Change Impact\n\n\\`\\`\\`text\n${clip(options.detectChanges, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n` : \"\"}\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWarnings(warnings: string[]): string {\n if (!warnings.length) {\n return \"\";\n }\n return `\n## Warnings\n\n${warnings.map((warning) => `- ${warning}`).join(\"\\n\")}\n`;\n}\n\nasync function collectOpenSpecContext(projectRoot: string, changeId: string | null): Promise<string> {\n if (!changeId) {\n return \"\";\n }\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const chunks: string[] = [];\n for (const file of [\"proposal.md\", \"design.md\", \"tasks.md\", \"README.md\"]) {\n const content = await readOptional(join(changeRoot, file));\n if (content) {\n chunks.push(`## ${file}\\n${content}`);\n }\n }\n\n const specsRoot = join(changeRoot, \"specs\");\n for (const spec of await listSpecFiles(specsRoot)) {\n const content = await readOptional(spec.path);\n if (content) {\n chunks.push(`## ${spec.label}\\n${content}`);\n }\n }\n\n return clip(chunks.join(\"\\n\\n\"), MAX_SOURCE_CONTEXT);\n}\n\nasync function listSpecFiles(specsRoot: string): Promise<Array<{ path: string; label: string }>> {\n try {\n const capabilities = await readdir(specsRoot, { withFileTypes: true });\n return capabilities\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n path: join(specsRoot, entry.name, \"spec.md\"),\n label: `specs/${entry.name}/spec.md`\n }));\n } catch {\n return [];\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction buildWorkflowQuery(options: { command: string; args: string[]; changeId: string | null }, sourceContext: string): string {\n const artifactTerms = normalizeWhitespace(sourceContext).slice(0, 1200);\n return normalizeWhitespace(\n [\n `FET OpenSpec ${options.command}`,\n options.changeId ? `change ${options.changeId}` : \"\",\n options.args.join(\" \"),\n artifactTerms\n ].join(\" \")\n );\n}\n\nfunction workflowGoal(command: string): string {\n if (command === \"apply\") {\n return \"Find implementation files, symbols, dependencies, and likely blast radius for the current OpenSpec tasks.\";\n }\n if (command === \"verify\") {\n return \"Find affected flows and source areas that should be checked while verifying this OpenSpec change.\";\n }\n if ([\"explore\", \"propose\", \"new\", \"continue\", \"ff\"].includes(command)) {\n return \"Find relevant modules, entry points, and existing behavior to make OpenSpec artifacts precise.\";\n }\n return \"Find relevant repository context for this FET/OpenSpec workflow command.\";\n}\n\nfunction shouldDetectChanges(command: string): boolean {\n return [\"apply\", \"verify\", \"sync\"].includes(command);\n}\n\nfunction commandText(result: Awaited<ReturnType<typeof runGitNexus>>): string {\n const output = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join(\"\\n\");\n return output || `exit ${result.exitCode}`;\n}\n\nfunction commandWarnings(results: ReadonlyArray<readonly [string, Awaited<ReturnType<typeof runGitNexus>>]>): string[] {\n return results\n .filter(([, result]) => result.exitCode !== 0)\n .map(([label, result]) => `${label} exited with ${result.exitCode}: ${firstLine(commandText(result))}`);\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || \"no output\";\n}\n\nfunction clip(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, max)}\\n\\n[truncated ${value.length - max} characters]`;\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizePathPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"workflow\";\n}\n","import { 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, language: FetLanguage = \"zh-CN\"): string {\n const block = renderManagedBlock(renderKarpathyClaudeGuidelines(language));\n if (!existing || !existing.trim()) {\n return `${block}\\n`;\n }\n\n const start = existing.indexOf(BEGIN);\n const end = existing.indexOf(END);\n if (start !== -1 && end !== -1 && end > start) {\n return `${existing.slice(0, start)}${block}${existing.slice(end + END.length)}`;\n }\n\n return `${existing.replace(/\\s*$/, \"\")}\\n\\n${block}\\n`;\n}\n\nexport function renderKarpathyCursorRule(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Andrej Karpathy inspired coding guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\nalwaysApply: true\n---\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nexport function renderKarpathyFetHandoff(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nfunction renderManagedBlock(content: string): string {\n return `${BEGIN}\n${content}\n${END}`;\n}\n\nfunction renderKarpathyClaudeGuidelines(language: FetLanguage): string {\n return `# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}`;\n}\n\nexport function renderKarpathyGuidelinesBody(language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderKarpathyGuidelinesBodyEn();\n }\n return `来源:${KARPATHY_SKILLS_SOURCE}\n\n将这些项目级指南与 AGENTS.md、OpenSpec 产物和用户最新请求一起使用。\n\n## 编码前先思考\n\n- 编辑前说明重要假设。\n- 当歧义会改变实现时,先澄清。\n- 主动呈现取舍,不要静默选择高风险路径。\n- 当更简单的方案更适合请求时,明确提出。\n\n## 简洁优先\n\n- 用最小且清晰的改动解决请求的问题。\n- 避免猜测性功能、配置或抽象。\n- 不要为一次性代码创建抽象。\n- 优先删除自己改动引入的复杂度,而不是继续堆结构。\n\n## 精准编辑\n\n- 只修改直接服务于任务的文件和行。\n- 保持现有风格,即便你个人更偏好另一种模式。\n- 除非任务需要,不要顺手重构附近代码、注释或格式。\n- 只移除因自己改动而过时的死导入、变量或 helper。\n\n## 目标驱动执行\n\n- 把模糊工作转成具体成功标准。\n- 对 bug,优先准备复现测试或清晰验证,再做修复。\n- 对多步骤工作,保留简短计划并验证每个有意义的步骤。\n- 持续迭代,直到达到成功标准或明确遇到阻塞。\n\n这些指南在非平凡工作中刻意偏向谨慎而不是速度。明显的一行修复可以灵活判断,保持轻量。`;\n}\n\nfunction renderKarpathyGuidelinesBodyEn(): string {\n return `Source: ${KARPATHY_SKILLS_SOURCE}\n\nUse these project-level guidelines together with AGENTS.md, OpenSpec artifacts, and the user's latest request.\n\n## Think Before Coding\n\n- State important assumptions before editing.\n- Ask for clarification when ambiguity would change the implementation.\n- Surface tradeoffs instead of silently choosing a risky path.\n- Push back when a simpler approach better fits the request.\n\n## Simplicity First\n\n- Solve the requested problem with the smallest clear change.\n- Avoid speculative features, configuration, or abstraction.\n- Do not create abstractions for one-off code.\n- Prefer deleting complexity introduced by your own change over adding more structure.\n\n## Precise Edits\n\n- Touch only files and lines that directly serve the task.\n- Preserve existing style even when you personally prefer another pattern.\n- Do not refactor nearby code, comments, or formatting unless the task requires it.\n- Remove only dead imports, variables, or helpers made obsolete by your own change.\n\n## Goal-Driven Execution\n\n- Convert vague work into concrete success criteria.\n- For bugs, prefer a reproducing test or clear verification before the fix.\n- For multi-step work, keep a short plan and verify each meaningful step.\n- Continue iterating until the success criteria are met or a blocker is explicit.\n\nThese guidelines intentionally favor caution over speed for non-trivial work. For obvious one-line fixes, use judgment and stay lightweight.`;\n}\n","import { FET_VERSION } from \"../version.js\";\n\nexport function renderVerifyInstructions(changeId: string, generatedAt = new Date().toISOString()): string {\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${generatedAt}\nchangeId: ${changeId}\npurpose: manual-verify\n---\n\n# Verify Instructions\n\n请按顺序完成以下检查:\n\n1. 运行 OpenSpec 规范校验:\\`openspec verify\\`\n2. 按项目约定运行 lint、typecheck、test。\n3. 检查本次 change 的 \\`tasks.md\\` 是否与实现状态一致。\n\n完成后运行:\n\n\\`\\`\\`sh\nfet verify --done --change ${changeId}\n\\`\\`\\`\n`;\n}\n","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 { createInterface } from \"node:readline/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { mergeFetConfig } from \"../config/index.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, createBackup, withProjectLock } from \"../fs/index.js\";\nimport {\n hasInvalidManagedAutoRegion,\n hasManagedAutoRegion,\n mergeKarpathyClaudeMd,\n renderAgentsMd,\n renderFetConfig,\n renderKarpathyCursorRule,\n renderKarpathyFetHandoff,\n replaceManagedRegion\n} from \"../templates/index.js\";\n\nexport async function updateContextCommand(ctx: FetCommandContext): Promise<void> {\n let contextResult: { warnings: string[] } = { warnings: [] };\n await withProjectLock(ctx.projectRoot, { command: \"update-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n contextResult = await updateContextFiles(ctx);\n });\n\n ctx.output.result({\n ok: true,\n command: \"update-context\",\n summary:\n ctx.language === \"en\"\n ? \"Updated FET-managed regions in AGENTS.md and openspec/config.yaml.\"\n : \"已更新 AGENTS.md 与 openspec/config.yaml 中的 FET 托管区域。\",\n warnings: contextResult.warnings\n });\n}\n\nexport async function updateContextFiles(ctx: FetCommandContext): Promise<{ warnings: string[] }> {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const agentsPath = join(ctx.projectRoot, \"AGENTS.md\");\n const configPath = join(ctx.projectRoot, \"openspec\", \"config.yaml\");\n const claudePath = join(ctx.projectRoot, \"CLAUDE.md\");\n const karpathyHandoffPath = join(ctx.projectRoot, \".fet\", \"karpathy-guidelines.md\");\n const karpathyCursorPath = join(ctx.projectRoot, \".cursor\", \"rules\", \"karpathy-guidelines.mdc\");\n\n const existingAgents = await readOptional(agentsPath);\n const existingClaude = await readOptional(claudePath);\n const existingKarpathyCursor = await readOptional(karpathyCursorPath);\n const warnings = [...scan.warnings];\n\n if (existingAgents && hasInvalidManagedAutoRegion(existingAgents)) {\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: ctx.language === \"en\" ? \"AGENTS.md FET managed markers are broken or duplicated.\" : \"AGENTS.md 的 FET 托管标记损坏或重复。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Manually repair FET:BEGIN AUTO / FET:END AUTO markers, then rerun.\"\n : \"手动修复 FET:BEGIN AUTO / FET:END AUTO 标记后重试。\"\n });\n }\n\n if (existingAgents && !hasManagedAutoRegion(existingAgents)) {\n if (!ctx.yes && !(await confirmInitCanReplaceUnmanagedAgents(ctx))) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message:\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and does not contain a FET-managed region.\"\n : \"AGENTS.md 已存在,且不包含 FET 托管区域。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.command === \"init\"\n ? ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet init --yes.\"\n : \"确认可备份并替换后运行 fet init --yes。\"\n : ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet update-context --yes.\"\n : \"确认可备份并替换后运行 fet update-context --yes。\"\n });\n }\n const backupPath = await createBackup(agentsPath);\n if (backupPath) {\n warnings.push(ctx.language === \"en\" ? `Backed up unmanaged AGENTS.md to ${backupPath}` : `已将非托管 AGENTS.md 备份到 ${backupPath}`);\n }\n }\n\n await atomicWrite(agentsPath, replaceManagedRegion(existingAgents, renderAgentsMd(scan, ctx.language)));\n await atomicWrite(configPath, await mergeFetConfig(configPath, renderFetConfig(scan, ctx.language)));\n await atomicWrite(claudePath, mergeKarpathyClaudeMd(existingClaude, ctx.language));\n await atomicWrite(karpathyHandoffPath, renderKarpathyFetHandoff(ctx.language));\n if (!existingKarpathyCursor || existingKarpathyCursor.includes(\"FET:MANAGED\")) {\n await atomicWrite(karpathyCursorPath, renderKarpathyCursorRule(ctx.language));\n } else {\n warnings.push(\n ctx.language === \"en\"\n ? \".cursor/rules/karpathy-guidelines.mdc exists and is not managed by FET; leaving it unchanged.\"\n : \".cursor/rules/karpathy-guidelines.mdc 已存在且不由 FET 托管,已保持不变。\"\n );\n }\n\n const placeholderCount = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (placeholderCount > 0) {\n warnings.push(renderAgentsPlaceholderWarning(placeholderCount, ctx.language));\n }\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.context = {\n agentsMdUpdatedAt: scan.generatedAt,\n configUpdatedAt: scan.generatedAt,\n scannerVersion: scan.scannerVersion\n };\n await ctx.stateStore.writeGlobal(state);\n\n return { warnings };\n}\n\nasync function confirmInitCanReplaceUnmanagedAgents(ctx: FetCommandContext): Promise<boolean> {\n if (ctx.command !== \"init\" || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and is not managed by FET. Continue now with the same effect as fet init --yes? [y/N] \"\n : \"AGENTS.md 已存在且不由 FET 托管。是否继续执行,效果等同于 fet init --yes?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"y\" || answer === \"yes\") {\n return true;\n }\n } finally {\n rl.close();\n }\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? \"fet init cancelled so you can handle AGENTS.md manually.\"\n : \"已取消 fet init,你可以先手动处理 AGENTS.md。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Review AGENTS.md, then rerun fet init or fet init --yes.\"\n : \"检查 AGENTS.md 后,手动重新运行 fet init 或 fet init --yes。\"\n });\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parseDocument } from \"yaml\";\n\nexport async function mergeFetConfig(configPath: string, renderedFetYaml: string): Promise<string> {\n const fetDoc = parseDocument(renderedFetYaml);\n const nextFet = fetDoc.get(\"fet\", true);\n\n let existing = \"\";\n try {\n existing = await readFile(configPath, \"utf8\");\n } catch {\n return renderedFetYaml;\n }\n\n const doc = parseDocument(existing || \"{}\");\n doc.set(\"fet\", nextFet);\n return doc.toString();\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { buildWorkflowGraphContext, type GraphContextResult } from \"../graph-context.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\n\nconst phaseByCommand: Record<string, ChangePhase> = {\n explore: \"explore\",\n propose: \"propose\",\n new: \"propose\",\n continue: \"propose\",\n ff: \"propose\",\n apply: \"implement\",\n verify: \"verify\",\n sync: \"sync\",\n archive: \"archive\",\n \"bulk-archive\": \"archive\",\n onboard: \"explore\"\n};\n\nexport async function proxyCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n await artifactWorkflowCommand(ctx, command, args);\n return;\n }\n if (command === \"apply\") {\n await applyWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"explore\") {\n await exploreWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"sync\") {\n await syncWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"bulk-archive\") {\n await bulkArchiveWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"onboard\") {\n await onboardWorkflowCommand(ctx);\n return;\n }\n\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n await assertOpenSpecCommandSupported(ctx, mapped.command, command);\n const mappedChangeId = extractChangeId(mapped.args);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? mappedChangeId) : (ctx.changeId ?? mappedChangeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: mapped.args,\n changeId: targetChangeId\n });\n\n const changelogEntry = command === \"archive\" && targetChangeId ? await createChangelogEntry(ctx.projectRoot, targetChangeId) : null;\n const result = await ctx.openSpec.run(mapped.command, mapped.args, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result,\n recoverable: true\n });\n }\n\n if (changelogEntry) {\n await appendChangelog(ctx.projectRoot, changelogEntry);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (command === \"archive\") {\n if (!state.activeChangeId || state.activeChangeId === targetChangeId || !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n } else if (ctx.changeId && inspection.changes.includes(ctx.changeId)) {\n state.activeChangeId = ctx.changeId;\n } else if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n } else if (!state.activeChangeId && inspection.changes.length === 1) {\n state.activeChangeId = inspection.changes[0] ?? null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n const changeId = ctx.changeId ?? state.activeChangeId;\n if (changeId && inspection.changes.includes(changeId)) {\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n changeState.currentPhase = phaseByCommand[command] ?? changeState.currentPhase;\n changeState.phases[changeState.currentPhase] = {\n status: \"done\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: mapped.command,\n args: mapped.args,\n exitCode: result.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n }\n });\n\n const graphContext = runState.graphContext;\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} completed.`,\n warnings: graphContext?.warnings,\n nextSteps: graphContext?.generated && graphContext.path ? [`Read ${graphContext.path} before broad source scans or implementation decisions.`] : undefined,\n data: graphContext ? { graphContext } : undefined\n });\n}\n\ntype ArtifactWorkflowCommand = \"propose\" | \"continue\" | \"ff\";\n\ninterface OpenSpecArtifactStatus {\n id: string;\n outputPath: string;\n status: string;\n missingDeps?: string[];\n}\n\nasync function applyWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command: \"apply\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", \"apply\");\n await assertOpenSpecCommandSupported(ctx, \"instructions\", \"apply\");\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"apply\",\n args: [\"tasks\", \"--change\", changeId],\n changeId\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const tasks = status.artifacts?.find((artifact) => artifact.id === \"tasks\");\n const warnings =\n tasks && tasks.status !== \"complete\" && tasks.status !== \"ready\"\n ? [`OpenSpec reports tasks artifact as \"${tasks.status}\". Finish planning artifacts before implementation if tasks.md is missing.`]\n : undefined;\n\n const instructions = await runInstructions(ctx, changeId, \"tasks\");\n await syncWorkflowState(ctx, \"apply\", changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [\"tasks\", \"--change\", changeId],\n exitCode: instructions.exitCode,\n phaseStatus: \"in_progress\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"apply\",\n summary: `fet apply prepared implementation instructions for change \"${changeId}\".`,\n warnings: [...(runState.graphContext?.warnings ?? []), ...(warnings ?? [])],\n nextSteps: [\n `Read openspec/changes/${changeId}/tasks.md and the instructions output.`,\n \"Implement pending tasks and update task checkboxes only after the work is done.\",\n `Run fet verify --change ${changeId}`\n ],\n data: {\n changeId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext\n }\n });\n });\n}\n\nasync function exploreWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const changeId = ctx.changeId ?? (openSpecArgs[0] && isKebabId(openSpecArgs[0]) ? openSpecArgs[0] : null);\n const graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"explore\",\n args: openSpecArgs,\n changeId\n });\n\n ctx.output.result({\n ok: true,\n command: \"explore\",\n summary: \"fet explore is an IDE-guided workflow for shaping OpenSpec changes.\",\n warnings: graphContext.warnings,\n nextSteps: [\n \"Discuss the requirement, constraints, and acceptance criteria with the user.\",\n changeId ? `Run fet continue --change ${changeId} when ready to create the next artifact.` : \"Run fet propose <change-id-or-description> when ready to create a change.\"\n ],\n data: { changeId, args: openSpecArgs, graphContext }\n });\n}\n\nasync function syncWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const openSpecArgs = stripFetOptions(args);\n\n await withProjectLock(ctx.projectRoot, { command: \"sync\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertVerifiedChange(ctx, changeId);\n await assertOpenSpecCommandSupported(ctx, \"validate\", \"sync\");\n\n const validateArgs = [changeId, \"--type\", \"change\", ...openSpecArgs.filter((arg) => arg !== changeId)];\n const result = await ctx.openSpec.run(\"validate\", validateArgs, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec validate failed during fet sync.\",\n details: result,\n recoverable: true\n });\n }\n\n await syncWorkflowState(ctx, \"sync\", changeId, {\n openSpecCommand: \"validate\",\n openSpecArgs: validateArgs,\n exitCode: result.exitCode,\n phaseStatus: \"done\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"sync\",\n summary: `fet sync validated change \"${changeId}\". OpenSpec 1.3.x applies spec updates during archive.`,\n nextSteps: [`Run fet archive --change ${changeId} when you are ready to archive and update main specs.`],\n data: ctx.json ? { changeId, validate: result } : { changeId }\n });\n });\n}\n\nasync function bulkArchiveWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const targets = [...new Set([...(ctx.changeId ? [ctx.changeId] : []), ...openSpecArgs.filter((arg) => !arg.startsWith(\"-\"))])];\n if (!targets.length) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"fet bulk-archive requires explicit change ids with the current OpenSpec CLI.\",\n suggestedCommand: \"fet bulk-archive --change <change-id>\"\n });\n }\n\n await withProjectLock(ctx.projectRoot, { command: \"bulk-archive\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"archive\", \"bulk-archive\");\n const archived: string[] = [];\n for (const changeId of targets) {\n await assertVerifiedChange(ctx, changeId);\n const changelogEntry = await createChangelogEntry(ctx.projectRoot, changeId);\n const result = await ctx.openSpec.run(\"archive\", [changeId], { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec archive failed for \"${changeId}\".`,\n details: result,\n recoverable: true\n });\n }\n await appendChangelog(ctx.projectRoot, changelogEntry);\n archived.push(changeId);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"bulk-archive\",\n summary: `fet bulk-archive archived ${archived.length} change(s) via OpenSpec archive.`,\n nextSteps: inspection.changes.length ? [`Remaining open changes: ${inspection.changes.join(\", \")}`] : undefined,\n data: { archived, openChangeIds: inspection.changes }\n });\n });\n}\n\nasync function onboardWorkflowCommand(ctx: FetCommandContext): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"onboard\",\n summary: \"fet onboard loaded local FET/OpenSpec workflow context.\",\n nextSteps: [\n inspection.changes.length ? `Open changes: ${inspection.changes.join(\", \")}` : \"No open changes found. Run fet propose <change-id-or-description> to start one.\",\n \"Use fet continue to prepare planning artifacts, fet apply for implementation instructions, fet verify before archive.\"\n ],\n data: { activeChangeId: state.activeChangeId, openChangeIds: inspection.changes, archivedChangeIds: inspection.archived }\n });\n}\n\ninterface OpenSpecStatusResult {\n changeName: string;\n schemaName?: string;\n isComplete?: boolean;\n applyRequires?: string[];\n artifacts?: OpenSpecArtifactStatus[];\n}\n\nasync function artifactWorkflowCommand(ctx: FetCommandContext, command: ArtifactWorkflowCommand, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", command);\n await assertOpenSpecCommandSupported(ctx, \"instructions\", command);\n if (command === \"propose\") {\n await assertOpenSpecCommandSupported(ctx, \"new\", command);\n }\n\n const changeId = command === \"propose\" ? await ensureProposedChange(ctx, openSpecArgs) : await requireChangeId(ctx);\n const artifactId = command === \"continue\" ? await resolveArtifactId(ctx, changeId, openSpecArgs[0]) : await resolveArtifactId(ctx, changeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: artifactId ? [artifactId, \"--change\", changeId] : [\"--change\", changeId],\n changeId\n });\n\n const instructions = await runInstructions(ctx, changeId, artifactId);\n await syncWorkflowState(ctx, command, changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [artifactId, \"--change\", changeId],\n exitCode: instructions.exitCode\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} prepared OpenSpec artifact \"${artifactId}\" for change \"${changeId}\".`,\n warnings: runState.graphContext?.warnings,\n nextSteps: [\n `Create or update openspec/changes/${changeId}/${resolveOutputPath(status, artifactId)}`,\n \"Review the artifact with the user before generating the next planning file.\",\n `Run fet passthrough status --change ${changeId}`,\n status.isComplete ? `Run fet apply --change ${changeId}` : `Run fet continue --change ${changeId} when ready for the next artifact`\n ],\n data: {\n changeId,\n artifactId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext\n }\n });\n });\n}\n\nasync function ensureProposedChange(ctx: FetCommandContext, args: string[]): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const existing = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const explicit = args[0];\n if (!explicit) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id or short description is required for fet propose.\",\n suggestedCommand: \"fet propose <change-id-or-description>\"\n });\n }\n\n const input = args.join(\" \").trim();\n const changeId = isKebabId(input) ? input : toKebabId(input);\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"Unable to derive a valid OpenSpec change id from the proposal input.\",\n details: { input },\n suggestedCommand: \"fet propose <kebab-case-change-id>\"\n });\n }\n\n if (existing.changes.includes(changeId)) {\n return changeId;\n }\n\n const createArgs = [\"change\", changeId];\n if (input && input !== changeId) {\n createArgs.push(\"--description\", input);\n }\n const result = await ctx.openSpec.run(\"new\", createArgs, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec new change failed.\",\n details: result,\n recoverable: true\n });\n }\n return changeId;\n}\n\nasync function resolveArtifactId(ctx: FetCommandContext, changeId: string, requestedArtifactId?: string): Promise<string> {\n const status = await readOpenSpecStatus(ctx, changeId);\n const artifacts = status.artifacts ?? [];\n if (requestedArtifactId) {\n const requested = artifacts.find((artifact) => artifact.id === requestedArtifactId);\n if (!requested) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" was not found for change \"${changeId}\".`,\n details: { changeId, requestedArtifactId, artifacts: artifacts.map((artifact) => artifact.id) },\n suggestedCommand: `fet passthrough status --change ${changeId} --json`\n });\n }\n if (requested.status !== \"ready\" && requested.status !== \"complete\") {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" is ${requested.status}, not ready.`,\n details: { changeId, requestedArtifactId, missingDeps: requested.missingDeps },\n suggestedCommand: `fet continue --change ${changeId}`\n });\n }\n return requestedArtifactId;\n }\n\n const next = artifacts.find((artifact) => artifact.status === \"ready\");\n if (!next) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `No ready OpenSpec artifact was found for change \"${changeId}\".`,\n details: { changeId, artifacts },\n suggestedCommand: status.isComplete ? `fet apply --change ${changeId}` : `fet passthrough status --change ${changeId} --json`\n });\n }\n return next.id;\n}\n\nasync function readOpenSpecStatus(ctx: FetCommandContext, changeId: string): Promise<OpenSpecStatusResult> {\n const result = await ctx.openSpec.run(\"status\", [\"--change\", changeId, \"--json\"], { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec status failed.\",\n details: result,\n recoverable: true\n });\n }\n try {\n return parseOpenSpecJson(result.stdout ?? \"{}\") as OpenSpecStatusResult;\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec status JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function runInstructions(ctx: FetCommandContext, changeId: string, artifactId: string): Promise<{ exitCode: number; data: unknown }> {\n const args = [artifactId, \"--change\", changeId, ...(ctx.json ? [\"--json\"] : [])];\n const result = await ctx.openSpec.run(\"instructions\", args, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.stdout && !ctx.json) {\n process.stdout.write(result.stdout.endsWith(\"\\n\") ? result.stdout : `${result.stdout}\\n`);\n }\n if (result.stderr && !ctx.json) {\n process.stderr.write(result.stderr.endsWith(\"\\n\") ? result.stderr : `${result.stderr}\\n`);\n }\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec instructions failed.\",\n details: result,\n recoverable: true\n });\n }\n if (!ctx.json) {\n return { exitCode: result.exitCode, data: null };\n }\n try {\n return { exitCode: result.exitCode, data: parseOpenSpecJson(result.stdout ?? \"{}\") };\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec instructions JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function syncWorkflowState(\n ctx: FetCommandContext,\n command: string,\n changeId: string,\n lastOpenSpecCommand: { openSpecCommand: string; openSpecArgs: string[]; exitCode: number; phaseStatus?: \"in_progress\" | \"done\" }\n): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (inspection.changes.includes(changeId)) {\n state.activeChangeId = changeId;\n }\n await ctx.stateStore.writeGlobal(state);\n\n if (!inspection.changes.includes(changeId)) {\n return;\n }\n\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n const phase = phaseByCommand[command] ?? \"propose\";\n changeState.currentPhase = phase;\n changeState.phases[phase] = {\n status: lastOpenSpecCommand.phaseStatus ?? \"in_progress\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: lastOpenSpecCommand.openSpecCommand,\n args: lastOpenSpecCommand.openSpecArgs,\n exitCode: lastOpenSpecCommand.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n}\n\nfunction resolveOutputPath(status: OpenSpecStatusResult, artifactId: string): string {\n return status.artifacts?.find((artifact) => artifact.id === artifactId)?.outputPath ?? `${artifactId}.md`;\n}\n\nfunction isKebabId(value: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);\n}\n\nfunction toKebabId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction parseOpenSpecJson(stdout: string): unknown {\n const trimmed = stdout.trim();\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n const starts = [objectStart, arrayStart].filter((index) => index >= 0);\n if (!starts.length) {\n return JSON.parse(trimmed || \"{}\");\n }\n return JSON.parse(trimmed.slice(Math.min(...starts)));\n}\n\nasync function assertOpenSpecCommandSupported(ctx: FetCommandContext, openSpecCommand: string, fetCommand: string): Promise<void> {\n const capabilities = await ctx.openSpec.getCapabilities();\n if (capabilities.commands.includes(openSpecCommand)) {\n return;\n }\n\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: `OpenSpec CLI ${capabilities.version} does not expose command \"${openSpecCommand}\" required by \"fet ${fetCommand}\". FET will not substitute another workflow command automatically.`,\n details: {\n openSpecVersion: capabilities.version,\n requiredCommand: openSpecCommand,\n availableCommands: capabilities.commands,\n supported: capabilities.supported\n },\n suggestedCommand:\n \"Upgrade OpenSpec to a version that supports this command, then rerun FET. Try: npm install -g @fission-ai/openspec@latest && fet doctor. If your OpenSpec version intentionally removed this command, pause and choose a compatible FET workflow instead of running ff automatically.\"\n });\n}\n\ninterface ChangelogEntry {\n updateTime: string;\n content: string;\n}\n\nasync function createChangelogEntry(projectRoot: string, changeId: string): Promise<ChangelogEntry> {\n return {\n updateTime: formatLocalTimestamp(new Date()),\n content: await readChangeRequirement(projectRoot, changeId)\n };\n}\n\nasync function appendChangelog(projectRoot: string, entry: ChangelogEntry): Promise<void> {\n const changelogPath = join(projectRoot, \"CHANGELOG.md\");\n const existing = await readOptional(changelogPath);\n const legacyContentLabel = \"\\u66f4\\u65b0\\u5185\\u5bb9\";\n const block = `updateTime: ${entry.updateTime}\\nchangeRequirement:${entry.content}\\n${legacyContentLabel}:${entry.content}\\n`;\n const next = existing?.trimEnd() ? `${existing.trimEnd()}\\n\\n${block}` : block;\n await atomicWrite(changelogPath, next);\n}\n\nasync function readChangeRequirement(projectRoot: string, changeId: string): Promise<string> {\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const proposal = await readOptional(join(changeRoot, \"proposal.md\"));\n if (proposal) {\n return summarizeMarkdown(proposal);\n }\n const readme = await readOptional(join(changeRoot, \"README.md\"));\n if (readme) {\n return summarizeMarkdown(readme);\n }\n return changeId;\n}\n\nfunction summarizeMarkdown(content: string): string {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"<!--\") && !line.startsWith(\"---\"))\n .join(\" \");\n return normalized || \"No change requirement found.\";\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction formatLocalTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport async function passthroughCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n const result = await ctx.openSpec.run(command, stripFetOptions(args), { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result\n });\n }\n}\n\nfunction stripFetOptions(args: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--cwd\" || arg === \"--change\") {\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--cwd=\") || arg?.startsWith(\"--change=\")) {\n continue;\n }\n if (arg === \"--yes\" || arg === \"--json\" || arg === \"--verbose\" || arg === \"--no-color\") {\n continue;\n }\n if (arg) {\n result.push(arg);\n }\n }\n return result;\n}\n\nasync function mapOpenSpecCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<{ command: string; args: string[] }> {\n switch (command) {\n case \"propose\":\n case \"bulk-archive\":\n case \"explore\":\n case \"onboard\":\n return { command, args: withGlobalChange(ctx, args) };\n case \"continue\":\n case \"ff\":\n return { command, args: await withDefaultChange(ctx, args, true) };\n case \"apply\":\n case \"sync\":\n return { command, args: await withDefaultChange(ctx, args) };\n case \"new\":\n return { command: \"new\", args: args[0] === \"change\" ? args : [\"change\", ...args] };\n case \"archive\":\n return { command: \"archive\", args: [ctx.changeId ?? args[0] ?? (await requireChangeId(ctx)), ...args.slice(ctx.changeId ? 0 : 1)] };\n default:\n return { command, args };\n }\n}\n\nfunction withGlobalChange(ctx: FetCommandContext, args: string[]): string[] {\n return ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args;\n}\n\nasync function withDefaultChange(ctx: FetCommandContext, args: string[], allowWithArgs = false): Promise<string[]> {\n if (ctx.changeId) {\n return [\"--change\", ctx.changeId, ...args];\n }\n if (args.includes(\"--change\") || args.some((arg) => arg.startsWith(\"--change=\"))) {\n return args;\n }\n if (args.length > 0 && !allowWithArgs) {\n return args;\n }\n return [\"--change\", await requireChangeId(ctx), ...args];\n}\n\nfunction extractChangeId(args: string[]): string | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--change\") {\n return args[index + 1] ?? null;\n }\n if (arg?.startsWith(\"--change=\")) {\n return arg.slice(\"--change=\".length) || null;\n }\n }\n return null;\n}\n\nasync function requireChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n const state = await ctx.stateStore.getOrCreateGlobal();\n if (state.activeChangeId) {\n return state.activeChangeId;\n }\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"No unambiguous OpenSpec change id was found.\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"Pass --change <change-id>.\"\n });\n}\n\nasync function assertVerified(ctx: FetCommandContext): Promise<void> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n const changeId = ctx.changeId ?? global.activeChangeId;\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id is required before this command can check FET verification.\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\n await assertVerifiedChange(ctx, changeId);\n}\n\nasync function assertVerifiedChange(ctx: FetCommandContext, changeId: string): Promise<void> {\n const change = await ctx.stateStore.readChange(changeId);\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (!inspection.changes.includes(changeId)) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"The selected change does not exist in openspec/changes.\",\n details: { changeId, openChangeIds: inspection.changes },\n suggestedCommand: \"fet doctor\"\n });\n }\n if (change?.manualVerify?.status !== \"declared_done\") {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"This change has not been marked verified by FET.\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { ProjectIdentity } from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function detectProjectIdentity(projectRoot: string): Promise<ProjectIdentity> {\n const [gitRoot, branch, headCommit] = await Promise.all([\n git(projectRoot, [\"rev-parse\", \"--show-toplevel\"]),\n git(projectRoot, [\"branch\", \"--show-current\"]),\n git(projectRoot, [\"rev-parse\", \"HEAD\"])\n ]);\n\n return {\n gitRoot,\n worktreePath: projectRoot,\n branch,\n headCommit\n };\n}\n\nasync function git(cwd: string, args: string[]): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { assertChangeState, assertGlobalState, createChangeState, createGlobalState } from \"./schema.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nexport class StateStore {\n constructor(\n private readonly projectRoot: string,\n private readonly fetVersion: string,\n private readonly project: ProjectIdentity\n ) {}\n\n async readGlobal(): Promise<GlobalState | null> {\n try {\n const value = JSON.parse(await readFile(this.globalPath(), \"utf8\"));\n assertGlobalState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateGlobal(): Promise<GlobalState> {\n return (await this.readGlobal()) ?? createGlobalState(this.fetVersion, this.project);\n }\n\n async writeGlobal(state: GlobalState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\"), { recursive: true });\n await atomicWrite(this.globalPath(), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n async readChange(changeId: string): Promise<ChangeState | null> {\n try {\n const value = JSON.parse(await readFile(this.changePath(changeId), \"utf8\"));\n assertChangeState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateChange(changeId: string, phase: ChangePhase): Promise<ChangeState> {\n return (await this.readChange(changeId)) ?? createChangeState(this.fetVersion, changeId, phase);\n }\n\n async writeChange(state: ChangeState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\", \"changes\", state.changeId), { recursive: true });\n await atomicWrite(this.changePath(state.changeId), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n private globalPath(): string {\n return join(this.projectRoot, \"openspec\", \"fet-state.json\");\n }\n\n private changePath(changeId: string): string {\n return join(this.projectRoot, \"openspec\", \"changes\", changeId, \"fet-state.json\");\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n","export const DEFAULT_LANGUAGE = \"zh-CN\" as const;\n\nexport type FetLanguage = \"zh-CN\" | \"en\";\n\nexport interface LanguageState {\n current: FetLanguage;\n updatedAt: string;\n}\n\nexport function normalizeLanguage(value: string | null | undefined): FetLanguage {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return DEFAULT_LANGUAGE;\n }\n if ([\"en\", \"en-us\", \"english\"].includes(normalized)) {\n return \"en\";\n }\n return DEFAULT_LANGUAGE;\n}\n\nexport function languageLabel(language: FetLanguage): string {\n return language === \"en\" ? \"English\" : \"中文\";\n}\n\nexport function languageInstruction(language: FetLanguage): string {\n return language === \"en\"\n ? \"Use English for FET interaction messages, generated handoff documents, and IDE prompt output unless the user asks otherwise.\"\n : \"除非用户另有明确要求,FET 的交互信息、生成的交接文档和 IDE 提示产出均使用中文。\";\n}\n","import { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { DEFAULT_LANGUAGE } from \"../language.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nconst phases: ChangePhase[] = [\"explore\", \"propose\", \"implement\", \"verify\", \"sync\", \"archive\"];\n\nexport function createGlobalState(fetVersion: string, project: ProjectIdentity): GlobalState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n createdAt: now,\n updatedAt: now,\n project,\n language: {\n current: DEFAULT_LANGUAGE,\n updatedAt: now\n },\n openspec: null,\n activeChangeId: null,\n openChangeIds: [],\n context: {\n agentsMdUpdatedAt: null,\n configUpdatedAt: null,\n scannerVersion: 1\n },\n toolAdapters: {},\n graph: {},\n verifyAuthorization: null,\n lastDoctor: null\n };\n}\n\nexport function createChangeState(fetVersion: string, changeId: string, phase: ChangePhase): ChangeState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n changeId,\n createdAt: now,\n updatedAt: now,\n currentPhase: phase,\n phases: Object.fromEntries(phases.map((item) => [item, { status: item === phase ? \"in_progress\" : \"not_started\" }])) as ChangeState[\"phases\"],\n tasks: {\n source: \"tasks.md\",\n completedIds: [],\n lastSyncedAt: null\n },\n manualVerify: null,\n lastOpenSpecCommand: null,\n warnings: []\n };\n}\n\nexport function assertGlobalState(value: unknown): asserts value is GlobalState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"全局状态 schema 不受支持\");\n }\n if (!isRecord(value.language)) {\n value.language = {\n current: DEFAULT_LANGUAGE,\n updatedAt: typeof value.updatedAt === \"string\" ? value.updatedAt : new Date().toISOString()\n };\n }\n if (typeof value.fetVersion !== \"string\" || !isRecord(value.project)) {\n throw corruptedState(\"全局状态缺少必填字段\");\n }\n}\n\nexport function assertChangeState(value: unknown): asserts value is ChangeState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"变更状态 schema 不受支持\");\n }\n if (typeof value.fetVersion !== \"string\" || typeof value.changeId !== \"string\") {\n throw corruptedState(\"变更状态缺少必填字段\");\n }\n}\n\nfunction unsupportedSchema(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateSchemaUnsupported,\n message,\n suggestedCommand: \"npm update -g @nick848/fet\"\n });\n}\n\nfunction corruptedState(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateCorrupted,\n message,\n suggestedCommand: \"fet doctor --fix\"\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readCompletedTaskIds(tasksPath: string): Promise<string[]> {\n let content: string;\n try {\n content = await readFile(tasksPath, \"utf8\");\n } catch {\n return [];\n }\n\n const completed: string[] = [];\n const pattern = /^\\s*[-*]\\s+\\[[xX]\\]\\s+([0-9]+(?:\\.[0-9]+)*)/gm;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content))) {\n if (match[1]) {\n completed.push(match[1]);\n }\n }\n return completed;\n}\n","import { spawn } from \"node:child_process\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nconst DEFAULT_PACKAGE_NAME = \"@nick848/fet\";\n\ninterface NpmRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal: NodeJS.Signals | null;\n stdout?: string;\n stderr?: string;\n}\n\nexport async function updateCommand(ctx: FetCommandContext): Promise<void> {\n const packageName = process.env.FET_UPDATE_PACKAGE_NAME ?? DEFAULT_PACKAGE_NAME;\n const npmExecutable = process.env.FET_UPDATE_NPM_EXECUTABLE ?? defaultNpmExecutable();\n const latestVersion = await resolveLatestVersion(packageName, npmExecutable);\n const currentVersion = ctx.fetVersion;\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET is already up to date (${currentVersion}).`\n : `FET 已是最新版 (${currentVersion})。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: false\n }\n });\n return;\n }\n\n if (!ctx.json) {\n ctx.output.info(\n ctx.language === \"en\"\n ? `Updating FET from ${currentVersion} to ${latestVersion}...`\n : `正在将 FET 从 ${currentVersion} 升级到 ${latestVersion}...`\n );\n }\n\n const installArgs = [\"install\", \"-g\", `${packageName}@latest`];\n const result = await runNpm(npmExecutable, installArgs, {\n cwd: ctx.cwd,\n stdio: ctx.json ? \"pipe\" : \"inherit\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: ctx.language === \"en\" ? \"FET update failed.\" : \"FET 升级失败。\",\n details: result,\n suggestedCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n });\n }\n\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET updated from ${currentVersion} to ${latestVersion}.`\n : `FET 已从 ${currentVersion} 升级到 ${latestVersion}。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: true,\n installCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n }\n });\n}\n\nasync function resolveLatestVersion(packageName: string, npmExecutable: string): Promise<string> {\n const override = process.env.FET_UPDATE_LATEST_VERSION?.trim();\n if (override) {\n return override;\n }\n\n const result = await runNpm(npmExecutable, [\"view\", packageName, \"version\", \"--json\"], {\n cwd: process.cwd(),\n stdio: \"pipe\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to check the latest FET version from npm.\",\n details: result,\n suggestedCommand: `${npmExecutable} view ${packageName} version`\n });\n }\n\n const version = parseNpmVersion(result.stdout ?? \"\");\n if (!version) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"npm returned an invalid FET version.\",\n details: { stdout: result.stdout }\n });\n }\n return version;\n}\n\nfunction parseNpmVersion(stdout: string): string | null {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" && parsed.length > 0 ? parsed : null;\n } catch {\n return trimmed;\n }\n}\n\nfunction runNpm(\n command: string,\n args: string[],\n options: { cwd: string; stdio: \"inherit\" | \"pipe\" }\n): Promise<NpmRunResult> {\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(command, args, {\n cwd: options.cwd,\n stdio: options.stdio,\n shell: process.platform === \"win32\"\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to run npm for FET update.\",\n details: { command, args },\n cause: error,\n suggestedCommand: `${command} ${args.join(\" \")}`\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n\nfunction defaultNpmExecutable(): string {\n return process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const diff = leftVersion.main[index] - rightVersion.main[index];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n\n if (!leftVersion.prerelease.length && rightVersion.prerelease.length) {\n return 1;\n }\n if (leftVersion.prerelease.length && !rightVersion.prerelease.length) {\n return -1;\n }\n\n const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftVersion.prerelease[index];\n const rightPart = rightVersion.prerelease[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const diff = comparePrereleasePart(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(version: string): { main: [number, number, number]; prerelease: string[] } {\n const [withoutBuild] = version.trim().replace(/^v/i, \"\").split(\"+\");\n const [mainValue = \"\", prereleaseValue = \"\"] = withoutBuild.split(\"-\");\n const mainParts = mainValue.split(\".\").map((part) => Number.parseInt(part, 10));\n return {\n main: [\n Number.isFinite(mainParts[0]) ? mainParts[0] : 0,\n Number.isFinite(mainParts[1]) ? mainParts[1] : 0,\n Number.isFinite(mainParts[2]) ? mainParts[2] : 0\n ],\n prerelease: prereleaseValue ? prereleaseValue.split(\".\") : []\n };\n}\n\nfunction comparePrereleasePart(left: string, right: string): number {\n const leftNumber = /^\\d+$/.test(left) ? Number.parseInt(left, 10) : null;\n const rightNumber = /^\\d+$/.test(right) ? Number.parseInt(right, 10) : null;\n\n if (leftNumber !== null && rightNumber !== null) {\n return Math.sign(leftNumber - rightNumber);\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return left.localeCompare(right);\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { renderVerifyInstructions } from \"../templates/index.js\";\n\nexport async function verifyCommand(ctx: FetCommandContext, options: { done?: boolean; auto?: boolean }): Promise<void> {\n if (options.auto) {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const plan = {\n schemaVersion: 1,\n packageManager: scan.project.packageManager,\n workspaces: [\n {\n name: \"root\",\n cwd: \".\",\n commands: Object.entries(scan.commands)\n .filter(([name]) => [\"lint\", \"typecheck\", \"test\"].includes(name))\n .map(([dimension, command]) => ({\n dimension,\n command: command.command,\n source: command.source,\n required: command.required,\n statusIfMissing: command.required ? \"fail\" : \"warn\"\n }))\n }\n ],\n missing: [\"lint\", \"typecheck\", \"test\"].filter((name) => !scan.commands[name])\n };\n if (ctx.yes) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.verifyAuthorization = {\n schemaVersion: 1,\n approvedAt: new Date().toISOString(),\n commandFingerprint: fingerprint(plan),\n packageManager: plan.packageManager,\n plan: plan.workspaces.flatMap((workspace) =>\n workspace.commands.map((command) => ({\n cwd: workspace.cwd,\n dimension: command.dimension,\n command: command.command,\n source: command.source,\n required: command.required\n }))\n )\n };\n await ctx.stateStore.writeGlobal(global);\n }\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: ctx.yes ? \"已确认 verify --auto 执行计划;MVP 暂不执行仓库脚本。\" : \"已生成 verify --auto 执行计划;MVP 暂不执行仓库脚本。\",\n warnings: plan.missing.map((name) => `未发现 ${name} 脚本,将在自动执行版本中按配置处理。`),\n data: plan,\n nextSteps: ctx.yes ? [\"当前版本请运行 fet verify 进入手动验证模式\"] : [\"审核执行计划\", \"确认计划后可运行 fet verify --auto --yes\", \"当前版本请运行 fet verify 进入手动验证模式\"]\n });\n return;\n }\n\n await withProjectLock(\n ctx.projectRoot,\n { command: \"verify\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n const changeId = await resolveChangeId(ctx);\n if (options.done) {\n await markDone(ctx, changeId);\n } else {\n await writeInstructions(ctx, changeId);\n }\n }\n );\n}\n\nasync function writeInstructions(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const generatedAt = new Date().toISOString();\n const dir = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\");\n const instructionsPath = join(dir, \"verify-instructions.md\");\n await mkdir(dir, { recursive: true });\n await atomicWrite(instructionsPath, renderVerifyInstructions(changeId, generatedAt));\n\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"in_progress\", updatedAt: generatedAt };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已生成手动验证指令。\",\n nextSteps: [`阅读 openspec/changes/${changeId}/.fet/verify-instructions.md`, `完成后运行 fet verify --done --change ${changeId}`]\n });\n}\n\nasync function markDone(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const declaredAt = new Date().toISOString();\n const instructionsPath = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\", \"verify-instructions.md\");\n const instructions = await readInstructions(instructionsPath, changeId);\n const instructionsGeneratedAt = readFrontMatterValue(instructions, \"generatedAt\") ?? declaredAt;\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"done\", updatedAt: declaredAt };\n state.manualVerify = {\n mode: \"manual\",\n status: \"declared_done\",\n declaredAt,\n instructionsPath: `openspec/changes/${changeId}/.fet/verify-instructions.md`,\n instructionsGeneratedAt,\n evidence: null\n };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已记录手动验证完成声明。\",\n nextSteps: [`fet sync --change ${changeId}`, `fet archive --change ${changeId}`]\n });\n}\n\nasync function assertChangeExists(ctx: FetCommandContext, changeId: string): Promise<void> {\n const inspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n if (!inspection.exists) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"指定的 change 不存在\",\n details: { changeId },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n }\n}\n\nasync function readInstructions(path: string, changeId: string): Promise<string> {\n try {\n await stat(path);\n const content = await readFile(path, \"utf8\");\n const fileChangeId = readFrontMatterValue(content, \"changeId\");\n if (fileChangeId !== changeId) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件与当前 change 不匹配\",\n details: { expected: changeId, actual: fileChangeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n return content;\n } catch (error) {\n if (error instanceof FetError) {\n throw error;\n }\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件不存在或无法读取\",\n details: { path },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n\nfunction readFrontMatterValue(content: string, key: string): string | null {\n const match = content.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n return match?.[1]?.trim() ?? null;\n}\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\nasync function resolveChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n if (global.activeChangeId) {\n return global.activeChangeId;\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"无法确定要验证的 change\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n}\n","import type { FetLanguage } from \"./language.js\";\n\nconst HIGH_COST_MODEL_PATTERNS = [\n /gpt[-_ ]?5\\.5/i,\n /glm[-_ ]?5(?:\\.1)?/i,\n /claude.*opus/i,\n /opus/i,\n /claude.*sonnet/i,\n /sonnet/i\n];\n\nconst MODEL_ENV_KEYS = [\"FET_IDE_MODEL\", \"FET_MODEL\", \"CODEX_MODEL\", \"CURSOR_MODEL\", \"OPENCODE_MODEL\", \"OPENAI_MODEL\", \"ANTHROPIC_MODEL\"];\n\nexport type ModelPolicyMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface DetectedModel {\n source: string;\n name: string;\n}\n\nexport interface ModelPolicyMismatch {\n command: string;\n detected: DetectedModel;\n recommended: \"high-cost\" | \"low-cost\";\n reason: string;\n}\n\nexport function detectCurrentModel(env: NodeJS.ProcessEnv = process.env): DetectedModel | null {\n for (const key of MODEL_ENV_KEYS) {\n const value = env[key]?.trim();\n if (value) {\n return { source: key, name: value };\n }\n }\n return null;\n}\n\nexport function isHighCostModel(model: string): boolean {\n return HIGH_COST_MODEL_PATTERNS.some((pattern) => pattern.test(model));\n}\n\nexport function getModelPolicyMode(env: NodeJS.ProcessEnv = process.env): ModelPolicyMode {\n const value = env.FET_MODEL_POLICY?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_MODEL_POLICY === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n return \"confirm\";\n}\n\nexport function getCommandModelPolicyMismatch(command: string, env: NodeJS.ProcessEnv = process.env): ModelPolicyMismatch | null {\n if (getModelPolicyMode(env) === \"off\") {\n return null;\n }\n\n const detected = detectCurrentModel(env);\n if (!detected) {\n return null;\n }\n\n const highCost = isHighCostModel(detected.name);\n if (command === \"apply\") {\n if (!highCost) {\n return {\n command,\n detected,\n recommended: \"high-cost\",\n reason: \"fet apply is the implementation phase and is recommended to use a high-capability/high-cost model.\"\n };\n }\n return null;\n }\n\n if (highCost) {\n return {\n command,\n detected,\n recommended: \"low-cost\",\n reason: `fet ${command} is not the implementation phase and is recommended to use a lower-cost model.`\n };\n }\n return null;\n}\n\nexport function formatModelPolicyMismatch(mismatch: ModelPolicyMismatch, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"Recommended models include GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet.\"\n : \"Recommended action: switch to a lower-cost model and reserve high-cost models for fet apply.\";\n return `${mismatch.reason} Detected ${mismatch.detected.source}=\"${mismatch.detected.name}\". ${switchHint}`;\n }\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"建议模型包括 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。\"\n : \"建议切换到低成本模型,把高成本模型留给 fet apply。\";\n const reason =\n mismatch.recommended === \"high-cost\"\n ? \"fet apply 属于实施阶段,建议使用高能力/高成本模型。\"\n : `fet ${mismatch.command} 不是实施阶段,建议使用低成本模型。`;\n return `${reason} 检测到 ${mismatch.detected.source}=\"${mismatch.detected.name}\"。${switchHint}`;\n}\n\nexport function renderIdeModelPolicy(command: string, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (command === \"apply\") {\n return \"Model policy: this command is recommended to run with a high-capability/high-cost model such as GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet. If the current IDE model is lower-cost, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n return \"Model policy: this command is recommended to run with a low-cost model. If the current IDE model is GPT-5.5, GLM-5.1, GLM-5, Claude Opus, Claude Sonnet, or another high-cost model, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n if (command === \"apply\") {\n return \"模型策略:该命令建议使用高能力/高成本模型运行,例如 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。若当前 IDE 模型能力较低,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n }\n\n return \"模型策略:该命令建议使用低成本模型运行。若当前 IDE 模型是 GPT-5.5、GLM-5.1、GLM-5、Claude Opus、Claude Sonnet 或其他高成本模型,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n}\n","import { resolve } from \"node:path\";\nimport { CodexAdapter, CursorAdapter } from \"../adapters/index.js\";\nimport { normalizeLanguage, type FetLanguage } from \"../language.js\";\nimport { DefaultOpenSpecAdapter } from \"../openspec/index.js\";\nimport { ProjectScanner } from \"../scanner/index.js\";\nimport { detectProjectIdentity, StateStore } from \"../state/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { OutputWriter } from \"./output.js\";\n\nexport interface GlobalOptions {\n cwd?: string;\n json?: boolean;\n verbose?: boolean;\n yes?: boolean;\n change?: string;\n lang?: string;\n}\n\nexport async function createCommandContext(command: string, options: GlobalOptions) {\n const projectRoot = resolve(options.cwd ?? process.cwd());\n const project = await detectProjectIdentity(projectRoot);\n const stateStore = new StateStore(projectRoot, FET_VERSION, project);\n const savedState = await stateStore.readGlobal();\n const language: FetLanguage = normalizeLanguage(options.lang ?? savedState?.language.current);\n const output = new OutputWriter(Boolean(options.json), language);\n\n return {\n command,\n cwd: projectRoot,\n projectRoot,\n isTty: Boolean(process.stdout.isTTY),\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n yes: Boolean(options.yes),\n changeId: options.change,\n language,\n explicitLanguage: options.lang !== undefined,\n fetVersion: FET_VERSION,\n output,\n stateStore,\n openSpec: new DefaultOpenSpecAdapter(),\n scanner: new ProjectScanner(),\n toolAdapters: [new CursorAdapter(), new CodexAdapter()]\n };\n}\n\nexport type FetCommandContext = Awaited<ReturnType<typeof createCommandContext>>;\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { codexCommandFiles, codexGuideFile, codexSlashPromptFiles } from \"./templates.js\";\n\ninterface CodexToolFile {\n path: string;\n content: string;\n managed: boolean;\n root?: \"project\" | \"codex-home\";\n}\n\nexport class CodexAdapter implements ToolAdapter {\n readonly tool = \"codex\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".codex\")) || await exists(join(projectRoot, \"AGENTS.md\")),\n reason: \"Codex adapter is available for projects that use AGENTS.md\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [\n ...[codexGuideFile(language), ...codexCommandFiles(language)].map((file) => ({\n ...file,\n managed: true,\n root: \"project\" as const\n })),\n ...codexSlashPromptFiles(language).map((file) => ({\n ...file,\n managed: true,\n root: \"codex-home\" as const\n }))\n ]\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Codex adapter file already exists and is not managed by FET\",\n details: { path: displayPath },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(displayPath);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `codex:${displayPath}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${displayPath} is missing`\n : !managed\n ? `${displayPath} exists but is not managed by FET`\n : !versionMatches\n ? `${displayPath} adapterVersion is stale`\n : `${displayPath} is managed by FET`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nfunction resolveTarget(projectRoot: string, file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return join(resolveCodexHome(), file.path);\n }\n return join(projectRoot, file.path);\n}\n\nfunction displayPathFor(file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return `$CODEX_HOME/${file.path.replaceAll(\"\\\\\", \"/\")}`;\n }\n return file.path;\n}\n\nfunction resolveCodexHome(): string {\n return process.env.FET_CODEX_HOME ?? process.env.CODEX_HOME ?? join(homedir(), \".codex\");\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","export const FET_WORKFLOW_COMMANDS = [\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n] as const;\n\nexport type FetWorkflowCommand = (typeof FET_WORKFLOW_COMMANDS)[number];\n\nexport const FET_GRAPH_COMMANDS = [\"graph-status\", \"graph-setup\", \"graph-init\", \"graph-refresh\", \"graph-doctor\", \"graph-handoff\"] as const;\n\nexport type FetGraphCommand = (typeof FET_GRAPH_COMMANDS)[number];\n\nexport const FET_ADAPTER_COMMANDS = [...FET_WORKFLOW_COMMANDS, \"update\", \"fill-context\", \"passthrough\", ...FET_GRAPH_COMMANDS] as const;\n\nexport type FetAdapterCommand = (typeof FET_ADAPTER_COMMANDS)[number];\n\nexport function renderFetAdapterUsage(command: FetAdapterCommand, args = \"[...args]\"): string {\n if (command.startsWith(\"graph-\")) {\n const subcommand = command.slice(\"graph-\".length);\n return `fet graph ${subcommand}${args ? ` ${args}` : \"\"}`;\n }\n if (command === \"passthrough\") {\n return `fet passthrough <openspec-command>${args ? ` ${args}` : \"\"}`;\n }\n return `fet ${command}${args ? ` ${args}` : \"\"}`;\n}\n","import { FET_VERSION } from \"../../version.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderKarpathyGuidelinesBody } from \"../../templates/index.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function codexGuideFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n const body =\n language === \"en\"\n ? `# FET For Codex\n\n## Language\n\n${languageInstruction(language)}\n\nBefore doing FET or OpenSpec work in Codex, read:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- the active change files under openspec/changes/<change-id>/, when a change is selected\n\nIf GitNexus code graph context is available in the IDE or MCP tools, prefer it before broad repository scans. Use it to identify relevant modules, dependencies, and insertion points, then read only the concrete source files needed. If GitNexus is unavailable, continue with the normal FET/OpenSpec workflow.\n\nUse the terminal command \\`fet <command>\\` as the source of truth for workflow transitions. These files are Codex-readable guidance; they do not register native slash commands.\n\nCommand guides live in .codex/fet/commands/.\n`\n : `# Codex 的 FET 使用指南\n\n## 语言\n\n${languageInstruction(language)}\n\n在 Codex 中执行 FET 或 OpenSpec 工作前,先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- 如果已选择 change,阅读 openspec/changes/<change-id>/ 下的当前产物\n\n如果 IDE 或 MCP 工具中可用 GitNexus 代码图上下文,先用它缩小仓库扫描范围;用图识别相关模块、依赖和插入点,再只读取需要确认行为的具体源码文件。GitNexus 不可用时,按普通 FET/OpenSpec 工作流继续。\n\n工作流流转以终端命令 \\`fet <command>\\` 为准。这些文件是给 Codex 阅读的指导,不注册原生 slash command。\n\n命令指南位于 .codex/fet/commands/。\n`;\n\n return {\n path: \".codex/fet/context.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n${body}`\n };\n}\n\nexport function 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# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`\n };\n}\n\nfunction renderCommand(command: FetAdapterCommand, language: FetLanguage): string {\n if (language !== \"en\") {\n return renderCommandZh(command);\n }\n if (command === \"fill-context\") {\n return renderFillContextCommand(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughCommand(language);\n }\n if (command.startsWith(\"graph-\")) {\n return renderGraphCommand(command, language);\n }\n\n const usage = renderFetAdapterUsage(command, \"\");\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run the FET ${command} workflow, first make sure the project context is loaded from AGENTS.md and openspec/config.yaml.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nIf the command needs a change id, pass it with \\`--change <change-id>\\` or use the active OpenSpec change from the user's request.\n\nAfter the command completes, report the important next steps from the FET output and keep any generated OpenSpec artifacts in the normal project workflow.\n`;\n}\n\nfunction renderCommandZh(command: FetAdapterCommand): string {\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"\");\n const title = commandTitleZh(command);\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n用于指导当前 IDE LLM 在用户确认下安装 GitNexus。\n\n先运行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n然后阅读 .fet/graph-setup.md,并以它作为安装任务书。只读检测命令可以直接运行;任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证。合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,报告失败命令、stderr 和下一步人工处理建议。\n`;\n }\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 用途\n\n${title}\n\n## 执行方式\n\n在执行前阅读 AGENTS.md、openspec/config.yaml、.codex/fet/karpathy-guidelines.md,以及当前 change 目录下已有的 OpenSpec 产物。\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n如果命令需要 change id,优先使用用户输入、\\`--change <change-id>\\`、FET active change 或唯一打开的 change。存在歧义时先询问用户。\n\n执行完成后,用中文总结关键输出、生成或更新的文件,以及下一步建议。\n`;\n}\n\nfunction renderPassthroughCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet passthrough <openspec-command>\nFET:END -->\n\n# fet passthrough\n\n${renderIdeModelPolicy(\"passthrough\", language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run an OpenSpec command that FET does not manage as a first-class workflow command, use FET passthrough instead of calling OpenSpec directly.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\nfet passthrough <openspec-command> [...args]\n\\`\\`\\`\n\nThis preserves the FET entry point while allowing access to unmanaged or newly added OpenSpec commands. Passthrough does not update FET lifecycle state.\n`;\n}\n\nfunction renderGraphCommand(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, \"\");\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nUse this command to guide IDE-assisted GitNexus installation with user approval.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nThen read .fet/graph-setup.md and follow it as the source of truth. You may run read-only detection commands directly. Before downloading software, installing globally, changing PATH, writing user-level files, or modifying IDE/MCP configuration, show the exact command and wait for user approval.\n\nAfter installation, verify \\`gitnexus --version\\`. If appropriate, continue with \\`fet graph init\\` and \\`fet graph handoff\\`. If installation fails, report the failing command, stderr, and next manual step.\n`;\n }\n const subcommand = command.slice(\"graph-\".length);\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to work with optional GitNexus graph support, use FET as the entry point.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nFor graph init or refresh, pass extra GitNexus analyze arguments only when the user provides them.\n\nAfter the command completes, report the GitNexus state, generated handoff files, and next steps.\n`;\n}\n\nfunction renderSlashPrompt(command: FetAdapterCommand, language: FetLanguage): string {\n if (command === \"ff\") {\n return renderFastForwardSlashPrompt(language);\n }\n if (language !== \"en\") {\n return renderSlashPromptZh(command);\n }\n if (command === \"propose\") {\n return renderProposeSlashPrompt(language);\n }\n if (command === \"continue\") {\n return renderContinueSlashPrompt(language);\n }\n if (command === \"explore\") {\n return renderExploreSlashPrompt(language);\n }\n if (command === \"new\") {\n return renderNewSlashPrompt(language);\n }\n if (command === \"apply\") {\n return renderApplySlashPrompt(language);\n }\n if (command === \"verify\") {\n return renderVerifySlashPrompt(language);\n }\n if (command === \"sync\") {\n return renderSyncSlashPrompt(language);\n }\n if (command === \"archive\") {\n return renderArchiveSlashPrompt(language);\n }\n if (command === \"bulk-archive\") {\n return renderBulkArchiveSlashPrompt(language);\n }\n if (command === \"onboard\") {\n return renderOnboardSlashPrompt(language);\n }\n if (command === \"fill-context\") {\n return renderFillContextSlashPrompt(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughSlashPrompt(language);\n }\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(language);\n }\n\n const usage = renderFetAdapterUsage(command);\n const isGraph = command.startsWith(\"graph-\");\n const shellCommand = isGraph ? `${renderFetAdapterUsage(command, \"\")} $ARGUMENTS` : `fet ${command} $ARGUMENTS`;\n const description = isGraph\n ? `Run optional GitNexus graph ${command.slice(\"graph-\".length)} through FET`\n : `Run the FET-managed OpenSpec ${command} workflow`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${description}\n---\n\nUse FET as the entry point for this OpenSpec workflow.\n\nBefore running the command, make sure the relevant project context is loaded from AGENTS.md and openspec/config.yaml. If a change id is needed and was not provided, infer it from the active FET/OpenSpec state when unambiguous; otherwise ask the user for the change id.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${shellCommand}\n\\`\\`\\`\n\nAfter it completes, summarize the important FET output and next steps.\n`;\n}\n\nfunction renderSlashPromptZh(command: FetAdapterCommand): string {\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(\"zh-CN\");\n }\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"[...args]\");\n const argumentHint = command === \"passthrough\" ? \"openspec-command [...args]\" : undefined;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${commandTitleZh(command)}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 目标\n\n${commandGoalZh(command)}\n\n## 步骤\n\n1. 阅读 AGENTS.md、openspec/config.yaml 和 .codex/fet/karpathy-guidelines.md。\n2. 如果存在当前 OpenSpec change,阅读 openspec/changes/<change-id>/ 下的相关产物。\n3. 运行 FET 命令:\n \\`\\`\\`sh\n ${usage}\n \\`\\`\\`\n4. 按 FET/OpenSpec 输出继续;需要写产物时,只写到 OpenSpec 指定路径,不要把提示包装文本复制进产物。\n5. 用中文总结本次动作、文件路径、状态和下一步。\n\n## 约束\n\n- 默认使用中文产出。\n- 不要绕过 FET 直接调用 openspec,除非 FET 命令本身不可用。\n- change 不明确时先询问用户。\n${command === \"fill-context\" ? \"- 替换 AGENTS.md 中每个 `[NEEDS LLM INPUT]` 或 `[NEED LLM INPUT]` 占位符,保留 FET 托管标记,不要修改业务代码。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" ? \"- 一次只创建一个 ready artifact,并在写入前阅读依赖文件。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" ? \"- 不要在用户审阅当前产物前自动运行 fet continue、fet ff 或循环生成后续产物;需要用户明确确认后再推进。\\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 change 并生成首个规划产物\",\n new: \"创建新的 FET/OpenSpec change 骨架\",\n continue: \"推进当前 FET/OpenSpec change 的下一个产物\",\n ff: \"快速生成 FET/OpenSpec 所需产物\",\n apply: \"实施 FET/OpenSpec change 中的任务\",\n verify: \"验证 FET/OpenSpec change\",\n sync: \"同步 delta specs 到主规范\",\n archive: \"归档已验证的 FET/OpenSpec change\",\n \"bulk-archive\": \"批量归档 FET/OpenSpec changes\",\n onboard: \"加载 FET/OpenSpec 项目上下文\",\n \"fill-context\": \"填充 FET AGENTS.md 占位符\",\n passthrough: \"通过 FET 透传未接管的 OpenSpec 命令\",\n \"graph-status\": \"查看 GitNexus 代码图状态\",\n \"graph-setup\": \"生成 GitNexus 安装交接说明\",\n \"graph-init\": \"初始化 GitNexus 代码图\",\n \"graph-refresh\": \"刷新 GitNexus 代码图\",\n \"graph-doctor\": \"诊断 GitNexus 代码图\",\n \"graph-handoff\": \"生成 GitNexus 代码图使用说明\"\n };\n return titles[command] ?? `运行 FET ${command} 工作流`;\n}\n\nfunction commandGoalZh(command: FetAdapterCommand): string {\n if (command === \"fill-context\") {\n return \"补齐 FET 自动生成的项目上下文,让后续 AI 编码和 OpenSpec 工作流拥有稳定的项目事实。\";\n }\n if (command === \"propose\") {\n return \"根据 change id 或描述创建 OpenSpec change(如不存在),并只生成当前第一个 ready 的规划产物。\";\n }\n if (command === \"continue\") {\n return \"基于 active change 或用户指定的 change,创建下一个 ready 的 OpenSpec 规划产物。\";\n }\n if (command === \"ff\") {\n return \"在用户明确要求快进时,一次性生成 change 所需的全部规划产物。\";\n }\n if (command === \"apply\") {\n return \"读取 OpenSpec 产物并按 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 renderGraphSetupSlashPrompt(language: FetLanguage): string {\n if (language === \"en\") {\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"Guide IDE-assisted GitNexus installation with user approval\",\n `Guide optional GitNexus installation for this project.\n\nSteps:\n\n1. Run:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. Read .fet/graph-setup.md and follow it as the source of truth.\n3. Run read-only detection commands as needed, such as checking the shell, PATH, package managers, and \\`gitnexus --version\\`.\n4. If GitNexus is missing, use the configured \\`FET_GITNEXUS_INSTALL_COMMAND\\` when present; otherwise find the official GitNexus installation instructions or ask the user for the preferred method.\n5. Before any command that downloads software, installs globally, changes PATH, writes user-level files, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n6. Verify installation with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, explain \\`gitnexus setup\\` and run it only after approval.\n8. Run \\`fet graph init\\` and then \\`fet graph handoff\\` when GitNexus is available.\n\nGuardrails:\n- GitNexus is optional; do not block FET/OpenSpec workflows if installation fails.\n- Do not modify application code during setup.\n- Report the failing command, stderr, and next manual step if blocked.`,\n undefined,\n language\n );\n }\n\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"指导 IDE LLM 在用户确认下安装 GitNexus\",\n `为当前项目引导可选的 GitNexus 安装。\n\n步骤:\n\n1. 运行:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. 阅读 .fet/graph-setup.md,并以它作为安装任务书。\n3. 按需运行只读检测命令,例如检查 shell、PATH、包管理器和 \\`gitnexus --version\\`。\n4. 如果 GitNexus 缺失,优先使用已配置的 \\`FET_GITNEXUS_INSTALL_COMMAND\\`;没有配置时,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n6. 用 \\`gitnexus --version\\` 验证安装。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\`,获得确认后再运行。\n8. GitNexus 可用后运行 \\`fet graph init\\`,再运行 \\`fet graph handoff\\`。\n\n约束:\n- GitNexus 是可选能力;安装失败时不要阻塞 FET/OpenSpec 主流程。\n- 安装过程中不要修改业务代码。\n- 如果受阻,报告失败命令、stderr 和下一步人工处理建议。`,\n undefined,\n language\n );\n}\n\nfunction renderExploreSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet explore [...args]\",\n \"Explore requirements for a FET/OpenSpec change\",\n `Enter exploration mode for a FET-managed OpenSpec change.\n\nUse this command for thinking and proposal shaping, not application implementation.\n\nInput after the slash command may be a change id, a feature idea, or a problem description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Check existing changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n3. If the input names an existing change, read its current artifacts under openspec/changes/<change-id>/.\n4. If the input is a new idea and the user wants to capture it, derive a kebab-case change id and create the change:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Run the native OpenSpec exploration flow through FET so clarification prompts stay interactive:\n \\`\\`\\`sh\n fet explore --change <change-id>\n \\`\\`\\`\n6. If OpenSpec or the user asks to generate or capture the proposal, create openspec/changes/<change-id>/proposal.md using the interactive answers, conversation, and project context.\n\nGuardrails:\n- Do not write application code in explore mode.\n- Ask a clarifying question if the proposal would otherwise be mostly guesswork.\n- Creating or updating OpenSpec artifacts is allowed when the user asks to capture the thinking.\n- After creating proposal.md, show the path and suggest /prompts:fet-continue <change-id> for the next artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderProposeSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet propose [...args]\",\n \"Create a FET/OpenSpec change and its first ready artifact\",\n `Start proposal planning for a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id or a short description of what the user wants to build. If omitted, ask the user.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Derive a kebab-case change id when the user provided a description. If ambiguous, ask the user.\n3. Run the native OpenSpec propose flow through FET. This creates the change when needed and returns instructions for only the next ready artifact:\n \\`\\`\\`sh\n fet propose <change-id-or-description> --json\n \\`\\`\\`\n4. Follow the native output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n5. Read dependency files before writing.\n6. Create only that artifact file at outputPath. Do not copy context/rules wrapper text into the artifact.\n7. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- Change id and location.\n- Which single artifact was created and its file path.\n- Current status.\n- Tell the user to review the artifact and run /prompts:fet-continue <change-id> when ready for the next artifact. Mention /prompts:fet-ff <change-id> only if they explicitly want to fast-forward all remaining artifacts.\n\nGuardrails:\n- Create one artifact per invocation. Do not run fet continue or fet ff in the same session unless the user explicitly asks after reviewing the artifact just created.\n- Never skip dependency order.\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderContinueSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet continue [...args]\",\n \"Create the next FET/OpenSpec artifact\",\n `Continue a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id, optionally followed by an artifact id. If omitted, use the active OpenSpec change and continue the next ready artifact.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n3. Check status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n4. Pick the first artifact whose status is ready, unless the user specified an artifact id.\n5. Run the native OpenSpec continue flow through FET:\n \\`\\`\\`sh\n fet continue [artifact-id] --change <change-id> --json\n \\`\\`\\`\n6. Follow the native continue output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n7. Read dependency files before writing.\n8. Create the artifact file at outputPath. Do not copy context/rules wrapper text into the artifact; use those fields only as constraints.\n9. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- State which artifact was created.\n- Show the file path.\n- Show the current status and what to run next.\n\nGuardrails:\n- Create one artifact per invocation.\n- Never skip dependency order.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderFastForwardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet ff [...args]\",\n language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\",\n `${language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\"}.\n\nUse this command only when the user explicitly wants to generate all remaining planning artifacts in one session without reviewing each artifact between steps. For step-by-step review, use /prompts:fet-propose or /prompts:fet-continue instead.\n\nInput after the slash command may be a change id. It may be omitted when the active OpenSpec change is unambiguous.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id. If ambiguous, ask the user.\n3. Run the native OpenSpec ff flow through FET:\n \\`\\`\\`sh\n fet ff --change <change-id>\n \\`\\`\\`\n4. Follow the native output. If it asks for clarification, ask the user rather than inventing details.\n5. If the native output includes artifact paths or templates to write, create those files and preserve OpenSpec structure.\n6. If FET reports that the OpenSpec CLI does not expose the requested command, stop immediately. Do not run \\`fet continue\\`, \\`openspec change\\`, or any alternative workflow command unless the user explicitly chooses that fallback after seeing the error.\n\nArtifact rules:\n- Follow the instruction field from OpenSpec/FET for each artifact.\n- Use template as structure, filling it with concrete project-specific content.\n- Do not copy context/rules wrapper text into artifact files.\n- Verify each file exists after writing.\n\nOutput:\n- Change id and location.\n- Artifacts created.\n- Current status.\n- Next recommended command, usually /prompts:fet-apply <change-id>.\n\nGuardrails:\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- If OpenSpec appears outdated or incompatible, report the detected version and suggest \\`npm install -g @fission-ai/openspec@latest\\` or \\`fet doctor\\`, then wait for the user's decision.`,\n undefined,\n language\n );\n}\n\nfunction renderManagedSlashPrompt(command: string, description: string, body: string, argumentHint?: string, language: FetLanguage = DEFAULT_LANGUAGE): string {\n const policyCommand = command.split(/\\s+/)[1] ?? command;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n const graphContextInstruction =\n language === \"en\"\n ? \"If GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\"\n : \"如果 GitNexus 代码图上下文可用,先用它缩小源码扫描范围;不可用时按普通流程继续。\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${command}\nFET:END -->\n\n---\ndescription: ${description}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(policyCommand, language)}\n\n${languageInstruction(language)}\n\n${graphContextInstruction}\n\n${body}\n`;\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { 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 if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet graph setup\nFET:END -->\n\n---\nname: fet-graph-setup\ndescription: ${language === \"en\" ? \"Guide IDE-assisted GitNexus installation with user approval\" : \"指导 IDE LLM 在用户确认下安装 GitNexus\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n${\n language === \"en\"\n ? `Run \\`fet graph setup\\`, then read .fet/graph-setup.md and follow it as an installation playbook.\n\nYou may run read-only detection commands without extra confirmation. Before any command that downloads software, installs globally, changes PATH, writes user-level config, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n\nAfter installation, verify with \\`gitnexus --version\\`, then run \\`fet graph init\\` and \\`fet graph handoff\\` when appropriate. If installation fails, summarize the failing command and next manual step.`\n : `先运行 \\`fet graph setup\\`,再阅读 .fet/graph-setup.md,并把它作为安装任务书执行。\n\n只读检测命令可以直接运行。任何会下载软件、全局安装、修改 PATH、写入用户级配置或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证;合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,汇总失败命令和下一步人工处理建议。`\n}\n`;\n }\n\n 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 \"update\",\n \"list\",\n \"view\",\n \"change\",\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\",\n \"spec\",\n \"config\",\n \"schema\",\n \"validate\",\n \"show\",\n \"feedback\",\n \"completion\",\n \"status\",\n \"instructions\",\n \"templates\",\n \"schemas\"\n ];\n return known.filter((command) => new RegExp(`\\\\b${escapeRegExp(command)}\\\\b`).test(help));\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OpenSpecChangeInspection, OpenSpecProjectInspection } from \"./types.js\";\n\nexport async function inspectOpenSpecProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n const openspecPath = join(projectRoot, \"openspec\");\n const changesPath = join(openspecPath, \"changes\");\n const legacyArchivePath = join(openspecPath, \"archive\");\n const changesArchivePath = join(changesPath, \"archive\");\n\n return {\n exists: await exists(openspecPath),\n changes: await listDirectories(changesPath, { exclude: [\"archive\"] }),\n archived: [...new Set([...(await listDirectories(legacyArchivePath)), ...(await listDirectories(changesArchivePath))])]\n };\n}\n\nexport async function inspectOpenSpecChange(\n projectRoot: string,\n changeId: string\n): Promise<OpenSpecChangeInspection> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const tasksPath = join(changePath, \"tasks.md\");\n const specsPath = join(changePath, \"specs\");\n\n return {\n changeId,\n exists: await exists(changePath),\n hasProposal: await exists(join(changePath, \"proposal.md\")),\n hasTasks: await exists(tasksPath),\n hasSpecs: await exists(specsPath),\n tasksPath,\n changePath\n };\n}\n\nasync function listDirectories(path: string, options: { exclude?: string[] } = {}): Promise<string[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n const excluded = new Set(options.exclude ?? []);\n return entries.filter((entry) => entry.isDirectory() && !excluded.has(entry.name)).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function resolveOpenSpecExecutable(): Promise<OpenSpecIdentity> {\n const executablePath = await findExecutable();\n const version = await readVersion(executablePath);\n return {\n executablePath,\n version,\n adapterVersion: 1\n };\n}\n\nasync function findExecutable(): Promise<string> {\n const command = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const { stdout } = await exec(command, [\"openspec\"]);\n const first = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .sort((left, right) => executablePreference(left) - executablePreference(right))\n .find(Boolean);\n if (first) {\n return first;\n }\n } catch {\n // Try npx below.\n }\n\n try {\n await exec(\"npx\", [\"openspec\", \"--version\"]);\n return \"npx openspec\";\n } catch {\n throw new FetError({\n code: ErrorCode.OpenSpecNotFound,\n message: \"OpenSpec CLI 未安装\",\n suggestedCommand: \"npm install -g @fission-ai/openspec\"\n });\n }\n}\n\nfunction executablePreference(path: string): number {\n if (process.platform === \"win32\" && path.toLowerCase().endsWith(\".cmd\")) {\n return 0;\n }\n return 1;\n}\n\nasync function readVersion(executablePath: string): Promise<string> {\n const command = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const args = executablePath === \"npx openspec\" ? [\"openspec\", \"--version\"] : [\"--version\"];\n try {\n const { stdout, stderr } = await exec(command, args);\n return stdout.trim() || stderr.trim() || \"unknown\";\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: \"无法读取 OpenSpec 版本\",\n details: { executablePath },\n cause: error\n });\n }\n}\n\nfunction exec(command: string, args: string[]) {\n return execFileAsync(command, args, { shell: process.platform === \"win32\" });\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecRunOptions, OpenSpecRunResult } from \"./types.js\";\n\nexport async function runOpenSpec(\n executablePath: string,\n command: string,\n args: string[],\n options: OpenSpecRunOptions\n): Promise<OpenSpecRunResult> {\n const spawnCommand = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const spawnArgs = executablePath === \"npx openspec\" ? [\"openspec\", command, ...args] : [command, ...args];\n\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(spawnCommand, spawnArgs, {\n cwd: options.cwd,\n stdio: options.stdio ?? \"inherit\",\n shell: process.platform === \"win32\"\n });\n\n if (child.stdout) {\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n }\n if (child.stderr) {\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n }\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec 命令启动失败\",\n details: { command, args },\n cause: error\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n","import { 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":["createInterface","readFile","stat","join","count","dirname","join","dirname","join","mkdir","open","readFile","join","mkdir","dirname","open","readFile","join","readFile","join","stat","join","relative","graph","join","readFile","count","stat","mkdir","dirname","join","join","mkdir","dirname","mkdir","dirname","join","mkdir","readFile","dirname","join","join","graph","mkdir","dirname","readFile","join","graph","firstLine","mkdir","dirname","readFile","stat","join","dirname","join","BEGIN","END","readFile","join","readFile","join","readOptional","readFile","exists","join","readOptional","readFile","stat","readFile","join","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","join","readOptional","readFile","resolve","mkdir","readFile","stat","join","join","mkdir","stat","readFile","switchHint","mkdir","readFile","stat","dirname","join","exists","join","mkdir","dirname","readFile","stat","mkdir","readFile","stat","dirname","join","exists","join","readExisting","mkdir","dirname","readFile","stat","execFile","promisify","readdir","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","spawn","resolve","spawn","execFileAsync","promisify","execFile","readFile","stat","join","parse","locks","exists","readdir","stat","join","exists","createInterface","count"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/doctor.ts","../../src/context-placeholders.ts","../../src/fs/atomic-write.ts","../../src/fs/backup.ts","../../src/fs/lock.ts","../../src/fs/journal.ts","../../src/gitnexus.ts","../../src/commands/fill-context.ts","../../src/agents-miniprogram.ts","../../src/scanner/miniprogram.ts","../../src/scanner/package.ts","../../src/templates/miniprogram-agents.ts","../../src/commands/graph.ts","../../src/graph-context.ts","../../src/commands/init.ts","../../src/commands/update-context.ts","../../src/config/yaml.ts","../../src/version.ts","../../src/templates/markers.ts","../../src/templates/agents-md.ts","../../src/templates/config-yaml.ts","../../src/templates/karpathy-skills.ts","../../src/templates/verify-instructions.ts","../../src/commands/proxy.ts","../../src/state/project.ts","../../src/state/store.ts","../../src/language.ts","../../src/state/schema.ts","../../src/state/tasks.ts","../../src/update/npm.ts","../../src/commands/update.ts","../../src/commands/verify.ts","../../src/model-policy.ts","../../src/cli/context.ts","../../src/adapters/codex/index.ts","../../src/adapters/commands.ts","../../src/adapters/codex/templates.ts","../../src/adapters/cursor/index.ts","../../src/adapters/cursor/templates.ts","../../src/openspec/adapter.ts","../../src/openspec/inspector.ts","../../src/openspec/resolver.ts","../../src/openspec/runner.ts","../../src/scanner/routes.ts","../../src/scanner/index.ts","../../src/cli/output.ts","../../src/cli/update-check.ts","../../src/update/check.ts"],"sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { fillContextCommand } from \"../commands/fill-context.js\";\nimport { graphCommand, type GraphAction } from \"../commands/graph.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { proxyCommand, passthroughCommand } from \"../commands/proxy.js\";\nimport { updateCommand } from \"../commands/update.js\";\nimport { updateContextCommand } from \"../commands/update-context.js\";\nimport { verifyCommand } from \"../commands/verify.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError, toFetError } from \"../errors/fet-error.js\";\nimport { formatModelPolicyMismatch, getCommandModelPolicyMismatch, getModelPolicyMode } from \"../model-policy.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { createCommandContext, type GlobalOptions } from \"./context.js\";\nimport { OutputWriter } from \"./output.js\";\nimport { handleFetUpdateCheck } from \"./update-check.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"fet\")\n .description(\"围绕 OpenSpec 的前端开发工作流编排工具。\")\n .enablePositionalOptions()\n .version(FET_VERSION)\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n\naddGlobalOptions(program.command(\"init\")).description(\"初始化 FET + OpenSpec\").action(wrap(\"init\", initCommand));\naddGlobalOptions(program.command(\"update\")).description(\"检查 FET 是否为最新版,并在需要时自动升级\").action(wrap(\"update\", updateCommand));\naddGlobalOptions(program.command(\"update-context\")).description(\"更新项目上下文\").action(wrap(\"update-context\", updateContextCommand));\naddGlobalOptions(program.command(\"fill-context\")).description(\"刷新 IDE 填充 AGENTS.md 占位符的提示文件\").action(wrap(\"fill-context\", fillContextCommand));\n\nconst graph = addGlobalOptions(program.command(\"graph\").description(\"管理可选的 GitNexus 代码图支持\"));\nfor (const action of [\"status\", \"setup\", \"doctor\", \"handoff\"] as const) {\n addGlobalOptions(graph.command(action).description(`运行 fet graph ${action}`)).action(wrap(\"graph\", (ctx) => graphCommand(ctx, action)));\n}\nfor (const action of [\"init\", \"refresh\"] as const) {\n addGlobalOptions(\n graph\n .command(`${action} [args...]`)\n .description(`通过 GitNexus analyze 执行 graph ${action}`)\n .allowUnknownOption(true)\n .passThroughOptions()\n ).action(wrap(\"graph\", (ctx, args: string[] = []) => graphCommand(ctx, action as GraphAction, args)));\n}\n\naddGlobalOptions(program.command(\"doctor\").description(\"诊断状态、配置与一致性\").option(\"--fix-lock\", \"清理 FET 锁文件\")).action(\n wrap(\"doctor\", (ctx, options: { fixLock?: boolean }) => doctorCommand(ctx, { fixLock: Boolean(options.fixLock) }))\n);\n\naddGlobalOptions(program.command(\"verify\").description(\"最终质量验证\").option(\"--done\", \"声明手动验证已完成\").option(\"--auto\", \"生成或执行自动验证计划\")).action(\n wrap(\"verify\", verifyCommand)\n);\n\nfor (const command of [\"explore\", \"propose\", \"new\", \"continue\", \"ff\", \"apply\", \"sync\", \"archive\", \"bulk-archive\", \"onboard\"]) {\n addGlobalOptions(program.command(`${command} [args...]`).description(`代理执行 openspec ${command}`).allowUnknownOption(true).passThroughOptions()).action(\n wrap(command, (ctx, args: string[] = []) => proxyCommand(ctx, command, args))\n );\n}\n\naddGlobalOptions(program.command(\"passthrough <command> [args...]\").description(\"透传暂未接管的 OpenSpec 命令\").allowUnknownOption(true).passThroughOptions()).action(\n wrap(\"passthrough\", (ctx, command: string, args: string[] = []) => passthroughCommand(ctx, command, args))\n);\n\nprogram.parseAsync(process.argv).catch((error) => {\n const json = process.argv.includes(\"--json\");\n const output = new OutputWriter(json);\n const fetError = toFetError(error);\n output.error(fetError);\n process.exitCode = fetError.exitCode;\n});\n\nfunction wrap<T extends unknown[]>(\n command: string,\n handler: (ctx: Awaited<ReturnType<typeof createCommandContext>>, ...args: T) => Promise<void>\n) {\n return async (...args: T) => {\n const maybeCommand = args[args.length - 1] as unknown;\n const opts = isCommandLike(maybeCommand)\n ? ({ ...(maybeCommand.parent?.opts() as GlobalOptions), ...(maybeCommand.opts() as GlobalOptions) } as GlobalOptions)\n : (program.opts() as GlobalOptions);\n const ctx = await createCommandContext(command, { ...opts, ...extractGlobalOptions(args) });\n try {\n await handleFetUpdateCheck(ctx);\n await handleModelPolicyRecommendation(ctx);\n await warnIfContextPlaceholdersRemain(ctx);\n await handler(ctx, ...args);\n } catch (error) {\n const fetError = toFetError(error);\n ctx.output.error(fetError);\n process.exitCode = fetError.exitCode;\n }\n };\n}\n\nasync function handleModelPolicyRecommendation(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n const mismatch = getCommandModelPolicyMismatch(ctx.command);\n if (!mismatch) {\n return;\n }\n\n const warning = formatModelPolicyMismatch(mismatch, ctx.language);\n const policyMode = getModelPolicyMode();\n ctx.output.warn(`${warning} ${renderModelPolicyActionHint(policyMode, ctx.language)}`);\n\n if (policyMode !== \"confirm\" || ctx.yes || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question = ctx.language === \"en\" ? \"Continue anyway? [y/N] \" : \"仍然继续?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled so you can switch IDE model.\" : \"命令已取消,你可以先切换 IDE 模型。\",\n details: { command: ctx.command, detected: mismatch.detected, recommended: mismatch.recommended },\n suggestedCommand: ctx.language === \"en\" ? `Switch IDE model, then rerun fet ${ctx.command}.` : `切换 IDE 模型后重新运行 fet ${ctx.command}。`\n });\n }\n } finally {\n rl.close();\n }\n}\n\nfunction renderModelPolicyActionHint(policyMode: ReturnType<typeof getModelPolicyMode>, language: Awaited<ReturnType<typeof createCommandContext>>[\"language\"]): string {\n if (policyMode === \"confirm\") {\n return language === \"en\"\n ? \"Choose whether to continue this command or stop and switch models.\"\n : \"请选择继续执行本命令,或停止后手动切换模型。\";\n }\n return language === \"en\"\n ? \"This is advisory because FET_MODEL_POLICY=warn; the command will continue.\"\n : \"当前设置 FET_MODEL_POLICY=warn,该提醒仅作为建议,命令会继续执行。\";\n}\n\nasync function warnIfContextPlaceholdersRemain(ctx: Awaited<ReturnType<typeof createCommandContext>>): Promise<void> {\n if ([\"init\", \"update\", \"update-context\", \"fill-context\", \"doctor\"].includes(ctx.command)) {\n return;\n }\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (count > 0) {\n ctx.output.warn(renderAgentsPlaceholderWarning(count, ctx.language));\n }\n}\n\nfunction isCommandLike(value: unknown): value is Command {\n return value instanceof Command;\n}\n\nfunction addGlobalOptions(command: Command): Command {\n return command\n .option(\"--cwd <path>\", \"指定项目根目录\")\n .option(\"--change <id>\", \"指定 OpenSpec change\")\n .option(\"--lang <language>\", \"指定 FET 交互信息和生成产物语言,默认 zh-CN\")\n .option(\"--yes\", \"对低风险确认使用默认同意\")\n .option(\"--json\", \"输出机器可读 JSON\")\n .option(\"--verbose\", \"输出诊断细节\")\n .option(\"--no-color\", \"禁用终端颜色\");\n}\n\nfunction extractGlobalOptions(args: unknown[]): GlobalOptions {\n const values = args.flatMap((arg) => (Array.isArray(arg) ? arg : []));\n const options: GlobalOptions = {};\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (typeof value !== \"string\") {\n continue;\n }\n if (value === \"--cwd\" && typeof values[index + 1] === \"string\") {\n options.cwd = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--cwd=\")) {\n options.cwd = value.slice(\"--cwd=\".length);\n } else if (value === \"--change\" && typeof values[index + 1] === \"string\") {\n options.change = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--change=\")) {\n options.change = value.slice(\"--change=\".length);\n } else if (value === \"--lang\" && typeof values[index + 1] === \"string\") {\n options.lang = values[index + 1];\n index += 1;\n } else if (value.startsWith(\"--lang=\")) {\n options.lang = value.slice(\"--lang=\".length);\n } else if (value === \"--yes\") {\n options.yes = true;\n } else if (value === \"--json\") {\n options.json = true;\n } else if (value === \"--verbose\") {\n options.verbose = true;\n }\n }\n return options;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { clearLock } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, toGitNexusState } from \"../gitnexus.js\";\nimport type { DoctorCheck } from \"../adapters/index.js\";\n\nexport async function doctorCommand(ctx: FetCommandContext, options: { fixLock?: boolean } = {}): Promise<void> {\n const checks: DoctorCheck[] = [];\n\n checks.push(await checkOpenSpec(ctx));\n checks.push(await checkState(ctx));\n checks.push(await checkFile(\"agents\", join(ctx.projectRoot, \"AGENTS.md\"), \"AGENTS.md 缺失\", \"fet update-context\"));\n checks.push(await checkFile(\"config\", join(ctx.projectRoot, \"openspec\", \"config.yaml\"), \"openspec/config.yaml 缺失\", \"fet init\"));\n\n checks.push(await checkPlaceholders(ctx));\n checks.push(await checkGitNexus(ctx));\n\n for (const adapter of ctx.toolAdapters) {\n checks.push(...(await adapter.doctor(ctx.projectRoot)));\n }\n\n const lockPath = join(ctx.projectRoot, \"openspec\", \".fet.lock\");\n if (await exists(lockPath)) {\n if (options.fixLock) {\n await clearLock(ctx.projectRoot);\n checks.push({ id: \"lock\", status: \"pass\", message: \"已清理 openspec/.fet.lock\" });\n } else {\n checks.push({ id: \"lock\", status: \"warn\", message: \"存在 openspec/.fet.lock\", suggestedCommand: \"fet doctor --fix-lock\" });\n }\n }\n\n const warnings = checks.filter((check) => check.status !== \"pass\").map((check) => check.message);\n ctx.output.result({\n ok: true,\n command: \"doctor\",\n summary: warnings.length ? `诊断完成,发现 ${warnings.length} 个需要关注的问题。` : \"诊断完成,未发现明显问题。\",\n warnings,\n data: checks\n });\n}\n\nasync function checkGitNexus(ctx: FetCommandContext): Promise<DoctorCheck> {\n const global = await ctx.stateStore.readGlobal();\n const state = mergeGitNexusGraphInfo(\n toGitNexusState(await detectGitNexus(), global?.graph?.gitnexus),\n await inspectGitNexusGraph(ctx.projectRoot)\n );\n if (global) {\n global.graph ??= {};\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return state.installed\n ? {\n id: \"gitnexus\",\n status: \"pass\",\n message:\n ctx.language === \"en\"\n ? `GitNexus detected: ${state.executablePath ?? \"gitnexus\"} (${state.version ?? \"unknown\"}), graph ${state.graphExists ? \"found\" : \"not found\"}`\n : `检测到 GitNexus:${state.executablePath ?? \"gitnexus\"}(${state.version ?? \"unknown\"}),代码图${state.graphExists ? \"已找到\" : \"未找到\"}`\n }\n : {\n id: \"gitnexus\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"Optional GitNexus code graph support is not installed\" : \"尚未安装可选的 GitNexus 代码图支持\",\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Install GitNexus later if you want OpenSpec artifacts to prefer a repository graph\"\n : \"如果希望 OpenSpec 产物优先参考仓库代码图,可以稍后安装 GitNexus\"\n };\n}\n\nasync function checkOpenSpec(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const identity = await ctx.openSpec.resolveExecutable();\n return { id: \"openspec\", status: \"pass\", message: `OpenSpec: ${identity.executablePath} (${identity.version})` };\n } catch (error) {\n return { id: \"openspec\", status: \"fail\", message: error instanceof Error ? error.message : \"OpenSpec 检测失败\" };\n }\n}\n\nasync function checkState(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n const state = await ctx.stateStore.readGlobal();\n return state\n ? { id: \"state\", status: \"pass\", message: \"FET 全局状态可读取\" }\n : { id: \"state\", status: \"warn\", message: \"FET 全局状态尚未初始化\", suggestedCommand: \"fet init\" };\n } catch (error) {\n return { id: \"state\", status: \"fail\", message: error instanceof Error ? error.message : \"FET 状态读取失败\" };\n }\n}\n\nasync function checkFile(id: string, path: string, missing: string, suggestedCommand: string): Promise<DoctorCheck> {\n return (await exists(path))\n ? { id, status: \"pass\", message: `${id} 存在` }\n : { id, status: \"warn\", message: missing, suggestedCommand };\n}\n\nasync function checkPlaceholders(ctx: FetCommandContext): Promise<DoctorCheck> {\n try {\n await readFile(join(ctx.projectRoot, \"AGENTS.md\"), \"utf8\");\n const count = await countAgentsLlmPlaceholders(ctx.projectRoot);\n return count\n ? {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? `AGENTS.md has ${count} LLM placeholder(s)` : `AGENTS.md 仍有 ${count} 个 LLM 占位符`,\n suggestedCommand: \"fet fill-context\"\n }\n : {\n id: \"context-placeholders\",\n status: \"pass\",\n message: ctx.language === \"en\" ? \"AGENTS.md placeholders resolved\" : \"AGENTS.md 占位符已处理\"\n };\n } catch {\n return {\n id: \"context-placeholders\",\n status: \"warn\",\n message: ctx.language === \"en\" ? \"AGENTS.md missing\" : \"AGENTS.md 缺失\",\n suggestedCommand: \"fet update-context\"\n };\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\n\nexport const AGENTS_LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/g;\n\nexport async function countAgentsLlmPlaceholders(projectRoot: string): Promise<number> {\n try {\n const content = await readFile(join(projectRoot, \"AGENTS.md\"), \"utf8\");\n return [...content.matchAll(AGENTS_LLM_PLACEHOLDER_PATTERN)].length;\n } catch {\n return 0;\n }\n}\n\nexport function renderAgentsPlaceholderWarning(count: number, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return `AGENTS.md still contains ${count} LLM placeholder(s). Run fet fill-context first so your IDE AI can replace them. Continuing current command.`;\n }\n return `AGENTS.md 仍有 ${count} 个 LLM 占位符。建议先运行 fet fill-context,让 IDE AI 补齐项目上下文;当前命令会继续执行。`;\n}\n","import { dirname } from \"node:path\";\nimport { open, rename, mkdir } from \"node:fs/promises\";\n\nexport interface AtomicWriteResult {\n path: string;\n tempPath: string;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array\n): Promise<AtomicWriteResult> {\n await mkdir(dirname(targetPath), { recursive: true });\n const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;\n const handle = await open(tempPath, \"wx\");\n\n try {\n await handle.writeFile(content);\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await rename(tempPath, targetPath);\n return { path: targetPath, tempPath };\n}\n","import { copyFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport async function createBackup(filePath: string): Promise<string | null> {\n try {\n await stat(filePath);\n } catch {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\..+$/, \"\")\n .replace(\"T\", \"-\");\n const backupPath = join(dirname(filePath), `${basename(filePath)}.fet-backup-${timestamp}`);\n await copyFile(filePath, backupPath);\n return backupPath;\n}\n","import { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { mkdir, open, readFile, rm } from \"node:fs/promises\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface LockMetadata {\n command: string;\n cwd: string;\n fetVersion: string;\n}\n\ninterface LockFile {\n pid: number;\n hostname: string;\n cwd: string;\n command: string;\n startedAt: string;\n fetVersion: string;\n}\n\nexport async function withProjectLock<T>(\n projectRoot: string,\n metadata: LockMetadata,\n fn: () => Promise<T>\n): Promise<T> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n const lock: LockFile = {\n pid: process.pid,\n hostname: hostname(),\n cwd: metadata.cwd,\n command: metadata.command,\n startedAt: new Date().toISOString(),\n fetVersion: metadata.fetVersion\n };\n\n let handle;\n try {\n await mkdir(dirname(lockPath), { recursive: true });\n handle = await open(lockPath, \"wx\");\n await handle.writeFile(JSON.stringify(lock, null, 2));\n } catch {\n throw new FetError({\n code: ErrorCode.LockHeld,\n message: \"另一个 FET 写命令正在运行\",\n details: await readExistingLock(lockPath),\n suggestedCommand: \"fet doctor --fix-lock\"\n });\n } finally {\n await handle?.close();\n }\n\n try {\n return await fn();\n } finally {\n await rm(lockPath, { force: true });\n }\n}\n\nasync function readExistingLock(lockPath: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(lockPath, \"utf8\"));\n } catch {\n return { path: lockPath };\n }\n}\n\nexport async function clearLock(projectRoot: string): Promise<boolean> {\n const lockPath = join(projectRoot, \"openspec\", \".fet.lock\");\n try {\n await rm(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { atomicWrite } from \"./atomic-write.js\";\n\nexport interface JournalStep {\n operation: \"write\" | \"backup\" | \"mkdir\" | \"skip\";\n path: string;\n backupPath?: string | null;\n status: \"done\" | \"failed\" | \"skipped\";\n message?: string;\n}\n\nexport interface InitJournal {\n schemaVersion: 1;\n startedAt: string;\n completedAt: string | null;\n fetVersion: string;\n steps: JournalStep[];\n}\n\nexport function createInitJournal(fetVersion: string): InitJournal {\n return {\n schemaVersion: 1,\n startedAt: new Date().toISOString(),\n completedAt: null,\n fetVersion,\n steps: []\n };\n}\n\nexport async function writeInitJournal(projectRoot: string, journal: InitJournal): Promise<void> {\n await atomicWrite(\n join(projectRoot, \"openspec\", \".fet-init-journal.json\"),\n `${JSON.stringify(journal, null, 2)}\\n`\n );\n}\n\nexport async function readInitJournal(projectRoot: string): Promise<InitJournal | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"openspec\", \".fet-init-journal.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { FetLanguage } from \"./language.js\";\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_GRAPH_PATH = \".gitnexus\";\n\nexport interface GitNexusDetection {\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n error?: string;\n}\n\nexport interface GitNexusState {\n provider: \"gitnexus\";\n installed: boolean;\n executablePath: string | null;\n version: string | null;\n checkedAt: string;\n recommendationShownAt: string | null;\n graphPath?: string | null;\n graphExists?: boolean;\n lastIndexedAt?: string | null;\n lastRefreshAt?: string | null;\n lastStatus?: string | null;\n setupHandoffPath?: string | null;\n setupHandoffUpdatedAt?: string | null;\n handoffPath?: string | null;\n handoffUpdatedAt?: string | null;\n projectContextPath?: string | null;\n projectContextUpdatedAt?: string | null;\n workflowContextPath?: string | null;\n workflowContextUpdatedAt?: string | null;\n lastWorkflowGraphQuery?: string | null;\n}\n\nexport interface GitNexusGraphInfo {\n graphPath: string;\n graphExists: boolean;\n lastIndexedAt: string | null;\n}\n\nexport interface GitNexusRunResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n command: string[];\n}\n\nexport async function detectGitNexus(env: NodeJS.ProcessEnv = process.env): Promise<GitNexusDetection> {\n const checkedAt = new Date().toISOString();\n const command = resolveGitNexusCommand(env);\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, \"--version\"], { shell: process.platform === \"win32\" });\n return {\n installed: true,\n executablePath: command.label,\n version: (stdout.trim() || stderr.trim() || \"unknown\").split(/\\r?\\n/)[0] ?? \"unknown\",\n checkedAt\n };\n } catch (error) {\n return {\n installed: false,\n executablePath: command.label,\n version: null,\n checkedAt,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function toGitNexusState(detection: GitNexusDetection, previous?: GitNexusState | null): GitNexusState {\n return {\n provider: \"gitnexus\",\n installed: detection.installed,\n executablePath: detection.installed ? detection.executablePath : null,\n version: detection.version,\n checkedAt: detection.checkedAt,\n recommendationShownAt: previous?.recommendationShownAt ?? null,\n graphPath: previous?.graphPath ?? null,\n graphExists: previous?.graphExists ?? false,\n lastIndexedAt: previous?.lastIndexedAt ?? null,\n lastRefreshAt: previous?.lastRefreshAt ?? null,\n lastStatus: previous?.lastStatus ?? null,\n setupHandoffPath: previous?.setupHandoffPath ?? null,\n setupHandoffUpdatedAt: previous?.setupHandoffUpdatedAt ?? null,\n handoffPath: previous?.handoffPath ?? null,\n handoffUpdatedAt: previous?.handoffUpdatedAt ?? null,\n projectContextPath: previous?.projectContextPath ?? null,\n projectContextUpdatedAt: previous?.projectContextUpdatedAt ?? null,\n workflowContextPath: previous?.workflowContextPath ?? null,\n workflowContextUpdatedAt: previous?.workflowContextUpdatedAt ?? null,\n lastWorkflowGraphQuery: previous?.lastWorkflowGraphQuery ?? null\n };\n}\n\nexport async function inspectGitNexusGraph(projectRoot: string, env: NodeJS.ProcessEnv = process.env): Promise<GitNexusGraphInfo> {\n const relative = env.FET_GITNEXUS_GRAPH_PATH?.trim() || DEFAULT_GRAPH_PATH;\n const graphPath = join(projectRoot, relative);\n try {\n const info = await stat(graphPath);\n return {\n graphPath: relative,\n graphExists: true,\n lastIndexedAt: info.mtime.toISOString()\n };\n } catch {\n return {\n graphPath: relative,\n graphExists: false,\n lastIndexedAt: null\n };\n }\n}\n\nexport async function runGitNexus(args: string[], options: { cwd: string; env?: NodeJS.ProcessEnv }): Promise<GitNexusRunResult> {\n const command = resolveGitNexusCommand(options.env ?? process.env);\n const fullCommand = [command.file, ...command.args, ...args];\n try {\n const { stdout, stderr } = await execFileAsync(command.file, [...command.args, ...args], {\n cwd: options.cwd,\n shell: process.platform === \"win32\"\n });\n return {\n exitCode: 0,\n stdout,\n stderr,\n command: fullCommand\n };\n } catch (error) {\n const maybe = error as { code?: number | string; stdout?: string; stderr?: string };\n return {\n exitCode: typeof maybe.code === \"number\" ? maybe.code : 1,\n stdout: maybe.stdout ?? \"\",\n stderr: maybe.stderr ?? (error instanceof Error ? error.message : String(error)),\n command: fullCommand\n };\n }\n}\n\nexport function mergeGitNexusGraphInfo(state: GitNexusState, graph: GitNexusGraphInfo): GitNexusState {\n return {\n ...state,\n graphPath: graph.graphPath,\n graphExists: graph.graphExists,\n lastIndexedAt: graph.lastIndexedAt\n };\n}\n\nexport function renderGitNexusRecommendation(state: GitNexusState, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (state.installed) {\n return `Optional GitNexus detected (${state.version ?? \"unknown\"}). You can generate a code graph after init; future OpenSpec artifacts should prefer the graph when it is available.`;\n }\n return \"Optional GitNexus code graph support is not installed. Consider installing GitNexus later to speed up OpenSpec artifact generation and improve code insertion context.\";\n }\n if (state.installed) {\n return `检测到可选 GitNexus(${state.version ?? \"unknown\"})。初始化后可以生成代码图;后续 OpenSpec 产物在图可用时应优先参考它。`;\n }\n\n return \"未安装可选的 GitNexus 代码图支持。可以稍后安装 GitNexus,以加速 OpenSpec 产物生成并改善代码插入上下文。\";\n}\n\nfunction resolveGitNexusCommand(env: NodeJS.ProcessEnv): { file: string; args: string[]; label: string } {\n const raw = env.FET_GITNEXUS_COMMAND?.trim() || env.FET_GITNEXUS_EXECUTABLE?.trim() || \"gitnexus\";\n const parts = splitCommand(raw);\n const [file = \"gitnexus\", ...args] = parts;\n const resolvedFile = process.platform === \"win32\" && raw === \"gitnexus\" ? \"gitnexus.cmd\" : file;\n return { file: resolvedFile, args, label: raw };\n}\n\nfunction splitCommand(value: string): string[] {\n const matches = value.match(/\"[^\"]+\"|'[^']+'|\\S+/g);\n return (matches?.length ? matches : [value]).map((part) => part.replace(/^[\"']|[\"']$/g, \"\"));\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { applyMiniprogramAgentsContext } from \"../agents-miniprogram.js\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { countAgentsLlmPlaceholders } from \"../context-placeholders.js\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { withProjectLock } from \"../fs/index.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport async function fillContextCommand(ctx: FetCommandContext): Promise<void> {\n let miniprogramSummary: string | undefined;\n await withProjectLock(ctx.projectRoot, { command: \"fill-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const miniprogramResult = await applyMiniprogramAgentsContext(ctx.projectRoot, ctx.language);\n miniprogramSummary = miniprogramResult.summary;\n\n const handoffPath = join(ctx.projectRoot, \".fet\", \"fill-context.md\");\n await mkdir(dirname(handoffPath), { recursive: true });\n await atomicWrite(handoffPath, renderGenericHandoff(ctx.language, miniprogramResult.detection.supported));\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(state);\n if (ctx.verbose) {\n ctx.output.info(ctx.language === \"en\" ? `Updated ${adapter.tool} adapter` : `已更新 ${adapter.tool} 适配器`, { written: result.written });\n }\n }\n });\n\n const placeholders = await countAgentsLlmPlaceholders(ctx.projectRoot);\n const warnings = miniprogramSummary ? [miniprogramSummary] : undefined;\n ctx.output.result({\n ok: true,\n command: \"fill-context\",\n summary:\n ctx.language === \"en\"\n ? placeholders\n ? `Found ${placeholders} AGENTS.md placeholder(s). Use your IDE AI to fill the rest.`\n : \"AGENTS.md placeholders are complete. IDE fill-context commands were refreshed.\"\n : placeholders\n ? `发现 ${placeholders} 个 AGENTS.md 占位符。请使用 IDE AI 补齐其余部分。`\n : \"AGENTS.md 占位符已补齐,已刷新 IDE fill-context 命令。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? placeholders\n ? [\n \"Cursor: run /fet-fill-context\",\n \"Codex: run /prompts:fet-fill-context\",\n \"OpenCode or other IDEs: open .fet/fill-context.md or run fet fill-context for handoff instructions\"\n ]\n : [\"Run fet doctor to confirm project context health\"]\n : placeholders\n ? [\n \"Cursor:运行 /fet-fill-context\",\n \"Codex:运行 /prompts:fet-fill-context\",\n \"OpenCode 或其他 IDE:打开 .fet/fill-context.md,或运行 fet fill-context 查看交接说明\"\n ]\n : [\"运行 fet doctor 确认项目上下文状态\"],\n data: {\n placeholders,\n cursorCommand: \"/fet-fill-context\",\n codexCommand: \"/prompts:fet-fill-context\"\n }\n });\n}\n\nfunction renderGenericHandoff(language: FetLanguage, miniprogramDetected: boolean): string {\n const miniprogramNoteEn = miniprogramDetected\n ? \"FET already scanned the mini program layout and wrote package-size constraints into AGENTS.md. Do not overwrite the Mini Program / package-size / development-constraint subsections unless the repo changed.\"\n : \"If AGENTS.md has a Mini Program section marked not applicable, keep it unless the project is actually a mini program.\";\n const miniprogramNoteZh = miniprogramDetected\n ? \"FET 已扫描小程序目录并把包体积/开发约束写入 AGENTS.md。除非仓库结构已变,不要覆盖「小程序」节中的包体积表与开发约束。\"\n : \"若 AGENTS.md 小程序节已标记为不适用,且项目确实不是小程序,可保留该说明。\";\n\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET Fill Context\n\nUse the IDE AI to complete FET-generated placeholders.\n\n1. Read AGENTS.md and openspec/config.yaml.\n2. Read .fet/karpathy-guidelines.md when it exists. For Codex, also read .codex/fet/karpathy-guidelines.md when it exists.\n3. Inspect README files, package scripts, routes, tests, source layout, and project conventions.\n4. ${miniprogramNoteEn}\n5. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete project-specific content.\n6. Preserve FET managed markers.\n7. Do not modify business code.\n8. Run \\`fet doctor\\` and confirm no AGENTS.md placeholder warning remains.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: fill-context\nFET:END -->\n\n# FET 填充上下文\n\n使用 IDE AI 补齐 FET 生成的项目上下文占位符。\n\n1. 阅读 AGENTS.md 和 openspec/config.yaml。\n2. 如果存在 .fet/karpathy-guidelines.md,请一并阅读。对 Codex,如果存在 .codex/fet/karpathy-guidelines.md,也要阅读。\n3. 检查 README、package scripts、路由、测试、源码结构和项目约定。\n4. ${miniprogramNoteZh}\n5. 将其余 \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、项目相关的内容。\n6. 保留 FET 托管标记。\n7. 不要修改业务代码。\n8. 运行 \\`fet doctor\\`,确认不再有 AGENTS.md 占位符警告。\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetLanguage } from \"./language.js\";\nimport { atomicWrite } from \"./fs/atomic-write.js\";\nimport { detectMiniprogramProject, type MiniprogramDetection } from \"./scanner/miniprogram.js\";\nimport {\n patchAgentsMiniprogramSection,\n renderMiniprogramFilledSection,\n renderMiniprogramNotApplicableSection\n} from \"./templates/miniprogram-agents.js\";\n\nexport interface MiniprogramAgentsApplyResult {\n applied: boolean;\n detection: MiniprogramDetection;\n summary: string;\n}\n\nexport async function applyMiniprogramAgentsContext(projectRoot: string, language: FetLanguage): Promise<MiniprogramAgentsApplyResult> {\n const agentsPath = join(projectRoot, \"AGENTS.md\");\n const detection = await detectMiniprogramProject(projectRoot);\n let existing: string;\n try {\n existing = await readFile(agentsPath, \"utf8\");\n } catch {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md was not found.\" : \"未找到 AGENTS.md。\"\n };\n }\n\n const section = detection.supported\n ? renderMiniprogramFilledSection(detection, language)\n : renderMiniprogramNotApplicableSection(language);\n const next = patchAgentsMiniprogramSection(existing, section, language);\n if (next === existing) {\n return {\n applied: false,\n detection,\n summary: language === \"en\" ? \"AGENTS.md mini program section was unchanged.\" : \"AGENTS.md 小程序节未变更。\"\n };\n }\n\n await atomicWrite(agentsPath, next);\n if (!detection.supported) {\n return {\n applied: true,\n detection,\n summary: language === \"en\" ? \"Marked mini program section as not applicable.\" : \"已将小程序节标记为不适用。\"\n };\n }\n\n const near = [detection.mainPackage, ...detection.subpackages].filter((pkg) => pkg.status !== \"ok\");\n const summary =\n language === \"en\"\n ? near.length\n ? `Updated AGENTS.md mini program constraints (${near.length} package(s) near or over limit).`\n : \"Updated AGENTS.md mini program constraints and package size table.\"\n : near.length\n ? `已更新 AGENTS.md 小程序约束(${near.length} 个包接近或超过体积上限)。`\n : \"已更新 AGENTS.md 小程序包体积表与开发约束。\";\n\n return { applied: true, detection, summary };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { readPackageJson } from \"./package.js\";\n\nconst MAIN_PACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst SUBPACKAGE_LIMIT_BYTES = 2 * 1024 * 1024;\nconst TOTAL_LIMIT_BYTES = 20 * 1024 * 1024;\nconst NEAR_LIMIT_BYTES = Math.floor(1.7 * 1024 * 1024);\n\nexport type MiniprogramPlatform = \"wechat\" | \"uni-app\" | \"taro\" | \"other\";\n\nexport type PackageSizeStatus = \"ok\" | \"near_limit\" | \"over_limit\";\n\nexport interface PackageSizeReport {\n name: string;\n root: string;\n sizeBytes: number;\n sizeLabel: string;\n limitBytes: number;\n status: PackageSizeStatus;\n pagePaths: string[];\n}\n\nexport interface MiniprogramScanResult {\n supported: true;\n platform: MiniprogramPlatform;\n platformLabel: string;\n projectType: string;\n appJsonPath: string;\n miniprogramRoot: string;\n mainPackage: PackageSizeReport;\n subpackages: PackageSizeReport[];\n totalSizeBytes: number;\n warnings: string[];\n}\n\nexport type MiniprogramDetection = MiniprogramScanResult | { supported: false };\n\ninterface AppJson {\n pages?: string[];\n subPackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n subpackages?: Array<{ root?: string; name?: string; pages?: string[] }>;\n}\n\nexport async function detectMiniprogramProject(projectRoot: string): Promise<MiniprogramDetection> {\n const pkg = await readPackageJson(projectRoot);\n const platform = await resolvePlatform(projectRoot, pkg);\n if (!platform) {\n return { supported: false };\n }\n\n const appJsonPath = await resolveAppJsonPath(projectRoot, platform);\n if (!appJsonPath) {\n return { supported: false };\n }\n\n const miniprogramRoot = dirnameNormalized(appJsonPath);\n const appJson = await readAppJson(appJsonPath);\n if (!appJson) {\n return { supported: false };\n }\n\n const subPackages = appJson.subPackages ?? appJson.subpackages ?? [];\n const subRoots = subPackages.map((item) => normalizeRelative(item.root ?? \"\")).filter(Boolean);\n const mainPagePaths = appJson.pages ?? [];\n\n const mainDirs = uniquePaths(mainPagePaths.map((page) => pageDir(page)).filter(Boolean));\n const mainSize = await sumPaths(miniprogramRoot, mainDirs, subRoots);\n const mainPackage: PackageSizeReport = {\n name: \"main\",\n root: miniprogramRoot,\n sizeBytes: mainSize,\n sizeLabel: formatBytes(mainSize),\n limitBytes: MAIN_PACKAGE_LIMIT_BYTES,\n status: sizeStatus(mainSize, MAIN_PACKAGE_LIMIT_BYTES),\n pagePaths: mainPagePaths\n };\n\n const subpackageReports: PackageSizeReport[] = [];\n for (const sub of subPackages) {\n const root = normalizeRelative(sub.root ?? \"\");\n if (!root) {\n continue;\n }\n const size = await directorySize(join(miniprogramRoot, root));\n subpackageReports.push({\n name: sub.name ?? root.replace(/\\/$/, \"\"),\n root,\n sizeBytes: size,\n sizeLabel: formatBytes(size),\n limitBytes: SUBPACKAGE_LIMIT_BYTES,\n status: sizeStatus(size, SUBPACKAGE_LIMIT_BYTES),\n pagePaths: sub.pages ?? []\n });\n }\n\n const totalSizeBytes = mainPackage.sizeBytes + subpackageReports.reduce((sum, item) => sum + item.sizeBytes, 0);\n const warnings: string[] = [];\n if (totalSizeBytes >= NEAR_LIMIT_BYTES) {\n warnings.push(\n totalSizeBytes >= TOTAL_LIMIT_BYTES\n ? \"源码目录合计体积已达到或超过 20MB 参考上限,需整体瘦身。\"\n : \"源码目录合计体积已接近 20MB 参考上限。\"\n );\n }\n\n return {\n supported: true,\n platform: platform.id,\n platformLabel: platform.label,\n projectType: platform.projectType,\n appJsonPath: relative(projectRoot, appJsonPath).replace(/\\\\/g, \"/\"),\n miniprogramRoot: relative(projectRoot, miniprogramRoot).replace(/\\\\/g, \"/\") || \".\",\n mainPackage,\n subpackages: subpackageReports,\n totalSizeBytes,\n warnings\n };\n}\n\nasync function resolvePlatform(\n projectRoot: string,\n pkg: Awaited<ReturnType<typeof readPackageJson>>\n): Promise<{ id: MiniprogramPlatform; label: string; projectType: string } | null> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n\n if (await exists(join(projectRoot, \"project.config.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生 / 微信开发者工具\" };\n }\n if (deps[\"@tarojs/taro\"] || deps[\"@tarojs/cli\"] || (await exists(join(projectRoot, \"config\", \"index.ts\")))) {\n return { id: \"taro\", label: \"Taro(可发布微信小程序)\", projectType: \"Taro 跨端小程序\" };\n }\n if ((await exists(join(projectRoot, \"manifest.json\"))) && (await exists(join(projectRoot, \"pages.json\")))) {\n return { id: \"uni-app\", label: \"uni-app(可发布微信小程序)\", projectType: \"uni-app 跨端小程序\" };\n }\n if (await exists(join(projectRoot, \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(app.json)\" };\n }\n if (await exists(join(projectRoot, \"miniprogram\", \"app.json\"))) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信原生(miniprogram 目录)\" };\n }\n if (deps[\"miniprogram-api-typings\"]) {\n return { id: \"wechat\", label: \"微信小程序\", projectType: \"微信 API 类型定义项目\" };\n }\n return null;\n}\n\nasync function resolveAppJsonPath(projectRoot: string, platform: { id: MiniprogramPlatform }): Promise<string | null> {\n const candidates: string[] = [];\n if (platform.id === \"wechat\") {\n try {\n const config = JSON.parse(await readFile(join(projectRoot, \"project.config.json\"), \"utf8\")) as {\n miniprogramRoot?: string;\n };\n if (config.miniprogramRoot) {\n candidates.push(join(projectRoot, config.miniprogramRoot, \"app.json\"));\n }\n } catch {\n // ignore\n }\n candidates.push(join(projectRoot, \"app.json\"), join(projectRoot, \"miniprogram\", \"app.json\"));\n } else {\n candidates.push(\n join(projectRoot, \"src\", \"app.json\"),\n join(projectRoot, \"app.json\"),\n join(projectRoot, \"miniprogram\", \"app.json\"),\n join(projectRoot, \"dist\", \"app.json\")\n );\n }\n\n for (const candidate of candidates) {\n if (await exists(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nasync function readAppJson(path: string): Promise<AppJson | null> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as AppJson;\n } catch {\n return null;\n }\n}\n\nasync function sumPaths(baseDir: string, dirs: string[], excludedRoots: string[]): Promise<number> {\n let total = 0;\n const visited = new Set<string>();\n\n for (const dir of dirs) {\n const abs = join(baseDir, dir);\n if (visited.has(abs)) {\n continue;\n }\n visited.add(abs);\n total += await directorySize(abs);\n }\n\n const rootFiles = await readdir(baseDir, { withFileTypes: true });\n for (const entry of rootFiles) {\n if (!entry.isFile()) {\n continue;\n }\n if (shouldSkipName(entry.name)) {\n continue;\n }\n total += (await stat(join(baseDir, entry.name))).size;\n }\n\n for (const entry of rootFiles) {\n if (!entry.isDirectory() || shouldSkipName(entry.name)) {\n continue;\n }\n const rel = `${entry.name}/`;\n if (dirs.some((dir) => dir === entry.name || dir.startsWith(`${entry.name}/`))) {\n continue;\n }\n if (excludedRoots.some((root) => root === entry.name || root.startsWith(`${entry.name}/`) || rel.startsWith(root))) {\n continue;\n }\n total += await directorySize(join(baseDir, entry.name));\n }\n\n return total;\n}\n\nasync function directorySize(targetPath: string): Promise<number> {\n try {\n const info = await stat(targetPath);\n if (!info.isDirectory()) {\n return info.size;\n }\n } catch {\n return 0;\n }\n\n let total = 0;\n const queue = [targetPath];\n while (queue.length) {\n const current = queue.pop();\n if (!current) {\n break;\n }\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (shouldSkipName(entry.name)) {\n continue;\n }\n const next = join(current, entry.name);\n if (entry.isDirectory()) {\n queue.push(next);\n } else if (entry.isFile()) {\n try {\n total += (await stat(next)).size;\n } catch {\n // ignore unreadable files\n }\n }\n }\n }\n return total;\n}\n\nfunction pageDir(pagePath: string): string {\n const normalized = pagePath.replace(/^\\//, \"\");\n const parts = normalized.split(\"/\");\n if (parts.length <= 1) {\n return parts[0] ?? \"\";\n }\n return parts.slice(0, -1).join(\"/\");\n}\n\nfunction sizeStatus(sizeBytes: number, limitBytes: number): PackageSizeStatus {\n if (sizeBytes >= limitBytes) {\n return \"over_limit\";\n }\n if (sizeBytes >= NEAR_LIMIT_BYTES) {\n return \"near_limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.replace(/^\\//, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.filter(Boolean))];\n}\n\nfunction shouldSkipName(name: string): boolean {\n return name === \"node_modules\" || name === \".git\" || name === \"miniprogram_npm\" || name.startsWith(\".\");\n}\n\nfunction dirnameNormalized(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, \"/\").split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \".\";\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse } from \"yaml\";\nimport type { ScannedCommand, ScannedWorkspace } from \"./types.js\";\n\ninterface PackageJson {\n name?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[] };\n}\n\nexport async function readPackageJson(projectRoot: string): Promise<PackageJson | null> {\n try {\n return JSON.parse(await readFile(join(projectRoot, \"package.json\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n\nexport interface PackageManagerDetection {\n manager: string;\n confidence: \"high\" | \"medium\" | \"low\";\n warnings: string[];\n}\n\nexport async function detectPackageManager(projectRoot: string, pkg: PackageJson | null): Promise<PackageManagerDetection> {\n const warnings: string[] = [];\n if (pkg?.packageManager) {\n const declared = pkg.packageManager.split(\"@\")[0] ?? \"unknown\";\n const locks = await detectLockManagers(projectRoot);\n const conflicting = locks.filter((item) => item !== declared);\n if (conflicting.length) {\n warnings.push(`packageManager 声明为 ${declared},但同时发现锁文件:${conflicting.join(\", \")}`);\n }\n return { manager: declared, confidence: \"high\", warnings };\n }\n\n const locks = await detectLockManagers(projectRoot);\n if (locks.length > 1) {\n warnings.push(`发现多个包管理器锁文件:${locks.join(\", \")},默认使用 ${locks[0]}`);\n return { manager: locks[0] ?? \"npm\", confidence: \"medium\", warnings };\n }\n if (locks[0]) {\n return { manager: locks[0], confidence: \"high\", warnings };\n }\n return { manager: \"npm\", confidence: \"low\", warnings };\n}\n\nexport function extractCommands(pkg: PackageJson | null, packageManager: string): Record<string, ScannedCommand> {\n const scripts = pkg?.scripts ?? {};\n const result: Record<string, ScannedCommand> = {};\n const scriptNames = [\"dev\", \"build\", \"lint\", \"typecheck\", \"check\", \"test\", \"test:unit\"];\n\n for (const name of scriptNames) {\n if (scripts[name]) {\n const dimension = name === \"check\" ? \"typecheck\" : name === \"test:unit\" ? \"test\" : name;\n if (result[dimension]) {\n continue;\n }\n result[dimension] = {\n command: scriptCommand(packageManager, name),\n source: `package.json:scripts.${name}`,\n required: name === \"build\"\n };\n }\n }\n\n return result;\n}\n\nexport function detectFramework(pkg: PackageJson | null): { name: string; confidence: \"high\" | \"medium\" | \"low\"; sources: string[] } {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n const candidates: Array<[string, string[]]> = [\n [\"next\", [\"next\"]],\n [\"nuxt\", [\"nuxt\"]],\n [\"vite\", [\"vite\"]],\n [\"sveltekit\", [\"@sveltejs/kit\"]],\n [\"angular\", [\"@angular/core\", \"@angular/cli\"]],\n [\"react\", [\"react\"]],\n [\"vue\", [\"vue\"]],\n [\"svelte\", [\"svelte\"]]\n ];\n for (const [candidate, packages] of candidates) {\n if (packages.some((name) => deps[name])) {\n return { name: candidate, confidence: \"high\", sources: [\"package.json\"] };\n }\n }\n return { name: \"unknown\", confidence: \"low\", sources: [] };\n}\n\nexport async function detectLanguage(projectRoot: string, pkg: PackageJson | null): Promise<string> {\n const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };\n if (deps.typescript || (await exists(join(projectRoot, \"tsconfig.json\")))) {\n return \"typescript\";\n }\n return \"javascript\";\n}\n\nexport async function detectWorkspaces(projectRoot: string, pkg: PackageJson | null): Promise<ScannedWorkspace[]> {\n const packageWorkspaces = normalizeWorkspaces(pkg?.workspaces).map((path) => ({\n name: path,\n path,\n source: \"package.json:workspaces\"\n }));\n if (packageWorkspaces.length) {\n return packageWorkspaces;\n }\n\n try {\n const workspace = parse(await readFile(join(projectRoot, \"pnpm-workspace.yaml\"), \"utf8\")) as { packages?: string[] } | null;\n return (workspace?.packages ?? []).map((path) => ({\n name: path,\n path,\n source: \"pnpm-workspace.yaml:packages\"\n }));\n } catch {\n return [];\n }\n}\n\nasync function detectLockManagers(projectRoot: string): Promise<string[]> {\n const lockFiles: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"bun.lockb\", \"bun\"],\n [\"bun.lock\", \"bun\"],\n [\"package-lock.json\", \"npm\"]\n ];\n const found: string[] = [];\n for (const [file, manager] of lockFiles) {\n if (await exists(join(projectRoot, file))) {\n found.push(manager);\n }\n }\n return found;\n}\n\nfunction normalizeWorkspaces(workspaces: PackageJson[\"workspaces\"]): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n return workspaces?.packages ?? [];\n}\n\nfunction scriptCommand(packageManager: string, name: string): string {\n return packageManager === \"npm\" ? `npm run ${name}` : `${packageManager} ${name}`;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import type { MiniprogramScanResult } from \"../scanner/miniprogram.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nconst MAIN_LIMIT_MB = 2;\nconst SUB_LIMIT_MB = 2;\nconst TOTAL_LIMIT_MB = 20;\nconst NEAR_LIMIT_MB = 1.7;\n\nexport function renderMiniprogramPlaceholderSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\n- Platform: [NEEDS LLM INPUT]\n- Project type: [NEEDS LLM INPUT]\n\n### Package size (filled by \\`fet fill-context\\`)\n\n[NEEDS LLM INPUT]\n\n### Development constraints\n\n[NEEDS LLM INPUT]`;\n }\n\n return `## 小程序\n\n- 平台:[NEEDS LLM INPUT]\n- 工程类型:[NEEDS LLM INPUT]\n\n### 包体积(由 \\`fet fill-context\\` 扫描补充)\n\n[NEEDS LLM INPUT]\n\n### 开发约束\n\n[NEEDS LLM INPUT]`;\n}\n\nexport function renderMiniprogramFilledSection(scan: MiniprogramScanResult, language: FetLanguage): string {\n if (language === \"en\") {\n return renderMiniprogramFilledSectionEn(scan);\n }\n return renderMiniprogramFilledSectionZh(scan);\n}\n\nfunction renderMiniprogramFilledSectionZh(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableZh(scan);\n const rules = renderConstraintRulesZh(scan);\n const warnings = scan.warnings.length ? `\\n\\n扫描提示:${scan.warnings.join(\";\")}` : \"\";\n\n return `## 小程序\n\n- 平台:${scan.platformLabel}\n- 工程类型:${scan.projectType}\n- 配置:\\`${scan.appJsonPath}\\`(根目录 \\`${scan.miniprogramRoot}/\\`)\n\n### 包体积(源码目录估算,上传前以微信开发者工具 / CI 构建产物为准)\n\n${sizeTable}\n\n> 说明:下表按仓库内页面/分包目录源码体积累计,用于规划开发;**实际上传体积以编译后为准**,通常与源码趋势一致。\n\n### 开发约束\n\n${rules}${warnings}`;\n}\n\nfunction renderMiniprogramFilledSectionEn(scan: MiniprogramScanResult): string {\n const sizeTable = renderSizeTableEn(scan);\n const rules = renderConstraintRulesEn(scan);\n const warnings = scan.warnings.length ? `\\n\\nScan notes: ${scan.warnings.join(\"; \")}` : \"\";\n\n return `## Mini Program\n\n- Platform: ${scan.platformLabel}\n- Project type: ${scan.projectType}\n- Config: \\`${scan.appJsonPath}\\` (root \\`${scan.miniprogramRoot}/\\`)\n\n### Package size (source tree estimate; verify with WeChat DevTools / CI build output)\n\n${sizeTable}\n\n> These numbers sum source directories for planning. **Uploaded package size is determined by the build output**, but source trends usually match.\n\n### Development constraints\n\n${rules}${warnings}`;\n}\n\nfunction renderSizeTableZh(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowZh(\"主包\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowZh(`分包 ${item.name}`, item))\n ];\n rows.push(`| 合计(源码估算) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | 参考 |`);\n\n return `| 包 | 根目录 | 源码体积(估算) | 上限 | 状态 |\n|----|--------|------------------|------|------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderSizeTableEn(scan: MiniprogramScanResult): string {\n const rows = [\n renderPackageRowEn(\"main\", scan.mainPackage),\n ...scan.subpackages.map((item) => renderPackageRowEn(`subpackage ${item.name}`, item))\n ];\n rows.push(`| total (source estimate) | — | ${formatBytes(scan.totalSizeBytes)} | ≤ ${TOTAL_LIMIT_MB} MB | reference |`);\n\n return `| package | root | estimated source size | limit | status |\n|---------|------|------------------------|-------|--------|\n${rows.join(\"\\n\")}`;\n}\n\nfunction renderPackageRowZh(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelZh(pkg.status)} |`;\n}\n\nfunction renderPackageRowEn(label: string, pkg: MiniprogramScanResult[\"mainPackage\"]): string {\n return `| ${label} | \\`${pkg.root}\\` | ${pkg.sizeLabel} | ≤ ${pkg.limitBytes / (1024 * 1024)} MB | ${statusLabelEn(pkg.status)} |`;\n}\n\nfunction renderConstraintRulesZh(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- 微信小程序体积上限(发布到微信时):**主包 ≤ ${MAIN_LIMIT_MB}MB**,**单个分包 ≤ ${SUB_LIMIT_MB}MB**,**整包 ≤ ${TOTAL_LIMIT_MB}MB**(以[微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html)为准)。`,\n `- **接近上限阈值:源码目录 ≥ ${NEAR_LIMIT_MB}MB** 即视为「接近 2MB」:禁止在该包内**新增页面**、大图、音视频、重复静态资源;优先拆到其他分包、懒加载或先做体积优化。`,\n `- 体积 **≥ ${MAIN_LIMIT_MB}MB(主包)或 ≥ ${SUB_LIMIT_MB}MB(分包)** 时,必须先瘦身再新增功能或页面。`,\n `- 新增页面前:确认目标包不在「接近上限」或「超限」列表;跨包迁移页面时同步更新 \\`app.json\\` / 分包配置与路由引用。`,\n `- Taro / uni-app 发布到微信时同样受上述上传体积约束;其他端规则见对应平台文档。`\n ];\n\n if (blocked.near.length) {\n lines.push(\n `- **当前接近上限(≥${NEAR_LIMIT_MB}MB,禁止在本包内新增页面)**:${blocked.near.map((item) => `\\`${item}\\``).join(\"、\")}。`\n );\n }\n if (blocked.over.length) {\n lines.push(`- **当前已超限(必须先瘦身)**:${blocked.over.map((item) => `\\`${item}\\``).join(\"、\")}。`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- 当前扫描未发现接近 2MB 的主包/分包目录,但仍应在每次较大改动后复核构建产物体积。\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderConstraintRulesEn(scan: MiniprogramScanResult): string {\n const blocked = collectBlockedPackages(scan);\n const lines = [\n `- WeChat upload limits: **main package ≤ ${MAIN_LIMIT_MB}MB**, **each subpackage ≤ ${SUB_LIMIT_MB}MB**, **whole mini program ≤ ${TOTAL_LIMIT_MB}MB** (see WeChat official docs).`,\n `- Treat **source tree ≥ ${NEAR_LIMIT_MB}MB** as near the 2MB cap: do **not** add new pages, large media, or redundant static assets in that package; split work to another subpackage or optimize first.`,\n `- If a package is **≥ ${MAIN_LIMIT_MB}MB (main) or ≥ ${SUB_LIMIT_MB}MB (sub)** , optimize before adding pages or features.`,\n `- Before adding a page, confirm the target package is not listed below; update \\`app.json\\` / subpackage config when moving pages.`,\n `- Taro / uni-app builds for WeChat follow the same upload limits.`\n ];\n\n if (blocked.near.length) {\n lines.push(`- **Near limit (≥${NEAR_LIMIT_MB}MB, no new pages in these packages):** ${blocked.near.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (blocked.over.length) {\n lines.push(`- **Over limit (optimize before more work):** ${blocked.over.map((item) => `\\`${item}\\``).join(\", \")}.`);\n }\n if (!blocked.near.length && !blocked.over.length) {\n lines.push(\"- No package is near 2MB in this scan; still verify build output after large changes.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction collectBlockedPackages(scan: MiniprogramScanResult): { near: string[]; over: string[] } {\n const near: string[] = [];\n const over: string[] = [];\n const all = [scan.mainPackage, ...scan.subpackages];\n for (const pkg of all) {\n const label = pkg.name === \"main\" ? `主包(${pkg.root})` : `${pkg.name}(${pkg.root})`;\n if (pkg.status === \"over_limit\") {\n over.push(label);\n } else if (pkg.status === \"near_limit\") {\n near.push(label);\n }\n }\n return { near, over };\n}\n\nfunction statusLabelZh(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"超限\";\n }\n if (status === \"near_limit\") {\n return \"接近上限\";\n }\n return \"正常\";\n}\n\nfunction statusLabelEn(status: MiniprogramScanResult[\"mainPackage\"][\"status\"]): string {\n if (status === \"over_limit\") {\n return \"over limit\";\n }\n if (status === \"near_limit\") {\n return \"near limit\";\n }\n return \"ok\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nexport function renderMiniprogramNotApplicableSection(language: FetLanguage): string {\n if (language === \"en\") {\n return `## Mini Program\n\nNot detected as a mini program project. Leave this section as N/A or remove it if irrelevant.`;\n }\n return `## 小程序\n\n未识别为小程序工程;如无小程序场景可填写「不适用」或删除本节。`;\n}\n\nexport function patchAgentsMiniprogramSection(content: string, sectionMarkdown: string, language: FetLanguage): string {\n const heading = language === \"en\" ? \"## Mini Program\" : \"## 小程序\";\n const autoBegin = \"<!-- FET:BEGIN AUTO -->\";\n const autoEnd = \"<!-- FET:END AUTO -->\";\n const begin = content.indexOf(autoBegin);\n const end = content.indexOf(autoEnd);\n if (begin === -1 || end === -1 || end < begin) {\n return content;\n }\n\n const auto = content.slice(begin, end);\n const headingIndex = auto.indexOf(heading);\n if (headingIndex === -1) {\n const insertion = `\\n\\n${sectionMarkdown}\\n`;\n return `${content.slice(0, end)}${insertion}${content.slice(end)}`;\n }\n\n const afterHeading = auto.slice(headingIndex + heading.length);\n const nextHeading = afterHeading.search(/\\n## /);\n const sectionEnd = nextHeading === -1 ? auto.length : headingIndex + heading.length + nextHeading;\n const absoluteStart = begin + headingIndex;\n const absoluteEnd = begin + sectionEnd;\n return `${content.slice(0, absoluteStart)}${sectionMarkdown}${content.slice(absoluteEnd)}`;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { buildProjectGraphContext } from \"../graph-context.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"../gitnexus.js\";\n\nexport type GraphAction = \"status\" | \"setup\" | \"init\" | \"refresh\" | \"doctor\" | \"handoff\";\n\nexport async function graphCommand(ctx: FetCommandContext, action: GraphAction, args: string[] = []): Promise<void> {\n switch (action) {\n case \"status\":\n await graphStatusCommand(ctx);\n return;\n case \"doctor\":\n await graphDoctorCommand(ctx);\n return;\n case \"setup\":\n await graphSetupCommand(ctx);\n return;\n case \"handoff\":\n await graphHandoffCommand(ctx);\n return;\n case \"init\":\n await graphAnalyzeCommand(ctx, \"init\", args);\n return;\n case \"refresh\":\n await graphAnalyzeCommand(ctx, \"refresh\", args);\n return;\n }\n}\n\nasync function graphStatusCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. Run fet graph setup for installation handoff instructions.\"\n : \"尚未安装 GitNexus。运行 fet graph setup 获取安装交接说明。\"\n ];\n ctx.output.result({\n ok: true,\n command: \"graph status\",\n summary:\n ctx.language === \"en\"\n ? result.state.installed\n ? `GitNexus graph status checked. Graph ${result.state.graphExists ? \"exists\" : \"does not exist\"} at ${result.state.graphPath ?? \".gitnexus\"}.`\n : \"GitNexus is not installed. Graph support remains optional.\"\n : result.state.installed\n ? `已检查 GitNexus 代码图状态。代码图${result.state.graphExists ? \"存在\" : \"不存在\"},路径为 ${result.state.graphPath ?? \".gitnexus\"}。`\n : \"尚未安装 GitNexus。代码图能力保持可选。\",\n warnings,\n nextSteps:\n result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"Run fet graph init to build the first GitNexus graph\" : \"运行 fet graph init 生成第一份 GitNexus 代码图\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphDoctorCommand(ctx: FetCommandContext): Promise<void> {\n const result = await refreshGraphState(ctx, { runStatus: true });\n const warnings = [\n ...(!result.state.installed ? [ctx.language === \"en\" ? \"GitNexus is not installed.\" : \"尚未安装 GitNexus。\"] : []),\n ...(result.state.installed && !result.state.graphExists\n ? [ctx.language === \"en\" ? \"GitNexus is installed but no graph directory was found.\" : \"已安装 GitNexus,但未发现代码图目录。\"]\n : []),\n ...(!result.state.handoffPath\n ? [ctx.language === \"en\" ? \"Graph handoff instructions have not been generated.\" : \"尚未生成代码图使用交接说明。\"]\n : [])\n ];\n\n ctx.output.result({\n ok: true,\n command: \"graph doctor\",\n summary:\n ctx.language === \"en\"\n ? warnings.length\n ? `Graph doctor completed with ${warnings.length} warning(s).`\n : \"Graph doctor completed without warnings.\"\n : warnings.length\n ? `代码图诊断完成,发现 ${warnings.length} 个警告。`\n : \"代码图诊断完成,未发现警告。\",\n warnings,\n nextSteps:\n warnings.length\n ? ctx.language === \"en\"\n ? [\"Run fet graph setup\", \"Run fet graph handoff\", \"Run fet graph init when GitNexus is installed\"]\n : [\"运行 fet graph setup\", \"运行 fet graph handoff\", \"安装 GitNexus 后运行 fet graph init\"]\n : undefined,\n data: result\n });\n}\n\nasync function graphSetupCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-setup.md\");\n const installCommand = process.env.FET_GITNEXUS_INSTALL_COMMAND?.trim() || null;\n await withProjectLock(ctx.projectRoot, { command: \"graph setup\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { write: false });\n await writeHandoffFile(handoffPath, renderGraphSetupHandoff(result.state, { installCommand, language: ctx.language }));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n setupHandoffPath: \".fet/graph-setup.md\",\n setupHandoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph setup\",\n summary:\n ctx.language === \"en\"\n ? \"GitNexus IDE-assisted setup playbook generated.\"\n : \"已生成 GitNexus IDE LLM 辅助安装任务书。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The playbook lets the current IDE LLM guide installation with user confirmation before risky commands.\"\n : \"尚未安装 GitNexus。任务书会指导当前 IDE LLM 推进安装,并在高风险命令前请求用户确认。\"\n ],\n nextSteps: result.state.installed\n ? [\n ctx.language === \"en\"\n ? \"Ask your IDE AI to read .fet/graph-setup.md and run the optional gitnexus setup flow if you want IDE/MCP integration\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并在需要 IDE/MCP 集成时按确认流程运行 gitnexus setup\",\n \"fet graph init\"\n ]\n : [\n ctx.language === \"en\"\n ? \"Ask your current IDE AI to read .fet/graph-setup.md and follow the installation playbook\"\n : \"让当前 IDE AI 阅读 .fet/graph-setup.md,并按安装任务书推进\"\n ],\n data: {\n path: \".fet/graph-setup.md\",\n installCommandConfigured: Boolean(installCommand),\n gitnexus: result.state\n }\n });\n}\n\nasync function graphHandoffCommand(ctx: FetCommandContext): Promise<void> {\n let result!: Awaited<ReturnType<typeof refreshGraphState>>;\n const handoffPath = join(ctx.projectRoot, \".fet\", \"graph-handoff.md\");\n await withProjectLock(ctx.projectRoot, { command: \"graph handoff\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n result = await refreshGraphState(ctx, { runStatus: true, write: false });\n await writeHandoffFile(handoffPath, renderGraphUsageHandoff(result.state, ctx.language));\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n handoffPath: \".fet/graph-handoff.md\",\n handoffUpdatedAt: new Date().toISOString()\n };\n await ctx.stateStore.writeGlobal(global);\n });\n\n ctx.output.result({\n ok: true,\n command: \"graph handoff\",\n summary: ctx.language === \"en\" ? \"GitNexus graph usage handoff generated.\" : \"已生成 GitNexus 代码图使用交接说明。\",\n warnings: result.state.installed\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus is not installed. The handoff still documents the fallback behavior.\"\n : \"尚未安装 GitNexus。交接说明仍会记录回退行为。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Cursor/Codex/OpenCode: read .fet/graph-handoff.md before broad repository scans\"]\n : [\"Cursor/Codex/OpenCode:大范围扫描仓库前先阅读 .fet/graph-handoff.md\"],\n data: {\n path: \".fet/graph-handoff.md\",\n gitnexus: result.state\n }\n });\n}\n\nasync function graphAnalyzeCommand(ctx: FetCommandContext, mode: \"init\" | \"refresh\", args: string[]): Promise<void> {\n const detection = await detectGitNexus();\n if (!detection.installed) {\n throw new FetError({\n code: ErrorCode.GraphProviderNotFound,\n message: ctx.language === \"en\" ? \"GitNexus is not installed or is not available on PATH.\" : \"尚未安装 GitNexus,或 GitNexus 不在 PATH 中。\",\n details: { executable: detection.executablePath, error: detection.error },\n suggestedCommand: \"fet graph setup\"\n });\n }\n\n const run = await runGitNexus([\"analyze\", ...args], { cwd: ctx.projectRoot });\n if (run.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.GraphCommandFailed,\n message: ctx.language === \"en\" ? \"GitNexus analyze failed.\" : \"GitNexus analyze 执行失败。\",\n details: { command: run.command.join(\" \"), exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr },\n suggestedCommand: \"fet graph doctor\"\n });\n }\n\n const result = await refreshGraphState(ctx, { write: false });\n const graphContext = await buildProjectGraphContext(ctx, result.state, `fet graph ${mode}`);\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...result.state,\n lastRefreshAt: new Date().toISOString(),\n projectContextPath: graphContext.path,\n projectContextUpdatedAt: graphContext.generated ? new Date().toISOString() : result.state.projectContextUpdatedAt ?? null\n };\n await ctx.stateStore.writeGlobal(global);\n\n ctx.output.result({\n ok: true,\n command: `graph ${mode}`,\n summary:\n ctx.language === \"en\"\n ? mode === \"init\"\n ? \"GitNexus graph initialized.\"\n : \"GitNexus graph refreshed.\"\n : mode === \"init\"\n ? \"已初始化 GitNexus 代码图。\"\n : \"已刷新 GitNexus 代码图。\",\n warnings: result.state.graphExists\n ? []\n : [\n ctx.language === \"en\"\n ? \"GitNexus analyze completed, but the configured graph directory was not found.\"\n : \"GitNexus analyze 已完成,但未发现配置的代码图目录。\"\n ],\n nextSteps:\n ctx.language === \"en\"\n ? [\"Run fet graph status\", \"Read .fet/graph-context/project.md before broad scans\", \"Use .fet/graph-handoff.md or generated IDE prompts to prefer graph context\"]\n : [\"运行 fet graph status\", \"使用 .fet/graph-handoff.md 或生成的 IDE 提示,优先参考代码图上下文\"],\n data: {\n gitnexus: global.graph.gitnexus,\n graphContext,\n run: {\n command: run.command,\n stdout: run.stdout.trim(),\n stderr: run.stderr.trim()\n }\n }\n });\n}\n\nasync function refreshGraphState(ctx: FetCommandContext, options: { runStatus?: boolean; write?: boolean } = {}) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n let state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n let gitnexusStatus: Awaited<ReturnType<typeof runGitNexus>> | null = null;\n\n if (options.runStatus && detection.installed) {\n gitnexusStatus = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n state = {\n ...state,\n lastStatus: firstLine(gitnexusStatus.stdout) || firstLine(gitnexusStatus.stderr) || `exit ${gitnexusStatus.exitCode}`\n };\n }\n\n if (options.write ?? true) {\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n }\n\n return {\n state,\n gitnexusStatus: gitnexusStatus\n ? {\n exitCode: gitnexusStatus.exitCode,\n command: gitnexusStatus.command,\n stdout: gitnexusStatus.stdout.trim(),\n stderr: gitnexusStatus.stderr.trim()\n }\n : null\n };\n}\n\nasync function writeHandoffFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderGraphSetupHandoff(\n state: GitNexusState,\n options: { installCommand: string | null; language: FetCommandContext[\"language\"] }\n): string {\n if (options.language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE Setup Playbook\n\nThis file is written for the current IDE LLM. Use it to help the user install and verify optional GitNexus graph support. GitNexus is optional; FET/OpenSpec workflows must continue to work when it is unavailable.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Executable: ${state.executablePath ?? \"gitnexus\"}\n- Version: ${state.version ?? \"unknown\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Configured install command: ${options.installCommand ?? \"none\"}\n\nIDE LLM setup flow:\n\n1. Check the shell, operating system, package managers, and PATH. Run only read-only detection commands at first.\n2. Run \\`gitnexus --version\\` or the executable shown above. If it succeeds, skip installation and continue to verification.\n3. If GitNexus is missing and \\`FET_GITNEXUS_INSTALL_COMMAND\\` is configured, explain that command to the user and ask for approval before running it.\n4. If no install command is configured, find the official GitNexus installation instructions or ask the user for the preferred install method. Do not invent an installer.\n5. Before running any command that downloads software, installs globally, changes PATH, modifies user home files, or changes IDE/MCP configuration, show the exact command and wait for user approval.\n6. After installation, verify with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, run \\`gitnexus setup\\` only after explaining what it may change and receiving approval.\n8. Return to this project and run \\`fet graph init\\` to build the first graph.\n9. Run \\`fet graph handoff\\` so future IDE AI work can prefer graph context before broad repository scans.\n\nGuardrails:\n\n- Do not block FET/OpenSpec commands when GitNexus is unavailable.\n- Do not generate or modify application code during setup.\n- Do not silently install software or modify global/user-level configuration.\n- If installation fails, summarize the failing command, stderr, and the next manual step.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-setup\nFET:END -->\n\n# FET GitNexus IDE 安装任务书\n\n本文档写给当前 IDE LLM。请用它帮助用户安装并验证可选的 GitNexus 代码图能力。GitNexus 是可选能力;即使不可用,FET/OpenSpec 主流程也必须继续可用。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 可执行文件:${state.executablePath ?? \"gitnexus\"}\n- 版本:${state.version ?? \"unknown\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 已配置安装命令:${options.installCommand ?? \"无\"}\n\nIDE LLM 安装流程:\n\n1. 先检测 shell、操作系统、包管理器和 PATH。起步阶段只运行只读检测命令。\n2. 运行 \\`gitnexus --version\\` 或上方显示的可执行文件。如果成功,跳过安装并进入验证。\n3. 如果 GitNexus 缺失且已配置 \\`FET_GITNEXUS_INSTALL_COMMAND\\`,先向用户解释该命令,再等待用户批准后执行。\n4. 如果没有配置安装命令,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。不要臆造安装命令。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户目录或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n6. 安装后运行 \\`gitnexus --version\\` 验证。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\` 可能修改的内容,获得确认后再运行。\n8. 回到本项目运行 \\`fet graph init\\`,生成第一份代码图。\n9. 运行 \\`fet graph handoff\\`,让后续 IDE AI 在大范围扫描前优先使用代码图上下文。\n\n约束:\n\n- GitNexus 不可用时,不要阻塞 FET/OpenSpec 命令。\n- 安装过程中不要生成或修改业务代码。\n- 不要静默安装软件,也不要静默修改全局或用户级配置。\n- 如果安装失败,汇总失败命令、stderr 和下一步人工处理建议。\n`;\n}\n\nfunction renderGraphUsageHandoff(state: GitNexusState, language: FetCommandContext[\"language\"]): string {\n if (language === \"en\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET Graph Handoff\n\nUse GitNexus graph context as an optional first pass before broad repository scans.\n\nCurrent status:\n\n- Installed: ${state.installed ? \"yes\" : \"no\"}\n- Graph path: ${state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${state.lastIndexedAt ?? \"unknown\"}\n- Last status: ${state.lastStatus ?? \"unknown\"}\n\nWhen graph context is available:\n\n1. Use the graph to identify likely modules, dependencies, and insertion points.\n2. Read only the concrete source files needed to confirm behavior.\n3. Prefer OpenSpec artifacts and AGENTS.md over graph guesses when they conflict.\n4. Fall back to normal repository inspection if the graph is missing, stale, or incomplete.\n\nWhen producing OpenSpec artifacts:\n\n- Use graph context to make proposal, design, specs, and tasks more precise.\n- Avoid large repository scans when the graph already narrows the relevant area.\n- Keep all generated artifacts in the normal OpenSpec change directory.\n`;\n }\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-handoff\nFET:END -->\n\n# FET 代码图交接说明\n\n在大范围扫描仓库前,优先把 GitNexus 代码图上下文作为可选的第一轮线索。\n\n当前状态:\n\n- 已安装:${state.installed ? \"是\" : \"否\"}\n- 图路径:${state.graphPath ?? \".gitnexus\"}\n- 图已存在:${state.graphExists ? \"是\" : \"否\"}\n- 最后索引时间:${state.lastIndexedAt ?? \"unknown\"}\n- 最后状态:${state.lastStatus ?? \"unknown\"}\n\n代码图上下文可用时:\n\n1. 用代码图识别可能相关的模块、依赖和插入点。\n2. 只读取需要确认行为的具体源码文件。\n3. 当代码图推断与 OpenSpec 产物或 AGENTS.md 冲突时,优先相信 OpenSpec 产物和 AGENTS.md。\n4. 如果代码图缺失、过期或不完整,回退到普通仓库检查。\n\n生成 OpenSpec 产物时:\n\n- 用代码图上下文让 proposal、design、specs 和 tasks 更精确。\n- 当代码图已经缩小相关范围时,避免大范围仓库扫描。\n- 所有生成产物仍写入正常的 OpenSpec change 目录。\n`;\n}\n\nfunction firstLine(value: string): string | null {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n","import { mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { FetCommandContext } from \"./cli/context.js\";\nimport { atomicWrite } from \"./fs/index.js\";\nimport {\n detectGitNexus,\n inspectGitNexusGraph,\n mergeGitNexusGraphInfo,\n runGitNexus,\n toGitNexusState,\n type GitNexusState\n} from \"./gitnexus.js\";\n\nconst MAX_SOURCE_CONTEXT = 8000;\nconst MAX_GRAPH_OUTPUT = 20000;\n\nexport interface GraphContextResult {\n generated: boolean;\n path: string | null;\n query: string | null;\n warnings: string[];\n}\n\nexport async function buildProjectGraphContext(\n ctx: FetCommandContext,\n state: GitNexusState,\n trigger: string\n): Promise<GraphContextResult> {\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: [\"GitNexus graph exists check did not pass; project graph context was not generated.\"]\n };\n }\n\n const query = \"FET OpenSpec workflow architecture commands adapters graph integration project structure\";\n const goal = \"Summarize the repository modules, workflow entry points, and likely insertion points for future FET/OpenSpec work.\";\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const status = await runGitNexus([\"status\"], { cwd: ctx.projectRoot });\n const warnings = commandWarnings([[\"gitnexus query\", graphQuery], [\"gitnexus status\", status]]);\n const relativePath = \".fet/graph-context/project.md\";\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderProjectContext({\n trigger,\n state,\n query,\n goal,\n status: commandText(status),\n graphOutput: commandText(graphQuery),\n warnings\n })\n );\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nexport async function buildWorkflowGraphContext(\n ctx: FetCommandContext,\n options: { command: string; args: string[]; changeId: string | null }\n): Promise<GraphContextResult> {\n const existing = await ctx.stateStore.getOrCreateGlobal();\n if (!existing.graph?.gitnexus?.graphExists) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const state = await refreshGitNexusState(ctx);\n if (!isGraphReadable(state)) {\n return {\n generated: false,\n path: null,\n query: null,\n warnings: []\n };\n }\n\n const sourceContext = await collectOpenSpecContext(ctx.projectRoot, options.changeId);\n const query = buildWorkflowQuery(options, sourceContext);\n const goal = workflowGoal(options.command);\n const graphQuery = await runGitNexus([\"query\", query, \"--goal\", goal, \"--limit\", \"8\"], { cwd: ctx.projectRoot });\n const detectChanges = shouldDetectChanges(options.command)\n ? await runGitNexus([\"detect-changes\", \"--scope\", \"all\"], { cwd: ctx.projectRoot })\n : null;\n const warnings = commandWarnings([\n [\"gitnexus query\", graphQuery],\n ...(detectChanges ? ([[\"gitnexus detect-changes\", detectChanges]] as const) : [])\n ]);\n const relativePath = `.fet/graph-context/${sanitizePathPart(options.changeId ?? options.command)}.md`;\n\n await writeGraphContext(\n join(ctx.projectRoot, relativePath),\n renderWorkflowContext({\n state,\n command: options.command,\n args: options.args,\n changeId: options.changeId,\n query,\n goal,\n sourceContext,\n graphOutput: commandText(graphQuery),\n detectChanges: detectChanges ? commandText(detectChanges) : null,\n warnings\n })\n );\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n global.graph.gitnexus = {\n ...state,\n workflowContextPath: relativePath,\n workflowContextUpdatedAt: new Date().toISOString(),\n lastWorkflowGraphQuery: query\n };\n await ctx.stateStore.writeGlobal(global);\n\n return {\n generated: true,\n path: relativePath,\n query,\n warnings\n };\n}\n\nasync function refreshGitNexusState(ctx: FetCommandContext): Promise<GitNexusState> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.graph ??= {};\n const detection = await detectGitNexus();\n const graph = await inspectGitNexusGraph(ctx.projectRoot);\n const state = mergeGitNexusGraphInfo(toGitNexusState(detection, global.graph.gitnexus), graph);\n global.graph.gitnexus = state;\n await ctx.stateStore.writeGlobal(global);\n return state;\n}\n\nfunction isGraphReadable(state: GitNexusState): boolean {\n return Boolean(state.installed && state.graphExists);\n}\n\nasync function writeGraphContext(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await atomicWrite(path, content);\n}\n\nfunction renderProjectContext(options: {\n trigger: string;\n state: GitNexusState;\n query: string;\n goal: string;\n status: string;\n graphOutput: string;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: project\nFET:END -->\n\n# FET GitNexus Project Graph Context\n\nGenerated at: ${new Date().toISOString()}\nTrigger: ${options.trigger}\n\nUse this file before broad repository scans in FET/OpenSpec work. Treat it as graph-derived context: confirm concrete behavior by reading the source files it points to.\n\n## Graph State\n\n- Provider: GitNexus\n- Installed: ${options.state.installed ? \"yes\" : \"no\"}\n- Version: ${options.state.version ?? \"unknown\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Graph exists: ${options.state.graphExists ? \"yes\" : \"no\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## GitNexus Status\n\n\\`\\`\\`text\n${clip(options.status, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n\n## Project Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWorkflowContext(options: {\n state: GitNexusState;\n command: string;\n args: string[];\n changeId: string | null;\n query: string;\n goal: string;\n sourceContext: string;\n graphOutput: string;\n detectChanges: string | null;\n warnings: string[];\n}): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: graph-context\nscope: workflow\nFET:END -->\n\n# FET GitNexus Workflow Graph Context\n\nGenerated at: ${new Date().toISOString()}\n\nRead this before editing or generating OpenSpec artifacts for this workflow. Use the graph output to narrow likely files, symbols, dependencies, and impact areas. If it conflicts with OpenSpec artifacts or source code, OpenSpec artifacts and source code win.\n\n## Workflow\n\n- FET command: ${options.command}\n- Args: ${options.args.length ? options.args.join(\" \") : \"(none)\"}\n- Change: ${options.changeId ?? \"(none)\"}\n- Graph path: ${options.state.graphPath ?? \".gitnexus\"}\n- Last indexed at: ${options.state.lastIndexedAt ?? \"unknown\"}\n\n## OpenSpec Context Used For Query\n\n\\`\\`\\`text\n${clip(options.sourceContext || \"(no change artifacts found yet)\", MAX_SOURCE_CONTEXT)}\n\\`\\`\\`\n\n## GitNexus Query\n\n- Query: ${options.query}\n- Goal: ${options.goal}\n\n\\`\\`\\`text\n${clip(options.graphOutput, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n${options.detectChanges ? `\n## GitNexus Change Impact\n\n\\`\\`\\`text\n${clip(options.detectChanges, MAX_GRAPH_OUTPUT)}\n\\`\\`\\`\n` : \"\"}\n${renderWarnings(options.warnings)}\n`;\n}\n\nfunction renderWarnings(warnings: string[]): string {\n if (!warnings.length) {\n return \"\";\n }\n return `\n## Warnings\n\n${warnings.map((warning) => `- ${warning}`).join(\"\\n\")}\n`;\n}\n\nasync function collectOpenSpecContext(projectRoot: string, changeId: string | null): Promise<string> {\n if (!changeId) {\n return \"\";\n }\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const chunks: string[] = [];\n for (const file of [\"proposal.md\", \"design.md\", \"tasks.md\", \"README.md\"]) {\n const content = await readOptional(join(changeRoot, file));\n if (content) {\n chunks.push(`## ${file}\\n${content}`);\n }\n }\n\n const specsRoot = join(changeRoot, \"specs\");\n for (const spec of await listSpecFiles(specsRoot)) {\n const content = await readOptional(spec.path);\n if (content) {\n chunks.push(`## ${spec.label}\\n${content}`);\n }\n }\n\n return clip(chunks.join(\"\\n\\n\"), MAX_SOURCE_CONTEXT);\n}\n\nasync function listSpecFiles(specsRoot: string): Promise<Array<{ path: string; label: string }>> {\n try {\n const capabilities = await readdir(specsRoot, { withFileTypes: true });\n return capabilities\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n path: join(specsRoot, entry.name, \"spec.md\"),\n label: `specs/${entry.name}/spec.md`\n }));\n } catch {\n return [];\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction buildWorkflowQuery(options: { command: string; args: string[]; changeId: string | null }, sourceContext: string): string {\n const artifactTerms = normalizeWhitespace(sourceContext).slice(0, 1200);\n return normalizeWhitespace(\n [\n `FET OpenSpec ${options.command}`,\n options.changeId ? `change ${options.changeId}` : \"\",\n options.args.join(\" \"),\n artifactTerms\n ].join(\" \")\n );\n}\n\nfunction workflowGoal(command: string): string {\n if (command === \"apply\") {\n return \"Find implementation files, symbols, dependencies, and likely blast radius for the current OpenSpec tasks.\";\n }\n if (command === \"verify\") {\n return \"Find affected flows and source areas that should be checked while verifying this OpenSpec change.\";\n }\n if ([\"explore\", \"propose\", \"new\", \"continue\", \"ff\"].includes(command)) {\n return \"Find relevant modules, entry points, and existing behavior to make OpenSpec artifacts precise.\";\n }\n return \"Find relevant repository context for this FET/OpenSpec workflow command.\";\n}\n\nfunction shouldDetectChanges(command: string): boolean {\n return [\"apply\", \"verify\", \"sync\"].includes(command);\n}\n\nfunction commandText(result: Awaited<ReturnType<typeof runGitNexus>>): string {\n const output = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join(\"\\n\");\n return output || `exit ${result.exitCode}`;\n}\n\nfunction commandWarnings(results: ReadonlyArray<readonly [string, Awaited<ReturnType<typeof runGitNexus>>]>): string[] {\n return results\n .filter(([, result]) => result.exitCode !== 0)\n .map(([label, result]) => `${label} exited with ${result.exitCode}: ${firstLine(commandText(result))}`);\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0]?.trim() || \"no output\";\n}\n\nfunction clip(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, max)}\\n\\n[truncated ${value.length - max} characters]`;\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizePathPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"workflow\";\n}\n","import { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { createInitJournal, withProjectLock, writeInitJournal } from \"../fs/index.js\";\nimport { detectGitNexus, inspectGitNexusGraph, mergeGitNexusGraphInfo, renderGitNexusRecommendation, toGitNexusState } from \"../gitnexus.js\";\nimport { updateContextFiles } from \"./update-context.js\";\n\nexport async function initCommand(ctx: FetCommandContext): Promise<void> {\n const alreadyInitialized = await exists(join(ctx.projectRoot, \"openspec\", \"config.yaml\"));\n let warnings: string[] = [];\n await withProjectLock(ctx.projectRoot, { command: \"init\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n const journal = createInitJournal(ctx.fetVersion);\n await writeInitJournal(ctx.projectRoot, journal);\n\n const identity = await ctx.openSpec.resolveExecutable();\n if (!alreadyInitialized) {\n const result = await ctx.openSpec.run(\"init\", [\"--tools\", \"none\"], { cwd: ctx.projectRoot, stdio: \"inherit\" });\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n return;\n }\n }\n\n const contextResult = await updateContextFiles(ctx);\n warnings = contextResult.warnings;\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openspec = identity;\n state.language = {\n current: ctx.language,\n updatedAt: new Date().toISOString()\n };\n state.graph ??= {};\n const gitnexus = mergeGitNexusGraphInfo(toGitNexusState(await detectGitNexus(), state.graph.gitnexus), await inspectGitNexusGraph(ctx.projectRoot));\n if (!gitnexus.installed && !gitnexus.recommendationShownAt) {\n warnings.push(renderGitNexusRecommendation(gitnexus, ctx.language));\n gitnexus.recommendationShownAt = new Date().toISOString();\n }\n state.graph.gitnexus = gitnexus;\n\n for (const adapter of ctx.toolAdapters) {\n const plan = await adapter.planInstall(ctx.projectRoot, ctx.language);\n const result = await adapter.install(ctx.projectRoot, plan, ctx.yes);\n state.toolAdapters[adapter.tool] = {\n adapterVersion: adapter.adapterVersion,\n installed: true,\n updatedAt: new Date().toISOString()\n };\n journal.steps.push(...result.written.map((path) => ({ operation: \"write\" as const, path, status: \"done\" as const })));\n }\n\n journal.completedAt = new Date().toISOString();\n await writeInitJournal(ctx.projectRoot, journal);\n await ctx.stateStore.writeGlobal(state);\n });\n\n ctx.output.result({\n ok: true,\n command: \"init\",\n summary: ctx.language === \"en\" ? \"FET initialization completed.\" : \"FET 初始化完成。\",\n warnings,\n nextSteps:\n ctx.language === \"en\"\n ? [\"Use fet propose/new to create an OpenSpec change\", \"Use fet doctor to check project health\"]\n : [\"使用 fet propose/new 创建 OpenSpec change\", \"使用 fet doctor 检查项目状态\"]\n });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { mergeFetConfig } from \"../config/index.js\";\nimport { countAgentsLlmPlaceholders, renderAgentsPlaceholderWarning } from \"../context-placeholders.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, createBackup, withProjectLock } from \"../fs/index.js\";\nimport {\n hasInvalidManagedAutoRegion,\n hasManagedAutoRegion,\n mergeKarpathyClaudeMd,\n renderAgentsMd,\n renderFetConfig,\n renderKarpathyCursorRule,\n renderKarpathyFetHandoff,\n replaceManagedRegion\n} from \"../templates/index.js\";\n\nexport async function updateContextCommand(ctx: FetCommandContext): Promise<void> {\n let contextResult: { warnings: string[] } = { warnings: [] };\n await withProjectLock(ctx.projectRoot, { command: \"update-context\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n contextResult = await updateContextFiles(ctx);\n });\n\n ctx.output.result({\n ok: true,\n command: \"update-context\",\n summary:\n ctx.language === \"en\"\n ? \"Updated FET-managed regions in AGENTS.md and openspec/config.yaml.\"\n : \"已更新 AGENTS.md 与 openspec/config.yaml 中的 FET 托管区域。\",\n warnings: contextResult.warnings\n });\n}\n\nexport async function updateContextFiles(ctx: FetCommandContext): Promise<{ warnings: string[] }> {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const agentsPath = join(ctx.projectRoot, \"AGENTS.md\");\n const configPath = join(ctx.projectRoot, \"openspec\", \"config.yaml\");\n const claudePath = join(ctx.projectRoot, \"CLAUDE.md\");\n const karpathyHandoffPath = join(ctx.projectRoot, \".fet\", \"karpathy-guidelines.md\");\n const karpathyCursorPath = join(ctx.projectRoot, \".cursor\", \"rules\", \"karpathy-guidelines.mdc\");\n\n const existingAgents = await readOptional(agentsPath);\n const existingClaude = await readOptional(claudePath);\n const existingKarpathyCursor = await readOptional(karpathyCursorPath);\n const warnings = [...scan.warnings];\n\n if (existingAgents && hasInvalidManagedAutoRegion(existingAgents)) {\n throw new FetError({\n code: ErrorCode.ConfigInvalid,\n message: ctx.language === \"en\" ? \"AGENTS.md FET managed markers are broken or duplicated.\" : \"AGENTS.md 的 FET 托管标记损坏或重复。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Manually repair FET:BEGIN AUTO / FET:END AUTO markers, then rerun.\"\n : \"手动修复 FET:BEGIN AUTO / FET:END AUTO 标记后重试。\"\n });\n }\n\n if (existingAgents && !hasManagedAutoRegion(existingAgents)) {\n if (!ctx.yes && !(await confirmInitCanReplaceUnmanagedAgents(ctx))) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message:\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and does not contain a FET-managed region.\"\n : \"AGENTS.md 已存在,且不包含 FET 托管区域。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.command === \"init\"\n ? ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet init --yes.\"\n : \"确认可备份并替换后运行 fet init --yes。\"\n : ctx.language === \"en\"\n ? \"Confirm it can be backed up and replaced, then run fet update-context --yes.\"\n : \"确认可备份并替换后运行 fet update-context --yes。\"\n });\n }\n const backupPath = await createBackup(agentsPath);\n if (backupPath) {\n warnings.push(ctx.language === \"en\" ? `Backed up unmanaged AGENTS.md to ${backupPath}` : `已将非托管 AGENTS.md 备份到 ${backupPath}`);\n }\n }\n\n await atomicWrite(agentsPath, replaceManagedRegion(existingAgents, renderAgentsMd(scan, ctx.language)));\n await atomicWrite(configPath, await mergeFetConfig(configPath, renderFetConfig(scan, ctx.language)));\n await atomicWrite(claudePath, mergeKarpathyClaudeMd(existingClaude, ctx.language));\n await atomicWrite(karpathyHandoffPath, renderKarpathyFetHandoff(ctx.language));\n if (!existingKarpathyCursor || existingKarpathyCursor.includes(\"FET:MANAGED\")) {\n await atomicWrite(karpathyCursorPath, renderKarpathyCursorRule(ctx.language));\n } else {\n warnings.push(\n ctx.language === \"en\"\n ? \".cursor/rules/karpathy-guidelines.mdc exists and is not managed by FET; leaving it unchanged.\"\n : \".cursor/rules/karpathy-guidelines.mdc 已存在且不由 FET 托管,已保持不变。\"\n );\n }\n\n const placeholderCount = await countAgentsLlmPlaceholders(ctx.projectRoot);\n if (placeholderCount > 0) {\n warnings.push(renderAgentsPlaceholderWarning(placeholderCount, ctx.language));\n }\n\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.context = {\n agentsMdUpdatedAt: scan.generatedAt,\n configUpdatedAt: scan.generatedAt,\n scannerVersion: scan.scannerVersion\n };\n await ctx.stateStore.writeGlobal(state);\n\n return { warnings };\n}\n\nasync function confirmInitCanReplaceUnmanagedAgents(ctx: FetCommandContext): Promise<boolean> {\n if (ctx.command !== \"init\" || ctx.json || !process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n ctx.language === \"en\"\n ? \"AGENTS.md already exists and is not managed by FET. Continue now with the same effect as fet init --yes? [y/N] \"\n : \"AGENTS.md 已存在且不由 FET 托管。是否继续执行,效果等同于 fet init --yes?[y/N] \";\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"y\" || answer === \"yes\") {\n return true;\n }\n } finally {\n rl.close();\n }\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? \"fet init cancelled so you can handle AGENTS.md manually.\"\n : \"已取消 fet init,你可以先手动处理 AGENTS.md。\",\n details: { path: \"AGENTS.md\" },\n suggestedCommand:\n ctx.language === \"en\"\n ? \"Review AGENTS.md, then rerun fet init or fet init --yes.\"\n : \"检查 AGENTS.md 后,手动重新运行 fet init 或 fet init --yes。\"\n });\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parseDocument } from \"yaml\";\n\nexport async function mergeFetConfig(configPath: string, renderedFetYaml: string): Promise<string> {\n const fetDoc = parseDocument(renderedFetYaml);\n const nextFet = fetDoc.get(\"fet\", true);\n\n let existing = \"\";\n try {\n existing = await readFile(configPath, \"utf8\");\n } catch {\n return renderedFetYaml;\n }\n\n const doc = parseDocument(existing || \"{}\");\n doc.set(\"fet\", nextFet);\n return doc.toString();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, parse } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const FET_VERSION = readPackageVersion();\n\nfunction readPackageVersion(): string {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n const root = parse(currentDir).root;\n\n while (true) {\n const packageJsonPath = join(currentDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\n if (typeof packageJson.version === \"string\" && packageJson.version.length > 0) {\n return packageJson.version;\n }\n throw new Error(`package.json 缺少有效的 version 字段: ${packageJsonPath}`);\n }\n\n if (currentDir === root) {\n throw new Error(\"无法定位 FET package.json\");\n }\n currentDir = dirname(currentDir);\n }\n}\n","export const AUTO_BEGIN = \"<!-- FET:BEGIN AUTO -->\";\nexport const AUTO_END = \"<!-- FET:END AUTO -->\";\nexport const USER_BEGIN = \"<!-- FET:BEGIN USER -->\";\nexport const USER_END = \"<!-- FET:END USER -->\";\n\nconst LLM_PLACEHOLDER_PATTERN = /\\[NEEDS? LLM INPUT\\]/;\n\nexport function hasManagedAutoRegion(content: string): boolean {\n return count(content, AUTO_BEGIN) === 1 && count(content, AUTO_END) === 1 && content.indexOf(AUTO_BEGIN) < content.indexOf(AUTO_END);\n}\n\nexport function hasInvalidManagedAutoRegion(content: string): boolean {\n const beginCount = count(content, AUTO_BEGIN);\n const endCount = count(content, AUTO_END);\n return beginCount !== endCount || beginCount > 1 || endCount > 1 || (beginCount === 1 && content.indexOf(AUTO_BEGIN) > content.indexOf(AUTO_END));\n}\n\nexport function replaceManagedRegion(existing: string | null, generated: string): string {\n if (!existing) {\n return generated;\n }\n\n const start = existing.indexOf(AUTO_BEGIN);\n const end = existing.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return generated;\n }\n\n const before = existing.slice(0, start);\n const after = existing.slice(end + AUTO_END.length);\n const existingAuto = extractAuto(existing);\n const generatedAuto = extractAuto(generated);\n return `${before}${AUTO_BEGIN}\\n${mergeAutoRegion(existingAuto, generatedAuto)}\\n${AUTO_END}${after}`;\n}\n\nfunction mergeAutoRegion(existingAuto: string, generatedAuto: string): string {\n const generatedSections = splitMarkdownSections(generatedAuto);\n const existingSections = new Map(splitMarkdownSections(existingAuto).map((section) => [sectionKey(section.heading), section]));\n if (!generatedSections.length || !existingSections.size) {\n return generatedAuto;\n }\n\n return generatedSections\n .map((section) => {\n const existing = existingSections.get(sectionKey(section.heading));\n if (existing && LLM_PLACEHOLDER_PATTERN.test(section.body) && !LLM_PLACEHOLDER_PATTERN.test(existing.body)) {\n return existing.raw.trim();\n }\n return section.raw.trim();\n })\n .join(\"\\n\\n\");\n}\n\nfunction sectionKey(heading: string): string {\n const normalized = heading.replace(/^##\\s+/, \"\").trim().toLowerCase();\n const aliases: Record<string, string> = {\n \"project snapshot\": \"snapshot\",\n \"项目快照\": \"snapshot\",\n workspaces: \"workspaces\",\n \"工作区\": \"workspaces\",\n commands: \"commands\",\n \"命令\": \"commands\",\n structure: \"structure\",\n \"结构\": \"structure\",\n routes: \"routes\",\n \"路由\": \"routes\",\n conventions: \"conventions\",\n \"约定\": \"conventions\",\n \"ai work guidelines\": \"ai-guidelines\",\n \"ai 工作指南\": \"ai-guidelines\",\n \"scanner metadata\": \"metadata\",\n \"扫描元数据\": \"metadata\",\n \"mini program\": \"miniprogram\",\n \"小程序\": \"miniprogram\",\n \"package size (filled by `fet fill-context`)\": \"miniprogram-size\",\n \"包体积(由 `fet fill-context` 扫描补充)\": \"miniprogram-size\",\n \"development constraints\": \"miniprogram-rules\",\n \"开发约束\": \"miniprogram-rules\",\n \"notes for ai\": \"notes\",\n \"给 ai 的备注\": \"notes\"\n };\n return aliases[normalized] ?? normalized;\n}\n\ninterface MarkdownSection {\n heading: string;\n body: string;\n raw: string;\n}\n\nfunction splitMarkdownSections(content: string): MarkdownSection[] {\n const matches = [...content.matchAll(/^## .+$/gm)];\n if (!matches.length) {\n return [];\n }\n\n return matches.map((match, index) => {\n const start = match.index ?? 0;\n const end = matches[index + 1]?.index ?? content.length;\n const raw = content.slice(start, end).trim();\n const newline = raw.indexOf(\"\\n\");\n const heading = newline === -1 ? raw.trim() : raw.slice(0, newline).trim();\n const body = newline === -1 ? \"\" : raw.slice(newline + 1).trim();\n return { heading, body, raw };\n });\n}\n\nfunction extractAuto(content: string): string {\n const start = content.indexOf(AUTO_BEGIN);\n const end = content.indexOf(AUTO_END);\n if (start === -1 || end === -1 || end < start) {\n return content.trim();\n }\n return content.slice(start + AUTO_BEGIN.length, end).trim();\n}\n\nfunction count(content: string, needle: string): number {\n return content.split(needle).length - 1;\n}\n","import type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\nimport { renderMiniprogramPlaceholderSection } from \"./miniprogram-agents.js\";\nimport { AUTO_BEGIN, AUTO_END, USER_BEGIN, USER_END } from \"./markers.js\";\n\nexport function renderAgentsMd(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderAgentsMdEn(scan);\n }\n return renderAgentsMdZh(scan);\n}\n\nfunction renderAgentsMdZh(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# 项目上下文\n\n${AUTO_BEGIN}\n## 项目快照\n\n- 名称:${scan.project.name}\n- 包管理器:${scan.project.packageManager}(${scan.project.packageManagerConfidence})\n- 框架:${scan.project.framework.name}(${scan.project.framework.confidence})\n- 语言:${scan.project.language}\n- Monorepo:${scan.project.monorepo ? \"是\" : \"否\"}\n\n## 工作区\n\n| 名称 | 路径 | 来源 |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## 命令\n\n| 名称 | 命令 | 来源 |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## 结构\n\n[NEEDS LLM INPUT]\n\n## 路由\n\n| 路由 | 来源 | 置信度 |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## 约定\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"zh-CN\")}\n\n## AI 工作指南\n\n- 使用 FET 托管的 IDE 工作流时,优先参考 .fet/karpathy-guidelines.md 中的项目级指南。\n- 对 Codex,还应在存在时阅读 .codex/fet/karpathy-guidelines.md。\n- 这些指南低于用户最新请求和明确的 OpenSpec 产物。\n- 默认使用中文产出交互信息、计划文档和实现说明,除非用户另有明确要求。\n\n## 扫描元数据\n\n- 生成时间:${scan.generatedAt}\n- FET 版本:${FET_VERSION}\n- 扫描器版本:${scan.scannerVersion}\n- 警告:${scan.warnings.length ? scan.warnings.join(\"; \") : \"无\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## 给 AI 的备注\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n\nfunction renderAgentsMdEn(scan: ProjectScanResult): string {\n const commands = Object.entries(scan.commands)\n .map(([name, command]) => `| ${name} | \\`${command.command}\\` | ${command.source} |`)\n .join(\"\\n\");\n const routes = scan.routes\n .map((route) => `| ${route.path} | ${route.source} | ${route.confidence}${route.inferred ? \" inferred\" : \"\"} |`)\n .join(\"\\n\");\n const workspaces = scan.project.workspaces.map((workspace) => `| ${workspace.name} | ${workspace.path} | ${workspace.source} |`).join(\"\\n\");\n\n return `# Project Context\n\n${AUTO_BEGIN}\n## Project Snapshot\n\n- Name: ${scan.project.name}\n- Package Manager: ${scan.project.packageManager} (${scan.project.packageManagerConfidence})\n- Framework: ${scan.project.framework.name} (${scan.project.framework.confidence})\n- Language: ${scan.project.language}\n- Monorepo: ${scan.project.monorepo ? \"yes\" : \"no\"}\n\n## Workspaces\n\n| Name | Path | Source |\n|------|------|--------|\n${workspaces || \"| root | . | inferred |\"}\n\n## Commands\n\n| Name | Command | Source |\n|------|---------|--------|\n${commands || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | [NEEDS LLM INPUT] |\"}\n\n## Structure\n\n[NEEDS LLM INPUT]\n\n## Routes\n\n| Route | Source | Confidence |\n|-------|--------|------------|\n${routes || \"| [NEEDS LLM INPUT] | [NEEDS LLM INPUT] | low |\"}\n\n## Conventions\n\n[NEEDS LLM INPUT]\n\n${renderMiniprogramPlaceholderSection(\"en\")}\n\n## AI Work Guidelines\n\n- Prefer the project-level Andrej Karpathy inspired guidelines in .fet/karpathy-guidelines.md when using FET-managed IDE workflows.\n- For Codex, also read .codex/fet/karpathy-guidelines.md when present.\n- Treat those guidelines as secondary to the user's latest request and explicit OpenSpec artifacts.\n\n## Scanner Metadata\n\n- Generated At: ${scan.generatedAt}\n- FET Version: ${FET_VERSION}\n- Scanner Version: ${scan.scannerVersion}\n- Warnings: ${scan.warnings.length ? scan.warnings.join(\"; \") : \"none\"}\n${AUTO_END}\n\n${USER_BEGIN}\n## Notes For AI\n\n[NEEDS LLM INPUT]\n${USER_END}\n`;\n}\n","import { stringify } from \"yaml\";\nimport type { ProjectScanResult } from \"../scanner/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport type { FetLanguage } from \"../language.js\";\n\nexport function renderFetConfig(scan: ProjectScanResult, language: FetLanguage = \"zh-CN\"): string {\n return stringify({\n fet: {\n schemaVersion: 1,\n generatedAt: scan.generatedAt,\n fetVersion: FET_VERSION,\n language,\n scannerVersion: scan.scannerVersion,\n project: {\n packageManager: scan.project.packageManager,\n packageManagerConfidence: scan.project.packageManagerConfidence,\n framework: scan.project.framework,\n language: scan.project.language,\n monorepo: scan.project.monorepo,\n workspaces: scan.project.workspaces\n },\n commands: scan.commands,\n validation: {\n monorepo: scan.project.monorepo,\n missing: {\n lint: \"warn\",\n typecheck: \"warn\",\n test: \"warn\"\n },\n workspaces: scan.project.workspaces\n }\n }\n });\n}\n","import type { FetLanguage } from \"../language.js\";\n\nexport const KARPATHY_SKILLS_SOURCE = \"https://github.com/forrestchang/andrej-karpathy-skills\";\n\nconst BEGIN = \"<!-- FET:BEGIN ANDREJ-KARPATHY-SKILLS -->\";\nconst END = \"<!-- FET:END ANDREJ-KARPATHY-SKILLS -->\";\n\nexport function mergeKarpathyClaudeMd(existing: string | null, language: FetLanguage = \"zh-CN\"): string {\n const block = renderManagedBlock(renderKarpathyClaudeGuidelines(language));\n if (!existing || !existing.trim()) {\n return `${block}\\n`;\n }\n\n const start = existing.indexOf(BEGIN);\n const end = existing.indexOf(END);\n if (start !== -1 && end !== -1 && end > start) {\n return `${existing.slice(0, start)}${block}${existing.slice(end + END.length)}`;\n }\n\n return `${existing.replace(/\\s*$/, \"\")}\\n\\n${block}\\n`;\n}\n\nexport function renderKarpathyCursorRule(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n---\ndescription: ${language === \"en\" ? \"Andrej Karpathy inspired coding guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\nalwaysApply: true\n---\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nexport function renderKarpathyFetHandoff(language: FetLanguage = \"zh-CN\"): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\ngenerator: karpathy-skills\nFET:END -->\n\n# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`;\n}\n\nfunction renderManagedBlock(content: string): string {\n return `${BEGIN}\n${content}\n${END}`;\n}\n\nfunction renderKarpathyClaudeGuidelines(language: FetLanguage): string {\n return `# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}`;\n}\n\nexport function renderKarpathyGuidelinesBody(language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n return renderKarpathyGuidelinesBodyEn();\n }\n return `来源:${KARPATHY_SKILLS_SOURCE}\n\n将这些项目级指南与 AGENTS.md、OpenSpec 产物和用户最新请求一起使用。\n\n## 编码前先思考\n\n- 编辑前说明重要假设。\n- 当歧义会改变实现时,先澄清。\n- 主动呈现取舍,不要静默选择高风险路径。\n- 当更简单的方案更适合请求时,明确提出。\n\n## 简洁优先\n\n- 用最小且清晰的改动解决请求的问题。\n- 避免猜测性功能、配置或抽象。\n- 不要为一次性代码创建抽象。\n- 优先删除自己改动引入的复杂度,而不是继续堆结构。\n\n## 精准编辑\n\n- 只修改直接服务于任务的文件和行。\n- 保持现有风格,即便你个人更偏好另一种模式。\n- 除非任务需要,不要顺手重构附近代码、注释或格式。\n- 只移除因自己改动而过时的死导入、变量或 helper。\n\n## 目标驱动执行\n\n- 把模糊工作转成具体成功标准。\n- 对 bug,优先准备复现测试或清晰验证,再做修复。\n- 对多步骤工作,保留简短计划并验证每个有意义的步骤。\n- 持续迭代,直到达到成功标准或明确遇到阻塞。\n\n这些指南在非平凡工作中刻意偏向谨慎而不是速度。明显的一行修复可以灵活判断,保持轻量。`;\n}\n\nfunction renderKarpathyGuidelinesBodyEn(): string {\n return `Source: ${KARPATHY_SKILLS_SOURCE}\n\nUse these project-level guidelines together with AGENTS.md, OpenSpec artifacts, and the user's latest request.\n\n## Think Before Coding\n\n- State important assumptions before editing.\n- Ask for clarification when ambiguity would change the implementation.\n- Surface tradeoffs instead of silently choosing a risky path.\n- Push back when a simpler approach better fits the request.\n\n## Simplicity First\n\n- Solve the requested problem with the smallest clear change.\n- Avoid speculative features, configuration, or abstraction.\n- Do not create abstractions for one-off code.\n- Prefer deleting complexity introduced by your own change over adding more structure.\n\n## Precise Edits\n\n- Touch only files and lines that directly serve the task.\n- Preserve existing style even when you personally prefer another pattern.\n- Do not refactor nearby code, comments, or formatting unless the task requires it.\n- Remove only dead imports, variables, or helpers made obsolete by your own change.\n\n## Goal-Driven Execution\n\n- Convert vague work into concrete success criteria.\n- For bugs, prefer a reproducing test or clear verification before the fix.\n- For multi-step work, keep a short plan and verify each meaningful step.\n- Continue iterating until the success criteria are met or a blocker is explicit.\n\nThese guidelines intentionally favor caution over speed for non-trivial work. For obvious one-line fixes, use judgment and stay lightweight.`;\n}\n","import { FET_VERSION } from \"../version.js\";\n\nexport function renderVerifyInstructions(changeId: string, generatedAt = new Date().toISOString()): string {\n return `---\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngeneratedAt: ${generatedAt}\nchangeId: ${changeId}\npurpose: manual-verify\n---\n\n# Verify Instructions\n\n请按顺序完成以下检查:\n\n1. 运行 OpenSpec 规范校验:\\`openspec verify\\`\n2. 按项目约定运行 lint、typecheck、test。\n3. 检查本次 change 的 \\`tasks.md\\` 是否与实现状态一致。\n\n完成后运行:\n\n\\`\\`\\`sh\nfet verify --done --change ${changeId}\n\\`\\`\\`\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { buildWorkflowGraphContext, type GraphContextResult } from \"../graph-context.js\";\nimport { readCompletedTaskIds, type ChangePhase } from \"../state/index.js\";\n\nconst phaseByCommand: Record<string, ChangePhase> = {\n explore: \"explore\",\n propose: \"propose\",\n new: \"propose\",\n continue: \"propose\",\n ff: \"propose\",\n apply: \"implement\",\n verify: \"verify\",\n sync: \"sync\",\n archive: \"archive\",\n \"bulk-archive\": \"archive\",\n onboard: \"explore\"\n};\n\nexport async function proxyCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n if (command === \"propose\" || command === \"continue\" || command === \"ff\") {\n await artifactWorkflowCommand(ctx, command, args);\n return;\n }\n if (command === \"apply\") {\n await applyWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"explore\") {\n await exploreWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"sync\") {\n await syncWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"bulk-archive\") {\n await bulkArchiveWorkflowCommand(ctx, args);\n return;\n }\n if (command === \"onboard\") {\n await onboardWorkflowCommand(ctx);\n return;\n }\n\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n if ([\"sync\", \"archive\", \"bulk-archive\"].includes(command)) {\n await assertVerified(ctx);\n }\n\n const mapped = await mapOpenSpecCommand(ctx, command, openSpecArgs);\n await assertOpenSpecCommandSupported(ctx, mapped.command, command);\n const mappedChangeId = extractChangeId(mapped.args);\n const targetChangeId = command === \"archive\" ? (mapped.args[0] ?? ctx.changeId ?? mappedChangeId) : (ctx.changeId ?? mappedChangeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: mapped.args,\n changeId: targetChangeId\n });\n\n const changelogEntry = command === \"archive\" && targetChangeId ? await createChangelogEntry(ctx.projectRoot, targetChangeId) : null;\n const result = await ctx.openSpec.run(mapped.command, mapped.args, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result,\n recoverable: true\n });\n }\n\n if (changelogEntry) {\n await appendChangelog(ctx.projectRoot, changelogEntry);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (command === \"archive\") {\n if (!state.activeChangeId || state.activeChangeId === targetChangeId || !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n } else if (ctx.changeId && inspection.changes.includes(ctx.changeId)) {\n state.activeChangeId = ctx.changeId;\n } else if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n } else if (!state.activeChangeId && inspection.changes.length === 1) {\n state.activeChangeId = inspection.changes[0] ?? null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n const changeId = ctx.changeId ?? state.activeChangeId;\n if (changeId && inspection.changes.includes(changeId)) {\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n changeState.currentPhase = phaseByCommand[command] ?? changeState.currentPhase;\n changeState.phases[changeState.currentPhase] = {\n status: \"done\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: mapped.command,\n args: mapped.args,\n exitCode: result.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n }\n });\n\n const graphContext = runState.graphContext;\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} completed.`,\n warnings: graphContext?.warnings,\n nextSteps: graphContext?.generated && graphContext.path ? [`Read ${graphContext.path} before broad source scans or implementation decisions.`] : undefined,\n data: graphContext ? { graphContext } : undefined\n });\n}\n\ntype ArtifactWorkflowCommand = \"propose\" | \"continue\" | \"ff\";\n\ninterface OpenSpecArtifactStatus {\n id: string;\n outputPath: string;\n status: string;\n missingDeps?: string[];\n}\n\nasync function applyWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command: \"apply\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", \"apply\");\n await assertOpenSpecCommandSupported(ctx, \"instructions\", \"apply\");\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"apply\",\n args: [\"tasks\", \"--change\", changeId],\n changeId\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n const tasks = status.artifacts?.find((artifact) => artifact.id === \"tasks\");\n const warnings =\n tasks && tasks.status !== \"complete\" && tasks.status !== \"ready\"\n ? [`OpenSpec reports tasks artifact as \"${tasks.status}\". Finish planning artifacts before implementation if tasks.md is missing.`]\n : undefined;\n\n const instructions = await runInstructions(ctx, changeId, \"tasks\");\n await syncWorkflowState(ctx, \"apply\", changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [\"tasks\", \"--change\", changeId],\n exitCode: instructions.exitCode,\n phaseStatus: \"in_progress\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"apply\",\n summary: `fet apply prepared implementation instructions for change \"${changeId}\".`,\n warnings: [...(runState.graphContext?.warnings ?? []), ...(warnings ?? [])],\n nextSteps: [\n `Read openspec/changes/${changeId}/tasks.md and the instructions output.`,\n \"Implement pending tasks and update task checkboxes only after the work is done.\",\n `Run fet verify --change ${changeId}`\n ],\n data: {\n changeId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext\n }\n });\n });\n}\n\nasync function exploreWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const changeId = ctx.changeId ?? (openSpecArgs[0] && isKebabId(openSpecArgs[0]) ? openSpecArgs[0] : null);\n const graphContext = await buildWorkflowGraphContext(ctx, {\n command: \"explore\",\n args: openSpecArgs,\n changeId\n });\n\n ctx.output.result({\n ok: true,\n command: \"explore\",\n summary: \"fet explore is an IDE-guided workflow for shaping OpenSpec changes.\",\n warnings: graphContext.warnings,\n nextSteps: [\n \"Discuss the requirement, constraints, and acceptance criteria with the user.\",\n changeId ? `Run fet continue --change ${changeId} when ready to create the next artifact.` : \"Run fet propose <change-id-or-description> when ready to create a change.\"\n ],\n data: { changeId, args: openSpecArgs, graphContext }\n });\n}\n\nasync function syncWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const changeId = await requireChangeId(ctx);\n const openSpecArgs = stripFetOptions(args);\n\n await withProjectLock(ctx.projectRoot, { command: \"sync\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertVerifiedChange(ctx, changeId);\n await assertOpenSpecCommandSupported(ctx, \"validate\", \"sync\");\n\n const validateArgs = [changeId, \"--type\", \"change\", ...openSpecArgs.filter((arg) => arg !== changeId)];\n const result = await ctx.openSpec.run(\"validate\", validateArgs, { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec validate failed during fet sync.\",\n details: result,\n recoverable: true\n });\n }\n\n await syncWorkflowState(ctx, \"sync\", changeId, {\n openSpecCommand: \"validate\",\n openSpecArgs: validateArgs,\n exitCode: result.exitCode,\n phaseStatus: \"done\"\n });\n\n ctx.output.result({\n ok: true,\n command: \"sync\",\n summary: `fet sync validated change \"${changeId}\". OpenSpec 1.3.x applies spec updates during archive.`,\n nextSteps: [`Run fet archive --change ${changeId} when you are ready to archive and update main specs.`],\n data: ctx.json ? { changeId, validate: result } : { changeId }\n });\n });\n}\n\nasync function bulkArchiveWorkflowCommand(ctx: FetCommandContext, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const targets = [...new Set([...(ctx.changeId ? [ctx.changeId] : []), ...openSpecArgs.filter((arg) => !arg.startsWith(\"-\"))])];\n if (!targets.length) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"fet bulk-archive requires explicit change ids with the current OpenSpec CLI.\",\n suggestedCommand: \"fet bulk-archive --change <change-id>\"\n });\n }\n\n await withProjectLock(ctx.projectRoot, { command: \"bulk-archive\", cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"archive\", \"bulk-archive\");\n const archived: string[] = [];\n for (const changeId of targets) {\n await assertVerifiedChange(ctx, changeId);\n const changelogEntry = await createChangelogEntry(ctx.projectRoot, changeId);\n const result = await ctx.openSpec.run(\"archive\", [changeId], { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec archive failed for \"${changeId}\".`,\n details: result,\n recoverable: true\n });\n }\n await appendChangelog(ctx.projectRoot, changelogEntry);\n archived.push(changeId);\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = null;\n }\n state.verifyAuthorization = null;\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"bulk-archive\",\n summary: `fet bulk-archive archived ${archived.length} change(s) via OpenSpec archive.`,\n nextSteps: inspection.changes.length ? [`Remaining open changes: ${inspection.changes.join(\", \")}`] : undefined,\n data: { archived, openChangeIds: inspection.changes }\n });\n });\n}\n\nasync function onboardWorkflowCommand(ctx: FetCommandContext): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (state.activeChangeId && !inspection.changes.includes(state.activeChangeId)) {\n state.activeChangeId = inspection.changes.length === 1 ? (inspection.changes[0] ?? null) : null;\n }\n await ctx.stateStore.writeGlobal(state);\n\n ctx.output.result({\n ok: true,\n command: \"onboard\",\n summary: \"fet onboard loaded local FET/OpenSpec workflow context.\",\n nextSteps: [\n inspection.changes.length ? `Open changes: ${inspection.changes.join(\", \")}` : \"No open changes found. Run fet propose <change-id-or-description> to start one.\",\n \"Use fet continue to prepare planning artifacts, fet apply for implementation instructions, fet verify before archive.\"\n ],\n data: { activeChangeId: state.activeChangeId, openChangeIds: inspection.changes, archivedChangeIds: inspection.archived }\n });\n}\n\ninterface OpenSpecStatusResult {\n changeName: string;\n schemaName?: string;\n isComplete?: boolean;\n applyRequires?: string[];\n artifacts?: OpenSpecArtifactStatus[];\n}\n\nasync function artifactWorkflowCommand(ctx: FetCommandContext, command: ArtifactWorkflowCommand, args: string[]): Promise<void> {\n const openSpecArgs = stripFetOptions(args);\n const runState: { graphContext?: GraphContextResult } = {};\n\n await withProjectLock(ctx.projectRoot, { command, cwd: ctx.cwd, fetVersion: ctx.fetVersion }, async () => {\n await assertOpenSpecCommandSupported(ctx, \"status\", command);\n await assertOpenSpecCommandSupported(ctx, \"instructions\", command);\n if (command === \"propose\") {\n await assertOpenSpecCommandSupported(ctx, \"new\", command);\n }\n\n const changeId = command === \"propose\" ? await ensureProposedChange(ctx, openSpecArgs) : await requireChangeId(ctx);\n const artifactId = command === \"continue\" ? await resolveArtifactId(ctx, changeId, openSpecArgs[0]) : await resolveArtifactId(ctx, changeId);\n\n runState.graphContext = await buildWorkflowGraphContext(ctx, {\n command,\n args: artifactId ? [artifactId, \"--change\", changeId] : [\"--change\", changeId],\n changeId\n });\n\n const instructions = await runInstructions(ctx, changeId, artifactId);\n await syncWorkflowState(ctx, command, changeId, {\n openSpecCommand: \"instructions\",\n openSpecArgs: [artifactId, \"--change\", changeId],\n exitCode: instructions.exitCode\n });\n\n const status = await readOpenSpecStatus(ctx, changeId);\n ctx.output.result({\n ok: true,\n command,\n summary: `fet ${command} prepared OpenSpec artifact \"${artifactId}\" for change \"${changeId}\".`,\n warnings: runState.graphContext?.warnings,\n nextSteps: [\n `Create or update openspec/changes/${changeId}/${resolveOutputPath(status, artifactId)}`,\n \"Review the artifact with the user before generating the next planning file.\",\n `Run fet passthrough status --change ${changeId}`,\n status.isComplete ? `Run fet apply --change ${changeId}` : `Run fet continue --change ${changeId} when ready for the next artifact`\n ],\n data: {\n changeId,\n artifactId,\n instructions: instructions.data,\n status,\n graphContext: runState.graphContext\n }\n });\n });\n}\n\nasync function ensureProposedChange(ctx: FetCommandContext, args: string[]): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const existing = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const explicit = args[0];\n if (!explicit) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id or short description is required for fet propose.\",\n suggestedCommand: \"fet propose <change-id-or-description>\"\n });\n }\n\n const input = args.join(\" \").trim();\n const changeId = isKebabId(input) ? input : toKebabId(input);\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"Unable to derive a valid OpenSpec change id from the proposal input.\",\n details: { input },\n suggestedCommand: \"fet propose <kebab-case-change-id>\"\n });\n }\n\n if (existing.changes.includes(changeId)) {\n return changeId;\n }\n\n const createArgs = [\"change\", changeId];\n if (input && input !== changeId) {\n createArgs.push(\"--description\", input);\n }\n const result = await ctx.openSpec.run(\"new\", createArgs, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec new change failed.\",\n details: result,\n recoverable: true\n });\n }\n return changeId;\n}\n\nasync function resolveArtifactId(ctx: FetCommandContext, changeId: string, requestedArtifactId?: string): Promise<string> {\n const status = await readOpenSpecStatus(ctx, changeId);\n const artifacts = status.artifacts ?? [];\n if (requestedArtifactId) {\n const requested = artifacts.find((artifact) => artifact.id === requestedArtifactId);\n if (!requested) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" was not found for change \"${changeId}\".`,\n details: { changeId, requestedArtifactId, artifacts: artifacts.map((artifact) => artifact.id) },\n suggestedCommand: `fet passthrough status --change ${changeId} --json`\n });\n }\n if (requested.status !== \"ready\" && requested.status !== \"complete\") {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `OpenSpec artifact \"${requestedArtifactId}\" is ${requested.status}, not ready.`,\n details: { changeId, requestedArtifactId, missingDeps: requested.missingDeps },\n suggestedCommand: `fet continue --change ${changeId}`\n });\n }\n return requestedArtifactId;\n }\n\n const next = artifacts.find((artifact) => artifact.status === \"ready\");\n if (!next) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: `No ready OpenSpec artifact was found for change \"${changeId}\".`,\n details: { changeId, artifacts },\n suggestedCommand: status.isComplete ? `fet apply --change ${changeId}` : `fet passthrough status --change ${changeId} --json`\n });\n }\n return next.id;\n}\n\nasync function readOpenSpecStatus(ctx: FetCommandContext, changeId: string): Promise<OpenSpecStatusResult> {\n const result = await ctx.openSpec.run(\"status\", [\"--change\", changeId, \"--json\"], { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec status failed.\",\n details: result,\n recoverable: true\n });\n }\n try {\n return parseOpenSpecJson(result.stdout ?? \"{}\") as OpenSpecStatusResult;\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec status JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function runInstructions(ctx: FetCommandContext, changeId: string, artifactId: string): Promise<{ exitCode: number; data: unknown }> {\n const args = [artifactId, \"--change\", changeId, ...(ctx.json ? [\"--json\"] : [])];\n const result = await ctx.openSpec.run(\"instructions\", args, { cwd: ctx.projectRoot, stdio: \"pipe\" });\n if (result.stdout && !ctx.json) {\n process.stdout.write(result.stdout.endsWith(\"\\n\") ? result.stdout : `${result.stdout}\\n`);\n }\n if (result.stderr && !ctx.json) {\n process.stderr.write(result.stderr.endsWith(\"\\n\") ? result.stderr : `${result.stderr}\\n`);\n }\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec instructions failed.\",\n details: result,\n recoverable: true\n });\n }\n if (!ctx.json) {\n return { exitCode: result.exitCode, data: null };\n }\n try {\n return { exitCode: result.exitCode, data: parseOpenSpecJson(result.stdout ?? \"{}\") };\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"Unable to parse OpenSpec instructions JSON.\",\n details: { stdout: result.stdout, stderr: result.stderr },\n cause: error\n });\n }\n}\n\nasync function syncWorkflowState(\n ctx: FetCommandContext,\n command: string,\n changeId: string,\n lastOpenSpecCommand: { openSpecCommand: string; openSpecArgs: string[]; exitCode: number; phaseStatus?: \"in_progress\" | \"done\" }\n): Promise<void> {\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n const state = await ctx.stateStore.getOrCreateGlobal();\n state.openChangeIds = inspection.changes;\n if (inspection.changes.includes(changeId)) {\n state.activeChangeId = changeId;\n }\n await ctx.stateStore.writeGlobal(state);\n\n if (!inspection.changes.includes(changeId)) {\n return;\n }\n\n const changeInspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n const changeState = await ctx.stateStore.getOrCreateChange(changeId, phaseByCommand[command] ?? \"propose\");\n const phase = phaseByCommand[command] ?? \"propose\";\n changeState.currentPhase = phase;\n changeState.phases[phase] = {\n status: lastOpenSpecCommand.phaseStatus ?? \"in_progress\",\n updatedAt: new Date().toISOString()\n };\n changeState.lastOpenSpecCommand = {\n command: lastOpenSpecCommand.openSpecCommand,\n args: lastOpenSpecCommand.openSpecArgs,\n exitCode: lastOpenSpecCommand.exitCode,\n ranAt: new Date().toISOString()\n };\n changeState.tasks.completedIds = await readCompletedTaskIds(changeInspection.tasksPath);\n changeState.tasks.lastSyncedAt = new Date().toISOString();\n await ctx.stateStore.writeChange(changeState);\n}\n\nfunction resolveOutputPath(status: OpenSpecStatusResult, artifactId: string): string {\n return status.artifacts?.find((artifact) => artifact.id === artifactId)?.outputPath ?? `${artifactId}.md`;\n}\n\nfunction isKebabId(value: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);\n}\n\nfunction toKebabId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction parseOpenSpecJson(stdout: string): unknown {\n const trimmed = stdout.trim();\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n const starts = [objectStart, arrayStart].filter((index) => index >= 0);\n if (!starts.length) {\n return JSON.parse(trimmed || \"{}\");\n }\n return JSON.parse(trimmed.slice(Math.min(...starts)));\n}\n\nasync function assertOpenSpecCommandSupported(ctx: FetCommandContext, openSpecCommand: string, fetCommand: string): Promise<void> {\n const capabilities = await ctx.openSpec.getCapabilities();\n if (capabilities.commands.includes(openSpecCommand)) {\n return;\n }\n\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: `OpenSpec CLI ${capabilities.version} does not expose command \"${openSpecCommand}\" required by \"fet ${fetCommand}\". FET will not substitute another workflow command automatically.`,\n details: {\n openSpecVersion: capabilities.version,\n requiredCommand: openSpecCommand,\n availableCommands: capabilities.commands,\n supported: capabilities.supported\n },\n suggestedCommand:\n \"Upgrade OpenSpec to a version that supports this command, then rerun FET. Try: npm install -g @fission-ai/openspec@latest && fet doctor. If your OpenSpec version intentionally removed this command, pause and choose a compatible FET workflow instead of running ff automatically.\"\n });\n}\n\ninterface ChangelogEntry {\n updateTime: string;\n content: string;\n}\n\nasync function createChangelogEntry(projectRoot: string, changeId: string): Promise<ChangelogEntry> {\n return {\n updateTime: formatLocalTimestamp(new Date()),\n content: await readChangeRequirement(projectRoot, changeId)\n };\n}\n\nasync function appendChangelog(projectRoot: string, entry: ChangelogEntry): Promise<void> {\n const changelogPath = join(projectRoot, \"CHANGELOG.md\");\n const existing = await readOptional(changelogPath);\n const legacyContentLabel = \"\\u66f4\\u65b0\\u5185\\u5bb9\";\n const block = `updateTime: ${entry.updateTime}\\nchangeRequirement:${entry.content}\\n${legacyContentLabel}:${entry.content}\\n`;\n const next = existing?.trimEnd() ? `${existing.trimEnd()}\\n\\n${block}` : block;\n await atomicWrite(changelogPath, next);\n}\n\nasync function readChangeRequirement(projectRoot: string, changeId: string): Promise<string> {\n const changeRoot = join(projectRoot, \"openspec\", \"changes\", changeId);\n const proposal = await readOptional(join(changeRoot, \"proposal.md\"));\n if (proposal) {\n return summarizeMarkdown(proposal);\n }\n const readme = await readOptional(join(changeRoot, \"README.md\"));\n if (readme) {\n return summarizeMarkdown(readme);\n }\n return changeId;\n}\n\nfunction summarizeMarkdown(content: string): string {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"<!--\") && !line.startsWith(\"---\"))\n .join(\" \");\n return normalized || \"No change requirement found.\";\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction formatLocalTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport async function passthroughCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<void> {\n const result = await ctx.openSpec.run(command, stripFetOptions(args), { cwd: ctx.projectRoot, stdio: ctx.json ? \"pipe\" : \"inherit\" });\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: `OpenSpec ${command} failed.`,\n details: result\n });\n }\n}\n\nfunction stripFetOptions(args: string[]): string[] {\n const result: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--cwd\" || arg === \"--change\") {\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--cwd=\") || arg?.startsWith(\"--change=\")) {\n continue;\n }\n if (arg === \"--yes\" || arg === \"--json\" || arg === \"--verbose\" || arg === \"--no-color\") {\n continue;\n }\n if (arg) {\n result.push(arg);\n }\n }\n return result;\n}\n\nasync function mapOpenSpecCommand(ctx: FetCommandContext, command: string, args: string[]): Promise<{ command: string; args: string[] }> {\n switch (command) {\n case \"propose\":\n case \"bulk-archive\":\n case \"explore\":\n case \"onboard\":\n return { command, args: withGlobalChange(ctx, args) };\n case \"continue\":\n case \"ff\":\n return { command, args: await withDefaultChange(ctx, args, true) };\n case \"apply\":\n case \"sync\":\n return { command, args: await withDefaultChange(ctx, args) };\n case \"new\":\n return { command: \"new\", args: args[0] === \"change\" ? args : [\"change\", ...args] };\n case \"archive\":\n return { command: \"archive\", args: [ctx.changeId ?? args[0] ?? (await requireChangeId(ctx)), ...args.slice(ctx.changeId ? 0 : 1)] };\n default:\n return { command, args };\n }\n}\n\nfunction withGlobalChange(ctx: FetCommandContext, args: string[]): string[] {\n return ctx.changeId ? [\"--change\", ctx.changeId, ...args] : args;\n}\n\nasync function withDefaultChange(ctx: FetCommandContext, args: string[], allowWithArgs = false): Promise<string[]> {\n if (ctx.changeId) {\n return [\"--change\", ctx.changeId, ...args];\n }\n if (args.includes(\"--change\") || args.some((arg) => arg.startsWith(\"--change=\"))) {\n return args;\n }\n if (args.length > 0 && !allowWithArgs) {\n return args;\n }\n return [\"--change\", await requireChangeId(ctx), ...args];\n}\n\nfunction extractChangeId(args: string[]): string | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--change\") {\n return args[index + 1] ?? null;\n }\n if (arg?.startsWith(\"--change=\")) {\n return arg.slice(\"--change=\".length) || null;\n }\n }\n return null;\n}\n\nasync function requireChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n const state = await ctx.stateStore.getOrCreateGlobal();\n if (state.activeChangeId) {\n return state.activeChangeId;\n }\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"No unambiguous OpenSpec change id was found.\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"Pass --change <change-id>.\"\n });\n}\n\nasync function assertVerified(ctx: FetCommandContext): Promise<void> {\n const global = await ctx.stateStore.getOrCreateGlobal();\n const changeId = ctx.changeId ?? global.activeChangeId;\n if (!changeId) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"A change id is required before this command can check FET verification.\",\n suggestedCommand: \"fet verify --done --change <change-id>\"\n });\n }\n await assertVerifiedChange(ctx, changeId);\n}\n\nasync function assertVerifiedChange(ctx: FetCommandContext, changeId: string): Promise<void> {\n const change = await ctx.stateStore.readChange(changeId);\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (!inspection.changes.includes(changeId)) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"The selected change does not exist in openspec/changes.\",\n details: { changeId, openChangeIds: inspection.changes },\n suggestedCommand: \"fet doctor\"\n });\n }\n if (change?.manualVerify?.status !== \"declared_done\") {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"This change has not been marked verified by FET.\",\n details: { changeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { ProjectIdentity } from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function detectProjectIdentity(projectRoot: string): Promise<ProjectIdentity> {\n const [gitRoot, branch, headCommit] = await Promise.all([\n git(projectRoot, [\"rev-parse\", \"--show-toplevel\"]),\n git(projectRoot, [\"branch\", \"--show-current\"]),\n git(projectRoot, [\"rev-parse\", \"HEAD\"])\n ]);\n\n return {\n gitRoot,\n worktreePath: projectRoot,\n branch,\n headCommit\n };\n}\n\nasync function git(cwd: string, args: string[]): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWrite } from \"../fs/atomic-write.js\";\nimport { assertChangeState, assertGlobalState, createChangeState, createGlobalState } from \"./schema.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nexport class StateStore {\n constructor(\n private readonly projectRoot: string,\n private readonly fetVersion: string,\n private readonly project: ProjectIdentity\n ) {}\n\n async readGlobal(): Promise<GlobalState | null> {\n try {\n const value = JSON.parse(await readFile(this.globalPath(), \"utf8\"));\n assertGlobalState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateGlobal(): Promise<GlobalState> {\n return (await this.readGlobal()) ?? createGlobalState(this.fetVersion, this.project);\n }\n\n async writeGlobal(state: GlobalState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\"), { recursive: true });\n await atomicWrite(this.globalPath(), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n async readChange(changeId: string): Promise<ChangeState | null> {\n try {\n const value = JSON.parse(await readFile(this.changePath(changeId), \"utf8\"));\n assertChangeState(value);\n return value;\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getOrCreateChange(changeId: string, phase: ChangePhase): Promise<ChangeState> {\n return (await this.readChange(changeId)) ?? createChangeState(this.fetVersion, changeId, phase);\n }\n\n async writeChange(state: ChangeState): Promise<void> {\n state.updatedAt = new Date().toISOString();\n await mkdir(join(this.projectRoot, \"openspec\", \"changes\", state.changeId), { recursive: true });\n await atomicWrite(this.changePath(state.changeId), `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n private globalPath(): string {\n return join(this.projectRoot, \"openspec\", \"fet-state.json\");\n }\n\n private changePath(changeId: string): string {\n return join(this.projectRoot, \"openspec\", \"changes\", changeId, \"fet-state.json\");\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n","export const DEFAULT_LANGUAGE = \"zh-CN\" as const;\n\nexport type FetLanguage = \"zh-CN\" | \"en\";\n\nexport interface LanguageState {\n current: FetLanguage;\n updatedAt: string;\n}\n\nexport function normalizeLanguage(value: string | null | undefined): FetLanguage {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return DEFAULT_LANGUAGE;\n }\n if ([\"en\", \"en-us\", \"english\"].includes(normalized)) {\n return \"en\";\n }\n return DEFAULT_LANGUAGE;\n}\n\nexport function languageLabel(language: FetLanguage): string {\n return language === \"en\" ? \"English\" : \"中文\";\n}\n\nexport function languageInstruction(language: FetLanguage): string {\n return language === \"en\"\n ? \"Use English for FET interaction messages, generated handoff documents, and IDE prompt output unless the user asks otherwise.\"\n : \"除非用户另有明确要求,FET 的交互信息、生成的交接文档和 IDE 提示产出均使用中文。\";\n}\n","import { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { DEFAULT_LANGUAGE } from \"../language.js\";\nimport type { ChangePhase, ChangeState, GlobalState, ProjectIdentity } from \"./types.js\";\n\nconst phases: ChangePhase[] = [\"explore\", \"propose\", \"implement\", \"verify\", \"sync\", \"archive\"];\n\nexport function createGlobalState(fetVersion: string, project: ProjectIdentity): GlobalState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n createdAt: now,\n updatedAt: now,\n project,\n language: {\n current: DEFAULT_LANGUAGE,\n updatedAt: now\n },\n openspec: null,\n activeChangeId: null,\n openChangeIds: [],\n context: {\n agentsMdUpdatedAt: null,\n configUpdatedAt: null,\n scannerVersion: 1\n },\n toolAdapters: {},\n graph: {},\n verifyAuthorization: null,\n lastDoctor: null\n };\n}\n\nexport function createChangeState(fetVersion: string, changeId: string, phase: ChangePhase): ChangeState {\n const now = new Date().toISOString();\n return {\n schemaVersion: 1,\n fetVersion,\n changeId,\n createdAt: now,\n updatedAt: now,\n currentPhase: phase,\n phases: Object.fromEntries(phases.map((item) => [item, { status: item === phase ? \"in_progress\" : \"not_started\" }])) as ChangeState[\"phases\"],\n tasks: {\n source: \"tasks.md\",\n completedIds: [],\n lastSyncedAt: null\n },\n manualVerify: null,\n lastOpenSpecCommand: null,\n warnings: []\n };\n}\n\nexport function assertGlobalState(value: unknown): asserts value is GlobalState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"全局状态 schema 不受支持\");\n }\n if (!isRecord(value.language)) {\n value.language = {\n current: DEFAULT_LANGUAGE,\n updatedAt: typeof value.updatedAt === \"string\" ? value.updatedAt : new Date().toISOString()\n };\n }\n if (typeof value.fetVersion !== \"string\" || !isRecord(value.project)) {\n throw corruptedState(\"全局状态缺少必填字段\");\n }\n}\n\nexport function assertChangeState(value: unknown): asserts value is ChangeState {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n throw unsupportedSchema(\"变更状态 schema 不受支持\");\n }\n if (typeof value.fetVersion !== \"string\" || typeof value.changeId !== \"string\") {\n throw corruptedState(\"变更状态缺少必填字段\");\n }\n}\n\nfunction unsupportedSchema(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateSchemaUnsupported,\n message,\n suggestedCommand: \"npm update -g @nick848/fet\"\n });\n}\n\nfunction corruptedState(message: string): FetError {\n return new FetError({\n code: ErrorCode.StateCorrupted,\n message,\n suggestedCommand: \"fet doctor --fix\"\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readCompletedTaskIds(tasksPath: string): Promise<string[]> {\n let content: string;\n try {\n content = await readFile(tasksPath, \"utf8\");\n } catch {\n return [];\n }\n\n const completed: string[] = [];\n const pattern = /^\\s*[-*]\\s+\\[[xX]\\]\\s+([0-9]+(?:\\.[0-9]+)*)/gm;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content))) {\n if (match[1]) {\n completed.push(match[1]);\n }\n }\n return completed;\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport const DEFAULT_FET_PACKAGE_NAME = \"@nick848/fet\";\n\nexport interface NpmRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal: NodeJS.Signals | null;\n stdout?: string;\n stderr?: string;\n}\n\nexport interface FetUpdateInstallOptions {\n cwd: string;\n json: boolean;\n language: \"en\" | \"zh-CN\";\n info: (message: string) => void;\n}\n\nexport function getFetPackageName(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_PACKAGE_NAME?.trim() || DEFAULT_FET_PACKAGE_NAME;\n}\n\nexport function getNpmExecutable(env: NodeJS.ProcessEnv = process.env): string {\n return env.FET_UPDATE_NPM_EXECUTABLE?.trim() || (process.platform === \"win32\" ? \"npm.cmd\" : \"npm\");\n}\n\nexport async function resolveLatestFetVersion(\n packageName = getFetPackageName(),\n npmExecutable = getNpmExecutable()\n): Promise<string> {\n const override = process.env.FET_UPDATE_LATEST_VERSION?.trim();\n if (override) {\n return override;\n }\n\n const result = await runNpm(npmExecutable, [\"view\", packageName, \"version\", \"--json\"], {\n cwd: process.cwd(),\n stdio: \"pipe\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to check the latest FET version from npm.\",\n details: result,\n suggestedCommand: `${npmExecutable} view ${packageName} version`\n });\n }\n\n const version = parseNpmVersion(result.stdout ?? \"\");\n if (!version) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"npm returned an invalid FET version.\",\n details: { stdout: result.stdout }\n });\n }\n return version;\n}\n\nexport async function performFetUpdate(\n currentVersion: string,\n latestVersion: string,\n options: FetUpdateInstallOptions\n): Promise<{ packageName: string; installCommand: string }> {\n const packageName = getFetPackageName();\n const npmExecutable = getNpmExecutable();\n const installArgs = [\"install\", \"-g\", `${packageName}@latest`];\n\n if (!options.json) {\n options.info(\n options.language === \"en\"\n ? `Updating FET from ${currentVersion} to ${latestVersion}...`\n : `正在将 FET 从 ${currentVersion} 升级到 ${latestVersion}...`\n );\n }\n\n const result = await runNpm(npmExecutable, installArgs, {\n cwd: options.cwd,\n stdio: options.json ? \"pipe\" : \"inherit\"\n });\n\n if (result.exitCode !== 0) {\n throw new FetError({\n code: ErrorCode.UpdateFailed,\n message: options.language === \"en\" ? \"FET update failed.\" : \"FET 升级失败。\",\n details: result,\n suggestedCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n });\n }\n\n return {\n packageName,\n installCommand: `${npmExecutable} ${installArgs.join(\" \")}`\n };\n}\n\nfunction parseNpmVersion(stdout: string): string | null {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" && parsed.length > 0 ? parsed : null;\n } catch {\n return trimmed;\n }\n}\n\nexport function runNpm(\n command: string,\n args: string[],\n options: { cwd: string; stdio: \"inherit\" | \"pipe\" }\n): Promise<NpmRunResult> {\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(command, args, {\n cwd: options.cwd,\n stdio: options.stdio,\n shell: process.platform === \"win32\"\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.UpdateFailed,\n message: \"Unable to run npm for FET update.\",\n details: { command, args },\n cause: error,\n suggestedCommand: `${command} ${args.join(\" \")}`\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const diff = leftVersion.main[index] - rightVersion.main[index];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n\n if (!leftVersion.prerelease.length && rightVersion.prerelease.length) {\n return 1;\n }\n if (leftVersion.prerelease.length && !rightVersion.prerelease.length) {\n return -1;\n }\n\n const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftVersion.prerelease[index];\n const rightPart = rightVersion.prerelease[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const diff = comparePrereleasePart(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(version: string): { main: [number, number, number]; prerelease: string[] } {\n const [withoutBuild] = version.trim().replace(/^v/i, \"\").split(\"+\");\n const [mainValue = \"\", prereleaseValue = \"\"] = withoutBuild.split(\"-\");\n const mainParts = mainValue.split(\".\").map((part) => Number.parseInt(part, 10));\n return {\n main: [\n Number.isFinite(mainParts[0]) ? mainParts[0] : 0,\n Number.isFinite(mainParts[1]) ? mainParts[1] : 0,\n Number.isFinite(mainParts[2]) ? mainParts[2] : 0\n ],\n prerelease: prereleaseValue ? prereleaseValue.split(\".\") : []\n };\n}\n\nfunction comparePrereleasePart(left: string, right: string): number {\n const leftNumber = /^\\d+$/.test(left) ? Number.parseInt(left, 10) : null;\n const rightNumber = /^\\d+$/.test(right) ? Number.parseInt(right, 10) : null;\n\n if (leftNumber !== null && rightNumber !== null) {\n return Math.sign(leftNumber - rightNumber);\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return left.localeCompare(right);\n}\n","import type { FetCommandContext } from \"../cli/context.js\";\nimport { compareVersions, getFetPackageName, performFetUpdate, resolveLatestFetVersion } from \"../update/npm.js\";\n\nexport async function updateCommand(ctx: FetCommandContext): Promise<void> {\n const packageName = getFetPackageName();\n const latestVersion = await resolveLatestFetVersion(packageName);\n const currentVersion = ctx.fetVersion;\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET is already up to date (${currentVersion}).`\n : `FET 已是最新版 (${currentVersion})。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: false\n }\n });\n return;\n }\n\n const install = await performFetUpdate(currentVersion, latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n ctx.output.result({\n ok: true,\n command: \"update\",\n summary:\n ctx.language === \"en\"\n ? `FET updated from ${currentVersion} to ${latestVersion}.`\n : `FET 已从 ${currentVersion} 升级到 ${latestVersion}。`,\n data: {\n packageName,\n currentVersion,\n latestVersion,\n updated: true,\n installCommand: install.installCommand\n }\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FetCommandContext } from \"../cli/context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport { atomicWrite, withProjectLock } from \"../fs/index.js\";\nimport { renderVerifyInstructions } from \"../templates/index.js\";\n\nexport async function verifyCommand(ctx: FetCommandContext, options: { done?: boolean; auto?: boolean }): Promise<void> {\n if (options.auto) {\n const scan = await ctx.scanner.scan(ctx.projectRoot, {});\n const plan = {\n schemaVersion: 1,\n packageManager: scan.project.packageManager,\n workspaces: [\n {\n name: \"root\",\n cwd: \".\",\n commands: Object.entries(scan.commands)\n .filter(([name]) => [\"lint\", \"typecheck\", \"test\"].includes(name))\n .map(([dimension, command]) => ({\n dimension,\n command: command.command,\n source: command.source,\n required: command.required,\n statusIfMissing: command.required ? \"fail\" : \"warn\"\n }))\n }\n ],\n missing: [\"lint\", \"typecheck\", \"test\"].filter((name) => !scan.commands[name])\n };\n if (ctx.yes) {\n const global = await ctx.stateStore.getOrCreateGlobal();\n global.verifyAuthorization = {\n schemaVersion: 1,\n approvedAt: new Date().toISOString(),\n commandFingerprint: fingerprint(plan),\n packageManager: plan.packageManager,\n plan: plan.workspaces.flatMap((workspace) =>\n workspace.commands.map((command) => ({\n cwd: workspace.cwd,\n dimension: command.dimension,\n command: command.command,\n source: command.source,\n required: command.required\n }))\n )\n };\n await ctx.stateStore.writeGlobal(global);\n }\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: ctx.yes ? \"已确认 verify --auto 执行计划;MVP 暂不执行仓库脚本。\" : \"已生成 verify --auto 执行计划;MVP 暂不执行仓库脚本。\",\n warnings: plan.missing.map((name) => `未发现 ${name} 脚本,将在自动执行版本中按配置处理。`),\n data: plan,\n nextSteps: ctx.yes ? [\"当前版本请运行 fet verify 进入手动验证模式\"] : [\"审核执行计划\", \"确认计划后可运行 fet verify --auto --yes\", \"当前版本请运行 fet verify 进入手动验证模式\"]\n });\n return;\n }\n\n await withProjectLock(\n ctx.projectRoot,\n { command: \"verify\", cwd: ctx.cwd, fetVersion: ctx.fetVersion },\n async () => {\n const changeId = await resolveChangeId(ctx);\n if (options.done) {\n await markDone(ctx, changeId);\n } else {\n await writeInstructions(ctx, changeId);\n }\n }\n );\n}\n\nasync function writeInstructions(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const generatedAt = new Date().toISOString();\n const dir = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\");\n const instructionsPath = join(dir, \"verify-instructions.md\");\n await mkdir(dir, { recursive: true });\n await atomicWrite(instructionsPath, renderVerifyInstructions(changeId, generatedAt));\n\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"in_progress\", updatedAt: generatedAt };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已生成手动验证指令。\",\n nextSteps: [`阅读 openspec/changes/${changeId}/.fet/verify-instructions.md`, `完成后运行 fet verify --done --change ${changeId}`]\n });\n}\n\nasync function markDone(ctx: FetCommandContext, changeId: string): Promise<void> {\n await assertChangeExists(ctx, changeId);\n const declaredAt = new Date().toISOString();\n const instructionsPath = join(ctx.projectRoot, \"openspec\", \"changes\", changeId, \".fet\", \"verify-instructions.md\");\n const instructions = await readInstructions(instructionsPath, changeId);\n const instructionsGeneratedAt = readFrontMatterValue(instructions, \"generatedAt\") ?? declaredAt;\n const state = await ctx.stateStore.getOrCreateChange(changeId, \"verify\");\n state.currentPhase = \"verify\";\n state.phases.verify = { status: \"done\", updatedAt: declaredAt };\n state.manualVerify = {\n mode: \"manual\",\n status: \"declared_done\",\n declaredAt,\n instructionsPath: `openspec/changes/${changeId}/.fet/verify-instructions.md`,\n instructionsGeneratedAt,\n evidence: null\n };\n await ctx.stateStore.writeChange(state);\n\n ctx.output.result({\n ok: true,\n command: \"verify\",\n summary: \"已记录手动验证完成声明。\",\n nextSteps: [`fet sync --change ${changeId}`, `fet archive --change ${changeId}`]\n });\n}\n\nasync function assertChangeExists(ctx: FetCommandContext, changeId: string): Promise<void> {\n const inspection = await ctx.openSpec.inspectChange(ctx.projectRoot, changeId);\n if (!inspection.exists) {\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"指定的 change 不存在\",\n details: { changeId },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n }\n}\n\nasync function readInstructions(path: string, changeId: string): Promise<string> {\n try {\n await stat(path);\n const content = await readFile(path, \"utf8\");\n const fileChangeId = readFrontMatterValue(content, \"changeId\");\n if (fileChangeId !== changeId) {\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件与当前 change 不匹配\",\n details: { expected: changeId, actual: fileChangeId },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n return content;\n } catch (error) {\n if (error instanceof FetError) {\n throw error;\n }\n throw new FetError({\n code: ErrorCode.StateCorrupted,\n message: \"验证指令文件不存在或无法读取\",\n details: { path },\n suggestedCommand: `fet verify --change ${changeId}`\n });\n }\n}\n\nfunction readFrontMatterValue(content: string, key: string): string | null {\n const match = content.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n return match?.[1]?.trim() ?? null;\n}\n\nfunction fingerprint(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\")}`;\n}\n\nasync function resolveChangeId(ctx: FetCommandContext): Promise<string> {\n if (ctx.changeId) {\n return ctx.changeId;\n }\n\n const global = await ctx.stateStore.getOrCreateGlobal();\n if (global.activeChangeId) {\n return global.activeChangeId;\n }\n\n const inspection = await ctx.openSpec.inspectProject(ctx.projectRoot);\n if (inspection.changes.length === 1 && inspection.changes[0]) {\n return inspection.changes[0];\n }\n\n throw new FetError({\n code: ErrorCode.InvalidArguments,\n message: \"无法确定要验证的 change\",\n details: { openChangeIds: inspection.changes },\n suggestedCommand: \"fet verify --change <change-id>\"\n });\n}\n","import type { FetLanguage } from \"./language.js\";\n\nconst HIGH_COST_MODEL_PATTERNS = [\n /gpt[-_ ]?5\\.5/i,\n /glm[-_ ]?5(?:\\.1)?/i,\n /claude.*opus/i,\n /opus/i,\n /claude.*sonnet/i,\n /sonnet/i\n];\n\nconst MODEL_ENV_KEYS = [\"FET_IDE_MODEL\", \"FET_MODEL\", \"CODEX_MODEL\", \"CURSOR_MODEL\", \"OPENCODE_MODEL\", \"OPENAI_MODEL\", \"ANTHROPIC_MODEL\"];\n\nexport type ModelPolicyMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface DetectedModel {\n source: string;\n name: string;\n}\n\nexport interface ModelPolicyMismatch {\n command: string;\n detected: DetectedModel;\n recommended: \"high-cost\" | \"low-cost\";\n reason: string;\n}\n\nexport function detectCurrentModel(env: NodeJS.ProcessEnv = process.env): DetectedModel | null {\n for (const key of MODEL_ENV_KEYS) {\n const value = env[key]?.trim();\n if (value) {\n return { source: key, name: value };\n }\n }\n return null;\n}\n\nexport function isHighCostModel(model: string): boolean {\n return HIGH_COST_MODEL_PATTERNS.some((pattern) => pattern.test(model));\n}\n\nexport function getModelPolicyMode(env: NodeJS.ProcessEnv = process.env): ModelPolicyMode {\n const value = env.FET_MODEL_POLICY?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_MODEL_POLICY === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n return \"confirm\";\n}\n\nexport function getCommandModelPolicyMismatch(command: string, env: NodeJS.ProcessEnv = process.env): ModelPolicyMismatch | null {\n if (getModelPolicyMode(env) === \"off\") {\n return null;\n }\n\n const detected = detectCurrentModel(env);\n if (!detected) {\n return null;\n }\n\n const highCost = isHighCostModel(detected.name);\n if (command === \"apply\") {\n if (!highCost) {\n return {\n command,\n detected,\n recommended: \"high-cost\",\n reason: \"fet apply is the implementation phase and is recommended to use a high-capability/high-cost model.\"\n };\n }\n return null;\n }\n\n if (highCost) {\n return {\n command,\n detected,\n recommended: \"low-cost\",\n reason: `fet ${command} is not the implementation phase and is recommended to use a lower-cost model.`\n };\n }\n return null;\n}\n\nexport function formatModelPolicyMismatch(mismatch: ModelPolicyMismatch, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"Recommended models include GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet.\"\n : \"Recommended action: switch to a lower-cost model and reserve high-cost models for fet apply.\";\n return `${mismatch.reason} Detected ${mismatch.detected.source}=\"${mismatch.detected.name}\". ${switchHint}`;\n }\n const switchHint =\n mismatch.recommended === \"high-cost\"\n ? \"建议模型包括 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。\"\n : \"建议切换到低成本模型,把高成本模型留给 fet apply。\";\n const reason =\n mismatch.recommended === \"high-cost\"\n ? \"fet apply 属于实施阶段,建议使用高能力/高成本模型。\"\n : `fet ${mismatch.command} 不是实施阶段,建议使用低成本模型。`;\n return `${reason} 检测到 ${mismatch.detected.source}=\"${mismatch.detected.name}\"。${switchHint}`;\n}\n\nexport function renderIdeModelPolicy(command: string, language: FetLanguage = \"zh-CN\"): string {\n if (language === \"en\") {\n if (command === \"apply\") {\n return \"Model policy: this command is recommended to run with a high-capability/high-cost model such as GPT-5.5, GLM-5.1, GLM-5, Claude Opus, or Claude Sonnet. If the current IDE model is lower-cost, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n return \"Model policy: this command is recommended to run with a low-cost model. If the current IDE model is GPT-5.5, GLM-5.1, GLM-5, Claude Opus, Claude Sonnet, or another high-cost model, tell the user and ask whether to stop for a model switch or continue anyway. Continue only after the user chooses.\";\n }\n\n if (command === \"apply\") {\n return \"模型策略:该命令建议使用高能力/高成本模型运行,例如 GPT-5.5、GLM-5.1、GLM-5、Claude Opus 或 Claude Sonnet。若当前 IDE 模型能力较低,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n }\n\n return \"模型策略:该命令建议使用低成本模型运行。若当前 IDE 模型是 GPT-5.5、GLM-5.1、GLM-5、Claude Opus、Claude Sonnet 或其他高成本模型,请告知用户并询问是停止后切换模型,还是继续执行当前命令;只有在用户选择后才继续。\";\n}\n","import { resolve } from \"node:path\";\nimport { CodexAdapter, CursorAdapter } from \"../adapters/index.js\";\nimport { normalizeLanguage, type FetLanguage } from \"../language.js\";\nimport { DefaultOpenSpecAdapter } from \"../openspec/index.js\";\nimport { ProjectScanner } from \"../scanner/index.js\";\nimport { detectProjectIdentity, StateStore } from \"../state/index.js\";\nimport { FET_VERSION } from \"../version.js\";\nimport { OutputWriter } from \"./output.js\";\n\nexport interface GlobalOptions {\n cwd?: string;\n json?: boolean;\n verbose?: boolean;\n yes?: boolean;\n change?: string;\n lang?: string;\n}\n\nexport async function createCommandContext(command: string, options: GlobalOptions) {\n const projectRoot = resolve(options.cwd ?? process.cwd());\n const project = await detectProjectIdentity(projectRoot);\n const stateStore = new StateStore(projectRoot, FET_VERSION, project);\n const savedState = await stateStore.readGlobal();\n const language: FetLanguage = normalizeLanguage(options.lang ?? savedState?.language.current);\n const output = new OutputWriter(Boolean(options.json), language);\n\n return {\n command,\n cwd: projectRoot,\n projectRoot,\n isTty: Boolean(process.stdout.isTTY),\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n yes: Boolean(options.yes),\n changeId: options.change,\n language,\n explicitLanguage: options.lang !== undefined,\n fetVersion: FET_VERSION,\n output,\n stateStore,\n openSpec: new DefaultOpenSpecAdapter(),\n scanner: new ProjectScanner(),\n toolAdapters: [new CursorAdapter(), new CodexAdapter()]\n };\n}\n\nexport type FetCommandContext = Awaited<ReturnType<typeof createCommandContext>>;\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { codexCommandFiles, codexGuideFile, codexSlashPromptFiles } from \"./templates.js\";\n\ninterface CodexToolFile {\n path: string;\n content: string;\n managed: boolean;\n root?: \"project\" | \"codex-home\";\n}\n\nexport class CodexAdapter implements ToolAdapter {\n readonly tool = \"codex\";\n readonly adapterVersion = 1;\n\n async detect(projectRoot: string) {\n return {\n detected: await exists(join(projectRoot, \".codex\")) || await exists(join(projectRoot, \"AGENTS.md\")),\n reason: \"Codex adapter is available for projects that use AGENTS.md\"\n };\n }\n\n async planInstall(_projectRoot: string, language?: FetLanguage): Promise<ToolInstallPlan> {\n return {\n tool: this.tool,\n files: [\n ...[codexGuideFile(language), ...codexCommandFiles(language)].map((file) => ({\n ...file,\n managed: true,\n root: \"project\" as const\n })),\n ...codexSlashPromptFiles(language).map((file) => ({\n ...file,\n managed: true,\n root: \"codex-home\" as const\n }))\n ]\n };\n }\n\n async install(projectRoot: string, plan: ToolInstallPlan, force = false): Promise<ToolInstallResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const existing = await readExisting(target);\n if (existing && !existing.includes(\"FET:MANAGED\") && !force) {\n throw new FetError({\n code: ErrorCode.ToolAdapterConflict,\n message: \"Codex adapter file already exists and is not managed by FET\",\n details: { path: displayPath },\n suggestedCommand: \"fet init --yes\"\n });\n }\n if (existing && !existing.includes(\"FET:MANAGED\") && force) {\n await createBackup(target);\n }\n await mkdir(dirname(target), { recursive: true });\n await atomicWrite(target, file.content);\n written.push(displayPath);\n }\n\n return { tool: this.tool, written, skipped };\n }\n\n async doctor(projectRoot: string): Promise<DoctorCheck[]> {\n const plan = await this.planInstall(projectRoot);\n const checks: DoctorCheck[] = [];\n for (const file of plan.files as CodexToolFile[]) {\n const target = resolveTarget(projectRoot, file);\n const displayPath = displayPathFor(file);\n const content = await readExisting(target);\n const managed = Boolean(content?.includes(\"FET:MANAGED\"));\n const versionMatches = Boolean(content?.includes(`adapterVersion: ${this.adapterVersion}`));\n checks.push({\n id: `codex:${displayPath}`,\n status: !content ? \"warn\" : managed && versionMatches ? \"pass\" : \"warn\",\n message: !content\n ? `${displayPath} is missing`\n : !managed\n ? `${displayPath} exists but is not managed by FET`\n : !versionMatches\n ? `${displayPath} adapterVersion is stale`\n : `${displayPath} is managed by FET`,\n suggestedCommand: !content || !managed || !versionMatches ? \"fet init\" : undefined\n });\n }\n return checks;\n }\n}\n\nfunction resolveTarget(projectRoot: string, file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return join(resolveCodexHome(), file.path);\n }\n return join(projectRoot, file.path);\n}\n\nfunction displayPathFor(file: CodexToolFile): string {\n if (file.root === \"codex-home\") {\n return `$CODEX_HOME/${file.path.replaceAll(\"\\\\\", \"/\")}`;\n }\n return file.path;\n}\n\nfunction resolveCodexHome(): string {\n return process.env.FET_CODEX_HOME ?? process.env.CODEX_HOME ?? join(homedir(), \".codex\");\n}\n\nasync function readExisting(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","export const FET_WORKFLOW_COMMANDS = [\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\"\n] as const;\n\nexport type FetWorkflowCommand = (typeof FET_WORKFLOW_COMMANDS)[number];\n\nexport const FET_GRAPH_COMMANDS = [\"graph-status\", \"graph-setup\", \"graph-init\", \"graph-refresh\", \"graph-doctor\", \"graph-handoff\"] as const;\n\nexport type FetGraphCommand = (typeof FET_GRAPH_COMMANDS)[number];\n\nexport const FET_ADAPTER_COMMANDS = [...FET_WORKFLOW_COMMANDS, \"update\", \"fill-context\", \"passthrough\", ...FET_GRAPH_COMMANDS] as const;\n\nexport type FetAdapterCommand = (typeof FET_ADAPTER_COMMANDS)[number];\n\nexport function renderFetAdapterUsage(command: FetAdapterCommand, args = \"[...args]\"): string {\n if (command.startsWith(\"graph-\")) {\n const subcommand = command.slice(\"graph-\".length);\n return `fet graph ${subcommand}${args ? ` ${args}` : \"\"}`;\n }\n if (command === \"passthrough\") {\n return `fet passthrough <openspec-command>${args ? ` ${args}` : \"\"}`;\n }\n return `fet ${command}${args ? ` ${args}` : \"\"}`;\n}\n","import { FET_VERSION } from \"../../version.js\";\nimport { renderIdeModelPolicy } from \"../../model-policy.js\";\nimport { DEFAULT_LANGUAGE, languageInstruction, type FetLanguage } from \"../../language.js\";\nimport { renderKarpathyGuidelinesBody } from \"../../templates/index.js\";\nimport { FET_ADAPTER_COMMANDS, renderFetAdapterUsage, type FetAdapterCommand } from \"../commands.js\";\n\nexport function codexGuideFile(language: FetLanguage = DEFAULT_LANGUAGE): { path: string; content: string } {\n const body =\n language === \"en\"\n ? `# FET For Codex\n\n## Language\n\n${languageInstruction(language)}\n\nBefore doing FET or OpenSpec work in Codex, read:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- the active change files under openspec/changes/<change-id>/, when a change is selected\n\nIf GitNexus code graph context is available in the IDE or MCP tools, prefer it before broad repository scans. Use it to identify relevant modules, dependencies, and insertion points, then read only the concrete source files needed. If GitNexus is unavailable, continue with the normal FET/OpenSpec workflow.\n\nUse the terminal command \\`fet <command>\\` as the source of truth for workflow transitions. These files are Codex-readable guidance; they do not register native slash commands.\n\nCommand guides live in .codex/fet/commands/.\n`\n : `# Codex 的 FET 使用指南\n\n## 语言\n\n${languageInstruction(language)}\n\n在 Codex 中执行 FET 或 OpenSpec 工作前,先阅读:\n\n- AGENTS.md\n- openspec/config.yaml\n- .codex/fet/karpathy-guidelines.md\n- 如果已选择 change,阅读 openspec/changes/<change-id>/ 下的当前产物\n\n如果 IDE 或 MCP 工具中可用 GitNexus 代码图上下文,先用它缩小仓库扫描范围;用图识别相关模块、依赖和插入点,再只读取需要确认行为的具体源码文件。GitNexus 不可用时,按普通 FET/OpenSpec 工作流继续。\n\n工作流流转以终端命令 \\`fet <command>\\` 为准。这些文件是给 Codex 阅读的指导,不注册原生 slash command。\n\n命令指南位于 .codex/fet/commands/。\n`;\n\n return {\n path: \".codex/fet/context.md\",\n content: `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\nFET:END -->\n\n${body}`\n };\n}\n\nexport function 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# ${language === \"en\" ? \"Andrej Karpathy Inspired Coding Guidelines\" : \"受 Andrej Karpathy 启发的编码指南\"}\n\n${renderKarpathyGuidelinesBody(language)}\n`\n };\n}\n\nfunction renderCommand(command: FetAdapterCommand, language: FetLanguage): string {\n if (language !== \"en\") {\n return renderCommandZh(command);\n }\n if (command === \"fill-context\") {\n return renderFillContextCommand(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughCommand(language);\n }\n if (command.startsWith(\"graph-\")) {\n return renderGraphCommand(command, language);\n }\n\n const usage = renderFetAdapterUsage(command, \"\");\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run the FET ${command} workflow, first make sure the project context is loaded from AGENTS.md and openspec/config.yaml.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nIf the command needs a change id, pass it with \\`--change <change-id>\\` or use the active OpenSpec change from the user's request.\n\nAfter the command completes, report the important next steps from the FET output and keep any generated OpenSpec artifacts in the normal project workflow.\n`;\n}\n\nfunction renderCommandZh(command: FetAdapterCommand): string {\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"\");\n const title = commandTitleZh(command);\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n用于指导当前 IDE LLM 在用户确认下安装 GitNexus。\n\n先运行:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n然后阅读 .fet/graph-setup.md,并以它作为安装任务书。只读检测命令可以直接运行;任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 配置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证。合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,报告失败命令、stderr 和下一步人工处理建议。\n`;\n }\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 用途\n\n${title}\n\n## 执行方式\n\n在执行前阅读 AGENTS.md、openspec/config.yaml、.codex/fet/karpathy-guidelines.md,以及当前 change 目录下已有的 OpenSpec 产物。\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\n如果命令需要 change id,优先使用用户输入、\\`--change <change-id>\\`、FET active change 或唯一打开的 change。存在歧义时先询问用户。\n\n执行完成后,用中文总结关键输出、生成或更新的文件,以及下一步建议。\n`;\n}\n\nfunction renderPassthroughCommand(language: FetLanguage): string {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: fet passthrough <openspec-command>\nFET:END -->\n\n# fet passthrough\n\n${renderIdeModelPolicy(\"passthrough\", language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to run an OpenSpec command that FET does not manage as a first-class workflow command, use FET passthrough instead of calling OpenSpec directly.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nThen run:\n\n\\`\\`\\`sh\nfet passthrough <openspec-command> [...args]\n\\`\\`\\`\n\nThis preserves the FET entry point while allowing access to unmanaged or newly added OpenSpec commands. Passthrough does not update FET lifecycle state.\n`;\n}\n\nfunction renderGraphCommand(command: FetAdapterCommand, language: FetLanguage): string {\n const usage = renderFetAdapterUsage(command, \"\");\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nUse this command to guide IDE-assisted GitNexus installation with user approval.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nThen read .fet/graph-setup.md and follow it as the source of truth. You may run read-only detection commands directly. Before downloading software, installing globally, changing PATH, writing user-level files, or modifying IDE/MCP configuration, show the exact command and wait for user approval.\n\nAfter installation, verify \\`gitnexus --version\\`. If appropriate, continue with \\`fet graph init\\` and \\`fet graph handoff\\`. If installation fails, report the failing command, stderr, and next manual step.\n`;\n }\n const subcommand = command.slice(\"graph-\".length);\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n# ${usage}\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\nWhen the user asks Codex to work with optional GitNexus graph support, use FET as the entry point.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${usage}\n\\`\\`\\`\n\nFor graph init or refresh, pass extra GitNexus analyze arguments only when the user provides them.\n\nAfter the command completes, report the GitNexus state, generated handoff files, and next steps.\n`;\n}\n\nfunction renderSlashPrompt(command: FetAdapterCommand, language: FetLanguage): string {\n if (command === \"ff\") {\n return renderFastForwardSlashPrompt(language);\n }\n if (language !== \"en\") {\n return renderSlashPromptZh(command);\n }\n if (command === \"propose\") {\n return renderProposeSlashPrompt(language);\n }\n if (command === \"continue\") {\n return renderContinueSlashPrompt(language);\n }\n if (command === \"explore\") {\n return renderExploreSlashPrompt(language);\n }\n if (command === \"new\") {\n return renderNewSlashPrompt(language);\n }\n if (command === \"apply\") {\n return renderApplySlashPrompt(language);\n }\n if (command === \"verify\") {\n return renderVerifySlashPrompt(language);\n }\n if (command === \"sync\") {\n return renderSyncSlashPrompt(language);\n }\n if (command === \"archive\") {\n return renderArchiveSlashPrompt(language);\n }\n if (command === \"bulk-archive\") {\n return renderBulkArchiveSlashPrompt(language);\n }\n if (command === \"onboard\") {\n return renderOnboardSlashPrompt(language);\n }\n if (command === \"fill-context\") {\n return renderFillContextSlashPrompt(language);\n }\n if (command === \"passthrough\") {\n return renderPassthroughSlashPrompt(language);\n }\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(language);\n }\n\n const usage = renderFetAdapterUsage(command);\n const isGraph = command.startsWith(\"graph-\");\n const shellCommand = isGraph ? `${renderFetAdapterUsage(command, \"\")} $ARGUMENTS` : `fet ${command} $ARGUMENTS`;\n const description = isGraph\n ? `Run optional GitNexus graph ${command.slice(\"graph-\".length)} through FET`\n : `Run the FET-managed OpenSpec ${command} workflow`;\n\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${description}\n---\n\nUse FET as the entry point for this OpenSpec workflow.\n\nBefore running the command, make sure the relevant project context is loaded from AGENTS.md and openspec/config.yaml. If a change id is needed and was not provided, infer it from the active FET/OpenSpec state when unambiguous; otherwise ask the user for the change id.\n\nAlso read .codex/fet/karpathy-guidelines.md and follow it unless it conflicts with the user's latest request or OpenSpec artifacts.\n\nIf GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\n\nRun:\n\n\\`\\`\\`sh\n${shellCommand}\n\\`\\`\\`\n\nAfter it completes, summarize the important FET output and next steps.\n`;\n}\n\nfunction renderSlashPromptZh(command: FetAdapterCommand): string {\n if (command === \"graph-setup\") {\n return renderGraphSetupSlashPrompt(\"zh-CN\");\n }\n const usage = renderFetAdapterUsage(command, command === \"fill-context\" ? \"\" : command === \"passthrough\" ? \"<openspec-command> [...args]\" : \"[...args]\");\n const argumentHint = command === \"passthrough\" ? \"openspec-command [...args]\" : undefined;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${usage}\nFET:END -->\n\n---\ndescription: ${commandTitleZh(command)}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(command, \"zh-CN\")}\n\n${languageInstruction(\"zh-CN\")}\n\n## 目标\n\n${commandGoalZh(command)}\n\n## 步骤\n\n1. 阅读 AGENTS.md、openspec/config.yaml 和 .codex/fet/karpathy-guidelines.md。\n2. 如果存在当前 OpenSpec change,阅读 openspec/changes/<change-id>/ 下的相关产物。\n3. 运行 FET 命令:\n \\`\\`\\`sh\n ${usage}\n \\`\\`\\`\n4. 按 FET/OpenSpec 输出继续;需要写产物时,只写到 OpenSpec 指定路径,不要把提示包装文本复制进产物。\n5. 用中文总结本次动作、文件路径、状态和下一步。\n\n## 约束\n\n- 默认使用中文产出。\n- 不要绕过 FET 直接调用 openspec,除非 FET 命令本身不可用。\n- change 不明确时先询问用户。\n${command === \"fill-context\" ? \"- fet fill-context 可能已写入小程序包体积与 2MB 约束,不要覆盖该节中的扫描结果,除非仓库结构已变。\\n- 替换 AGENTS.md 中其余 [NEEDS LLM INPUT] 占位符,保留 FET 托管标记,不要修改业务代码。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" ? \"- 一次只创建一个 ready artifact,并在写入前阅读依赖文件。\\n\" : \"\"}${command === \"propose\" || command === \"continue\" ? \"- 不要在用户审阅当前产物前自动运行 fet continue、fet ff 或循环生成后续产物;需要用户明确确认后再推进。\\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 change 并生成首个规划产物\",\n new: \"创建新的 FET/OpenSpec change 骨架\",\n continue: \"推进当前 FET/OpenSpec change 的下一个产物\",\n ff: \"快速生成 FET/OpenSpec 所需产物\",\n apply: \"实施 FET/OpenSpec change 中的任务\",\n verify: \"验证 FET/OpenSpec change\",\n sync: \"同步 delta specs 到主规范\",\n archive: \"归档已验证的 FET/OpenSpec change\",\n \"bulk-archive\": \"批量归档 FET/OpenSpec changes\",\n onboard: \"加载 FET/OpenSpec 项目上下文\",\n \"fill-context\": \"填充 FET AGENTS.md 占位符\",\n passthrough: \"通过 FET 透传未接管的 OpenSpec 命令\",\n \"graph-status\": \"查看 GitNexus 代码图状态\",\n \"graph-setup\": \"生成 GitNexus 安装交接说明\",\n \"graph-init\": \"初始化 GitNexus 代码图\",\n \"graph-refresh\": \"刷新 GitNexus 代码图\",\n \"graph-doctor\": \"诊断 GitNexus 代码图\",\n \"graph-handoff\": \"生成 GitNexus 代码图使用说明\"\n };\n return titles[command] ?? `运行 FET ${command} 工作流`;\n}\n\nfunction commandGoalZh(command: FetAdapterCommand): string {\n if (command === \"fill-context\") {\n return \"补齐 FET 自动生成的项目上下文,让后续 AI 编码和 OpenSpec 工作流拥有稳定的项目事实。\";\n }\n if (command === \"propose\") {\n return \"根据 change id 或描述创建 OpenSpec change(如不存在),并只生成当前第一个 ready 的规划产物。\";\n }\n if (command === \"continue\") {\n return \"基于 active change 或用户指定的 change,创建下一个 ready 的 OpenSpec 规划产物。\";\n }\n if (command === \"ff\") {\n return \"在用户明确要求快进时,一次性生成 change 所需的全部规划产物。\";\n }\n if (command === \"apply\") {\n return \"读取 OpenSpec 产物并按 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. \\`fet fill-context\\` may already fill the mini program package-size table and 2MB constraints. Do not overwrite those subsections unless the repo changed.\n6. Replace every remaining \\`[NEEDS LLM INPUT]\\` or \\`[NEED LLM INPUT]\\` placeholder in AGENTS.md with concrete, concise project-specific content.\n7. Preserve FET managed markers such as \\`FET:BEGIN AUTO\\`, \\`FET:END AUTO\\`, \\`FET:BEGIN USER\\`, and \\`FET:END USER\\`.\n8. Do not modify business code.\n9. Run:\n \\`\\`\\`sh\n fet doctor\n \\`\\`\\`\n Confirm that no AGENTS.md placeholder warning remains.\n\nGuardrails:\n- Do not invent facts that cannot be inferred from the repo.\n- Use [UNKNOWN] only when the repository does not contain enough evidence.\n- Keep generated context stable and useful for future AI coding sessions.`,\n undefined,\n language\n );\n}\n\nfunction renderNewSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet new [...args]\",\n \"Create a new FET/OpenSpec change scaffold\",\n `Create a new FET-managed OpenSpec change scaffold.\n\nInput after the slash command should be a kebab-case change id or a short description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. If no input was provided, ask what change the user wants to build or fix.\n3. Derive a kebab-case change id when the user provided a description.\n4. Create the change through FET:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Show current artifact status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n6. Get the first ready artifact instructions:\n \\`\\`\\`sh\n fet continue <first-ready-artifact-id> --change <change-id>\n \\`\\`\\`\n\nGuardrails:\n- Do not create artifact files in /prompts:fet-new.\n- If the change already exists, suggest /prompts:fet-continue <change-id>.\n- Show the change location and the next command to create the first artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderApplySlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet apply [...args]\",\n \"Implement tasks from a FET/OpenSpec change\",\n `Implement a FET-managed OpenSpec change.\n\nInput after the slash command may identify the change, for example a change id or --change <change-id>. If omitted, use the active OpenSpec change when it is unambiguous.\n\nSteps:\n\n1. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n2. Run the native OpenSpec apply flow through FET:\n \\`\\`\\`sh\n fet apply --change <change-id> --json\n \\`\\`\\`\n3. Follow the native apply output. If JSON output is unavailable, read the files referenced by the terminal output and the artifacts under openspec/changes/<change-id>/.\n4. If 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 renderGraphSetupSlashPrompt(language: FetLanguage): string {\n if (language === \"en\") {\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"Guide IDE-assisted GitNexus installation with user approval\",\n `Guide optional GitNexus installation for this project.\n\nSteps:\n\n1. Run:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. Read .fet/graph-setup.md and follow it as the source of truth.\n3. Run read-only detection commands as needed, such as checking the shell, PATH, package managers, and \\`gitnexus --version\\`.\n4. If GitNexus is missing, use the configured \\`FET_GITNEXUS_INSTALL_COMMAND\\` when present; otherwise find the official GitNexus installation instructions or ask the user for the preferred method.\n5. Before any command that downloads software, installs globally, changes PATH, writes user-level files, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n6. Verify installation with \\`gitnexus --version\\`.\n7. If the user wants IDE/MCP integration, explain \\`gitnexus setup\\` and run it only after approval.\n8. Run \\`fet graph init\\` and then \\`fet graph handoff\\` when GitNexus is available.\n\nGuardrails:\n- GitNexus is optional; do not block FET/OpenSpec workflows if installation fails.\n- Do not modify application code during setup.\n- Report the failing command, stderr, and next manual step if blocked.`,\n undefined,\n language\n );\n }\n\n return renderManagedSlashPrompt(\n \"fet graph setup\",\n \"指导 IDE LLM 在用户确认下安装 GitNexus\",\n `为当前项目引导可选的 GitNexus 安装。\n\n步骤:\n\n1. 运行:\n \\`\\`\\`sh\n fet graph setup\n \\`\\`\\`\n2. 阅读 .fet/graph-setup.md,并以它作为安装任务书。\n3. 按需运行只读检测命令,例如检查 shell、PATH、包管理器和 \\`gitnexus --version\\`。\n4. 如果 GitNexus 缺失,优先使用已配置的 \\`FET_GITNEXUS_INSTALL_COMMAND\\`;没有配置时,查找 GitNexus 官方安装说明,或询问用户希望使用的安装方式。\n5. 任何会下载软件、全局安装、修改 PATH、写入用户级文件或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n6. 用 \\`gitnexus --version\\` 验证安装。\n7. 如果用户需要 IDE/MCP 集成,先说明 \\`gitnexus setup\\`,获得确认后再运行。\n8. GitNexus 可用后运行 \\`fet graph init\\`,再运行 \\`fet graph handoff\\`。\n\n约束:\n- GitNexus 是可选能力;安装失败时不要阻塞 FET/OpenSpec 主流程。\n- 安装过程中不要修改业务代码。\n- 如果受阻,报告失败命令、stderr 和下一步人工处理建议。`,\n undefined,\n language\n );\n}\n\nfunction renderExploreSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet explore [...args]\",\n \"Explore requirements for a FET/OpenSpec change\",\n `Enter exploration mode for a FET-managed OpenSpec change.\n\nUse this command for thinking and proposal shaping, not application implementation.\n\nInput after the slash command may be a change id, a feature idea, or a problem description.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Check existing changes:\n \\`\\`\\`sh\n fet passthrough status --json\n \\`\\`\\`\n3. If the input names an existing change, read its current artifacts under openspec/changes/<change-id>/.\n4. If the input is a new idea and the user wants to capture it, derive a kebab-case change id and create the change:\n \\`\\`\\`sh\n fet new <change-id>\n \\`\\`\\`\n5. Run the native OpenSpec exploration flow through FET so clarification prompts stay interactive:\n \\`\\`\\`sh\n fet explore --change <change-id>\n \\`\\`\\`\n6. If OpenSpec or the user asks to generate or capture the proposal, create openspec/changes/<change-id>/proposal.md using the interactive answers, conversation, and project context.\n\nGuardrails:\n- Do not write application code in explore mode.\n- Ask a clarifying question if the proposal would otherwise be mostly guesswork.\n- Creating or updating OpenSpec artifacts is allowed when the user asks to capture the thinking.\n- After creating proposal.md, show the path and suggest /prompts:fet-continue <change-id> for the next artifact.`,\n undefined,\n language\n );\n}\n\nfunction renderProposeSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet propose [...args]\",\n \"Create a FET/OpenSpec change and its first ready artifact\",\n `Start proposal planning for a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id or a short description of what the user wants to build. If omitted, ask the user.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Derive a kebab-case change id when the user provided a description. If ambiguous, ask the user.\n3. Run the native OpenSpec propose flow through FET. This creates the change when needed and returns instructions for only the next ready artifact:\n \\`\\`\\`sh\n fet propose <change-id-or-description> --json\n \\`\\`\\`\n4. Follow the native output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n5. Read dependency files before writing.\n6. Create only that artifact file at outputPath. Do not copy context/rules wrapper text into the artifact.\n7. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- Change id and location.\n- Which single artifact was created and its file path.\n- Current status.\n- Tell the user to review the artifact and run /prompts:fet-continue <change-id> when ready for the next artifact. Mention /prompts:fet-ff <change-id> only if they explicitly want to fast-forward all remaining artifacts.\n\nGuardrails:\n- Create one artifact per invocation. Do not run fet continue or fet ff in the same session unless the user explicitly asks after reviewing the artifact just created.\n- Never skip dependency order.\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderContinueSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet continue [...args]\",\n \"Create the next FET/OpenSpec artifact\",\n `Continue a FET-managed OpenSpec change by creating exactly one ready artifact.\n\nInput after the slash command may be a change id, optionally followed by an artifact id. If omitted, use the active OpenSpec change and continue the next ready artifact.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id from the input, active FET/OpenSpec state, or the only open change. If ambiguous, ask the user.\n3. Check status:\n \\`\\`\\`sh\n fet passthrough status --change <change-id> --json\n \\`\\`\\`\n4. Pick the first artifact whose status is ready, unless the user specified an artifact id.\n5. Run the native OpenSpec continue flow through FET:\n \\`\\`\\`sh\n fet continue [artifact-id] --change <change-id> --json\n \\`\\`\\`\n6. Follow the native continue output. When it provides template, instruction, dependencies, and outputPath, use those fields.\n7. Read dependency files before writing.\n8. Create the artifact file at outputPath. Do not copy context/rules wrapper text into the artifact; use those fields only as constraints.\n9. Verify the file exists, then run:\n \\`\\`\\`sh\n fet passthrough status --change <change-id>\n \\`\\`\\`\n\nOutput:\n- State which artifact was created.\n- Show the file path.\n- Show the current status and what to run next.\n\nGuardrails:\n- Create one artifact per invocation.\n- Never skip dependency order.\n- Ask the user if instructions are ambiguous enough that a useful artifact cannot be written.`,\n undefined,\n language\n );\n}\n\nfunction renderFastForwardSlashPrompt(language: FetLanguage): string {\n return renderManagedSlashPrompt(\n \"fet ff [...args]\",\n language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\",\n `${language === \"en\" ? \"Fast-forward FET/OpenSpec artifact creation\" : \"快速生成 FET/OpenSpec 所需产物\"}.\n\nUse this command only when the user explicitly wants to generate all remaining planning artifacts in one session without reviewing each artifact between steps. For step-by-step review, use /prompts:fet-propose or /prompts:fet-continue instead.\n\nInput after the slash command may be a change id. It may be omitted when the active OpenSpec change is unambiguous.\n\nSteps:\n\n1. Load project context from AGENTS.md and openspec/config.yaml.\n2. Resolve the change id. If ambiguous, ask the user.\n3. Run the native OpenSpec ff flow through FET:\n \\`\\`\\`sh\n fet ff --change <change-id>\n \\`\\`\\`\n4. Follow the native output. If it asks for clarification, ask the user rather than inventing details.\n5. If the native output includes artifact paths or templates to write, create those files and preserve OpenSpec structure.\n6. If FET reports that the OpenSpec CLI does not expose the requested command, stop immediately. Do not run \\`fet continue\\`, \\`openspec change\\`, or any alternative workflow command unless the user explicitly chooses that fallback after seeing the error.\n\nArtifact rules:\n- Follow the instruction field from OpenSpec/FET for each artifact.\n- Use template as structure, filling it with concrete project-specific content.\n- Do not copy context/rules wrapper text into artifact files.\n- Verify each file exists after writing.\n\nOutput:\n- Change id and location.\n- Artifacts created.\n- Current status.\n- Next recommended command, usually /prompts:fet-apply <change-id>.\n\nGuardrails:\n- Do not substitute one FET/OpenSpec workflow command for another after a command-not-found or unsupported-version error.\n- If OpenSpec appears outdated or incompatible, report the detected version and suggest \\`npm install -g @fission-ai/openspec@latest\\` or \\`fet doctor\\`, then wait for the user's decision.`,\n undefined,\n language\n );\n}\n\nfunction renderManagedSlashPrompt(command: string, description: string, body: string, argumentHint?: string, language: FetLanguage = DEFAULT_LANGUAGE): string {\n const policyCommand = command.split(/\\s+/)[1] ?? command;\n const argumentHintLine = argumentHint ? `argument-hint: ${argumentHint}\\n` : \"\";\n const graphContextInstruction =\n language === \"en\"\n ? \"If GitNexus graph context is available, consult it before broad source scans and use it to narrow the files you read. If it is unavailable, continue normally.\"\n : \"如果 GitNexus 代码图上下文可用,先用它缩小源码扫描范围;不可用时按普通流程继续。\";\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: codex-adapter\nadapterVersion: 1\ncommand: ${command}\nFET:END -->\n\n---\ndescription: ${description}\n${argumentHintLine}---\n\n${renderIdeModelPolicy(policyCommand, language)}\n\n${languageInstruction(language)}\n\n${graphContextInstruction}\n\n${body}\n`;\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { ErrorCode } from \"../../errors/codes.js\";\nimport { FetError } from \"../../errors/fet-error.js\";\nimport { atomicWrite } from \"../../fs/atomic-write.js\";\nimport { createBackup } from \"../../fs/backup.js\";\nimport type { FetLanguage } from \"../../language.js\";\nimport type { DoctorCheck, ToolAdapter, ToolInstallPlan, ToolInstallResult } from \"../types.js\";\nimport { 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\\`fet fill-context\\` 可能已写入小程序包体积表与 2MB 开发约束,不要覆盖 AGENTS.md「小程序」节中的扫描结果,除非仓库结构已变。\n\n检查 README、package scripts、路由、测试、源码结构和现有约定后,把 AGENTS.md 中**其余** \\`[NEEDS LLM INPUT]\\` 或 \\`[NEED LLM INPUT]\\` 占位符替换为具体、简洁、项目相关的内容。保留 FET 托管标记,不要修改业务代码。\n`;\n }\n if (command === \"graph-setup\") {\n return `<!-- FET:MANAGED\nschemaVersion: 1\nfetVersion: ${FET_VERSION}\ngenerator: cursor-adapter\nadapterVersion: 1\ncommand: fet graph setup\nFET:END -->\n\n---\nname: fet-graph-setup\ndescription: ${language === \"en\" ? \"Guide IDE-assisted GitNexus installation with user approval\" : \"指导 IDE LLM 在用户确认下安装 GitNexus\"}\ndisable-model-invocation: false\n---\n\n${renderIdeModelPolicy(command, language)}\n\n${languageInstruction(language)}\n\n${\n language === \"en\"\n ? `Run \\`fet graph setup\\`, then read .fet/graph-setup.md and follow it as an installation playbook.\n\nYou may run read-only detection commands without extra confirmation. Before any command that downloads software, installs globally, changes PATH, writes user-level config, or modifies IDE/MCP settings, show the exact command and wait for user approval.\n\nAfter installation, verify with \\`gitnexus --version\\`, then run \\`fet graph init\\` and \\`fet graph handoff\\` when appropriate. If installation fails, summarize the failing command and next manual step.`\n : `先运行 \\`fet graph setup\\`,再阅读 .fet/graph-setup.md,并把它作为安装任务书执行。\n\n只读检测命令可以直接运行。任何会下载软件、全局安装、修改 PATH、写入用户级配置或修改 IDE/MCP 设置的命令,执行前都要展示完整命令并等待用户确认。\n\n安装后用 \\`gitnexus --version\\` 验证;合适时继续运行 \\`fet graph init\\` 和 \\`fet graph handoff\\`。如果安装失败,汇总失败命令和下一步人工处理建议。`\n}\n`;\n }\n\n 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 \"update\",\n \"list\",\n \"view\",\n \"change\",\n \"explore\",\n \"propose\",\n \"new\",\n \"continue\",\n \"ff\",\n \"apply\",\n \"verify\",\n \"sync\",\n \"archive\",\n \"bulk-archive\",\n \"onboard\",\n \"spec\",\n \"config\",\n \"schema\",\n \"validate\",\n \"show\",\n \"feedback\",\n \"completion\",\n \"status\",\n \"instructions\",\n \"templates\",\n \"schemas\"\n ];\n return known.filter((command) => new RegExp(`\\\\b${escapeRegExp(command)}\\\\b`).test(help));\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { OpenSpecChangeInspection, OpenSpecProjectInspection } from \"./types.js\";\n\nexport async function inspectOpenSpecProject(projectRoot: string): Promise<OpenSpecProjectInspection> {\n const openspecPath = join(projectRoot, \"openspec\");\n const changesPath = join(openspecPath, \"changes\");\n const legacyArchivePath = join(openspecPath, \"archive\");\n const changesArchivePath = join(changesPath, \"archive\");\n\n return {\n exists: await exists(openspecPath),\n changes: await listDirectories(changesPath, { exclude: [\"archive\"] }),\n archived: [...new Set([...(await listDirectories(legacyArchivePath)), ...(await listDirectories(changesArchivePath))])]\n };\n}\n\nexport async function inspectOpenSpecChange(\n projectRoot: string,\n changeId: string\n): Promise<OpenSpecChangeInspection> {\n const changePath = join(projectRoot, \"openspec\", \"changes\", changeId);\n const tasksPath = join(changePath, \"tasks.md\");\n const specsPath = join(changePath, \"specs\");\n\n return {\n changeId,\n exists: await exists(changePath),\n hasProposal: await exists(join(changePath, \"proposal.md\")),\n hasTasks: await exists(tasksPath),\n hasSpecs: await exists(specsPath),\n tasksPath,\n changePath\n };\n}\n\nasync function listDirectories(path: string, options: { exclude?: string[] } = {}): Promise<string[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n const excluded = new Set(options.exclude ?? []);\n return entries.filter((entry) => entry.isDirectory() && !excluded.has(entry.name)).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecIdentity } from \"../state/types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function resolveOpenSpecExecutable(): Promise<OpenSpecIdentity> {\n const executablePath = await findExecutable();\n const version = await readVersion(executablePath);\n return {\n executablePath,\n version,\n adapterVersion: 1\n };\n}\n\nasync function findExecutable(): Promise<string> {\n const command = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const { stdout } = await exec(command, [\"openspec\"]);\n const first = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .sort((left, right) => executablePreference(left) - executablePreference(right))\n .find(Boolean);\n if (first) {\n return first;\n }\n } catch {\n // Try npx below.\n }\n\n try {\n await exec(\"npx\", [\"openspec\", \"--version\"]);\n return \"npx openspec\";\n } catch {\n throw new FetError({\n code: ErrorCode.OpenSpecNotFound,\n message: \"OpenSpec CLI 未安装\",\n suggestedCommand: \"npm install -g @fission-ai/openspec\"\n });\n }\n}\n\nfunction executablePreference(path: string): number {\n if (process.platform === \"win32\" && path.toLowerCase().endsWith(\".cmd\")) {\n return 0;\n }\n return 1;\n}\n\nasync function readVersion(executablePath: string): Promise<string> {\n const command = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const args = executablePath === \"npx openspec\" ? [\"openspec\", \"--version\"] : [\"--version\"];\n try {\n const { stdout, stderr } = await exec(command, args);\n return stdout.trim() || stderr.trim() || \"unknown\";\n } catch (error) {\n throw new FetError({\n code: ErrorCode.OpenSpecUnsupportedVersion,\n message: \"无法读取 OpenSpec 版本\",\n details: { executablePath },\n cause: error\n });\n }\n}\n\nfunction exec(command: string, args: string[]) {\n return execFileAsync(command, args, { shell: process.platform === \"win32\" });\n}\n","import { spawn } from \"node:child_process\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport type { OpenSpecRunOptions, OpenSpecRunResult } from \"./types.js\";\n\nexport async function runOpenSpec(\n executablePath: string,\n command: string,\n args: string[],\n options: OpenSpecRunOptions\n): Promise<OpenSpecRunResult> {\n const spawnCommand = executablePath === \"npx openspec\" ? \"npx\" : executablePath;\n const spawnArgs = executablePath === \"npx openspec\" ? [\"openspec\", command, ...args] : [command, ...args];\n\n return new Promise((resolve, reject) => {\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n const child = spawn(spawnCommand, spawnArgs, {\n cwd: options.cwd,\n stdio: options.stdio ?? \"inherit\",\n shell: process.platform === \"win32\"\n });\n\n if (child.stdout) {\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n }\n if (child.stderr) {\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n }\n\n child.on(\"error\", (error) => {\n reject(\n new FetError({\n code: ErrorCode.OpenSpecCommandFailed,\n message: \"OpenSpec 命令启动失败\",\n details: { command, args },\n cause: error\n })\n );\n });\n\n child.on(\"close\", (exitCode, signal) => {\n resolve({\n command,\n args,\n exitCode: exitCode ?? 1,\n signal,\n stdout: stdout.length ? Buffer.concat(stdout).toString(\"utf8\") : undefined,\n stderr: stderr.length ? Buffer.concat(stderr).toString(\"utf8\") : undefined\n });\n });\n });\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { ScannedRoute } from \"./types.js\";\n\nexport async function scanRoutes(projectRoot: string): Promise<ScannedRoute[]> {\n const candidates = [\"src/routes\", \"src/pages\", \"app\", \"pages\"];\n const routes: ScannedRoute[] = [];\n\n for (const candidate of candidates) {\n const root = join(projectRoot, candidate);\n if (!(await exists(root))) {\n continue;\n }\n for (const file of await listFiles(root)) {\n if (!/\\.(tsx?|jsx?|vue|svelte)$/.test(file)) {\n continue;\n }\n routes.push({\n path: inferRoutePath(relative(root, file)),\n source: relative(projectRoot, file).split(sep).join(\"/\"),\n inferred: true,\n confidence: \"medium\"\n });\n }\n }\n\n return routes.slice(0, 100);\n}\n\nfunction inferRoutePath(relativePath: string): string {\n const normalized = relativePath.split(sep).join(\"/\");\n const withoutExt = normalized.replace(/\\.(tsx?|jsx?|vue|svelte)$/, \"\");\n const withoutIndex = withoutExt.replace(/\\/index$/, \"\").replace(/^index$/, \"\");\n return `/${withoutIndex}`.replace(/\\/+/g, \"/\");\n}\n\nasync function listFiles(root: string): Promise<string[]> {\n const entries = await readdir(root, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFiles(path)));\n } else {\n files.push(path);\n }\n }\n return files;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { detectMiniprogramProject } from \"./miniprogram.js\";\nimport { detectFramework, detectLanguage, detectPackageManager, detectWorkspaces, extractCommands, readPackageJson } from \"./package.js\";\nimport { scanRoutes } from \"./routes.js\";\nimport type { ProjectScanResult, ScanOptions } from \"./types.js\";\n\nexport class ProjectScanner {\n async scan(projectRoot: string, _options: ScanOptions = {}): Promise<ProjectScanResult> {\n const pkg = await readPackageJson(projectRoot);\n const packageManager = await detectPackageManager(projectRoot, pkg);\n const framework = detectFramework(pkg);\n const workspaces = await detectWorkspaces(projectRoot, pkg);\n const language = await detectLanguage(projectRoot, pkg);\n const miniprogram = await detectMiniprogramProject(projectRoot);\n const warnings = [...packageManager.warnings];\n if (framework.name === \"unknown\") {\n warnings.push(\"未能从 package.json 识别主要框架\");\n }\n if (miniprogram.supported) {\n warnings.push(...miniprogram.warnings);\n }\n\n return {\n generatedAt: new Date().toISOString(),\n scannerVersion: 1,\n project: {\n name: pkg?.name ?? \"unknown\",\n packageManager: packageManager.manager,\n packageManagerConfidence: packageManager.confidence,\n framework,\n language,\n monorepo: workspaces.length > 0,\n workspaces\n },\n commands: extractCommands(pkg, packageManager.manager),\n routes: await scanRoutes(projectRoot),\n conventions: [],\n skippedFiles: [],\n warnings,\n miniprogram\n };\n }\n}\n\nexport type { MiniprogramDetection, MiniprogramScanResult } from \"./miniprogram.js\";\n\nexport type {\n ProjectScanResult,\n ScanOptions,\n ScannedCommand,\n ScannedConvention,\n ScannedProjectMetadata,\n ScannedRoute,\n ScannedWorkspace,\n SkippedFile\n} from \"./types.js\";\n","import type { FetLanguage } from \"../language.js\";\nimport { FetError } from \"../errors/fet-error.js\";\n\nexport interface CommandResult {\n ok: true;\n command: string;\n summary: string;\n warnings?: string[];\n nextSteps?: string[];\n data?: unknown;\n}\n\nexport class OutputWriter {\n constructor(\n private readonly json: boolean,\n private readonly language: FetLanguage = \"zh-CN\"\n ) {}\n\n info(message: string, details?: unknown): void {\n if (!this.json) {\n process.stdout.write(`${message}${formatDetails(details)}\\n`);\n }\n }\n\n warn(message: string, details?: unknown): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: true, warning: message, details }, null, 2)}\\n`);\n return;\n }\n process.stderr.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${message}${formatDetails(details)}\\n`);\n }\n\n error(error: FetError): void {\n if (this.json) {\n process.stderr.write(`${JSON.stringify({ ok: false, error: error.toJSON() }, null, 2)}\\n`);\n return;\n }\n\n process.stderr.write(`${this.language === \"en\" ? \"FET cannot continue\" : \"FET 无法继续\"}:${error.message}\\n`);\n if (error.details !== undefined) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Details\" : \"详情\"}:\\n${formatBlock(error.details)}\\n`);\n }\n if (error.suggestedCommand) {\n process.stderr.write(`\\n${this.language === \"en\" ? \"Suggestion\" : \"建议\"}:\\n ${error.suggestedCommand}\\n`);\n }\n }\n\n result(result: CommandResult): void {\n if (this.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`${result.summary}\\n`);\n for (const warning of result.warnings ?? []) {\n process.stdout.write(`${this.language === \"en\" ? \"Warning\" : \"警告\"}:${warning}\\n`);\n }\n if (result.nextSteps?.length) {\n process.stdout.write(`\\n${this.language === \"en\" ? \"Next steps\" : \"下一步\"}:\\n`);\n for (const step of result.nextSteps) {\n process.stdout.write(` ${step}\\n`);\n }\n }\n }\n}\n\nfunction formatDetails(details: unknown): string {\n if (details === undefined) {\n return \"\";\n }\n return ` ${JSON.stringify(details)}`;\n}\n\nfunction formatBlock(details: unknown): string {\n if (typeof details === \"string\") {\n return ` ${details}`;\n }\n return JSON.stringify(details, null, 2)\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { FetCommandContext } from \"./context.js\";\nimport { ErrorCode } from \"../errors/codes.js\";\nimport { FetError } from \"../errors/fet-error.js\";\nimport {\n formatFetUpdateWarning,\n getFetUpdateCheckMode,\n rememberDismissedFetUpdate,\n resolveFetUpdateAvailability,\n shouldCheckFetUpdateForCommand,\n type FetUpdateAvailability\n} from \"../update/check.js\";\nimport { performFetUpdate } from \"../update/npm.js\";\n\nexport async function handleFetUpdateCheck(ctx: FetCommandContext): Promise<void> {\n if (!shouldCheckFetUpdateForCommand(ctx.command)) {\n return;\n }\n\n const mode = getFetUpdateCheckMode();\n if (mode === \"off\") {\n return;\n }\n\n const availability = await resolveFetUpdateAvailability(ctx.fetVersion);\n if (!availability) {\n return;\n }\n\n const warning = formatFetUpdateWarning(availability, ctx.language);\n ctx.output.warn(warning);\n\n const forceConfirm = process.env.FET_UPDATE_CHECK_FORCE_CONFIRM === \"1\";\n const interactive =\n mode === \"confirm\" && !ctx.json && !ctx.yes && (forceConfirm || (process.stdin.isTTY && process.stderr.isTTY));\n if (!interactive) {\n return;\n }\n\n const choice = await promptFetUpdateChoice(availability, ctx.language);\n if (choice === \"skip\") {\n await rememberDismissedFetUpdate(availability.latestVersion);\n return;\n }\n if (choice === \"cancel\") {\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message: ctx.language === \"en\" ? \"Command cancelled before FET update.\" : \"命令已取消,未执行 FET 升级。\",\n details: availability,\n suggestedCommand: ctx.language === \"en\" ? `fet update` : \"fet update\"\n });\n }\n\n await performFetUpdate(availability.currentVersion, availability.latestVersion, {\n cwd: ctx.cwd,\n json: ctx.json,\n language: ctx.language,\n info: (message) => ctx.output.info(message)\n });\n\n throw new FetError({\n code: ErrorCode.UserCancelled,\n message:\n ctx.language === \"en\"\n ? `FET updated to ${availability.latestVersion}. Rerun this command to use the new version.`\n : `FET 已升级到 ${availability.latestVersion}。请重新运行当前命令以使用新版本。`,\n details: availability,\n suggestedCommand: `fet ${ctx.command}`\n });\n}\n\nasync function promptFetUpdateChoice(\n availability: FetUpdateAvailability,\n language: FetCommandContext[\"language\"]\n): Promise<\"update\" | \"skip\" | \"cancel\"> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const question =\n language === \"en\"\n ? `Update FET now (${availability.currentVersion} -> ${availability.latestVersion})? [U]pdate / [S]kip / [C]ancel [s]: `\n : `是否现在升级 FET(${availability.currentVersion} -> ${availability.latestVersion})?[U]升级 / [S]跳过 / [C]取消 [s]: `;\n const answer = (await rl.question(question)).trim().toLowerCase();\n if (answer === \"u\" || answer === \"update\" || answer === \"升级\") {\n return \"update\";\n }\n if (answer === \"c\" || answer === \"cancel\" || answer === \"取消\") {\n return \"cancel\";\n }\n return \"skip\";\n } finally {\n rl.close();\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { FetLanguage } from \"../language.js\";\nimport { compareVersions, getFetPackageName, resolveLatestFetVersion } from \"./npm.js\";\n\nexport type FetUpdateCheckMode = \"off\" | \"warn\" | \"confirm\";\n\nexport interface FetUpdateAvailability {\n packageName: string;\n currentVersion: string;\n latestVersion: string;\n}\n\ninterface UpdateCheckCache {\n latestVersion: string;\n checkedAt: string;\n dismissedLatestVersion?: string;\n}\n\nconst DEFAULT_CACHE_TTL_MS = 6 * 60 * 60 * 1000;\n\nexport function getFetUpdateCheckMode(env: NodeJS.ProcessEnv = process.env): FetUpdateCheckMode {\n const value = env.FET_UPDATE_CHECK?.trim().toLowerCase();\n if (value === \"off\" || env.FET_SKIP_UPDATE_CHECK === \"1\") {\n return \"off\";\n }\n if (value === \"warn\") {\n return \"warn\";\n }\n if (value === \"confirm\") {\n return \"confirm\";\n }\n return \"confirm\";\n}\n\nexport function shouldCheckFetUpdateForCommand(command: string): boolean {\n return command !== \"update\";\n}\n\nexport async function resolveFetUpdateAvailability(currentVersion: string): Promise<FetUpdateAvailability | null> {\n const packageName = getFetPackageName();\n const cache = await readUpdateCheckCache();\n const ttlMs = Number.parseInt(process.env.FET_UPDATE_CHECK_TTL_MS ?? \"\", 10);\n const cacheTtlMs = Number.isFinite(ttlMs) && ttlMs > 0 ? ttlMs : DEFAULT_CACHE_TTL_MS;\n\n let latestVersion = cache?.latestVersion;\n const cacheFresh = cache?.checkedAt ? Date.now() - Date.parse(cache.checkedAt) < cacheTtlMs : false;\n\n if (!latestVersion || !cacheFresh) {\n try {\n latestVersion = await resolveLatestFetVersion(packageName);\n await writeUpdateCheckCache({\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: cache?.dismissedLatestVersion\n });\n } catch {\n if (cache?.latestVersion) {\n latestVersion = cache.latestVersion;\n } else {\n return null;\n }\n }\n }\n\n if (compareVersions(currentVersion, latestVersion) >= 0) {\n return null;\n }\n\n if (cache?.dismissedLatestVersion === latestVersion) {\n return null;\n }\n\n return {\n packageName,\n currentVersion,\n latestVersion\n };\n}\n\nexport async function rememberDismissedFetUpdate(latestVersion: string): Promise<void> {\n const cache = (await readUpdateCheckCache()) ?? {\n latestVersion,\n checkedAt: new Date().toISOString()\n };\n await writeUpdateCheckCache({\n ...cache,\n latestVersion,\n checkedAt: new Date().toISOString(),\n dismissedLatestVersion: latestVersion\n });\n}\n\nexport function formatFetUpdateWarning(availability: FetUpdateAvailability, language: FetLanguage): string {\n if (language === \"en\") {\n return `A newer FET release is available (${availability.currentVersion} -> ${availability.latestVersion}). Run \\`fet update\\` or choose update when prompted.`;\n }\n return `检测到 FET 有新版本(当前 ${availability.currentVersion},最新 ${availability.latestVersion})。可运行 \\`fet update\\`,或在提示时选择升级。`;\n}\n\nfunction cachePath(): string {\n const home = process.env.FET_UPDATE_CHECK_CACHE_HOME?.trim() || homedir();\n return join(home, \".fet\", \"update-check-cache.json\");\n}\n\nasync function readUpdateCheckCache(): Promise<UpdateCheckCache | null> {\n try {\n const raw = await readFile(cachePath(), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<UpdateCheckCache>;\n if (typeof parsed.latestVersion !== \"string\" || typeof parsed.checkedAt !== \"string\") {\n return null;\n }\n return {\n latestVersion: parsed.latestVersion,\n checkedAt: parsed.checkedAt,\n dismissedLatestVersion: typeof parsed.dismissedLatestVersion === \"string\" ? parsed.dismissedLatestVersion : undefined\n };\n } catch {\n return null;\n }\n}\n\nasync function writeUpdateCheckCache(cache: UpdateCheckCache): Promise<void> {\n const path = cachePath();\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(cache, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":";;;;;;;AAAA,SAAS,mBAAAA,wBAAuB;AAChC,SAAS,eAAe;;;ACDxB,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAC/B,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAGd,IAAM,iCAAiC;AAE9C,eAAsB,2BAA2B,aAAsC;AACrF,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,KAAK,aAAa,WAAW,GAAG,MAAM;AACrE,WAAO,CAAC,GAAG,QAAQ,SAAS,8BAA8B,CAAC,EAAE;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,+BAA+BC,QAAe,WAAwB,SAAiB;AACrG,MAAI,aAAa,MAAM;AACrB,WAAO,4BAA4BA,MAAK;AAAA,EAC1C;AACA,SAAO,0BAAgBA,MAAK;AAC9B;;;ACpBA,SAAS,eAAe;AACxB,SAAS,MAAM,QAAQ,aAAa;AAOpC,eAAsB,YACpB,YACA,SAC4B;AAC5B,QAAM,MAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,QAAM,WAAW,GAAG,UAAU,QAAQ,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAC/D,QAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAExC,MAAI;AACF,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,OAAO,KAAK;AAAA,EACpB,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AAEA,QAAM,OAAO,UAAU,UAAU;AACjC,SAAO,EAAE,MAAM,YAAY,SAAS;AACtC;;;ACzBA,SAAS,UAAU,YAAY;AAC/B,SAAS,UAAU,WAAAC,UAAS,QAAAC,aAAY;AAExC,eAAsB,aAAa,UAA0C;AAC3E,MAAI;AACF,UAAM,KAAK,QAAQ;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,aAAY,oBAAI,KAAK,GACxB,YAAY,EACZ,QAAQ,SAAS,EAAE,EACnB,QAAQ,SAAS,EAAE,EACnB,QAAQ,KAAK,GAAG;AACnB,QAAM,aAAaA,MAAKD,SAAQ,QAAQ,GAAG,GAAG,SAAS,QAAQ,CAAC,eAAe,SAAS,EAAE;AAC1F,QAAM,SAAS,UAAU,UAAU;AACnC,SAAO;AACT;;;AClBA,SAAS,gBAAgB;AACzB,SAAS,WAAAE,UAAS,QAAAC,aAAY;AAC9B,SAAS,SAAAC,QAAO,QAAAC,OAAM,YAAAC,WAAU,UAAU;AAmB1C,eAAsB,gBACpB,aACA,UACA,IACY;AACZ,QAAM,WAAWC,MAAK,aAAa,YAAY,WAAW;AAC1D,QAAM,OAAiB;AAAA,IACrB,KAAK,QAAQ;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,KAAK,SAAS;AAAA,IACd,SAAS,SAAS;AAAA,IAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,YAAY,SAAS;AAAA,EACvB;AAEA,MAAI;AACJ,MAAI;AACF,UAAMC,OAAMC,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,aAAS,MAAMC,MAAK,UAAU,IAAI;AAClC,UAAM,OAAO,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EACtD,QAAQ;AACN,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,MAAM,iBAAiB,QAAQ;AAAA,MACxC,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,UAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,eAAe,iBAAiB,UAAoC;AAClE,MAAI;AACF,WAAO,KAAK,MAAM,MAAMC,UAAS,UAAU,MAAM,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACF;AAEA,eAAsB,UAAU,aAAuC;AACrE,QAAM,WAAWJ,MAAK,aAAa,YAAY,WAAW;AAC1D,MAAI;AACF,UAAM,GAAG,QAAQ;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC3EA,SAAS,QAAAK,aAAY;AACrB,SAAS,YAAAC,iBAAgB;AAmBlB,SAAS,kBAAkB,YAAiC;AACjE,SAAO;AAAA,IACL,eAAe;AAAA,IACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa;AAAA,IACb;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,iBAAiB,aAAqB,SAAqC;AAC/F,QAAM;AAAA,IACJC,MAAK,aAAa,YAAY,wBAAwB;AAAA,IACtD,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA,EACrC;AACF;;;ACnCA,SAAS,gBAAgB;AACzB,SAAS,QAAAC,aAAY;AACrB,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;AAG1B,IAAM,gBAAgB,UAAU,QAAQ;AACxC,IAAM,qBAAqB;AA8C3B,eAAsB,eAAe,MAAyB,QAAQ,KAAiC;AACrG,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,UAAU,uBAAuB,GAAG;AAC1C,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,QAAQ,MAAM,CAAC,GAAG,QAAQ,MAAM,WAAW,GAAG,EAAE,OAAO,QAAQ,aAAa,QAAQ,CAAC;AACpI,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,QAAQ;AAAA,MACxB,UAAU,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,MAAM,OAAO,EAAE,CAAC,KAAK;AAAA,MAC5E;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,QAAQ;AAAA,MACxB,SAAS;AAAA,MACT;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,WAA8B,UAAgD;AAC5G,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW,UAAU;AAAA,IACrB,gBAAgB,UAAU,YAAY,UAAU,iBAAiB;AAAA,IACjE,SAAS,UAAU;AAAA,IACnB,WAAW,UAAU;AAAA,IACrB,uBAAuB,UAAU,yBAAyB;AAAA,IAC1D,WAAW,UAAU,aAAa;AAAA,IAClC,aAAa,UAAU,eAAe;AAAA,IACtC,eAAe,UAAU,iBAAiB;AAAA,IAC1C,eAAe,UAAU,iBAAiB;AAAA,IAC1C,YAAY,UAAU,cAAc;AAAA,IACpC,kBAAkB,UAAU,oBAAoB;AAAA,IAChD,uBAAuB,UAAU,yBAAyB;AAAA,IAC1D,aAAa,UAAU,eAAe;AAAA,IACtC,kBAAkB,UAAU,oBAAoB;AAAA,IAChD,oBAAoB,UAAU,sBAAsB;AAAA,IACpD,yBAAyB,UAAU,2BAA2B;AAAA,IAC9D,qBAAqB,UAAU,uBAAuB;AAAA,IACtD,0BAA0B,UAAU,4BAA4B;AAAA,IAChE,wBAAwB,UAAU,0BAA0B;AAAA,EAC9D;AACF;AAEA,eAAsB,qBAAqB,aAAqB,MAAyB,QAAQ,KAAiC;AAChI,QAAMC,YAAW,IAAI,yBAAyB,KAAK,KAAK;AACxD,QAAM,YAAYD,MAAK,aAAaC,SAAQ;AAC5C,MAAI;AACF,UAAM,OAAO,MAAMF,MAAK,SAAS;AACjC,WAAO;AAAA,MACL,WAAWE;AAAA,MACX,aAAa;AAAA,MACb,eAAe,KAAK,MAAM,YAAY;AAAA,IACxC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,WAAWA;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAsB,YAAY,MAAgB,SAA+E;AAC/H,QAAM,UAAU,uBAAuB,QAAQ,OAAO,QAAQ,GAAG;AACjE,QAAM,cAAc,CAAC,QAAQ,MAAM,GAAG,QAAQ,MAAM,GAAG,IAAI;AAC3D,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,QAAQ,MAAM,CAAC,GAAG,QAAQ,MAAM,GAAG,IAAI,GAAG;AAAA,MACvF,KAAK,QAAQ;AAAA,MACb,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AACD,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ;AACd,WAAO;AAAA,MACL,UAAU,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,MACxD,QAAQ,MAAM,UAAU;AAAA,MACxB,QAAQ,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9E,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,OAAsBC,QAAyC;AACpG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAWA,OAAM;AAAA,IACjB,aAAaA,OAAM;AAAA,IACnB,eAAeA,OAAM;AAAA,EACvB;AACF;AAEO,SAAS,6BAA6B,OAAsB,WAAwB,SAAiB;AAC1G,MAAI,aAAa,MAAM;AACrB,QAAI,MAAM,WAAW;AACnB,aAAO,+BAA+B,MAAM,WAAW,SAAS;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW;AACnB,WAAO,gDAAkB,MAAM,WAAW,SAAS;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAyE;AACvG,QAAM,MAAM,IAAI,sBAAsB,KAAK,KAAK,IAAI,yBAAyB,KAAK,KAAK;AACvF,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,CAAC,OAAO,YAAY,GAAG,IAAI,IAAI;AACrC,QAAM,eAAe,QAAQ,aAAa,WAAW,QAAQ,aAAa,iBAAiB;AAC3F,SAAO,EAAE,MAAM,cAAc,MAAM,OAAO,IAAI;AAChD;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,UAAU,MAAM,MAAM,sBAAsB;AAClD,UAAQ,SAAS,SAAS,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,QAAQ,gBAAgB,EAAE,CAAC;AAC7F;;;AN1KA,eAAsB,cAAc,KAAwB,UAAiC,CAAC,GAAkB;AAC9G,QAAM,SAAwB,CAAC;AAE/B,SAAO,KAAK,MAAM,cAAc,GAAG,CAAC;AACpC,SAAO,KAAK,MAAM,WAAW,GAAG,CAAC;AACjC,SAAO,KAAK,MAAM,UAAU,UAAUC,MAAK,IAAI,aAAa,WAAW,GAAG,0BAAgB,oBAAoB,CAAC;AAC/G,SAAO,KAAK,MAAM,UAAU,UAAUA,MAAK,IAAI,aAAa,YAAY,aAAa,GAAG,qCAA2B,UAAU,CAAC;AAE9H,SAAO,KAAK,MAAM,kBAAkB,GAAG,CAAC;AACxC,SAAO,KAAK,MAAM,cAAc,GAAG,CAAC;AAEpC,aAAW,WAAW,IAAI,cAAc;AACtC,WAAO,KAAK,GAAI,MAAM,QAAQ,OAAO,IAAI,WAAW,CAAE;AAAA,EACxD;AAEA,QAAM,WAAWA,MAAK,IAAI,aAAa,YAAY,WAAW;AAC9D,MAAI,MAAM,OAAO,QAAQ,GAAG;AAC1B,QAAI,QAAQ,SAAS;AACnB,YAAM,UAAU,IAAI,WAAW;AAC/B,aAAO,KAAK,EAAE,IAAI,QAAQ,QAAQ,QAAQ,SAAS,wCAAyB,CAAC;AAAA,IAC/E,OAAO;AACL,aAAO,KAAK,EAAE,IAAI,QAAQ,QAAQ,QAAQ,SAAS,mCAAyB,kBAAkB,wBAAwB,CAAC;AAAA,IACzH;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO;AAC/F,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,SAAS,SAAS,8CAAW,SAAS,MAAM,4DAAe;AAAA,IACpE;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAe,cAAc,KAA8C;AACzE,QAAM,SAAS,MAAM,IAAI,WAAW,WAAW;AAC/C,QAAM,QAAQ;AAAA,IACZ,gBAAgB,MAAM,eAAe,GAAG,QAAQ,OAAO,QAAQ;AAAA,IAC/D,MAAM,qBAAqB,IAAI,WAAW;AAAA,EAC5C;AACA,MAAI,QAAQ;AACV,WAAO,UAAU,CAAC;AAClB,WAAO,MAAM,WAAW;AACxB,UAAM,IAAI,WAAW,YAAY,MAAM;AAAA,EACzC;AAEA,SAAO,MAAM,YACT;AAAA,IACE,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SACE,IAAI,aAAa,OACb,sBAAsB,MAAM,kBAAkB,UAAU,KAAK,MAAM,WAAW,SAAS,YAAY,MAAM,cAAc,UAAU,WAAW,KAC5I,oCAAgB,MAAM,kBAAkB,UAAU,SAAI,MAAM,WAAW,SAAS,iCAAQ,MAAM,cAAc,uBAAQ,oBAAK;AAAA,EACjI,IACA;AAAA,IACE,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,IAAI,aAAa,OAAO,0DAA0D;AAAA,IAC3F,kBACE,IAAI,aAAa,OACb,uFACA;AAAA,EACR;AACN;AAEA,eAAe,cAAc,KAA8C;AACzE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,SAAS,kBAAkB;AACtD,WAAO,EAAE,IAAI,YAAY,QAAQ,QAAQ,SAAS,aAAa,SAAS,cAAc,KAAK,SAAS,OAAO,IAAI;AAAA,EACjH,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,YAAY,QAAQ,QAAQ,SAAS,iBAAiB,QAAQ,MAAM,UAAU,oCAAgB;AAAA,EAC7G;AACF;AAEA,eAAe,WAAW,KAA8C;AACtE,MAAI;AACF,UAAM,QAAQ,MAAM,IAAI,WAAW,WAAW;AAC9C,WAAO,QACH,EAAE,IAAI,SAAS,QAAQ,QAAQ,SAAS,iDAAc,IACtD,EAAE,IAAI,SAAS,QAAQ,QAAQ,SAAS,8DAAiB,kBAAkB,WAAW;AAAA,EAC5F,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,SAAS,iBAAiB,QAAQ,MAAM,UAAU,2CAAa;AAAA,EACvG;AACF;AAEA,eAAe,UAAU,IAAY,MAAc,SAAiB,kBAAgD;AAClH,SAAQ,MAAM,OAAO,IAAI,IACrB,EAAE,IAAI,QAAQ,QAAQ,SAAS,GAAG,EAAE,gBAAM,IAC1C,EAAE,IAAI,QAAQ,QAAQ,SAAS,SAAS,iBAAiB;AAC/D;AAEA,eAAe,kBAAkB,KAA8C;AAC7E,MAAI;AACF,UAAMC,UAASD,MAAK,IAAI,aAAa,WAAW,GAAG,MAAM;AACzD,UAAME,SAAQ,MAAM,2BAA2B,IAAI,WAAW;AAC9D,WAAOA,SACH;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,IAAI,aAAa,OAAO,iBAAiBA,MAAK,wBAAwB,0BAAgBA,MAAK;AAAA,MACpG,kBAAkB;AAAA,IACpB,IACA;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,IAAI,aAAa,OAAO,oCAAoC;AAAA,IACvE;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,IAAI,aAAa,OAAO,sBAAsB;AAAA,MACvD,kBAAkB;AAAA,IACpB;AAAA,EACF;AACF;AAEA,eAAe,OAAO,MAAgC;AACpD,MAAI;AACF,UAAMC,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AOtIA,SAAS,SAAAC,cAAa;AACtB,SAAS,WAAAC,UAAS,QAAAC,cAAY;;;ACD9B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,SAAS,YAAAC,WAAU,QAAAC,aAAY;AACxC,SAAS,QAAAC,OAAM,gBAAgB;;;ACD/B,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAa;AAYtB,eAAsB,gBAAgB,aAAkD;AACtF,MAAI;AACF,WAAO,KAAK,MAAM,MAAMF,UAASE,MAAK,aAAa,cAAc,GAAG,MAAM,CAAC;AAAA,EAC7E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,qBAAqB,aAAqB,KAA2D;AACzH,QAAM,WAAqB,CAAC;AAC5B,MAAI,KAAK,gBAAgB;AACvB,UAAM,WAAW,IAAI,eAAe,MAAM,GAAG,EAAE,CAAC,KAAK;AACrD,UAAMC,SAAQ,MAAM,mBAAmB,WAAW;AAClD,UAAM,cAAcA,OAAM,OAAO,CAAC,SAAS,SAAS,QAAQ;AAC5D,QAAI,YAAY,QAAQ;AACtB,eAAS,KAAK,qCAAsB,QAAQ,+DAAa,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IACnF;AACA,WAAO,EAAE,SAAS,UAAU,YAAY,QAAQ,SAAS;AAAA,EAC3D;AAEA,QAAM,QAAQ,MAAM,mBAAmB,WAAW;AAClD,MAAI,MAAM,SAAS,GAAG;AACpB,aAAS,KAAK,2EAAe,MAAM,KAAK,IAAI,CAAC,kCAAS,MAAM,CAAC,CAAC,EAAE;AAChE,WAAO,EAAE,SAAS,MAAM,CAAC,KAAK,OAAO,YAAY,UAAU,SAAS;AAAA,EACtE;AACA,MAAI,MAAM,CAAC,GAAG;AACZ,WAAO,EAAE,SAAS,MAAM,CAAC,GAAG,YAAY,QAAQ,SAAS;AAAA,EAC3D;AACA,SAAO,EAAE,SAAS,OAAO,YAAY,OAAO,SAAS;AACvD;AAEO,SAAS,gBAAgB,KAAyB,gBAAwD;AAC/G,QAAM,UAAU,KAAK,WAAW,CAAC;AACjC,QAAM,SAAyC,CAAC;AAChD,QAAM,cAAc,CAAC,OAAO,SAAS,QAAQ,aAAa,SAAS,QAAQ,WAAW;AAEtF,aAAW,QAAQ,aAAa;AAC9B,QAAI,QAAQ,IAAI,GAAG;AACjB,YAAM,YAAY,SAAS,UAAU,cAAc,SAAS,cAAc,SAAS;AACnF,UAAI,OAAO,SAAS,GAAG;AACrB;AAAA,MACF;AACA,aAAO,SAAS,IAAI;AAAA,QAClB,SAAS,cAAc,gBAAgB,IAAI;AAAA,QAC3C,QAAQ,wBAAwB,IAAI;AAAA,QACpC,UAAU,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,KAAqG;AACnI,QAAM,OAAO,EAAE,GAAI,KAAK,gBAAgB,CAAC,GAAI,GAAI,KAAK,mBAAmB,CAAC,EAAG;AAC7E,QAAM,aAAwC;AAAA,IAC5C,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAA,IACjB,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAA,IACjB,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAA,IACjB,CAAC,aAAa,CAAC,eAAe,CAAC;AAAA,IAC/B,CAAC,WAAW,CAAC,iBAAiB,cAAc,CAAC;AAAA,IAC7C,CAAC,SAAS,CAAC,OAAO,CAAC;AAAA,IACnB,CAAC,OAAO,CAAC,KAAK,CAAC;AAAA,IACf,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAA,EACvB;AACA,aAAW,CAAC,WAAW,QAAQ,KAAK,YAAY;AAC9C,QAAI,SAAS,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG;AACvC,aAAO,EAAE,MAAM,WAAW,YAAY,QAAQ,SAAS,CAAC,cAAc,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,SAAO,EAAE,MAAM,WAAW,YAAY,OAAO,SAAS,CAAC,EAAE;AAC3D;AAEA,eAAsB,eAAe,aAAqB,KAA0C;AAClG,QAAM,OAAO,EAAE,GAAI,KAAK,gBAAgB,CAAC,GAAI,GAAI,KAAK,mBAAmB,CAAC,EAAG;AAC7E,MAAI,KAAK,cAAe,MAAMC,QAAOF,MAAK,aAAa,eAAe,CAAC,GAAI;AACzE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,iBAAiB,aAAqB,KAAsD;AAChH,QAAM,oBAAoB,oBAAoB,KAAK,UAAU,EAAE,IAAI,CAAC,UAAU;AAAA,IAC5E,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,EACV,EAAE;AACF,MAAI,kBAAkB,QAAQ;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,MAAM,MAAMF,UAASE,MAAK,aAAa,qBAAqB,GAAG,MAAM,CAAC;AACxF,YAAQ,WAAW,YAAY,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,MAChD,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,mBAAmB,aAAwC;AACxE,QAAM,YAAqC;AAAA,IACzC,CAAC,kBAAkB,MAAM;AAAA,IACzB,CAAC,aAAa,MAAM;AAAA,IACpB,CAAC,aAAa,KAAK;AAAA,IACnB,CAAC,YAAY,KAAK;AAAA,IAClB,CAAC,qBAAqB,KAAK;AAAA,EAC7B;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,OAAO,KAAK,WAAW;AACvC,QAAI,MAAME,QAAOF,MAAK,aAAa,IAAI,CAAC,GAAG;AACzC,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,YAAiD;AAC5E,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,YAAY,YAAY,CAAC;AAClC;AAEA,SAAS,cAAc,gBAAwB,MAAsB;AACnE,SAAO,mBAAmB,QAAQ,WAAW,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI;AACjF;AAEA,eAAeE,QAAO,MAAgC;AACpD,MAAI;AACF,UAAMH,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD1JA,IAAM,2BAA2B,IAAI,OAAO;AAC5C,IAAM,yBAAyB,IAAI,OAAO;AAC1C,IAAM,oBAAoB,KAAK,OAAO;AACtC,IAAM,mBAAmB,KAAK,MAAM,MAAM,OAAO,IAAI;AAqCrD,eAAsB,yBAAyB,aAAoD;AACjG,QAAM,MAAM,MAAM,gBAAgB,WAAW;AAC7C,QAAM,WAAW,MAAM,gBAAgB,aAAa,GAAG;AACvD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AAEA,QAAM,cAAc,MAAM,mBAAmB,aAAa,QAAQ;AAClE,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AAEA,QAAM,kBAAkB,kBAAkB,WAAW;AACrD,QAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AAEA,QAAM,cAAc,QAAQ,eAAe,QAAQ,eAAe,CAAC;AACnE,QAAM,WAAW,YAAY,IAAI,CAAC,SAAS,kBAAkB,KAAK,QAAQ,EAAE,CAAC,EAAE,OAAO,OAAO;AAC7F,QAAM,gBAAgB,QAAQ,SAAS,CAAC;AAExC,QAAM,WAAW,YAAY,cAAc,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC;AACvF,QAAM,WAAW,MAAM,SAAS,iBAAiB,UAAU,QAAQ;AACnE,QAAM,cAAiC;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,YAAY,QAAQ;AAAA,IAC/B,YAAY;AAAA,IACZ,QAAQ,WAAW,UAAU,wBAAwB;AAAA,IACrD,WAAW;AAAA,EACb;AAEA,QAAM,oBAAyC,CAAC;AAChD,aAAW,OAAO,aAAa;AAC7B,UAAM,OAAO,kBAAkB,IAAI,QAAQ,EAAE;AAC7C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,OAAO,MAAM,cAAcI,MAAK,iBAAiB,IAAI,CAAC;AAC5D,sBAAkB,KAAK;AAAA,MACrB,MAAM,IAAI,QAAQ,KAAK,QAAQ,OAAO,EAAE;AAAA,MACxC;AAAA,MACA,WAAW;AAAA,MACX,WAAW,YAAY,IAAI;AAAA,MAC3B,YAAY;AAAA,MACZ,QAAQ,WAAW,MAAM,sBAAsB;AAAA,MAC/C,WAAW,IAAI,SAAS,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,YAAY,YAAY,kBAAkB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,WAAW,CAAC;AAC9G,QAAM,WAAqB,CAAC;AAC5B,MAAI,kBAAkB,kBAAkB;AACtC,aAAS;AAAA,MACP,kBAAkB,oBACd,iKACA;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU,SAAS;AAAA,IACnB,eAAe,SAAS;AAAA,IACxB,aAAa,SAAS;AAAA,IACtB,aAAa,SAAS,aAAa,WAAW,EAAE,QAAQ,OAAO,GAAG;AAAA,IAClE,iBAAiB,SAAS,aAAa,eAAe,EAAE,QAAQ,OAAO,GAAG,KAAK;AAAA,IAC/E;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,gBACb,aACA,KACiF;AACjF,QAAM,OAAO,EAAE,GAAI,KAAK,gBAAgB,CAAC,GAAI,GAAI,KAAK,mBAAmB,CAAC,EAAG;AAE7E,MAAI,MAAMC,QAAOD,MAAK,aAAa,qBAAqB,CAAC,GAAG;AAC1D,WAAO,EAAE,IAAI,UAAU,OAAO,kCAAS,aAAa,wEAAiB;AAAA,EACvE;AACA,MAAI,KAAK,cAAc,KAAK,KAAK,aAAa,KAAM,MAAMC,QAAOD,MAAK,aAAa,UAAU,UAAU,CAAC,GAAI;AAC1G,WAAO,EAAE,IAAI,QAAQ,OAAO,oEAAkB,aAAa,sCAAa;AAAA,EAC1E;AACA,MAAK,MAAMC,QAAOD,MAAK,aAAa,eAAe,CAAC,KAAO,MAAMC,QAAOD,MAAK,aAAa,YAAY,CAAC,GAAI;AACzG,WAAO,EAAE,IAAI,WAAW,OAAO,uEAAqB,aAAa,yCAAgB;AAAA,EACnF;AACA,MAAI,MAAMC,QAAOD,MAAK,aAAa,UAAU,CAAC,GAAG;AAC/C,WAAO,EAAE,IAAI,UAAU,OAAO,kCAAS,aAAa,+CAAiB;AAAA,EACvE;AACA,MAAI,MAAMC,QAAOD,MAAK,aAAa,eAAe,UAAU,CAAC,GAAG;AAC9D,WAAO,EAAE,IAAI,UAAU,OAAO,kCAAS,aAAa,+DAAuB;AAAA,EAC7E;AACA,MAAI,KAAK,yBAAyB,GAAG;AACnC,WAAO,EAAE,IAAI,UAAU,OAAO,kCAAS,aAAa,wDAAgB;AAAA,EACtE;AACA,SAAO;AACT;AAEA,eAAe,mBAAmB,aAAqB,UAA+D;AACpH,QAAM,aAAuB,CAAC;AAC9B,MAAI,SAAS,OAAO,UAAU;AAC5B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,MAAME,UAASF,MAAK,aAAa,qBAAqB,GAAG,MAAM,CAAC;AAG1F,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,KAAKA,MAAK,aAAa,OAAO,iBAAiB,UAAU,CAAC;AAAA,MACvE;AAAA,IACF,QAAQ;AAAA,IAER;AACA,eAAW,KAAKA,MAAK,aAAa,UAAU,GAAGA,MAAK,aAAa,eAAe,UAAU,CAAC;AAAA,EAC7F,OAAO;AACL,eAAW;AAAA,MACTA,MAAK,aAAa,OAAO,UAAU;AAAA,MACnCA,MAAK,aAAa,UAAU;AAAA,MAC5BA,MAAK,aAAa,eAAe,UAAU;AAAA,MAC3CA,MAAK,aAAa,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,MAAMC,QAAO,SAAS,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,YAAY,MAAuC;AAChE,MAAI;AACF,WAAO,KAAK,MAAM,MAAMC,UAAS,MAAM,MAAM,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,SAAS,SAAiB,MAAgB,eAA0C;AACjG,MAAI,QAAQ;AACZ,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,OAAO,MAAM;AACtB,UAAM,MAAMF,MAAK,SAAS,GAAG;AAC7B,QAAI,QAAQ,IAAI,GAAG,GAAG;AACpB;AAAA,IACF;AACA,YAAQ,IAAI,GAAG;AACf,aAAS,MAAM,cAAc,GAAG;AAAA,EAClC;AAEA,QAAM,YAAY,MAAM,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAChE,aAAW,SAAS,WAAW;AAC7B,QAAI,CAAC,MAAM,OAAO,GAAG;AACnB;AAAA,IACF;AACA,QAAI,eAAe,MAAM,IAAI,GAAG;AAC9B;AAAA,IACF;AACA,cAAU,MAAMG,MAAKH,MAAK,SAAS,MAAM,IAAI,CAAC,GAAG;AAAA,EACnD;AAEA,aAAW,SAAS,WAAW;AAC7B,QAAI,CAAC,MAAM,YAAY,KAAK,eAAe,MAAM,IAAI,GAAG;AACtD;AAAA,IACF;AACA,UAAM,MAAM,GAAG,MAAM,IAAI;AACzB,QAAI,KAAK,KAAK,CAAC,QAAQ,QAAQ,MAAM,QAAQ,IAAI,WAAW,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG;AAC9E;AAAA,IACF;AACA,QAAI,cAAc,KAAK,CAAC,SAAS,SAAS,MAAM,QAAQ,KAAK,WAAW,GAAG,MAAM,IAAI,GAAG,KAAK,IAAI,WAAW,IAAI,CAAC,GAAG;AAClH;AAAA,IACF;AACA,aAAS,MAAM,cAAcA,MAAK,SAAS,MAAM,IAAI,CAAC;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,eAAe,cAAc,YAAqC;AAChE,MAAI;AACF,UAAM,OAAO,MAAMG,MAAK,UAAU;AAClC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,aAAO,KAAK;AAAA,IACd;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,QAAM,QAAQ,CAAC,UAAU;AACzB,SAAO,MAAM,QAAQ;AACnB,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC1D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,eAAe,MAAM,IAAI,GAAG;AAC9B;AAAA,MACF;AACA,YAAM,OAAOH,MAAK,SAAS,MAAM,IAAI;AACrC,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,IAAI;AAAA,MACjB,WAAW,MAAM,OAAO,GAAG;AACzB,YAAI;AACF,oBAAU,MAAMG,MAAK,IAAI,GAAG;AAAA,QAC9B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,UAA0B;AACzC,QAAM,aAAa,SAAS,QAAQ,OAAO,EAAE;AAC7C,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO,MAAM,CAAC,KAAK;AAAA,EACrB;AACA,SAAO,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACpC;AAEA,SAAS,WAAW,WAAmB,YAAuC;AAC5E,MAAI,aAAa,YAAY;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,SAAS,OAAO,MAAM;AACxB,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC9C;AACA,MAAI,SAAS,MAAM;AACjB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,GAAG,KAAK;AACjB;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,GAAG;AACpD;AAEA,SAAS,YAAY,OAA2B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC;AAC3C;AAEA,SAAS,eAAe,MAAuB;AAC7C,SAAO,SAAS,kBAAkB,SAAS,UAAU,SAAS,qBAAqB,KAAK,WAAW,GAAG;AACxG;AAEA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG;AACpD,QAAM,IAAI;AACV,SAAO,MAAM,KAAK,GAAG,KAAK;AAC5B;AAEA,eAAeF,QAAO,MAAgC;AACpD,MAAI;AACF,UAAME,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AEhUA,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAEf,SAAS,oCAAoC,UAA+B;AACjF,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYT;AAEO,SAAS,+BAA+B,MAA6B,UAA+B;AACzG,MAAI,aAAa,MAAM;AACrB,WAAO,iCAAiC,IAAI;AAAA,EAC9C;AACA,SAAO,iCAAiC,IAAI;AAC9C;AAEA,SAAS,iCAAiC,MAAqC;AAC7E,QAAM,YAAY,kBAAkB,IAAI;AACxC,QAAM,QAAQ,wBAAwB,IAAI;AAC1C,QAAM,WAAW,KAAK,SAAS,SAAS;AAAA;AAAA,gCAAY,KAAK,SAAS,KAAK,QAAG,CAAC,KAAK;AAEhF,SAAO;AAAA;AAAA,sBAEF,KAAK,aAAa;AAAA,kCAChB,KAAK,WAAW;AAAA,wBAChB,KAAK,WAAW,gCAAY,KAAK,eAAe;AAAA;AAAA;AAAA;AAAA,EAIvD,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,KAAK,GAAG,QAAQ;AAClB;AAEA,SAAS,iCAAiC,MAAqC;AAC7E,QAAM,YAAY,kBAAkB,IAAI;AACxC,QAAM,QAAQ,wBAAwB,IAAI;AAC1C,QAAM,WAAW,KAAK,SAAS,SAAS;AAAA;AAAA,cAAmB,KAAK,SAAS,KAAK,IAAI,CAAC,KAAK;AAExF,SAAO;AAAA;AAAA,cAEK,KAAK,aAAa;AAAA,kBACd,KAAK,WAAW;AAAA,cACpB,KAAK,WAAW,cAAc,KAAK,eAAe;AAAA;AAAA;AAAA;AAAA,EAI9D,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,KAAK,GAAG,QAAQ;AAClB;AAEA,SAAS,kBAAkB,MAAqC;AAC9D,QAAM,OAAO;AAAA,IACX,mBAAmB,gBAAM,KAAK,WAAW;AAAA,IACzC,GAAG,KAAK,YAAY,IAAI,CAAC,SAAS,mBAAmB,gBAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,EAC/E;AACA,OAAK,KAAK,iEAAoBC,aAAY,KAAK,cAAc,CAAC,aAAQ,cAAc,sBAAY;AAEhG,SAAO;AAAA;AAAA,EAEP,KAAK,KAAK,IAAI,CAAC;AACjB;AAEA,SAAS,kBAAkB,MAAqC;AAC9D,QAAM,OAAO;AAAA,IACX,mBAAmB,QAAQ,KAAK,WAAW;AAAA,IAC3C,GAAG,KAAK,YAAY,IAAI,CAAC,SAAS,mBAAmB,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,EACvF;AACA,OAAK,KAAK,wCAAmCA,aAAY,KAAK,cAAc,CAAC,aAAQ,cAAc,mBAAmB;AAEtH,SAAO;AAAA;AAAA,EAEP,KAAK,KAAK,IAAI,CAAC;AACjB;AAEA,SAAS,mBAAmB,OAAe,KAAmD;AAC5F,SAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,QAAQ,IAAI,SAAS,aAAQ,IAAI,cAAc,OAAO,KAAK,SAAS,cAAc,IAAI,MAAM,CAAC;AAChI;AAEA,SAAS,mBAAmB,OAAe,KAAmD;AAC5F,SAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,QAAQ,IAAI,SAAS,aAAQ,IAAI,cAAc,OAAO,KAAK,SAAS,cAAc,IAAI,MAAM,CAAC;AAChI;AAEA,SAAS,wBAAwB,MAAqC;AACpE,QAAM,UAAU,uBAAuB,IAAI;AAC3C,QAAM,QAAQ;AAAA,IACZ,uIAA8B,aAAa,+CAAiB,YAAY,mCAAe,cAAc;AAAA,IACrG,iFAAqB,aAAa;AAAA,IAClC,2BAAY,aAAa,2CAAa,YAAY;AAAA,IAClD;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,QAAQ;AACvB,UAAM;AAAA,MACJ,uDAAe,aAAa,qFAAoB,QAAQ,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,EAAE,KAAK,QAAG,CAAC;AAAA,IACrG;AAAA,EACF;AACA,MAAI,QAAQ,KAAK,QAAQ;AACvB,UAAM,KAAK,uFAAsB,QAAQ,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,EAAE,KAAK,QAAG,CAAC,QAAG;AAAA,EACzF;AACA,MAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,KAAK,QAAQ;AAChD,UAAM,KAAK,wOAA+C;AAAA,EAC5D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,wBAAwB,MAAqC;AACpE,QAAM,UAAU,uBAAuB,IAAI;AAC3C,QAAM,QAAQ;AAAA,IACZ,iDAA4C,aAAa,kCAA6B,YAAY,qCAAgC,cAAc;AAAA,IAChJ,gCAA2B,aAAa;AAAA,IACxC,8BAAyB,aAAa,uBAAkB,YAAY;AAAA,IACpE;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,QAAQ;AACvB,UAAM,KAAK,yBAAoB,aAAa,0CAA0C,QAAQ,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EAC/I;AACA,MAAI,QAAQ,KAAK,QAAQ;AACvB,UAAM,KAAK,iDAAiD,QAAQ,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACrH;AACA,MAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,KAAK,QAAQ;AAChD,UAAM,KAAK,uFAAuF;AAAA,EACpG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,uBAAuB,MAAiE;AAC/F,QAAM,OAAiB,CAAC;AACxB,QAAM,OAAiB,CAAC;AACxB,QAAM,MAAM,CAAC,KAAK,aAAa,GAAG,KAAK,WAAW;AAClD,aAAW,OAAO,KAAK;AACrB,UAAM,QAAQ,IAAI,SAAS,SAAS,gBAAM,IAAI,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI;AAC/E,QAAI,IAAI,WAAW,cAAc;AAC/B,WAAK,KAAK,KAAK;AAAA,IACjB,WAAW,IAAI,WAAW,cAAc;AACtC,WAAK,KAAK,KAAK;AAAA,IACjB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,KAAK;AACtB;AAEA,SAAS,cAAc,QAAgE;AACrF,MAAI,WAAW,cAAc;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,WAAW,cAAc;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAgE;AACrF,MAAI,WAAW,cAAc;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,WAAW,cAAc;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASA,aAAY,OAAuB;AAC1C,MAAI,SAAS,OAAO,MAAM;AACxB,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC9C;AACA,MAAI,SAAS,MAAM;AACjB,WAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,GAAG,KAAK;AACjB;AAEO,SAAS,sCAAsC,UAA+B;AACnF,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA;AAAA;AAAA,EAGT;AACA,SAAO;AAAA;AAAA;AAGT;AAEO,SAAS,8BAA8B,SAAiB,iBAAyB,UAA+B;AACrH,QAAM,UAAU,aAAa,OAAO,oBAAoB;AACxD,QAAM,YAAY;AAClB,QAAM,UAAU;AAChB,QAAM,QAAQ,QAAQ,QAAQ,SAAS;AACvC,QAAM,MAAM,QAAQ,QAAQ,OAAO;AACnC,MAAI,UAAU,MAAM,QAAQ,MAAM,MAAM,OAAO;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,MAAM,OAAO,GAAG;AACrC,QAAM,eAAe,KAAK,QAAQ,OAAO;AACzC,MAAI,iBAAiB,IAAI;AACvB,UAAM,YAAY;AAAA;AAAA,EAAO,eAAe;AAAA;AACxC,WAAO,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ,MAAM,GAAG,CAAC;AAAA,EAClE;AAEA,QAAM,eAAe,KAAK,MAAM,eAAe,QAAQ,MAAM;AAC7D,QAAM,cAAc,aAAa,OAAO,OAAO;AAC/C,QAAM,aAAa,gBAAgB,KAAK,KAAK,SAAS,eAAe,QAAQ,SAAS;AACtF,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,cAAc,QAAQ;AAC5B,SAAO,GAAG,QAAQ,MAAM,GAAG,aAAa,CAAC,GAAG,eAAe,GAAG,QAAQ,MAAM,WAAW,CAAC;AAC1F;;;AHvOA,eAAsB,8BAA8B,aAAqB,UAA8D;AACrI,QAAM,aAAaC,MAAK,aAAa,WAAW;AAChD,QAAM,YAAY,MAAM,yBAAyB,WAAW;AAC5D,MAAI;AACJ,MAAI;AACF,eAAW,MAAMC,UAAS,YAAY,MAAM;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,aAAa,OAAO,6BAA6B;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,YACtB,+BAA+B,WAAW,QAAQ,IAClD,sCAAsC,QAAQ;AAClD,QAAM,OAAO,8BAA8B,UAAU,SAAS,QAAQ;AACtE,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,aAAa,OAAO,kDAAkD;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI,CAAC,UAAU,WAAW;AACxB,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,aAAa,OAAO,mDAAmD;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,UAAU,aAAa,GAAG,UAAU,WAAW,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,IAAI;AAClG,QAAM,UACJ,aAAa,OACT,KAAK,SACH,+CAA+C,KAAK,MAAM,qCAC1D,uEACF,KAAK,SACH,oEAAuB,KAAK,MAAM,oFAClC;AAER,SAAO,EAAE,SAAS,MAAM,WAAW,QAAQ;AAC7C;;;ADtDA,eAAsB,mBAAmB,KAAuC;AAC9E,MAAI;AACJ,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,gBAAgB,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACxH,UAAM,oBAAoB,MAAM,8BAA8B,IAAI,aAAa,IAAI,QAAQ;AAC3F,yBAAqB,kBAAkB;AAEvC,UAAM,cAAcC,OAAK,IAAI,aAAa,QAAQ,iBAAiB;AACnE,UAAMC,OAAMC,SAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,YAAY,aAAa,qBAAqB,IAAI,UAAU,kBAAkB,UAAU,SAAS,CAAC;AAExG,eAAW,WAAW,IAAI,cAAc;AACtC,YAAM,OAAO,MAAM,QAAQ,YAAY,IAAI,aAAa,IAAI,QAAQ;AACpE,YAAM,SAAS,MAAM,QAAQ,QAAQ,IAAI,aAAa,MAAM,IAAI,GAAG;AACnE,YAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,YAAM,aAAa,QAAQ,IAAI,IAAI;AAAA,QACjC,gBAAgB,QAAQ;AAAA,QACxB,WAAW;AAAA,QACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,YAAM,IAAI,WAAW,YAAY,KAAK;AACtC,UAAI,IAAI,SAAS;AACf,YAAI,OAAO,KAAK,IAAI,aAAa,OAAO,WAAW,QAAQ,IAAI,aAAa,sBAAO,QAAQ,IAAI,uBAAQ,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,MACpI;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,2BAA2B,IAAI,WAAW;AACrE,QAAM,WAAW,qBAAqB,CAAC,kBAAkB,IAAI;AAC7D,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,eACE,SAAS,YAAY,iEACrB,mFACF,eACE,gBAAM,YAAY,mHAClB;AAAA,IACR;AAAA,IACA,WACE,IAAI,aAAa,OACb,eACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA,CAAC,kDAAkD,IACrD,eACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA,CAAC,gFAAyB;AAAA,IAClC,MAAM;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,UAAuB,qBAAsC;AACzF,QAAM,oBAAoB,sBACtB,kNACA;AACJ,QAAM,oBAAoB,sBACtB,sUACA;AAEJ,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAYN,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAYJ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAMtB;;;AKxHA,SAAS,SAAAC,cAAa;AACtB,SAAS,WAAAC,UAAS,QAAAC,cAAY;;;ACD9B,SAAS,SAAAC,QAAO,WAAAC,UAAS,YAAAC,iBAAgB;AACzC,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAY9B,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AASzB,eAAsB,yBACpB,KACA,OACA,SAC6B;AAC7B,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC,oFAAoF;AAAA,IACjG;AAAA,EACF;AAEA,QAAM,QAAQ;AACd,QAAM,OAAO;AACb,QAAM,aAAa,MAAM,YAAY,CAAC,SAAS,OAAO,UAAU,MAAM,WAAW,GAAG,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC;AAC/G,QAAM,SAAS,MAAM,YAAY,CAAC,QAAQ,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC;AACrE,QAAM,WAAW,gBAAgB,CAAC,CAAC,kBAAkB,UAAU,GAAG,CAAC,mBAAmB,MAAM,CAAC,CAAC;AAC9F,QAAM,eAAe;AAErB,QAAM;AAAA,IACJC,OAAK,IAAI,aAAa,YAAY;AAAA,IAClC,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,YAAY,MAAM;AAAA,MAC1B,aAAa,YAAY,UAAU;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,0BACpB,KACA,SAC6B;AAC7B,QAAM,WAAW,MAAM,IAAI,WAAW,kBAAkB;AACxD,MAAI,CAAC,SAAS,OAAO,UAAU,aAAa;AAC1C,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,qBAAqB,GAAG;AAC5C,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,uBAAuB,IAAI,aAAa,QAAQ,QAAQ;AACpF,QAAM,QAAQ,mBAAmB,SAAS,aAAa;AACvD,QAAM,OAAO,aAAa,QAAQ,OAAO;AACzC,QAAM,aAAa,MAAM,YAAY,CAAC,SAAS,OAAO,UAAU,MAAM,WAAW,GAAG,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC;AAC/G,QAAM,gBAAgB,oBAAoB,QAAQ,OAAO,IACrD,MAAM,YAAY,CAAC,kBAAkB,WAAW,KAAK,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC,IAChF;AACJ,QAAM,WAAW,gBAAgB;AAAA,IAC/B,CAAC,kBAAkB,UAAU;AAAA,IAC7B,GAAI,gBAAiB,CAAC,CAAC,2BAA2B,aAAa,CAAC,IAAc,CAAC;AAAA,EACjF,CAAC;AACD,QAAM,eAAe,sBAAsB,iBAAiB,QAAQ,YAAY,QAAQ,OAAO,CAAC;AAEhG,QAAM;AAAA,IACJA,OAAK,IAAI,aAAa,YAAY;AAAA,IAClC,sBAAsB;AAAA,MACpB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,YAAY,UAAU;AAAA,MACnC,eAAe,gBAAgB,YAAY,aAAa,IAAI;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,SAAO,UAAU,CAAC;AAClB,SAAO,MAAM,WAAW;AAAA,IACtB,GAAG;AAAA,IACH,qBAAqB;AAAA,IACrB,2BAA0B,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjD,wBAAwB;AAAA,EAC1B;AACA,QAAM,IAAI,WAAW,YAAY,MAAM;AAEvC,SAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,KAAgD;AAClF,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,SAAO,UAAU,CAAC;AAClB,QAAM,YAAY,MAAM,eAAe;AACvC,QAAMC,SAAQ,MAAM,qBAAqB,IAAI,WAAW;AACxD,QAAM,QAAQ,uBAAuB,gBAAgB,WAAW,OAAO,MAAM,QAAQ,GAAGA,MAAK;AAC7F,SAAO,MAAM,WAAW;AACxB,QAAM,IAAI,WAAW,YAAY,MAAM;AACvC,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+B;AACtD,SAAO,QAAQ,MAAM,aAAa,MAAM,WAAW;AACrD;AAEA,eAAe,kBAAkB,MAAc,SAAgC;AAC7E,QAAMC,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,YAAY,MAAM,OAAO;AACjC;AAEA,SAAS,qBAAqB,SAQnB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAQO,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,WAC7B,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOX,QAAQ,MAAM,YAAY,QAAQ,IAAI;AAAA,aACxC,QAAQ,MAAM,WAAW,SAAS;AAAA,gBAC/B,QAAQ,MAAM,aAAa,WAAW;AAAA,kBACpC,QAAQ,MAAM,cAAc,QAAQ,IAAI;AAAA,qBACrC,QAAQ,MAAM,iBAAiB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3D,KAAK,QAAQ,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,WAK7B,QAAQ,KAAK;AAAA,UACd,QAAQ,IAAI;AAAA;AAAA;AAAA,EAGpB,KAAK,QAAQ,aAAa,gBAAgB,CAAC;AAAA;AAAA,EAE3C,eAAe,QAAQ,QAAQ,CAAC;AAAA;AAElC;AAEA,SAAS,sBAAsB,SAWpB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAQO,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMvB,QAAQ,OAAO;AAAA,UACtB,QAAQ,KAAK,SAAS,QAAQ,KAAK,KAAK,GAAG,IAAI,QAAQ;AAAA,YACrD,QAAQ,YAAY,QAAQ;AAAA,gBACxB,QAAQ,MAAM,aAAa,WAAW;AAAA,qBACjC,QAAQ,MAAM,iBAAiB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3D,KAAK,QAAQ,iBAAiB,mCAAmC,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,WAK3E,QAAQ,KAAK;AAAA,UACd,QAAQ,IAAI;AAAA;AAAA;AAAA,EAGpB,KAAK,QAAQ,aAAa,gBAAgB,CAAC;AAAA;AAAA,EAE3C,QAAQ,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIxB,KAAK,QAAQ,eAAe,gBAAgB,CAAC;AAAA;AAAA,IAE3C,EAAE;AAAA,EACJ,eAAe,QAAQ,QAAQ,CAAC;AAAA;AAElC;AAEA,SAAS,eAAe,UAA4B;AAClD,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AAAA;AAAA;AAAA,EAGP,SAAS,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAEtD;AAEA,eAAe,uBAAuB,aAAqB,UAA0C;AACnG,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,aAAaH,OAAK,aAAa,YAAY,WAAW,QAAQ;AACpE,QAAM,SAAmB,CAAC;AAC1B,aAAW,QAAQ,CAAC,eAAe,aAAa,YAAY,WAAW,GAAG;AACxE,UAAM,UAAU,MAAM,aAAaA,OAAK,YAAY,IAAI,CAAC;AACzD,QAAI,SAAS;AACX,aAAO,KAAK,MAAM,IAAI;AAAA,EAAK,OAAO,EAAE;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,YAAYA,OAAK,YAAY,OAAO;AAC1C,aAAW,QAAQ,MAAM,cAAc,SAAS,GAAG;AACjD,UAAM,UAAU,MAAM,aAAa,KAAK,IAAI;AAC5C,QAAI,SAAS;AACX,aAAO,KAAK,MAAM,KAAK,KAAK;AAAA,EAAK,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,KAAK,OAAO,KAAK,MAAM,GAAG,kBAAkB;AACrD;AAEA,eAAe,cAAc,WAAoE;AAC/F,MAAI;AACF,UAAM,eAAe,MAAMI,SAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AACrE,WAAO,aACJ,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,WAAW;AAAA,MACf,MAAMJ,OAAK,WAAW,MAAM,MAAM,SAAS;AAAA,MAC3C,OAAO,SAAS,MAAM,IAAI;AAAA,IAC5B,EAAE;AAAA,EACN,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,aAAa,MAAsC;AAChE,MAAI;AACF,WAAO,MAAMK,UAAS,MAAM,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAAuE,eAA+B;AAChI,QAAM,gBAAgB,oBAAoB,aAAa,EAAE,MAAM,GAAG,IAAI;AACtE,SAAO;AAAA,IACL;AAAA,MACE,gBAAgB,QAAQ,OAAO;AAAA,MAC/B,QAAQ,WAAW,UAAU,QAAQ,QAAQ,KAAK;AAAA,MAClD,QAAQ,KAAK,KAAK,GAAG;AAAA,MACrB;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ;AACF;AAEA,SAAS,aAAa,SAAyB;AAC7C,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT;AACA,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,WAAW,WAAW,OAAO,YAAY,IAAI,EAAE,SAAS,OAAO,GAAG;AACrE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA0B;AACrD,SAAO,CAAC,SAAS,UAAU,MAAM,EAAE,SAAS,OAAO;AACrD;AAEA,SAAS,YAAY,QAAyD;AAC5E,QAAM,SAAS,CAAC,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACrF,SAAO,UAAU,QAAQ,OAAO,QAAQ;AAC1C;AAEA,SAAS,gBAAgB,SAA8F;AACrH,SAAO,QACJ,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,aAAa,CAAC,EAC5C,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM,GAAG,KAAK,gBAAgB,OAAO,QAAQ,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC,EAAE;AAC1G;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK;AACnD;AAEA,SAAS,KAAK,OAAe,KAAqB;AAChD,MAAI,MAAM,UAAU,KAAK;AACvB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,aAAkB,MAAM,SAAS,GAAG;AACnE;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,QAAQ,qBAAqB,GAAG,EAAE,QAAQ,YAAY,EAAE,KAAK;AAC5E;;;ADtWA,eAAsB,aAAa,KAAwB,QAAqB,OAAiB,CAAC,GAAkB;AAClH,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,YAAM,mBAAmB,GAAG;AAC5B;AAAA,IACF,KAAK;AACH,YAAM,mBAAmB,GAAG;AAC5B;AAAA,IACF,KAAK;AACH,YAAM,kBAAkB,GAAG;AAC3B;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,GAAG;AAC7B;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,KAAK,QAAQ,IAAI;AAC3C;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,KAAK,WAAW,IAAI;AAC9C;AAAA,EACJ;AACF;AAEA,eAAe,mBAAmB,KAAuC;AACvE,QAAM,SAAS,MAAM,kBAAkB,KAAK,EAAE,WAAW,KAAK,CAAC;AAC/D,QAAM,WAAW,OAAO,MAAM,YAC1B,CAAC,IACD;AAAA,IACE,IAAI,aAAa,OACb,0FACA;AAAA,EACN;AACJ,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,OAAO,MAAM,YACX,wCAAwC,OAAO,MAAM,cAAc,WAAW,gBAAgB,OAAO,OAAO,MAAM,aAAa,WAAW,MAC1I,+DACF,OAAO,MAAM,YACX,qFAAyB,OAAO,MAAM,cAAc,iBAAO,oBAAK,4BAAQ,OAAO,MAAM,aAAa,WAAW,WAC7G;AAAA,IACR;AAAA,IACA,WACE,OAAO,MAAM,aAAa,CAAC,OAAO,MAAM,cACpC,CAAC,IAAI,aAAa,OAAO,yDAAyD,wFAAsC,IACxH;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAe,mBAAmB,KAAuC;AACvE,QAAM,SAAS,MAAM,kBAAkB,KAAK,EAAE,WAAW,KAAK,CAAC;AAC/D,QAAM,WAAW;AAAA,IACf,GAAI,CAAC,OAAO,MAAM,YAAY,CAAC,IAAI,aAAa,OAAO,+BAA+B,yCAAgB,IAAI,CAAC;AAAA,IAC3G,GAAI,OAAO,MAAM,aAAa,CAAC,OAAO,MAAM,cACxC,CAAC,IAAI,aAAa,OAAO,4DAA4D,+FAAyB,IAC9G,CAAC;AAAA,IACL,GAAI,CAAC,OAAO,MAAM,cACd,CAAC,IAAI,aAAa,OAAO,wDAAwD,sFAAgB,IACjG,CAAC;AAAA,EACP;AAEA,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,SAAS,SACP,+BAA+B,SAAS,MAAM,iBAC9C,6CACF,SAAS,SACP,gEAAc,SAAS,MAAM,8BAC7B;AAAA,IACR;AAAA,IACA,WACE,SAAS,SACL,IAAI,aAAa,OACf,CAAC,uBAAuB,yBAAyB,+CAA+C,IAChG,CAAC,gCAAsB,kCAAwB,yDAAgC,IACjF;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAe,kBAAkB,KAAuC;AACtE,MAAI;AACJ,QAAM,cAAcC,OAAK,IAAI,aAAa,QAAQ,gBAAgB;AAClE,QAAM,iBAAiB,QAAQ,IAAI,8BAA8B,KAAK,KAAK;AAC3E,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,eAAe,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACvH,aAAS,MAAM,kBAAkB,KAAK,EAAE,OAAO,MAAM,CAAC;AACtD,UAAM,iBAAiB,aAAa,wBAAwB,OAAO,OAAO,EAAE,gBAAgB,UAAU,IAAI,SAAS,CAAC,CAAC;AACrH,UAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,WAAO,UAAU,CAAC;AAClB,WAAO,MAAM,WAAW;AAAA,MACtB,GAAG,OAAO;AAAA,MACV,kBAAkB;AAAA,MAClB,wBAAuB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAChD;AACA,UAAM,IAAI,WAAW,YAAY,MAAM;AAAA,EACzC,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,oDACA;AAAA,IACN,UAAU,OAAO,MAAM,YACnB,CAAC,IACD;AAAA,MACE,IAAI,aAAa,OACb,sIACA;AAAA,IACN;AAAA,IACJ,WAAW,OAAO,MAAM,YACpB;AAAA,MACE,IAAI,aAAa,OACb,yHACA;AAAA,MACJ;AAAA,IACF,IACA;AAAA,MACE,IAAI,aAAa,OACb,6FACA;AAAA,IACN;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,0BAA0B,QAAQ,cAAc;AAAA,MAChD,UAAU,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,oBAAoB,KAAuC;AACxE,MAAI;AACJ,QAAM,cAAcA,OAAK,IAAI,aAAa,QAAQ,kBAAkB;AACpE,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,iBAAiB,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACzH,aAAS,MAAM,kBAAkB,KAAK,EAAE,WAAW,MAAM,OAAO,MAAM,CAAC;AACvE,UAAM,iBAAiB,aAAa,wBAAwB,OAAO,OAAO,IAAI,QAAQ,CAAC;AACvF,UAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,WAAO,UAAU,CAAC;AAClB,WAAO,MAAM,WAAW;AAAA,MACtB,GAAG,OAAO;AAAA,MACV,aAAa;AAAA,MACb,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3C;AACA,UAAM,IAAI,WAAW,YAAY,MAAM;AAAA,EACzC,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,IAAI,aAAa,OAAO,4CAA4C;AAAA,IAC7E,UAAU,OAAO,MAAM,YACnB,CAAC,IACD;AAAA,MACE,IAAI,aAAa,OACb,kFACA;AAAA,IACN;AAAA,IACJ,WACE,IAAI,aAAa,OACb,CAAC,iFAAiF,IAClF,CAAC,qHAAyD;AAAA,IAChE,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,oBAAoB,KAAwB,MAA0B,MAA+B;AAClH,QAAM,YAAY,MAAM,eAAe;AACvC,MAAI,CAAC,UAAU,WAAW;AACxB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,IAAI,aAAa,OAAO,2DAA2D;AAAA,MAC5F,SAAS,EAAE,YAAY,UAAU,gBAAgB,OAAO,UAAU,MAAM;AAAA,MACxE,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM,YAAY,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC;AAC5E,MAAI,IAAI,aAAa,GAAG;AACtB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,IAAI,aAAa,OAAO,6BAA6B;AAAA,MAC9D,SAAS,EAAE,SAAS,IAAI,QAAQ,KAAK,GAAG,GAAG,UAAU,IAAI,UAAU,QAAQ,IAAI,QAAQ,QAAQ,IAAI,OAAO;AAAA,MAC1G,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,kBAAkB,KAAK,EAAE,OAAO,MAAM,CAAC;AAC5D,QAAM,eAAe,MAAM,yBAAyB,KAAK,OAAO,OAAO,aAAa,IAAI,EAAE;AAC1F,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,SAAO,UAAU,CAAC;AAClB,SAAO,MAAM,WAAW;AAAA,IACtB,GAAG,OAAO;AAAA,IACV,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,oBAAoB,aAAa;AAAA,IACjC,yBAAyB,aAAa,aAAY,oBAAI,KAAK,GAAE,YAAY,IAAI,OAAO,MAAM,2BAA2B;AAAA,EACvH;AACA,QAAM,IAAI,WAAW,YAAY,MAAM;AAEvC,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS,SAAS,IAAI;AAAA,IACtB,SACE,IAAI,aAAa,OACb,SAAS,SACP,gCACA,8BACF,SAAS,SACP,+DACA;AAAA,IACR,UAAU,OAAO,MAAM,cACnB,CAAC,IACD;AAAA,MACE,IAAI,aAAa,OACb,kFACA;AAAA,IACN;AAAA,IACJ,WACE,IAAI,aAAa,OACb,CAAC,wBAAwB,yDAAyD,4EAA4E,IAC9J,CAAC,iCAAuB,gJAAiD;AAAA,IAC/E,MAAM;AAAA,MACJ,UAAU,OAAO,MAAM;AAAA,MACvB;AAAA,MACA,KAAK;AAAA,QACH,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI,OAAO,KAAK;AAAA,QACxB,QAAQ,IAAI,OAAO,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAe,kBAAkB,KAAwB,UAAoD,CAAC,GAAG;AAC/G,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,SAAO,UAAU,CAAC;AAClB,QAAM,YAAY,MAAM,eAAe;AACvC,QAAMC,SAAQ,MAAM,qBAAqB,IAAI,WAAW;AACxD,MAAI,QAAQ,uBAAuB,gBAAgB,WAAW,OAAO,MAAM,QAAQ,GAAGA,MAAK;AAC3F,MAAI,iBAAiE;AAErE,MAAI,QAAQ,aAAa,UAAU,WAAW;AAC5C,qBAAiB,MAAM,YAAY,CAAC,QAAQ,GAAG,EAAE,KAAK,IAAI,YAAY,CAAC;AACvE,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,YAAYC,WAAU,eAAe,MAAM,KAAKA,WAAU,eAAe,MAAM,KAAK,QAAQ,eAAe,QAAQ;AAAA,IACrH;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,MAAM;AACzB,WAAO,MAAM,WAAW;AACxB,UAAM,IAAI,WAAW,YAAY,MAAM;AAAA,EACzC;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,iBACZ;AAAA,MACE,UAAU,eAAe;AAAA,MACzB,SAAS,eAAe;AAAA,MACxB,QAAQ,eAAe,OAAO,KAAK;AAAA,MACnC,QAAQ,eAAe,OAAO,KAAK;AAAA,IACrC,IACA;AAAA,EACN;AACF;AAEA,eAAe,iBAAiB,MAAc,SAAgC;AAC5E,QAAMC,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,YAAY,MAAM,OAAO;AACjC;AAEA,SAAS,wBACP,OACA,SACQ;AACR,MAAI,QAAQ,aAAa,MAAM;AAC7B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAWI,MAAM,YAAY,QAAQ,IAAI;AAAA,gBAC7B,MAAM,kBAAkB,UAAU;AAAA,aACrC,MAAM,WAAW,SAAS;AAAA,gBACvB,MAAM,aAAa,WAAW;AAAA,kBAC5B,MAAM,cAAc,QAAQ,IAAI;AAAA,gCAClB,QAAQ,kBAAkB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB9D;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAWD,MAAM,YAAY,WAAM,QAAG;AAAA,wCACzB,MAAM,kBAAkB,UAAU;AAAA,sBACrC,MAAM,WAAW,SAAS;AAAA,4BACzB,MAAM,aAAa,WAAW;AAAA,kCAC7B,MAAM,cAAc,WAAM,QAAG;AAAA,oDAC1B,QAAQ,kBAAkB,QAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBzC;AAEA,SAAS,wBAAwB,OAAsB,UAAiD;AACtG,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAWI,MAAM,YAAY,QAAQ,IAAI;AAAA,gBAC7B,MAAM,aAAa,WAAW;AAAA,kBAC5B,MAAM,cAAc,QAAQ,IAAI;AAAA,qBAC7B,MAAM,iBAAiB,SAAS;AAAA,iBACpC,MAAM,cAAc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe5C;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAWD,MAAM,YAAY,WAAM,QAAG;AAAA,4BAC3B,MAAM,aAAa,WAAW;AAAA,kCAC7B,MAAM,cAAc,WAAM,QAAG;AAAA,8CAC3B,MAAM,iBAAiB,SAAS;AAAA,kCAClC,MAAM,cAAc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetC;AAEA,SAASF,WAAU,OAA8B;AAC/C,SAAO,MAAM,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK;AACnD;;;AElcA,SAAS,QAAAG,aAAY;AACrB,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,YAAAC,kBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,QAAAC,cAAY;;;ACFrB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,qBAAqB;AAE9B,eAAsB,eAAe,YAAoB,iBAA0C;AACjG,QAAM,SAAS,cAAc,eAAe;AAC5C,QAAM,UAAU,OAAO,IAAI,OAAO,IAAI;AAEtC,MAAI,WAAW;AACf,MAAI;AACF,eAAW,MAAMA,UAAS,YAAY,MAAM;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,cAAc,YAAY,IAAI;AAC1C,MAAI,IAAI,OAAO,OAAO;AACtB,SAAO,IAAI,SAAS;AACtB;;;ACjBA,SAAS,YAAY,oBAAoB;AACzC,SAAS,WAAAC,UAAS,QAAAC,QAAM,SAAAC,cAAa;AACrC,SAAS,qBAAqB;AAEvB,IAAM,cAAc,mBAAmB;AAE9C,SAAS,qBAA6B;AACpC,MAAI,aAAaF,SAAQ,cAAc,YAAY,GAAG,CAAC;AACvD,QAAM,OAAOE,OAAM,UAAU,EAAE;AAE/B,SAAO,MAAM;AACX,UAAM,kBAAkBD,OAAK,YAAY,cAAc;AACvD,QAAI,WAAW,eAAe,GAAG;AAC/B,YAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,MAAM,CAAC;AACpE,UAAI,OAAO,YAAY,YAAY,YAAY,YAAY,QAAQ,SAAS,GAAG;AAC7E,eAAO,YAAY;AAAA,MACrB;AACA,YAAM,IAAI,MAAM,qEAAkC,eAAe,EAAE;AAAA,IACrE;AAEA,QAAI,eAAe,MAAM;AACvB,YAAM,IAAI,MAAM,2CAAuB;AAAA,IACzC;AACA,iBAAaD,SAAQ,UAAU;AAAA,EACjC;AACF;;;ACzBO,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,WAAW;AAExB,IAAM,0BAA0B;AAEzB,SAAS,qBAAqB,SAA0B;AAC7D,SAAO,MAAM,SAAS,UAAU,MAAM,KAAK,MAAM,SAAS,QAAQ,MAAM,KAAK,QAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AACrI;AAEO,SAAS,4BAA4B,SAA0B;AACpE,QAAM,aAAa,MAAM,SAAS,UAAU;AAC5C,QAAM,WAAW,MAAM,SAAS,QAAQ;AACxC,SAAO,eAAe,YAAY,aAAa,KAAK,WAAW,KAAM,eAAe,KAAK,QAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AACjJ;AAEO,SAAS,qBAAqB,UAAyB,WAA2B;AACvF,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,QAAQ,UAAU;AACzC,QAAM,MAAM,SAAS,QAAQ,QAAQ;AACrC,MAAI,UAAU,MAAM,QAAQ,MAAM,MAAM,OAAO;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,MAAM,GAAG,KAAK;AACtC,QAAM,QAAQ,SAAS,MAAM,MAAM,SAAS,MAAM;AAClD,QAAM,eAAe,YAAY,QAAQ;AACzC,QAAM,gBAAgB,YAAY,SAAS;AAC3C,SAAO,GAAG,MAAM,GAAG,UAAU;AAAA,EAAK,gBAAgB,cAAc,aAAa,CAAC;AAAA,EAAK,QAAQ,GAAG,KAAK;AACrG;AAEA,SAAS,gBAAgB,cAAsB,eAA+B;AAC5E,QAAM,oBAAoB,sBAAsB,aAAa;AAC7D,QAAM,mBAAmB,IAAI,IAAI,sBAAsB,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC;AAC7H,MAAI,CAAC,kBAAkB,UAAU,CAAC,iBAAiB,MAAM;AACvD,WAAO;AAAA,EACT;AAEA,SAAO,kBACJ,IAAI,CAAC,YAAY;AAChB,UAAM,WAAW,iBAAiB,IAAI,WAAW,QAAQ,OAAO,CAAC;AACjE,QAAI,YAAY,wBAAwB,KAAK,QAAQ,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,IAAI,GAAG;AAC1G,aAAO,SAAS,IAAI,KAAK;AAAA,IAC3B;AACA,WAAO,QAAQ,IAAI,KAAK;AAAA,EAC1B,CAAC,EACA,KAAK,MAAM;AAChB;AAEA,SAAS,WAAW,SAAyB;AAC3C,QAAM,aAAa,QAAQ,QAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY;AACpE,QAAM,UAAkC;AAAA,IACtC,oBAAoB;AAAA,IACpB,4BAAQ;AAAA,IACR,YAAY;AAAA,IACZ,sBAAO;AAAA,IACP,UAAU;AAAA,IACV,gBAAM;AAAA,IACN,WAAW;AAAA,IACX,gBAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAM;AAAA,IACN,sBAAsB;AAAA,IACtB,+BAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,kCAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,sBAAO;AAAA,IACP,+CAA+C;AAAA,IAC/C,oFAAkC;AAAA,IAClC,2BAA2B;AAAA,IAC3B,4BAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,gCAAY;AAAA,EACd;AACA,SAAO,QAAQ,UAAU,KAAK;AAChC;AAQA,SAAS,sBAAsB,SAAoC;AACjE,QAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,WAAW,CAAC;AACjD,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,QAAQ,IAAI,CAAC,OAAO,UAAU;AACnC,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,MAAM,QAAQ,QAAQ,CAAC,GAAG,SAAS,QAAQ;AACjD,UAAM,MAAM,QAAQ,MAAM,OAAO,GAAG,EAAE,KAAK;AAC3C,UAAM,UAAU,IAAI,QAAQ,IAAI;AAChC,UAAM,UAAU,YAAY,KAAK,IAAI,KAAK,IAAI,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK;AACzE,UAAM,OAAO,YAAY,KAAK,KAAK,IAAI,MAAM,UAAU,CAAC,EAAE,KAAK;AAC/D,WAAO,EAAE,SAAS,MAAM,IAAI;AAAA,EAC9B,CAAC;AACH;AAEA,SAAS,YAAY,SAAyB;AAC5C,QAAM,QAAQ,QAAQ,QAAQ,UAAU;AACxC,QAAM,MAAM,QAAQ,QAAQ,QAAQ;AACpC,MAAI,UAAU,MAAM,QAAQ,MAAM,MAAM,OAAO;AAC7C,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO,QAAQ,MAAM,QAAQ,WAAW,QAAQ,GAAG,EAAE,KAAK;AAC5D;AAEA,SAAS,MAAM,SAAiB,QAAwB;AACtD,SAAO,QAAQ,MAAM,MAAM,EAAE,SAAS;AACxC;;;AChHO,SAAS,eAAe,MAAyB,WAAwB,SAAiB;AAC/F,MAAI,aAAa,MAAM;AACrB,WAAO,iBAAiB,IAAI;AAAA,EAC9B;AACA,SAAO,iBAAiB,IAAI;AAC9B;AAEA,SAAS,iBAAiB,MAAiC;AACzD,QAAM,WAAW,OAAO,QAAQ,KAAK,QAAQ,EAC1C,IAAI,CAAC,CAAC,MAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,MAAM,IAAI,EACnF,KAAK,IAAI;AACZ,QAAM,SAAS,KAAK,OACjB,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,GAAG,MAAM,WAAW,cAAc,EAAE,IAAI,EAC9G,KAAK,IAAI;AACZ,QAAM,aAAa,KAAK,QAAQ,WAAW,IAAI,CAAC,cAAc,KAAK,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI;AAE1I,SAAO;AAAA;AAAA,EAEP,UAAU;AAAA;AAAA;AAAA,sBAGL,KAAK,QAAQ,IAAI;AAAA,kCACf,KAAK,QAAQ,cAAc,SAAI,KAAK,QAAQ,wBAAwB;AAAA,sBACtE,KAAK,QAAQ,UAAU,IAAI,SAAI,KAAK,QAAQ,UAAU,UAAU;AAAA,sBAChE,KAAK,QAAQ,QAAQ;AAAA,kBACf,KAAK,QAAQ,WAAW,WAAM,QAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5C,cAAc,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,YAAY,+DAA+D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3E,UAAU,iDAAiD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3D,oCAAoC,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAWrC,KAAK,WAAW;AAAA,0BACd,WAAW;AAAA,wCACZ,KAAK,cAAc;AAAA,sBACtB,KAAK,SAAS,SAAS,KAAK,SAAS,KAAK,IAAI,IAAI,QAAG;AAAA,EAC1D,QAAQ;AAAA;AAAA,EAER,UAAU;AAAA;AAAA;AAAA;AAAA,EAIV,QAAQ;AAAA;AAEV;AAEA,SAAS,iBAAiB,MAAiC;AACzD,QAAM,WAAW,OAAO,QAAQ,KAAK,QAAQ,EAC1C,IAAI,CAAC,CAAC,MAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,MAAM,IAAI,EACnF,KAAK,IAAI;AACZ,QAAM,SAAS,KAAK,OACjB,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,GAAG,MAAM,WAAW,cAAc,EAAE,IAAI,EAC9G,KAAK,IAAI;AACZ,QAAM,aAAa,KAAK,QAAQ,WAAW,IAAI,CAAC,cAAc,KAAK,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI;AAE1I,SAAO;AAAA;AAAA,EAEP,UAAU;AAAA;AAAA;AAAA,UAGF,KAAK,QAAQ,IAAI;AAAA,qBACN,KAAK,QAAQ,cAAc,KAAK,KAAK,QAAQ,wBAAwB;AAAA,eAC3E,KAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,QAAQ,UAAU,UAAU;AAAA,cAClE,KAAK,QAAQ,QAAQ;AAAA,cACrB,KAAK,QAAQ,WAAW,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,cAAc,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,YAAY,+DAA+D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3E,UAAU,iDAAiD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3D,oCAAoC,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUzB,KAAK,WAAW;AAAA,iBACjB,WAAW;AAAA,qBACP,KAAK,cAAc;AAAA,cAC1B,KAAK,SAAS,SAAS,KAAK,SAAS,KAAK,IAAI,IAAI,MAAM;AAAA,EACpE,QAAQ;AAAA;AAAA,EAER,UAAU;AAAA;AAAA;AAAA;AAAA,EAIV,QAAQ;AAAA;AAEV;;;ACxJA,SAAS,iBAAiB;AAKnB,SAAS,gBAAgB,MAAyB,WAAwB,SAAiB;AAChG,SAAO,UAAU;AAAA,IACf,KAAK;AAAA,MACH,eAAe;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,MACZ;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,SAAS;AAAA,QACP,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,0BAA0B,KAAK,QAAQ;AAAA,QACvC,WAAW,KAAK,QAAQ;AAAA,QACxB,UAAU,KAAK,QAAQ;AAAA,QACvB,UAAU,KAAK,QAAQ;AAAA,QACvB,YAAY,KAAK,QAAQ;AAAA,MAC3B;AAAA,MACA,UAAU,KAAK;AAAA,MACf,YAAY;AAAA,QACV,UAAU,KAAK,QAAQ;AAAA,QACvB,SAAS;AAAA,UACP,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QACR;AAAA,QACA,YAAY,KAAK,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC/BO,IAAM,yBAAyB;AAEtC,IAAM,QAAQ;AACd,IAAM,MAAM;AAEL,SAAS,sBAAsB,UAAyB,WAAwB,SAAiB;AACtG,QAAM,QAAQ,mBAAmB,+BAA+B,QAAQ,CAAC;AACzE,MAAI,CAAC,YAAY,CAAC,SAAS,KAAK,GAAG;AACjC,WAAO,GAAG,KAAK;AAAA;AAAA,EACjB;AAEA,QAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,QAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,MAAI,UAAU,MAAM,QAAQ,MAAM,MAAM,OAAO;AAC7C,WAAO,GAAG,SAAS,MAAM,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,SAAS,MAAM,MAAM,IAAI,MAAM,CAAC;AAAA,EAC/E;AAEA,SAAO,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA;AAAA,EAAO,KAAK;AAAA;AACpD;AAEO,SAAS,yBAAyB,WAAwB,SAAiB;AAChF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMM,aAAa,OAAO,+CAA+C,mEAA2B;AAAA;AAAA;AAAA;AAAA,EAI3G,6BAA6B,QAAQ,CAAC;AAAA;AAExC;AAEO,SAAS,yBAAyB,WAAwB,SAAiB;AAChF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,aAAa,OAAO,+CAA+C,mEAA2B;AAAA;AAAA,EAEhG,6BAA6B,QAAQ,CAAC;AAAA;AAExC;AAEA,SAAS,mBAAmB,SAAyB;AACnD,SAAO,GAAG,KAAK;AAAA,EACf,OAAO;AAAA,EACP,GAAG;AACL;AAEA,SAAS,+BAA+B,UAA+B;AACrE,SAAO,KAAK,aAAa,OAAO,+CAA+C,mEAA2B;AAAA;AAAA,EAE1G,6BAA6B,QAAQ,CAAC;AACxC;AAEO,SAAS,6BAA6B,WAAwB,SAAiB;AACpF,MAAI,aAAa,MAAM;AACrB,WAAO,+BAA+B;AAAA,EACxC;AACA,SAAO,qBAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCrC;AAEA,SAAS,iCAAyC;AAChD,SAAO,WAAW,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiC1C;;;ACpIO,SAAS,yBAAyB,UAAkB,eAAc,oBAAI,KAAK,GAAE,YAAY,GAAW;AACzG,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA,eACV,WAAW;AAAA,YACd,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAeS,QAAQ;AAAA;AAAA;AAGrC;;;APLA,eAAsB,qBAAqB,KAAuC;AAChF,MAAI,gBAAwC,EAAE,UAAU,CAAC,EAAE;AAC3D,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,kBAAkB,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AAC1H,oBAAgB,MAAM,mBAAmB,GAAG;AAAA,EAC9C,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,uEACA;AAAA,IACN,UAAU,cAAc;AAAA,EAC1B,CAAC;AACH;AAEA,eAAsB,mBAAmB,KAAyD;AAChG,QAAM,OAAO,MAAM,IAAI,QAAQ,KAAK,IAAI,aAAa,CAAC,CAAC;AACvD,QAAM,aAAaG,OAAK,IAAI,aAAa,WAAW;AACpD,QAAM,aAAaA,OAAK,IAAI,aAAa,YAAY,aAAa;AAClE,QAAM,aAAaA,OAAK,IAAI,aAAa,WAAW;AACpD,QAAM,sBAAsBA,OAAK,IAAI,aAAa,QAAQ,wBAAwB;AAClF,QAAM,qBAAqBA,OAAK,IAAI,aAAa,WAAW,SAAS,yBAAyB;AAE9F,QAAM,iBAAiB,MAAMC,cAAa,UAAU;AACpD,QAAM,iBAAiB,MAAMA,cAAa,UAAU;AACpD,QAAM,yBAAyB,MAAMA,cAAa,kBAAkB;AACpE,QAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;AAElC,MAAI,kBAAkB,4BAA4B,cAAc,GAAG;AACjE,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,IAAI,aAAa,OAAO,4DAA4D;AAAA,MAC7F,SAAS,EAAE,MAAM,YAAY;AAAA,MAC7B,kBACE,IAAI,aAAa,OACb,uEACA;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB,CAAC,qBAAqB,cAAc,GAAG;AAC3D,QAAI,CAAC,IAAI,OAAO,CAAE,MAAM,qCAAqC,GAAG,GAAI;AAClE,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SACE,IAAI,aAAa,OACb,wEACA;AAAA,QACN,SAAS,EAAE,MAAM,YAAY;AAAA,QAC7B,kBACE,IAAI,YAAY,SACZ,IAAI,aAAa,OACf,uEACA,4FACF,IAAI,aAAa,OACf,iFACA;AAAA,MACV,CAAC;AAAA,IACH;AACA,UAAM,aAAa,MAAM,aAAa,UAAU;AAChD,QAAI,YAAY;AACd,eAAS,KAAK,IAAI,aAAa,OAAO,oCAAoC,UAAU,KAAK,+DAAuB,UAAU,EAAE;AAAA,IAC9H;AAAA,EACF;AAEA,QAAM,YAAY,YAAY,qBAAqB,gBAAgB,eAAe,MAAM,IAAI,QAAQ,CAAC,CAAC;AACtG,QAAM,YAAY,YAAY,MAAM,eAAe,YAAY,gBAAgB,MAAM,IAAI,QAAQ,CAAC,CAAC;AACnG,QAAM,YAAY,YAAY,sBAAsB,gBAAgB,IAAI,QAAQ,CAAC;AACjF,QAAM,YAAY,qBAAqB,yBAAyB,IAAI,QAAQ,CAAC;AAC7E,MAAI,CAAC,0BAA0B,uBAAuB,SAAS,aAAa,GAAG;AAC7E,UAAM,YAAY,oBAAoB,yBAAyB,IAAI,QAAQ,CAAC;AAAA,EAC9E,OAAO;AACL,aAAS;AAAA,MACP,IAAI,aAAa,OACb,kGACA;AAAA,IACN;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,2BAA2B,IAAI,WAAW;AACzE,MAAI,mBAAmB,GAAG;AACxB,aAAS,KAAK,+BAA+B,kBAAkB,IAAI,QAAQ,CAAC;AAAA,EAC9E;AAEA,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,QAAM,UAAU;AAAA,IACd,mBAAmB,KAAK;AAAA,IACxB,iBAAiB,KAAK;AAAA,IACtB,gBAAgB,KAAK;AAAA,EACvB;AACA,QAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,SAAO,EAAE,SAAS;AACpB;AAEA,eAAe,qCAAqC,KAA0C;AAC5F,MAAI,IAAI,YAAY,UAAU,IAAI,QAAQ,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACvF,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,UAAM,WACJ,IAAI,aAAa,OACb,oHACA;AACN,UAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,GAAG,KAAK,EAAE,YAAY;AAChE,QAAI,WAAW,OAAO,WAAW,OAAO;AACtC,aAAO;AAAA,IACT;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AAEA,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA,SACE,IAAI,aAAa,OACb,6DACA;AAAA,IACN,SAAS,EAAE,MAAM,YAAY;AAAA,IAC7B,kBACE,IAAI,aAAa,OACb,6DACA;AAAA,EACR,CAAC;AACH;AAEA,eAAeA,cAAa,MAAsC;AAChE,MAAI;AACF,WAAO,MAAMC,WAAS,MAAM,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADrJA,eAAsB,YAAY,KAAuC;AACvE,QAAM,qBAAqB,MAAMC,QAAOC,OAAK,IAAI,aAAa,YAAY,aAAa,CAAC;AACxF,MAAI,WAAqB,CAAC;AAC1B,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,QAAQ,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AAChH,UAAM,UAAU,kBAAkB,IAAI,UAAU;AAChD,UAAM,iBAAiB,IAAI,aAAa,OAAO;AAE/C,UAAM,WAAW,MAAM,IAAI,SAAS,kBAAkB;AACtD,QAAI,CAAC,oBAAoB;AACvB,YAAM,SAAS,MAAM,IAAI,SAAS,IAAI,QAAQ,CAAC,WAAW,MAAM,GAAG,EAAE,KAAK,IAAI,aAAa,OAAO,UAAU,CAAC;AAC7G,UAAI,OAAO,aAAa,GAAG;AACzB,gBAAQ,WAAW,OAAO;AAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,mBAAmB,GAAG;AAClD,eAAW,cAAc;AAEzB,UAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,UAAM,WAAW;AACjB,UAAM,WAAW;AAAA,MACf,SAAS,IAAI;AAAA,MACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAM,UAAU,CAAC;AACjB,UAAM,WAAW,uBAAuB,gBAAgB,MAAM,eAAe,GAAG,MAAM,MAAM,QAAQ,GAAG,MAAM,qBAAqB,IAAI,WAAW,CAAC;AAClJ,QAAI,CAAC,SAAS,aAAa,CAAC,SAAS,uBAAuB;AAC1D,eAAS,KAAK,6BAA6B,UAAU,IAAI,QAAQ,CAAC;AAClE,eAAS,yBAAwB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC1D;AACA,UAAM,MAAM,WAAW;AAEvB,eAAW,WAAW,IAAI,cAAc;AACtC,YAAM,OAAO,MAAM,QAAQ,YAAY,IAAI,aAAa,IAAI,QAAQ;AACpE,YAAM,SAAS,MAAM,QAAQ,QAAQ,IAAI,aAAa,MAAM,IAAI,GAAG;AACnE,YAAM,aAAa,QAAQ,IAAI,IAAI;AAAA,QACjC,gBAAgB,QAAQ;AAAA,QACxB,WAAW;AAAA,QACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,cAAQ,MAAM,KAAK,GAAG,OAAO,QAAQ,IAAI,CAAC,UAAU,EAAE,WAAW,SAAkB,MAAM,QAAQ,OAAgB,EAAE,CAAC;AAAA,IACtH;AAEA,YAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC7C,UAAM,iBAAiB,IAAI,aAAa,OAAO;AAC/C,UAAM,IAAI,WAAW,YAAY,KAAK;AAAA,EACxC,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,IAAI,aAAa,OAAO,kCAAkC;AAAA,IACnE;AAAA,IACA,WACE,IAAI,aAAa,OACb,CAAC,oDAAoD,wCAAwC,IAC7F,CAAC,6DAAyC,8DAAsB;AAAA,EACxE,CAAC;AACH;AAEA,eAAeD,QAAO,MAAgC;AACpD,MAAI;AACF,UAAME,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AS3EA,SAAS,YAAAC,kBAAgB;AACzB,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAG1B,IAAMC,iBAAgBD,WAAUD,SAAQ;AAExC,eAAsB,sBAAsB,aAA+C;AACzF,QAAM,CAAC,SAAS,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtD,IAAI,aAAa,CAAC,aAAa,iBAAiB,CAAC;AAAA,IACjD,IAAI,aAAa,CAAC,UAAU,gBAAgB,CAAC;AAAA,IAC7C,IAAI,aAAa,CAAC,aAAa,MAAM,CAAC;AAAA,EACxC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,IAAI,KAAa,MAAwC;AACtE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAME,eAAc,OAAO,MAAM,EAAE,IAAI,CAAC;AAC3D,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC5BA,SAAS,SAAAC,QAAO,YAAAC,kBAAgB;AAChC,SAAS,QAAAC,cAAY;;;ACDd,IAAM,mBAAmB;AASzB,SAAS,kBAAkB,OAA+C;AAC/E,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,SAAS,SAAS,EAAE,SAAS,UAAU,GAAG;AACnD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,oBAAoB,UAA+B;AACjE,SAAO,aAAa,OAChB,iIACA;AACN;;;ACvBA,IAAM,SAAwB,CAAC,WAAW,WAAW,aAAa,UAAU,QAAQ,SAAS;AAEtF,SAAS,kBAAkB,YAAoB,SAAuC;AAC3F,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,SAAS;AAAA,MACP,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,IAClB;AAAA,IACA,cAAc,CAAC;AAAA,IACf,OAAO,CAAC;AAAA,IACR,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AACF;AAEO,SAAS,kBAAkB,YAAoB,UAAkB,OAAiC;AACvG,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,QAAQ,OAAO,YAAY,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,SAAS,QAAQ,gBAAgB,cAAc,CAAC,CAAC,CAAC;AAAA,IACnH,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,IACA,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,UAAU,CAAC;AAAA,EACb;AACF;AAEO,SAAS,kBAAkB,OAA8C;AAC9E,MAAI,CAAC,SAAS,KAAK,KAAK,MAAM,kBAAkB,GAAG;AACjD,UAAM,kBAAkB,0DAAkB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,MAAM,QAAQ,GAAG;AAC7B,UAAM,WAAW;AAAA,MACf,SAAS;AAAA,MACT,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC5F;AAAA,EACF;AACA,MAAI,OAAO,MAAM,eAAe,YAAY,CAAC,SAAS,MAAM,OAAO,GAAG;AACpE,UAAM,eAAe,8DAAY;AAAA,EACnC;AACF;AAEO,SAAS,kBAAkB,OAA8C;AAC9E,MAAI,CAAC,SAAS,KAAK,KAAK,MAAM,kBAAkB,GAAG;AACjD,UAAM,kBAAkB,0DAAkB;AAAA,EAC5C;AACA,MAAI,OAAO,MAAM,eAAe,YAAY,OAAO,MAAM,aAAa,UAAU;AAC9E,UAAM,eAAe,8DAAY;AAAA,EACnC;AACF;AAEA,SAAS,kBAAkB,SAA2B;AACpD,SAAO,IAAI,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACH;AAEA,SAAS,eAAe,SAA2B;AACjD,SAAO,IAAI,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACH;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AF3FO,IAAM,aAAN,MAAiB;AAAA,EACtB,YACmB,aACA,YACA,SACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,aAA0C;AAC9C,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,MAAMC,WAAS,KAAK,WAAW,GAAG,MAAM,CAAC;AAClE,wBAAkB,KAAK;AACvB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,oBAA0C;AAC9C,WAAQ,MAAM,KAAK,WAAW,KAAM,kBAAkB,KAAK,YAAY,KAAK,OAAO;AAAA,EACrF;AAAA,EAEA,MAAM,YAAY,OAAmC;AACnD,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAMC,OAAMC,OAAK,KAAK,aAAa,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACnE,UAAM,YAAY,KAAK,WAAW,GAAG,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC5E;AAAA,EAEA,MAAM,WAAW,UAA+C;AAC9D,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,MAAMF,WAAS,KAAK,WAAW,QAAQ,GAAG,MAAM,CAAC;AAC1E,wBAAkB,KAAK;AACvB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,UAAkB,OAA0C;AAClF,WAAQ,MAAM,KAAK,WAAW,QAAQ,KAAM,kBAAkB,KAAK,YAAY,UAAU,KAAK;AAAA,EAChG;AAAA,EAEA,MAAM,YAAY,OAAmC;AACnD,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAMC,OAAMC,OAAK,KAAK,aAAa,YAAY,WAAW,MAAM,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9F,UAAM,YAAY,KAAK,WAAW,MAAM,QAAQ,GAAG,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC1F;AAAA,EAEQ,aAAqB;AAC3B,WAAOA,OAAK,KAAK,aAAa,YAAY,gBAAgB;AAAA,EAC5D;AAAA,EAEQ,WAAW,UAA0B;AAC3C,WAAOA,OAAK,KAAK,aAAa,YAAY,WAAW,UAAU,gBAAgB;AAAA,EACjF;AACF;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS;AAC1F;;;AGtEA,SAAS,YAAAC,kBAAgB;AAEzB,eAAsB,qBAAqB,WAAsC;AAC/E,MAAI;AACJ,MAAI;AACF,cAAU,MAAMA,WAAS,WAAW,MAAM;AAAA,EAC5C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,UAAU;AAChB,MAAI;AACJ,SAAQ,QAAQ,QAAQ,KAAK,OAAO,GAAI;AACtC,QAAI,MAAM,CAAC,GAAG;AACZ,gBAAU,KAAK,MAAM,CAAC,CAAC;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;;;ALVA,IAAM,iBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,SAAS;AACX;AAEA,eAAsB,aAAa,KAAwB,SAAiB,MAA+B;AACzG,MAAI,YAAY,aAAa,YAAY,cAAc,YAAY,MAAM;AACvE,UAAM,wBAAwB,KAAK,SAAS,IAAI;AAChD;AAAA,EACF;AACA,MAAI,YAAY,SAAS;AACvB,UAAM,qBAAqB,KAAK,IAAI;AACpC;AAAA,EACF;AACA,MAAI,YAAY,WAAW;AACzB,UAAM,uBAAuB,KAAK,IAAI;AACtC;AAAA,EACF;AACA,MAAI,YAAY,QAAQ;AACtB,UAAM,oBAAoB,KAAK,IAAI;AACnC;AAAA,EACF;AACA,MAAI,YAAY,gBAAgB;AAC9B,UAAM,2BAA2B,KAAK,IAAI;AAC1C;AAAA,EACF;AACA,MAAI,YAAY,WAAW;AACzB,UAAM,uBAAuB,GAAG;AAChC;AAAA,EACF;AAEA,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAkD,CAAC;AAEzD,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACxG,QAAI,CAAC,QAAQ,WAAW,cAAc,EAAE,SAAS,OAAO,GAAG;AACzD,YAAM,eAAe,GAAG;AAAA,IAC1B;AAEA,UAAM,SAAS,MAAM,mBAAmB,KAAK,SAAS,YAAY;AAClE,UAAM,+BAA+B,KAAK,OAAO,SAAS,OAAO;AACjE,UAAM,iBAAiB,gBAAgB,OAAO,IAAI;AAClD,UAAM,iBAAiB,YAAY,YAAa,OAAO,KAAK,CAAC,KAAK,IAAI,YAAY,iBAAmB,IAAI,YAAY;AAErH,aAAS,eAAe,MAAM,0BAA0B,KAAK;AAAA,MAC3D;AAAA,MACA,MAAM,OAAO;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,iBAAiB,YAAY,aAAa,iBAAiB,MAAM,qBAAqB,IAAI,aAAa,cAAc,IAAI;AAC/H,UAAM,SAAS,MAAM,IAAI,SAAS,IAAI,OAAO,SAAS,OAAO,MAAM,EAAE,KAAK,IAAI,aAAa,OAAO,IAAI,OAAO,SAAS,UAAU,CAAC;AACjI,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,YAAY,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,QAAI,gBAAgB;AAClB,YAAM,gBAAgB,IAAI,aAAa,cAAc;AAAA,IACvD;AAEA,UAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,UAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,UAAM,gBAAgB,WAAW;AACjC,QAAI,YAAY,WAAW;AACzB,UAAI,CAAC,MAAM,kBAAkB,MAAM,mBAAmB,kBAAkB,CAAC,WAAW,QAAQ,SAAS,MAAM,cAAc,GAAG;AAC1H,cAAM,iBAAiB;AAAA,MACzB;AACA,YAAM,sBAAsB;AAAA,IAC9B,WAAW,IAAI,YAAY,WAAW,QAAQ,SAAS,IAAI,QAAQ,GAAG;AACpE,YAAM,iBAAiB,IAAI;AAAA,IAC7B,WAAW,MAAM,kBAAkB,CAAC,WAAW,QAAQ,SAAS,MAAM,cAAc,GAAG;AACrF,YAAM,iBAAiB,WAAW,QAAQ,WAAW,IAAK,WAAW,QAAQ,CAAC,KAAK,OAAQ;AAAA,IAC7F,WAAW,CAAC,MAAM,kBAAkB,WAAW,QAAQ,WAAW,GAAG;AACnE,YAAM,iBAAiB,WAAW,QAAQ,CAAC,KAAK;AAAA,IAClD;AACA,UAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,UAAM,WAAW,IAAI,YAAY,MAAM;AACvC,QAAI,YAAY,WAAW,QAAQ,SAAS,QAAQ,GAAG;AACrD,YAAM,mBAAmB,MAAM,IAAI,SAAS,cAAc,IAAI,aAAa,QAAQ;AACnF,YAAM,cAAc,MAAM,IAAI,WAAW,kBAAkB,UAAU,eAAe,OAAO,KAAK,SAAS;AACzG,kBAAY,eAAe,eAAe,OAAO,KAAK,YAAY;AAClE,kBAAY,OAAO,YAAY,YAAY,IAAI;AAAA,QAC7C,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,kBAAY,sBAAsB;AAAA,QAChC,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,QAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC;AACA,kBAAY,MAAM,eAAe,MAAM,qBAAqB,iBAAiB,SAAS;AACtF,kBAAY,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AACxD,YAAM,IAAI,WAAW,YAAY,WAAW;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,QAAM,eAAe,SAAS;AAC9B,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ;AAAA,IACA,SAAS,OAAO,OAAO;AAAA,IACvB,UAAU,cAAc;AAAA,IACxB,WAAW,cAAc,aAAa,aAAa,OAAO,CAAC,QAAQ,aAAa,IAAI,yDAAyD,IAAI;AAAA,IACjJ,MAAM,eAAe,EAAE,aAAa,IAAI;AAAA,EAC1C,CAAC;AACH;AAWA,eAAe,qBAAqB,KAAwB,MAA+B;AACzF,QAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,QAAM,WAAkD,CAAC;AAEzD,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,SAAS,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACjH,UAAM,+BAA+B,KAAK,UAAU,OAAO;AAC3D,UAAM,+BAA+B,KAAK,gBAAgB,OAAO;AAEjE,aAAS,eAAe,MAAM,0BAA0B,KAAK;AAAA,MAC3D,SAAS;AAAA,MACT,MAAM,CAAC,SAAS,YAAY,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB,KAAK,QAAQ;AACrD,UAAM,QAAQ,OAAO,WAAW,KAAK,CAAC,aAAa,SAAS,OAAO,OAAO;AAC1E,UAAM,WACJ,SAAS,MAAM,WAAW,cAAc,MAAM,WAAW,UACrD,CAAC,uCAAuC,MAAM,MAAM,4EAA4E,IAChI;AAEN,UAAM,eAAe,MAAM,gBAAgB,KAAK,UAAU,OAAO;AACjE,UAAM,kBAAkB,KAAK,SAAS,UAAU;AAAA,MAC9C,iBAAiB;AAAA,MACjB,cAAc,CAAC,SAAS,YAAY,QAAQ;AAAA,MAC5C,UAAU,aAAa;AAAA,MACvB,aAAa;AAAA,IACf,CAAC;AAED,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SAAS,8DAA8D,QAAQ;AAAA,MAC/E,UAAU,CAAC,GAAI,SAAS,cAAc,YAAY,CAAC,GAAI,GAAI,YAAY,CAAC,CAAE;AAAA,MAC1E,WAAW;AAAA,QACT,yBAAyB,QAAQ;AAAA,QACjC;AAAA,QACA,2BAA2B,QAAQ;AAAA,MACrC;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA,cAAc,aAAa;AAAA,QAC3B;AAAA,QACA,cAAc,SAAS;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,uBAAuB,KAAwB,MAA+B;AAC3F,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAW,IAAI,aAAa,aAAa,CAAC,KAAK,UAAU,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI;AACpG,QAAM,eAAe,MAAM,0BAA0B,KAAK;AAAA,IACxD,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU,aAAa;AAAA,IACvB,WAAW;AAAA,MACT;AAAA,MACA,WAAW,6BAA6B,QAAQ,6CAA6C;AAAA,IAC/F;AAAA,IACA,MAAM,EAAE,UAAU,MAAM,cAAc,aAAa;AAAA,EACrD,CAAC;AACH;AAEA,eAAe,oBAAoB,KAAwB,MAA+B;AACxF,QAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,QAAM,eAAe,gBAAgB,IAAI;AAEzC,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,QAAQ,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AAChH,UAAM,qBAAqB,KAAK,QAAQ;AACxC,UAAM,+BAA+B,KAAK,YAAY,MAAM;AAE5D,UAAM,eAAe,CAAC,UAAU,UAAU,UAAU,GAAG,aAAa,OAAO,CAAC,QAAQ,QAAQ,QAAQ,CAAC;AACrG,UAAM,SAAS,MAAM,IAAI,SAAS,IAAI,YAAY,cAAc,EAAE,KAAK,IAAI,aAAa,OAAO,IAAI,OAAO,SAAS,UAAU,CAAC;AAC9H,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB,KAAK,QAAQ,UAAU;AAAA,MAC7C,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,aAAa;AAAA,IACf,CAAC;AAED,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SAAS,8BAA8B,QAAQ;AAAA,MAC/C,WAAW,CAAC,4BAA4B,QAAQ,uDAAuD;AAAA,MACvG,MAAM,IAAI,OAAO,EAAE,UAAU,UAAU,OAAO,IAAI,EAAE,SAAS;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,2BAA2B,KAAwB,MAA+B;AAC/F,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAI,GAAG,aAAa,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7H,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,gBAAgB,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACxH,UAAM,+BAA+B,KAAK,WAAW,cAAc;AACnE,UAAM,WAAqB,CAAC;AAC5B,eAAW,YAAY,SAAS;AAC9B,YAAM,qBAAqB,KAAK,QAAQ;AACxC,YAAM,iBAAiB,MAAM,qBAAqB,IAAI,aAAa,QAAQ;AAC3E,YAAM,SAAS,MAAM,IAAI,SAAS,IAAI,WAAW,CAAC,QAAQ,GAAG,EAAE,KAAK,IAAI,aAAa,OAAO,IAAI,OAAO,SAAS,UAAU,CAAC;AAC3H,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,IAAI,SAAS;AAAA,UACjB;AAAA,UACA,SAAS,gCAAgC,QAAQ;AAAA,UACjD,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AACA,YAAM,gBAAgB,IAAI,aAAa,cAAc;AACrD,eAAS,KAAK,QAAQ;AAAA,IACxB;AAEA,UAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,UAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,UAAM,gBAAgB,WAAW;AACjC,QAAI,MAAM,kBAAkB,CAAC,WAAW,QAAQ,SAAS,MAAM,cAAc,GAAG;AAC9E,YAAM,iBAAiB;AAAA,IACzB;AACA,UAAM,sBAAsB;AAC5B,UAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SAAS,6BAA6B,SAAS,MAAM;AAAA,MACrD,WAAW,WAAW,QAAQ,SAAS,CAAC,2BAA2B,WAAW,QAAQ,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,MACtG,MAAM,EAAE,UAAU,eAAe,WAAW,QAAQ;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,uBAAuB,KAAuC;AAC3E,QAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,QAAM,gBAAgB,WAAW;AACjC,MAAI,MAAM,kBAAkB,CAAC,WAAW,QAAQ,SAAS,MAAM,cAAc,GAAG;AAC9E,UAAM,iBAAiB,WAAW,QAAQ,WAAW,IAAK,WAAW,QAAQ,CAAC,KAAK,OAAQ;AAAA,EAC7F;AACA,QAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,MACT,WAAW,QAAQ,SAAS,iBAAiB,WAAW,QAAQ,KAAK,IAAI,CAAC,KAAK;AAAA,MAC/E;AAAA,IACF;AAAA,IACA,MAAM,EAAE,gBAAgB,MAAM,gBAAgB,eAAe,WAAW,SAAS,mBAAmB,WAAW,SAAS;AAAA,EAC1H,CAAC;AACH;AAUA,eAAe,wBAAwB,KAAwB,SAAkC,MAA+B;AAC9H,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAkD,CAAC;AAEzD,QAAM,gBAAgB,IAAI,aAAa,EAAE,SAAS,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,YAAY;AACxG,UAAM,+BAA+B,KAAK,UAAU,OAAO;AAC3D,UAAM,+BAA+B,KAAK,gBAAgB,OAAO;AACjE,QAAI,YAAY,WAAW;AACzB,YAAM,+BAA+B,KAAK,OAAO,OAAO;AAAA,IAC1D;AAEA,UAAM,WAAW,YAAY,YAAY,MAAM,qBAAqB,KAAK,YAAY,IAAI,MAAM,gBAAgB,GAAG;AAClH,UAAM,aAAa,YAAY,aAAa,MAAM,kBAAkB,KAAK,UAAU,aAAa,CAAC,CAAC,IAAI,MAAM,kBAAkB,KAAK,QAAQ;AAE3I,aAAS,eAAe,MAAM,0BAA0B,KAAK;AAAA,MAC3D;AAAA,MACA,MAAM,aAAa,CAAC,YAAY,YAAY,QAAQ,IAAI,CAAC,YAAY,QAAQ;AAAA,MAC7E;AAAA,IACF,CAAC;AAED,UAAM,eAAe,MAAM,gBAAgB,KAAK,UAAU,UAAU;AACpE,UAAM,kBAAkB,KAAK,SAAS,UAAU;AAAA,MAC9C,iBAAiB;AAAA,MACjB,cAAc,CAAC,YAAY,YAAY,QAAQ;AAAA,MAC/C,UAAU,aAAa;AAAA,IACzB,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB,KAAK,QAAQ;AACrD,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ;AAAA,MACA,SAAS,OAAO,OAAO,gCAAgC,UAAU,iBAAiB,QAAQ;AAAA,MAC1F,UAAU,SAAS,cAAc;AAAA,MACjC,WAAW;AAAA,QACT,qCAAqC,QAAQ,IAAI,kBAAkB,QAAQ,UAAU,CAAC;AAAA,QACtF;AAAA,QACA,uCAAuC,QAAQ;AAAA,QAC/C,OAAO,aAAa,0BAA0B,QAAQ,KAAK,6BAA6B,QAAQ;AAAA,MAClG;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,cAAc,aAAa;AAAA,QAC3B;AAAA,QACA,cAAc,SAAS;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,qBAAqB,KAAwB,MAAiC;AAC3F,MAAI,IAAI,UAAU;AAChB,WAAO,IAAI;AAAA,EACb;AAEA,QAAM,WAAW,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AAClE,QAAM,WAAW,KAAK,CAAC;AACvB,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,KAAK;AAClC,QAAM,WAAW,UAAU,KAAK,IAAI,QAAQ,UAAU,KAAK;AAC3D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,MAAM;AAAA,MACjB,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,QAAQ,SAAS,QAAQ,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,UAAU,QAAQ;AACtC,MAAI,SAAS,UAAU,UAAU;AAC/B,eAAW,KAAK,iBAAiB,KAAK;AAAA,EACxC;AACA,QAAM,SAAS,MAAM,IAAI,SAAS,IAAI,OAAO,YAAY,EAAE,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC;AAChG,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAwB,UAAkB,qBAA+C;AACxH,QAAM,SAAS,MAAM,mBAAmB,KAAK,QAAQ;AACrD,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,MAAI,qBAAqB;AACvB,UAAM,YAAY,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,mBAAmB;AAClF,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,sBAAsB,mBAAmB,+BAA+B,QAAQ;AAAA,QACzF,SAAS,EAAE,UAAU,qBAAqB,WAAW,UAAU,IAAI,CAAC,aAAa,SAAS,EAAE,EAAE;AAAA,QAC9F,kBAAkB,mCAAmC,QAAQ;AAAA,MAC/D,CAAC;AAAA,IACH;AACA,QAAI,UAAU,WAAW,WAAW,UAAU,WAAW,YAAY;AACnE,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,sBAAsB,mBAAmB,QAAQ,UAAU,MAAM;AAAA,QAC1E,SAAS,EAAE,UAAU,qBAAqB,aAAa,UAAU,YAAY;AAAA,QAC7E,kBAAkB,yBAAyB,QAAQ;AAAA,MACrD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,UAAU,KAAK,CAAC,aAAa,SAAS,WAAW,OAAO;AACrE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,oDAAoD,QAAQ;AAAA,MACrE,SAAS,EAAE,UAAU,UAAU;AAAA,MAC/B,kBAAkB,OAAO,aAAa,sBAAsB,QAAQ,KAAK,mCAAmC,QAAQ;AAAA,IACtH,CAAC;AAAA,EACH;AACA,SAAO,KAAK;AACd;AAEA,eAAe,mBAAmB,KAAwB,UAAiD;AACzG,QAAM,SAAS,MAAM,IAAI,SAAS,IAAI,UAAU,CAAC,YAAY,UAAU,QAAQ,GAAG,EAAE,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC;AACzH,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACA,MAAI;AACF,WAAO,kBAAkB,OAAO,UAAU,IAAI;AAAA,EAChD,SAAS,OAAO;AACd,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,MACxD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,eAAe,gBAAgB,KAAwB,UAAkB,YAAkE;AACzI,QAAM,OAAO,CAAC,YAAY,YAAY,UAAU,GAAI,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAE;AAC/E,QAAM,SAAS,MAAM,IAAI,SAAS,IAAI,gBAAgB,MAAM,EAAE,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC;AACnG,MAAI,OAAO,UAAU,CAAC,IAAI,MAAM;AAC9B,YAAQ,OAAO,MAAM,OAAO,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,GAAG,OAAO,MAAM;AAAA,CAAI;AAAA,EAC1F;AACA,MAAI,OAAO,UAAU,CAAC,IAAI,MAAM;AAC9B,YAAQ,OAAO,MAAM,OAAO,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,GAAG,OAAO,MAAM;AAAA,CAAI;AAAA,EAC1F;AACA,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACA,MAAI,CAAC,IAAI,MAAM;AACb,WAAO,EAAE,UAAU,OAAO,UAAU,MAAM,KAAK;AAAA,EACjD;AACA,MAAI;AACF,WAAO,EAAE,UAAU,OAAO,UAAU,MAAM,kBAAkB,OAAO,UAAU,IAAI,EAAE;AAAA,EACrF,SAAS,OAAO;AACd,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,MACxD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,eAAe,kBACb,KACA,SACA,UACA,qBACe;AACf,QAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,QAAM,gBAAgB,WAAW;AACjC,MAAI,WAAW,QAAQ,SAAS,QAAQ,GAAG;AACzC,UAAM,iBAAiB;AAAA,EACzB;AACA,QAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,MAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ,GAAG;AAC1C;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,IAAI,SAAS,cAAc,IAAI,aAAa,QAAQ;AACnF,QAAM,cAAc,MAAM,IAAI,WAAW,kBAAkB,UAAU,eAAe,OAAO,KAAK,SAAS;AACzG,QAAM,QAAQ,eAAe,OAAO,KAAK;AACzC,cAAY,eAAe;AAC3B,cAAY,OAAO,KAAK,IAAI;AAAA,IAC1B,QAAQ,oBAAoB,eAAe;AAAA,IAC3C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,cAAY,sBAAsB;AAAA,IAChC,SAAS,oBAAoB;AAAA,IAC7B,MAAM,oBAAoB;AAAA,IAC1B,UAAU,oBAAoB;AAAA,IAC9B,QAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,EAChC;AACA,cAAY,MAAM,eAAe,MAAM,qBAAqB,iBAAiB,SAAS;AACtF,cAAY,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AACxD,QAAM,IAAI,WAAW,YAAY,WAAW;AAC9C;AAEA,SAAS,kBAAkB,QAA8B,YAA4B;AACnF,SAAO,OAAO,WAAW,KAAK,CAAC,aAAa,SAAS,OAAO,UAAU,GAAG,cAAc,GAAG,UAAU;AACtG;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,6BAA6B,KAAK,KAAK;AAChD;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,SAAS,EAAE,EACnB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,kBAAkB,QAAyB;AAClD,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,cAAc,QAAQ,QAAQ,GAAG;AACvC,QAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,QAAM,SAAS,CAAC,aAAa,UAAU,EAAE,OAAO,CAAC,UAAU,SAAS,CAAC;AACrE,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,KAAK,MAAM,WAAW,IAAI;AAAA,EACnC;AACA,SAAO,KAAK,MAAM,QAAQ,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AACtD;AAEA,eAAe,+BAA+B,KAAwB,iBAAyB,YAAmC;AAChI,QAAM,eAAe,MAAM,IAAI,SAAS,gBAAgB;AACxD,MAAI,aAAa,SAAS,SAAS,eAAe,GAAG;AACnD;AAAA,EACF;AAEA,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA,SAAS,gBAAgB,aAAa,OAAO,6BAA6B,eAAe,sBAAsB,UAAU;AAAA,IACzH,SAAS;AAAA,MACP,iBAAiB,aAAa;AAAA,MAC9B,iBAAiB;AAAA,MACjB,mBAAmB,aAAa;AAAA,MAChC,WAAW,aAAa;AAAA,IAC1B;AAAA,IACA,kBACE;AAAA,EACJ,CAAC;AACH;AAOA,eAAe,qBAAqB,aAAqB,UAA2C;AAClG,SAAO;AAAA,IACL,YAAY,qBAAqB,oBAAI,KAAK,CAAC;AAAA,IAC3C,SAAS,MAAM,sBAAsB,aAAa,QAAQ;AAAA,EAC5D;AACF;AAEA,eAAe,gBAAgB,aAAqB,OAAsC;AACxF,QAAM,gBAAgBC,OAAK,aAAa,cAAc;AACtD,QAAM,WAAW,MAAMC,cAAa,aAAa;AACjD,QAAM,qBAAqB;AAC3B,QAAM,QAAQ,eAAe,MAAM,UAAU;AAAA,oBAAuB,MAAM,OAAO;AAAA,EAAK,kBAAkB,IAAI,MAAM,OAAO;AAAA;AACzH,QAAM,OAAO,UAAU,QAAQ,IAAI,GAAG,SAAS,QAAQ,CAAC;AAAA;AAAA,EAAO,KAAK,KAAK;AACzE,QAAM,YAAY,eAAe,IAAI;AACvC;AAEA,eAAe,sBAAsB,aAAqB,UAAmC;AAC3F,QAAM,aAAaD,OAAK,aAAa,YAAY,WAAW,QAAQ;AACpE,QAAM,WAAW,MAAMC,cAAaD,OAAK,YAAY,aAAa,CAAC;AACnE,MAAI,UAAU;AACZ,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AACA,QAAM,SAAS,MAAMC,cAAaD,OAAK,YAAY,WAAW,CAAC;AAC/D,MAAI,QAAQ;AACV,WAAO,kBAAkB,MAAM;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,aAAa,QAChB,QAAQ,SAAS,IAAI,EACrB,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,QAAQ,CAAC,KAAK,WAAW,MAAM,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,EAC5E,KAAK,GAAG;AACX,SAAO,cAAc;AACvB;AAEA,eAAeC,cAAa,MAAsC;AAChE,MAAI;AACF,WAAO,MAAMC,WAAS,MAAM,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,MAAoB;AAChD,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,QAAQ,IAAI,KAAK,SAAS,IAAI,CAAC;AACrC,QAAM,MAAM,IAAI,KAAK,QAAQ,CAAC;AAC9B,QAAM,QAAQ,IAAI,KAAK,SAAS,CAAC;AACjC,QAAM,UAAU,IAAI,KAAK,WAAW,CAAC;AACrC,QAAM,UAAU,IAAI,KAAK,WAAW,CAAC;AACrC,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO;AAC/D;AAEA,SAAS,IAAI,OAAuB;AAClC,SAAO,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AACtC;AAEA,eAAsB,mBAAmB,KAAwB,SAAiB,MAA+B;AAC/G,QAAM,SAAS,MAAM,IAAI,SAAS,IAAI,SAAS,gBAAgB,IAAI,GAAG,EAAE,KAAK,IAAI,aAAa,OAAO,IAAI,OAAO,SAAS,UAAU,CAAC;AACpI,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,YAAY,OAAO;AAAA,MAC5B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,MAA0B;AACjD,QAAM,SAAmB,CAAC;AAC1B,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,QAAQ,WAAW,QAAQ,YAAY;AACzC,eAAS;AACT;AAAA,IACF;AACA,QAAI,KAAK,WAAW,QAAQ,KAAK,KAAK,WAAW,WAAW,GAAG;AAC7D;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,QAAQ,YAAY,QAAQ,eAAe,QAAQ,cAAc;AACtF;AAAA,IACF;AACA,QAAI,KAAK;AACP,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBAAmB,KAAwB,SAAiB,MAA8D;AACvI,UAAQ,SAAS;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,SAAS,MAAM,iBAAiB,KAAK,IAAI,EAAE;AAAA,IACtD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,SAAS,MAAM,MAAM,kBAAkB,KAAK,MAAM,IAAI,EAAE;AAAA,IACnE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,SAAS,MAAM,MAAM,kBAAkB,KAAK,IAAI,EAAE;AAAA,IAC7D,KAAK;AACH,aAAO,EAAE,SAAS,OAAO,MAAM,KAAK,CAAC,MAAM,WAAW,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE;AAAA,IACnF,KAAK;AACH,aAAO,EAAE,SAAS,WAAW,MAAM,CAAC,IAAI,YAAY,KAAK,CAAC,KAAM,MAAM,gBAAgB,GAAG,GAAI,GAAG,KAAK,MAAM,IAAI,WAAW,IAAI,CAAC,CAAC,EAAE;AAAA,IACpI;AACE,aAAO,EAAE,SAAS,KAAK;AAAA,EAC3B;AACF;AAEA,SAAS,iBAAiB,KAAwB,MAA0B;AAC1E,SAAO,IAAI,WAAW,CAAC,YAAY,IAAI,UAAU,GAAG,IAAI,IAAI;AAC9D;AAEA,eAAe,kBAAkB,KAAwB,MAAgB,gBAAgB,OAA0B;AACjH,MAAI,IAAI,UAAU;AAChB,WAAO,CAAC,YAAY,IAAI,UAAU,GAAG,IAAI;AAAA,EAC3C;AACA,MAAI,KAAK,SAAS,UAAU,KAAK,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC,GAAG;AAChF,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,CAAC,eAAe;AACrC,WAAO;AAAA,EACT;AACA,SAAO,CAAC,YAAY,MAAM,gBAAgB,GAAG,GAAG,GAAG,IAAI;AACzD;AAEA,SAAS,gBAAgB,MAA+B;AACtD,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,QAAQ,YAAY;AACtB,aAAO,KAAK,QAAQ,CAAC,KAAK;AAAA,IAC5B;AACA,QAAI,KAAK,WAAW,WAAW,GAAG;AAChC,aAAO,IAAI,MAAM,YAAY,MAAM,KAAK;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,gBAAgB,KAAyC;AACtE,MAAI,IAAI,UAAU;AAChB,WAAO,IAAI;AAAA,EACb;AACA,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB;AACrD,MAAI,MAAM,gBAAgB;AACxB,WAAO,MAAM;AAAA,EACf;AACA,QAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,MAAI,WAAW,QAAQ,WAAW,KAAK,WAAW,QAAQ,CAAC,GAAG;AAC5D,WAAO,WAAW,QAAQ,CAAC;AAAA,EAC7B;AACA,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,IACT,SAAS,EAAE,eAAe,WAAW,QAAQ;AAAA,IAC7C,kBAAkB;AAAA,EACpB,CAAC;AACH;AAEA,eAAe,eAAe,KAAuC;AACnE,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,QAAM,WAAW,IAAI,YAAY,OAAO;AACxC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,qBAAqB,KAAK,QAAQ;AAC1C;AAEA,eAAe,qBAAqB,KAAwB,UAAiC;AAC3F,QAAM,SAAS,MAAM,IAAI,WAAW,WAAW,QAAQ;AACvD,QAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,MAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ,GAAG;AAC1C,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,UAAU,eAAe,WAAW,QAAQ;AAAA,MACvD,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,cAAc,WAAW,iBAAiB;AACpD,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,SAAS;AAAA,MACpB,kBAAkB,uBAAuB,QAAQ;AAAA,IACnD,CAAC;AAAA,EACH;AACF;;;AM/xBA,SAAS,aAAa;AAIf,IAAM,2BAA2B;AAkBjC,SAAS,kBAAkB,MAAyB,QAAQ,KAAa;AAC9E,SAAO,IAAI,yBAAyB,KAAK,KAAK;AAChD;AAEO,SAAS,iBAAiB,MAAyB,QAAQ,KAAa;AAC7E,SAAO,IAAI,2BAA2B,KAAK,MAAM,QAAQ,aAAa,UAAU,YAAY;AAC9F;AAEA,eAAsB,wBACpB,cAAc,kBAAkB,GAChC,gBAAgB,iBAAiB,GAChB;AACjB,QAAM,WAAW,QAAQ,IAAI,2BAA2B,KAAK;AAC7D,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,OAAO,eAAe,CAAC,QAAQ,aAAa,WAAW,QAAQ,GAAG;AAAA,IACrF,KAAK,QAAQ,IAAI;AAAA,IACjB,OAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,kBAAkB,GAAG,aAAa,SAAS,WAAW;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,gBAAgB,OAAO,UAAU,EAAE;AACnD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,QAAQ,OAAO,OAAO;AAAA,IACnC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAsB,iBACpB,gBACA,eACA,SAC0D;AAC1D,QAAM,cAAc,kBAAkB;AACtC,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,cAAc,CAAC,WAAW,MAAM,GAAG,WAAW,SAAS;AAE7D,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ;AAAA,MACN,QAAQ,aAAa,OACjB,qBAAqB,cAAc,OAAO,aAAa,QACvD,iCAAa,cAAc,uBAAQ,aAAa;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,OAAO,eAAe,aAAa;AAAA,IACtD,KAAK,QAAQ;AAAA,IACb,OAAO,QAAQ,OAAO,SAAS;AAAA,EACjC,CAAC;AAED,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,QAAQ,aAAa,OAAO,uBAAuB;AAAA,MAC5D,SAAS;AAAA,MACT,kBAAkB,GAAG,aAAa,IAAI,YAAY,KAAK,GAAG,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,GAAG,aAAa,IAAI,YAAY,KAAK,GAAG,CAAC;AAAA,EAC3D;AACF;AAEA,SAAS,gBAAgB,QAA+B;AACtD,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS;AAAA,EACpE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,OACd,SACA,MACA,SACuB;AACvB,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,UAAM,SAAmB,CAAC;AAC1B,UAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACjC,KAAK,QAAQ;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAC9D,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAE9D,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B;AAAA,QACE,IAAI,SAAS;AAAA,UACX;AAAA,UACA,SAAS;AAAA,UACT,SAAS,EAAE,SAAS,KAAK;AAAA,UACzB,OAAO;AAAA,UACP,kBAAkB,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU,WAAW;AACtC,MAAAA,SAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,YAAY;AAAA,QACtB;AAAA,QACA,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,QACjE,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,MACnE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,gBAAgB,MAAc,OAAuB;AACnE,QAAM,cAAc,aAAa,IAAI;AACrC,QAAM,eAAe,aAAa,KAAK;AAEvC,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,UAAM,OAAO,YAAY,KAAK,KAAK,IAAI,aAAa,KAAK,KAAK;AAC9D,QAAI,SAAS,GAAG;AACd,aAAO,KAAK,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,WAAW,UAAU,aAAa,WAAW,QAAQ;AACpE,WAAO;AAAA,EACT;AACA,MAAI,YAAY,WAAW,UAAU,CAAC,aAAa,WAAW,QAAQ;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,IAAI,YAAY,WAAW,QAAQ,aAAa,WAAW,MAAM;AACrF,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;AAC9C,UAAM,WAAW,YAAY,WAAW,KAAK;AAC7C,UAAM,YAAY,aAAa,WAAW,KAAK;AAC/C,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,OAAO,sBAAsB,UAAU,SAAS;AACtD,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,SAA2E;AAC/F,QAAM,CAAC,YAAY,IAAI,QAAQ,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG;AAClE,QAAM,CAAC,YAAY,IAAI,kBAAkB,EAAE,IAAI,aAAa,MAAM,GAAG;AACrE,QAAM,YAAY,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;AAC9E,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,OAAO,SAAS,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,MAC/C,OAAO,SAAS,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,MAC/C,OAAO,SAAS,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,IACjD;AAAA,IACA,YAAY,kBAAkB,gBAAgB,MAAM,GAAG,IAAI,CAAC;AAAA,EAC9D;AACF;AAEA,SAAS,sBAAsB,MAAc,OAAuB;AAClE,QAAM,aAAa,QAAQ,KAAK,IAAI,IAAI,OAAO,SAAS,MAAM,EAAE,IAAI;AACpE,QAAM,cAAc,QAAQ,KAAK,KAAK,IAAI,OAAO,SAAS,OAAO,EAAE,IAAI;AAEvE,MAAI,eAAe,QAAQ,gBAAgB,MAAM;AAC/C,WAAO,KAAK,KAAK,aAAa,WAAW;AAAA,EAC3C;AACA,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,cAAc,KAAK;AACjC;;;AC1NA,eAAsB,cAAc,KAAuC;AACzE,QAAM,cAAc,kBAAkB;AACtC,QAAM,gBAAgB,MAAM,wBAAwB,WAAW;AAC/D,QAAM,iBAAiB,IAAI;AAE3B,MAAI,gBAAgB,gBAAgB,aAAa,KAAK,GAAG;AACvD,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SACE,IAAI,aAAa,OACb,8BAA8B,cAAc,OAC5C,uCAAc,cAAc;AAAA,MAClC,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,iBAAiB,gBAAgB,eAAe;AAAA,IACpE,KAAK,IAAI;AAAA,IACT,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,MAAM,CAAC,YAAY,IAAI,OAAO,KAAK,OAAO;AAAA,EAC5C,CAAC;AAED,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SACE,IAAI,aAAa,OACb,oBAAoB,cAAc,OAAO,aAAa,MACtD,oBAAU,cAAc,uBAAQ,aAAa;AAAA,IACnD,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;;;AChDA,SAAS,kBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,YAAU,QAAAC,aAAY;AACtC,SAAS,QAAAC,cAAY;AAOrB,eAAsB,cAAc,KAAwB,SAA4D;AACtH,MAAI,QAAQ,MAAM;AAChB,UAAM,OAAO,MAAM,IAAI,QAAQ,KAAK,IAAI,aAAa,CAAC,CAAC;AACvD,UAAM,OAAO;AAAA,MACX,eAAe;AAAA,MACf,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,YAAY;AAAA,QACV;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,UAAU,OAAO,QAAQ,KAAK,QAAQ,EACnC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,aAAa,MAAM,EAAE,SAAS,IAAI,CAAC,EAC/D,IAAI,CAAC,CAAC,WAAW,OAAO,OAAO;AAAA,YAC9B;AAAA,YACA,SAAS,QAAQ;AAAA,YACjB,QAAQ,QAAQ;AAAA,YAChB,UAAU,QAAQ;AAAA,YAClB,iBAAiB,QAAQ,WAAW,SAAS;AAAA,UAC/C,EAAE;AAAA,QACN;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,aAAa,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,CAAC;AAAA,IAC9E;AACA,QAAI,IAAI,KAAK;AACX,YAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,aAAO,sBAAsB;AAAA,QAC3B,eAAe;AAAA,QACf,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC,oBAAoB,YAAY,IAAI;AAAA,QACpC,gBAAgB,KAAK;AAAA,QACrB,MAAM,KAAK,WAAW;AAAA,UAAQ,CAAC,cAC7B,UAAU,SAAS,IAAI,CAAC,aAAa;AAAA,YACnC,KAAK,UAAU;AAAA,YACf,WAAW,QAAQ;AAAA,YACnB,SAAS,QAAQ;AAAA,YACjB,QAAQ,QAAQ;AAAA,YAChB,UAAU,QAAQ;AAAA,UACpB,EAAE;AAAA,QACJ;AAAA,MACF;AACA,YAAM,IAAI,WAAW,YAAY,MAAM;AAAA,IACzC;AAEA,QAAI,OAAO,OAAO;AAAA,MAChB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SAAS,IAAI,MAAM,8HAAyC;AAAA,MAC5D,UAAU,KAAK,QAAQ,IAAI,CAAC,SAAS,sBAAO,IAAI,+GAAqB;AAAA,MACrE,MAAM;AAAA,MACN,WAAW,IAAI,MAAM,CAAC,wGAA6B,IAAI,CAAC,wCAAU,4EAAoC,wGAA6B;AAAA,IACrI,CAAC;AACD;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,IAAI;AAAA,IACJ,EAAE,SAAS,UAAU,KAAK,IAAI,KAAK,YAAY,IAAI,WAAW;AAAA,IAC9D,YAAY;AACV,YAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,UAAI,QAAQ,MAAM;AAChB,cAAM,SAAS,KAAK,QAAQ;AAAA,MAC9B,OAAO;AACL,cAAM,kBAAkB,KAAK,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,kBAAkB,KAAwB,UAAiC;AACxF,QAAM,mBAAmB,KAAK,QAAQ;AACtC,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,MAAMC,OAAK,IAAI,aAAa,YAAY,WAAW,UAAU,MAAM;AACzE,QAAM,mBAAmBA,OAAK,KAAK,wBAAwB;AAC3D,QAAMC,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,YAAY,kBAAkB,yBAAyB,UAAU,WAAW,CAAC;AAEnF,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB,UAAU,QAAQ;AACvE,QAAM,eAAe;AACrB,QAAM,OAAO,SAAS,EAAE,QAAQ,eAAe,WAAW,YAAY;AACtE,QAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW,CAAC,iCAAuB,QAAQ,gCAAgC,6DAAoC,QAAQ,EAAE;AAAA,EAC3H,CAAC;AACH;AAEA,eAAe,SAAS,KAAwB,UAAiC;AAC/E,QAAM,mBAAmB,KAAK,QAAQ;AACtC,QAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC1C,QAAM,mBAAmBD,OAAK,IAAI,aAAa,YAAY,WAAW,UAAU,QAAQ,wBAAwB;AAChH,QAAM,eAAe,MAAM,iBAAiB,kBAAkB,QAAQ;AACtE,QAAM,0BAA0B,qBAAqB,cAAc,aAAa,KAAK;AACrF,QAAM,QAAQ,MAAM,IAAI,WAAW,kBAAkB,UAAU,QAAQ;AACvE,QAAM,eAAe;AACrB,QAAM,OAAO,SAAS,EAAE,QAAQ,QAAQ,WAAW,WAAW;AAC9D,QAAM,eAAe;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA,kBAAkB,oBAAoB,QAAQ;AAAA,IAC9C;AAAA,IACA,UAAU;AAAA,EACZ;AACA,QAAM,IAAI,WAAW,YAAY,KAAK;AAEtC,MAAI,OAAO,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW,CAAC,qBAAqB,QAAQ,IAAI,wBAAwB,QAAQ,EAAE;AAAA,EACjF,CAAC;AACH;AAEA,eAAe,mBAAmB,KAAwB,UAAiC;AACzF,QAAM,aAAa,MAAM,IAAI,SAAS,cAAc,IAAI,aAAa,QAAQ;AAC7E,MAAI,CAAC,WAAW,QAAQ;AACtB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,SAAS;AAAA,MACpB,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACF;AAEA,eAAe,iBAAiB,MAAc,UAAmC;AAC/E,MAAI;AACF,UAAME,MAAK,IAAI;AACf,UAAM,UAAU,MAAMC,WAAS,MAAM,MAAM;AAC3C,UAAM,eAAe,qBAAqB,SAAS,UAAU;AAC7D,QAAI,iBAAiB,UAAU;AAC7B,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,SAAS,EAAE,UAAU,UAAU,QAAQ,aAAa;AAAA,QACpD,kBAAkB,uBAAuB,QAAQ;AAAA,MACnD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,KAAK;AAAA,MAChB,kBAAkB,uBAAuB,QAAQ;AAAA,IACnD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,SAAiB,KAA4B;AACzE,QAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,GAAG,cAAc,GAAG,CAAC;AAChE,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,UAAU,WAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;AACnF;AAEA,eAAe,gBAAgB,KAAyC;AACtE,MAAI,IAAI,UAAU;AAChB,WAAO,IAAI;AAAA,EACb;AAEA,QAAM,SAAS,MAAM,IAAI,WAAW,kBAAkB;AACtD,MAAI,OAAO,gBAAgB;AACzB,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,aAAa,MAAM,IAAI,SAAS,eAAe,IAAI,WAAW;AACpE,MAAI,WAAW,QAAQ,WAAW,KAAK,WAAW,QAAQ,CAAC,GAAG;AAC5D,WAAO,WAAW,QAAQ,CAAC;AAAA,EAC7B;AAEA,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,IACT,SAAS,EAAE,eAAe,WAAW,QAAQ;AAAA,IAC7C,kBAAkB;AAAA,EACpB,CAAC;AACH;;;AChMA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,CAAC,iBAAiB,aAAa,eAAe,gBAAgB,kBAAkB,gBAAgB,iBAAiB;AAgBjI,SAAS,mBAAmB,MAAyB,QAAQ,KAA2B;AAC7F,aAAW,OAAO,gBAAgB;AAChC,UAAM,QAAQ,IAAI,GAAG,GAAG,KAAK;AAC7B,QAAI,OAAO;AACT,aAAO,EAAE,QAAQ,KAAK,MAAM,MAAM;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,yBAAyB,KAAK,CAAC,YAAY,QAAQ,KAAK,KAAK,CAAC;AACvE;AAEO,SAAS,mBAAmB,MAAyB,QAAQ,KAAsB;AACxF,QAAM,QAAQ,IAAI,kBAAkB,KAAK,EAAE,YAAY;AACvD,MAAI,UAAU,SAAS,IAAI,0BAA0B,KAAK;AACxD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,8BAA8B,SAAiB,MAAyB,QAAQ,KAAiC;AAC/H,MAAI,mBAAmB,GAAG,MAAM,OAAO;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,GAAG;AACvC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,gBAAgB,SAAS,IAAI;AAC9C,MAAI,YAAY,SAAS;AACvB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACZ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,QAAQ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BAA0B,UAA+B,WAAwB,SAAiB;AAChH,MAAI,aAAa,MAAM;AACrB,UAAMC,cACJ,SAAS,gBAAgB,cACrB,uFACA;AACN,WAAO,GAAG,SAAS,MAAM,aAAa,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,IAAI,MAAMA,WAAU;AAAA,EAC3G;AACA,QAAM,aACJ,SAAS,gBAAgB,cACrB,qHACA;AACN,QAAM,SACJ,SAAS,gBAAgB,cACrB,wIACA,OAAO,SAAS,OAAO;AAC7B,SAAO,GAAG,MAAM,uBAAQ,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,IAAI,UAAK,UAAU;AAC5F;AAEO,SAAS,qBAAqB,SAAiB,WAAwB,SAAiB;AAC7F,MAAI,aAAa,MAAM;AACrB,QAAI,YAAY,SAAS;AACvB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvHA,SAAS,eAAe;;;ACAxB,SAAS,SAAAC,QAAO,YAAAC,YAAU,QAAAC,aAAY;AACtC,SAAS,eAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,cAAY;;;ACFvB,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,qBAAqB,CAAC,gBAAgB,eAAe,cAAc,iBAAiB,gBAAgB,eAAe;AAIzH,IAAM,uBAAuB,CAAC,GAAG,uBAAuB,UAAU,gBAAgB,eAAe,GAAG,kBAAkB;AAItH,SAAS,sBAAsB,SAA4B,OAAO,aAAqB;AAC5F,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,UAAM,aAAa,QAAQ,MAAM,SAAS,MAAM;AAChD,WAAO,aAAa,UAAU,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,EACzD;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO,qCAAqC,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,EACpE;AACA,SAAO,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAChD;;;AC3BO,SAAS,eAAe,WAAwB,kBAAqD;AAC1G,QAAM,OACJ,aAAa,OACT;AAAA;AAAA;AAAA;AAAA,EAIN,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAevB;AAAA;AAAA;AAAA;AAAA,EAIN,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB7B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,cAEC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,IAAI;AAAA,EACJ;AACF;AAEO,SAAS,kBAAkB,WAAwB,kBAA4D;AACpH,SAAO;AAAA,IACL,4BAA4B,QAAQ;AAAA,IACpC,GAAG,qBAAqB,IAAI,CAAC,aAAa;AAAA,MAC1C,MAAM,uBAAuB,OAAO;AAAA,MACpC,SAAS,cAAc,SAAS,QAAQ;AAAA,IACxC,EAAE;AAAA,EACJ;AACF;AAEO,SAAS,sBAAsB,WAAwB,kBAA4D;AACxH,SAAO,qBAAqB,IAAI,CAAC,aAAa;AAAA,IAC5C,MAAM,eAAe,OAAO;AAAA,IAC5B,SAAS,kBAAkB,SAAS,QAAQ;AAAA,EAC9C,EAAE;AACJ;AAEA,SAAS,4BAA4B,UAA0D;AAC7F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,cAEC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKrB,aAAa,OAAO,+CAA+C,mEAA2B;AAAA;AAAA,EAEhG,6BAA6B,QAAQ,CAAC;AAAA;AAAA,EAEtC;AACF;AAEA,SAAS,cAAc,SAA4B,UAA+B;AAChF,MAAI,aAAa,MAAM;AACrB,WAAO,gBAAgB,OAAO;AAAA,EAChC;AACA,MAAI,YAAY,gBAAgB;AAC9B,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,mBAAmB,SAAS,QAAQ;AAAA,EAC7C;AAEA,QAAM,QAAQ,sBAAsB,SAAS,EAAE;AAC/C,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA,IAGZ,KAAK;AAAA;AAAA,EAEP,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA,0CAEW,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/C,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOP;AAEA,SAAS,gBAAgB,SAAoC;AAC3D,QAAM,QAAQ,sBAAsB,SAAS,YAAY,iBAAiB,KAAK,YAAY,gBAAgB,iCAAiC,EAAE;AAC9I,QAAM,QAAQ,eAAe,OAAO;AACpC,MAAI,YAAY,eAAe;AAC7B,WAAO;AAAA;AAAA,cAEG,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA,IAGZ,KAAK;AAAA;AAAA,EAEP,qBAAqB,SAAS,OAAO,CAAC;AAAA;AAAA,EAEtC,oBAAoB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL;AACA,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA,IAGZ,KAAK;AAAA;AAAA,EAEP,qBAAqB,SAAS,OAAO,CAAC;AAAA;AAAA,EAEtC,oBAAoB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAI5B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOP;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvB,qBAAqB,eAAe,QAAQ,CAAC;AAAA;AAAA,EAE7C,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB/B;AAEA,SAAS,mBAAmB,SAA4B,UAA+B;AACrF,QAAM,QAAQ,sBAAsB,SAAS,EAAE;AAC/C,MAAI,YAAY,eAAe;AAC7B,WAAO;AAAA;AAAA,cAEG,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA,IAGZ,KAAK;AAAA;AAAA,EAEP,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL;AACA,QAAM,aAAa,QAAQ,MAAM,SAAS,MAAM;AAChD,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA,IAGZ,KAAK;AAAA;AAAA,EAEP,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOP;AAEA,SAAS,kBAAkB,SAA4B,UAA+B;AACpF,MAAI,YAAY,MAAM;AACpB,WAAO,6BAA6B,QAAQ;AAAA,EAC9C;AACA,MAAI,aAAa,MAAM;AACrB,WAAO,oBAAoB,OAAO;AAAA,EACpC;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,YAAY,YAAY;AAC1B,WAAO,0BAA0B,QAAQ;AAAA,EAC3C;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,YAAY,OAAO;AACrB,WAAO,qBAAqB,QAAQ;AAAA,EACtC;AACA,MAAI,YAAY,SAAS;AACvB,WAAO,uBAAuB,QAAQ;AAAA,EACxC;AACA,MAAI,YAAY,UAAU;AACxB,WAAO,wBAAwB,QAAQ;AAAA,EACzC;AACA,MAAI,YAAY,QAAQ;AACtB,WAAO,sBAAsB,QAAQ;AAAA,EACvC;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,YAAY,gBAAgB;AAC9B,WAAO,6BAA6B,QAAQ;AAAA,EAC9C;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACA,MAAI,YAAY,gBAAgB;AAC9B,WAAO,6BAA6B,QAAQ;AAAA,EAC9C;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO,6BAA6B,QAAQ;AAAA,EAC9C;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO,4BAA4B,QAAQ;AAAA,EAC7C;AAEA,QAAM,QAAQ,sBAAsB,OAAO;AAC3C,QAAM,UAAU,QAAQ,WAAW,QAAQ;AAC3C,QAAM,eAAe,UAAU,GAAG,sBAAsB,SAAS,EAAE,CAAC,gBAAgB,OAAO,OAAO;AAClG,QAAM,cAAc,UAChB,+BAA+B,QAAQ,MAAM,SAAS,MAAM,CAAC,iBAC7D,gCAAgC,OAAO;AAE3C,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA;AAAA,eAID,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcxB,YAAY;AAAA;AAAA;AAAA;AAAA;AAKd;AAEA,SAAS,oBAAoB,SAAoC;AAC/D,MAAI,YAAY,eAAe;AAC7B,WAAO,4BAA4B,OAAO;AAAA,EAC5C;AACA,QAAM,QAAQ,sBAAsB,SAAS,YAAY,iBAAiB,KAAK,YAAY,gBAAgB,iCAAiC,WAAW;AACvJ,QAAM,eAAe,YAAY,gBAAgB,+BAA+B;AAChF,QAAM,mBAAmB,eAAe,kBAAkB,YAAY;AAAA,IAAO;AAC7E,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA;AAAA,eAID,eAAe,OAAO,CAAC;AAAA,EACpC,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB,SAAS,OAAO,CAAC;AAAA;AAAA,EAEtC,oBAAoB,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAI5B,cAAc,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQnB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUR,YAAY,iBAAiB,0bAAoI,EAAE,GAAG,YAAY,aAAa,YAAY,aAAa,gJAA4C,EAAE,GAAG,YAAY,aAAa,YAAY,aAAa,6QAAqE,EAAE,GAAG,YAAY,UAAU,iLAA8D,EAAE;AAC7d;AAEA,SAAS,eAAe,SAAoC;AAC1D,QAAM,SAAqD;AAAA,IACzD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AACA,SAAO,OAAO,OAAO,KAAK,oBAAU,OAAO;AAC7C;AAEA,SAAS,cAAc,SAAoC;AACzD,MAAI,YAAY,gBAAgB;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,WAAW;AACzB,WAAO;AAAA,EACT;AACA,MAAI,YAAY,YAAY;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AACA,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AACA,SAAO,eAAe,OAAO;AAC/B;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvB,qBAAqB,gBAAgB,QAAQ,CAAC;AAAA;AAAA,EAE9C,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB/B;AAEA,SAAS,6BAA6B,UAA+B;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,UAA+B;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,UAA+B;AAC7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwBA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,UAA+B;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA2BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,UAA+B;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwBA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,UAA+B;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqBA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,UAA+B;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAeA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,UAA+B;AAClE,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAoBA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA+BA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,UAA+B;AAChE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkCA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,UAA+B;AACnE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAO,gDAAgD;AAAA,IACpE,GAAG,aAAa,OAAO,gDAAgD,gEAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiC/F;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,SAAiB,aAAqB,MAAc,cAAuB,WAAwB,kBAA0B;AAC7J,QAAM,gBAAgB,QAAQ,MAAM,KAAK,EAAE,CAAC,KAAK;AACjD,QAAM,mBAAmB,eAAe,kBAAkB,YAAY;AAAA,IAAO;AAC7E,QAAM,0BACJ,aAAa,OACT,mKACA;AACN,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,OAAO;AAAA;AAAA;AAAA;AAAA,eAIH,WAAW;AAAA,EACxB,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB,eAAe,QAAQ,CAAC;AAAA;AAAA,EAE7C,oBAAoB,QAAQ,CAAC;AAAA;AAAA,EAE7B,uBAAuB;AAAA;AAAA,EAEvB,IAAI;AAAA;AAEN;;;AFrgCO,IAAM,eAAN,MAA0C;AAAA,EACtC,OAAO;AAAA,EACP,iBAAiB;AAAA,EAE1B,MAAM,OAAO,aAAqB;AAChC,WAAO;AAAA,MACL,UAAU,MAAMC,QAAOC,OAAK,aAAa,QAAQ,CAAC,KAAK,MAAMD,QAAOC,OAAK,aAAa,WAAW,CAAC;AAAA,MAClG,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,cAAsB,UAAkD;AACxF,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,QACL,GAAG,CAAC,eAAe,QAAQ,GAAG,GAAG,kBAAkB,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,UAC3E,GAAG;AAAA,UACH,SAAS;AAAA,UACT,MAAM;AAAA,QACR,EAAE;AAAA,QACF,GAAG,sBAAsB,QAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,UAChD,GAAG;AAAA,UACH,SAAS;AAAA,UACT,MAAM;AAAA,QACR,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,aAAqB,MAAuB,QAAQ,OAAmC;AACnG,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAoB,CAAC;AAE3B,eAAW,QAAQ,KAAK,OAA0B;AAChD,YAAM,SAAS,cAAc,aAAa,IAAI;AAC9C,YAAM,cAAc,eAAe,IAAI;AACvC,YAAM,WAAW,MAAM,aAAa,MAAM;AAC1C,UAAI,YAAY,CAAC,SAAS,SAAS,aAAa,KAAK,CAAC,OAAO;AAC3D,cAAM,IAAI,SAAS;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,UACT,SAAS,EAAE,MAAM,YAAY;AAAA,UAC7B,kBAAkB;AAAA,QACpB,CAAC;AAAA,MACH;AACA,UAAI,YAAY,CAAC,SAAS,SAAS,aAAa,KAAK,OAAO;AAC1D,cAAM,aAAa,MAAM;AAAA,MAC3B;AACA,YAAMC,OAAMC,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,YAAM,YAAY,QAAQ,KAAK,OAAO;AACtC,cAAQ,KAAK,WAAW;AAAA,IAC1B;AAEA,WAAO,EAAE,MAAM,KAAK,MAAM,SAAS,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,aAA6C;AACxD,UAAM,OAAO,MAAM,KAAK,YAAY,WAAW;AAC/C,UAAM,SAAwB,CAAC;AAC/B,eAAW,QAAQ,KAAK,OAA0B;AAChD,YAAM,SAAS,cAAc,aAAa,IAAI;AAC9C,YAAM,cAAc,eAAe,IAAI;AACvC,YAAM,UAAU,MAAM,aAAa,MAAM;AACzC,YAAM,UAAU,QAAQ,SAAS,SAAS,aAAa,CAAC;AACxD,YAAM,iBAAiB,QAAQ,SAAS,SAAS,mBAAmB,KAAK,cAAc,EAAE,CAAC;AAC1F,aAAO,KAAK;AAAA,QACV,IAAI,SAAS,WAAW;AAAA,QACxB,QAAQ,CAAC,UAAU,SAAS,WAAW,iBAAiB,SAAS;AAAA,QACjE,SAAS,CAAC,UACN,GAAG,WAAW,gBACd,CAAC,UACC,GAAG,WAAW,sCACd,CAAC,iBACC,GAAG,WAAW,6BACd,GAAG,WAAW;AAAA,QACtB,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,aAAa;AAAA,MAC3E,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,aAAqB,MAA6B;AACvE,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAOF,OAAK,iBAAiB,GAAG,KAAK,IAAI;AAAA,EAC3C;AACA,SAAOA,OAAK,aAAa,KAAK,IAAI;AACpC;AAEA,SAAS,eAAe,MAA6B;AACnD,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,eAAe,KAAK,KAAK,WAAW,MAAM,GAAG,CAAC;AAAA,EACvD;AACA,SAAO,KAAK;AACd;AAEA,SAAS,mBAA2B;AAClC,SAAO,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,cAAcA,OAAK,QAAQ,GAAG,QAAQ;AACzF;AAEA,eAAe,aAAa,MAAsC;AAChE,MAAI;AACF,WAAO,MAAMG,WAAS,MAAM,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeJ,QAAO,MAAgC;AACpD,MAAI;AACF,UAAMK,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AGrIA,SAAS,SAAAC,QAAO,YAAAC,YAAU,QAAAC,aAAY;AACtC,SAAS,WAAAC,UAAS,QAAAC,cAAY;;;ACIvB,SAAS,iBAAiB,WAAwB,kBAA4D;AACnH,SAAO,qBAAqB,IAAI,CAAC,aAAa;AAAA,IAC5C,MAAM,sBAAsB,OAAO;AAAA,IACnC,SAAS,YAAY,SAAS,QAAQ;AAAA,EACxC,EAAE;AACJ;AAEO,SAAS,eAAe,WAAwB,kBAAqD;AAC1G,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,cAEC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMV,aAAa,OAAO,sDAAsD,+EAAmB;AAAA;AAAA;AAAA;AAAA,EAI1G,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7B;AACF;AAEA,SAAS,YAAY,SAA4B,UAA+B;AAC9E,QAAM,QAAQ,sBAAsB,SAAS,YAAY,gBAAgB,cAAc,EAAE;AACzF,MAAI,YAAY,gBAAgB;AAC9B,WAAO;AAAA;AAAA,cAEG,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQV,aAAa,OAAO,mDAAmD,sEAAmC;AAAA;AAAA;AAAA;AAAA,EAIvH,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa7B;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO;AAAA;AAAA,cAEG,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQV,aAAa,OAAO,gEAAgE,gFAA8B;AAAA;AAAA;AAAA;AAAA,EAI/H,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA,EAG7B,aAAa,OACT;AAAA;AAAA;AAAA;AAAA,8MAKA;AAAA;AAAA;AAAA;AAAA,mTAKN;AAAA;AAAA,EAEE;AAEA,SAAO;AAAA;AAAA,cAEK,WAAW;AAAA;AAAA;AAAA,WAGd,KAAK;AAAA;AAAA;AAAA;AAAA,YAIJ,OAAO;AAAA,eACJ,aAAa,OAAO,4BAA4B,OAAO,gCAAgC,kEAA0B,OAAO,qBAAM;AAAA;AAAA;AAAA;AAAA,EAI3I,qBAAqB,SAAS,QAAQ,CAAC;AAAA;AAAA,EAEvC,oBAAoB,QAAQ,CAAC;AAAA;AAAA,gGAEK,OAAO,kGAA4B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5E,KAAK;AAAA;AAAA;AAAA;AAAA;AAKP;;;AD/HO,IAAM,gBAAN,MAA2C;AAAA,EACvC,OAAO;AAAA,EACP,iBAAiB;AAAA,EAE1B,MAAM,OAAO,aAAqB;AAChC,WAAO;AAAA,MACL,UAAU,MAAMC,QAAOC,OAAK,aAAa,SAAS,CAAC;AAAA,MACnD,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,cAAsB,UAAkD;AACxF,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,OAAO,CAAC,GAAG,iBAAiB,QAAQ,GAAG,eAAe,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,QAC9E,GAAG;AAAA,QACH,SAAS;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,aAAqB,MAAuB,QAAQ,OAAmC;AACnG,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAoB,CAAC;AAE3B,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,SAASA,OAAK,aAAa,KAAK,IAAI;AAC1C,YAAM,WAAW,MAAMC,cAAa,MAAM;AAC1C,UAAI,YAAY,CAAC,SAAS,SAAS,aAAa,KAAK,CAAC,OAAO;AAC3D,cAAM,IAAI,SAAS;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,UACT,SAAS,EAAE,MAAM,KAAK,KAAK;AAAA,UAC3B,kBAAkB;AAAA,QACpB,CAAC;AAAA,MACH;AACA,UAAI,YAAY,CAAC,SAAS,SAAS,aAAa,KAAK,OAAO;AAC1D,cAAM,aAAa,MAAM;AAAA,MAC3B;AACA,YAAMC,OAAMC,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,YAAM,YAAY,QAAQ,KAAK,OAAO;AACtC,cAAQ,KAAK,KAAK,IAAI;AAAA,IACxB;AAEA,WAAO,EAAE,MAAM,KAAK,MAAM,SAAS,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,aAA6C;AACxD,UAAM,OAAO,MAAM,KAAK,YAAY,WAAW;AAC/C,UAAM,SAAwB,CAAC;AAC/B,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,SAASH,OAAK,aAAa,KAAK,IAAI;AAC1C,YAAM,UAAU,MAAMC,cAAa,MAAM;AACzC,YAAM,UAAU,QAAQ,SAAS,SAAS,aAAa,CAAC;AACxD,YAAM,iBAAiB,QAAQ,SAAS,SAAS,mBAAmB,KAAK,cAAc,EAAE,CAAC;AAC1F,aAAO,KAAK;AAAA,QACV,IAAI,UAAU,KAAK,IAAI;AAAA,QACvB,QAAQ,CAAC,UAAU,SAAS,WAAW,iBAAiB,SAAS;AAAA,QACjE,SAAS,CAAC,UACN,GAAG,KAAK,IAAI,kBACZ,CAAC,UACC,GAAG,KAAK,IAAI,iEACZ,CAAC,iBACC,GAAG,KAAK,IAAI,uCACZ,GAAG,KAAK,IAAI;AAAA,QACpB,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,aAAa;AAAA,MAC3E,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAeA,cAAa,MAAsC;AAChE,MAAI;AACF,WAAO,MAAMG,WAAS,MAAM,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeL,QAAO,MAAgC;AACpD,MAAI;AACF,UAAMM,MAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AEjGA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;;;ACD1B,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAC9B,SAAS,QAAAC,cAAY;AAGrB,eAAsB,uBAAuB,aAAyD;AACpG,QAAM,eAAeA,OAAK,aAAa,UAAU;AACjD,QAAM,cAAcA,OAAK,cAAc,SAAS;AAChD,QAAM,oBAAoBA,OAAK,cAAc,SAAS;AACtD,QAAM,qBAAqBA,OAAK,aAAa,SAAS;AAEtD,SAAO;AAAA,IACL,QAAQ,MAAMC,QAAO,YAAY;AAAA,IACjC,SAAS,MAAM,gBAAgB,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;AAAA,IACpE,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,MAAM,gBAAgB,iBAAiB,GAAI,GAAI,MAAM,gBAAgB,kBAAkB,CAAE,CAAC,CAAC;AAAA,EACxH;AACF;AAEA,eAAsB,sBACpB,aACA,UACmC;AACnC,QAAM,aAAaD,OAAK,aAAa,YAAY,WAAW,QAAQ;AACpE,QAAM,YAAYA,OAAK,YAAY,UAAU;AAC7C,QAAM,YAAYA,OAAK,YAAY,OAAO;AAE1C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,MAAMC,QAAO,UAAU;AAAA,IAC/B,aAAa,MAAMA,QAAOD,OAAK,YAAY,aAAa,CAAC;AAAA,IACzD,UAAU,MAAMC,QAAO,SAAS;AAAA,IAChC,UAAU,MAAMA,QAAO,SAAS;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,MAAc,UAAkC,CAAC,GAAsB;AACpG,MAAI;AACF,UAAM,UAAU,MAAMH,SAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3D,UAAM,WAAW,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC;AAC9C,WAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC9G,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAeG,QAAO,MAAgC;AACpD,MAAI;AACF,UAAMF,OAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACrDA,SAAS,YAAAG,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAK1B,IAAMC,iBAAgBC,WAAUC,SAAQ;AAExC,eAAsB,4BAAuD;AAC3E,QAAM,iBAAiB,MAAM,eAAe;AAC5C,QAAM,UAAU,MAAM,YAAY,cAAc;AAChD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF;AAEA,eAAe,iBAAkC;AAC/C,QAAM,UAAU,QAAQ,aAAa,UAAU,cAAc;AAC7D,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC,UAAU,CAAC;AACnD,UAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,MAAM,UAAU,qBAAqB,IAAI,IAAI,qBAAqB,KAAK,CAAC,EAC9E,KAAK,OAAO;AACf,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,KAAK,OAAO,CAAC,YAAY,WAAW,CAAC;AAC3C,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,MAAsB;AAClD,MAAI,QAAQ,aAAa,WAAW,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AACvE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,YAAY,gBAAyC;AAClE,QAAM,UAAU,mBAAmB,iBAAiB,QAAQ;AAC5D,QAAM,OAAO,mBAAmB,iBAAiB,CAAC,YAAY,WAAW,IAAI,CAAC,WAAW;AACzF,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI;AACnD,WAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EAC3C,SAAS,OAAO;AACd,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,SAAS,EAAE,eAAe;AAAA,MAC1B,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,SAAS,KAAK,SAAiB,MAAgB;AAC7C,SAAOF,eAAc,SAAS,MAAM,EAAE,OAAO,QAAQ,aAAa,QAAQ,CAAC;AAC7E;;;ACvEA,SAAS,SAAAG,cAAa;AAKtB,eAAsB,YACpB,gBACA,SACA,MACA,SAC4B;AAC5B,QAAM,eAAe,mBAAmB,iBAAiB,QAAQ;AACjE,QAAM,YAAY,mBAAmB,iBAAiB,CAAC,YAAY,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;AAExG,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,UAAM,SAAmB,CAAC;AAC1B,UAAM,QAAQC,OAAM,cAAc,WAAW;AAAA,MAC3C,KAAK,QAAQ;AAAA,MACb,OAAO,QAAQ,SAAS;AAAA,MACxB,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AAED,QAAI,MAAM,QAAQ;AAChB,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAAA,IAC/D;AACA,QAAI,MAAM,QAAQ;AAChB,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAAA,IAC/D;AAEA,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B;AAAA,QACE,IAAI,SAAS;AAAA,UACX;AAAA,UACA,SAAS;AAAA,UACT,SAAS,EAAE,SAAS,KAAK;AAAA,UACzB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU,WAAW;AACtC,MAAAD,SAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,YAAY;AAAA,QACtB;AAAA,QACA,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,QACjE,QAAQ,OAAO,SAAS,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,MACnE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AHrCA,IAAME,iBAAgBC,WAAUC,SAAQ;AAEjC,IAAM,yBAAN,MAAwD;AAAA,EACrD;AAAA,EAER,MAAM,oBAA+C;AACnD,SAAK,aAAa,MAAM,0BAA0B;AAClD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,kBAAiD;AACrD,UAAM,WAAW,MAAM,KAAK,kBAAkB;AAC9C,UAAM,aAAa,SAAS,mBAAmB,iBAAiB,QAAQ,SAAS;AACjF,UAAM,OAAO,SAAS,mBAAmB,iBAAiB,CAAC,YAAY,QAAQ,IAAI,CAAC,QAAQ;AAE5F,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAMF,eAAc,YAAY,MAAM,EAAE,OAAO,QAAQ,aAAa,QAAQ,CAAC;AAChG,aAAO;AAAA,QACL,SAAS,SAAS;AAAA,QAClB,UAAU,cAAc,MAAM;AAAA,QAC9B,WAAW;AAAA,MACb;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,SAAS,SAAS;AAAA,QAClB,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,SAAiB,MAAgB,SAAyD;AAClG,UAAM,WAAW,MAAM,KAAK,kBAAkB;AAC9C,WAAO,YAAY,SAAS,gBAAgB,SAAS,MAAM,OAAO;AAAA,EACpE;AAAA,EAEA,eAAe,aAAyD;AACtE,WAAO,uBAAuB,WAAW;AAAA,EAC3C;AAAA,EAEA,cAAc,aAAqB,UAAqD;AACtF,WAAO,sBAAsB,aAAa,QAAQ;AAAA,EACpD;AACF;AAEA,SAAS,cAAc,MAAwB;AAC7C,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM,OAAO,CAAC,YAAY,IAAI,OAAO,MAAM,aAAa,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC;AAC1F;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;AI/FA,SAAS,WAAAG,UAAS,QAAAC,cAAY;AAC9B,SAAS,QAAAC,QAAM,YAAAC,WAAU,WAAW;AAGpC,eAAsB,WAAW,aAA8C;AAC7E,QAAM,aAAa,CAAC,cAAc,aAAa,OAAO,OAAO;AAC7D,QAAM,SAAyB,CAAC;AAEhC,aAAW,aAAa,YAAY;AAClC,UAAM,OAAOD,OAAK,aAAa,SAAS;AACxC,QAAI,CAAE,MAAME,QAAO,IAAI,GAAI;AACzB;AAAA,IACF;AACA,eAAW,QAAQ,MAAM,UAAU,IAAI,GAAG;AACxC,UAAI,CAAC,4BAA4B,KAAK,IAAI,GAAG;AAC3C;AAAA,MACF;AACA,aAAO,KAAK;AAAA,QACV,MAAM,eAAeD,UAAS,MAAM,IAAI,CAAC;AAAA,QACzC,QAAQA,UAAS,aAAa,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,QACvD,UAAU;AAAA,QACV,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,MAAM,GAAG,GAAG;AAC5B;AAEA,SAAS,eAAe,cAA8B;AACpD,QAAM,aAAa,aAAa,MAAM,GAAG,EAAE,KAAK,GAAG;AACnD,QAAM,aAAa,WAAW,QAAQ,6BAA6B,EAAE;AACrE,QAAM,eAAe,WAAW,QAAQ,YAAY,EAAE,EAAE,QAAQ,WAAW,EAAE;AAC7E,SAAO,IAAI,YAAY,GAAG,QAAQ,QAAQ,GAAG;AAC/C;AAEA,eAAe,UAAU,MAAiC;AACxD,QAAM,UAAU,MAAMH,SAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3D,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAOE,OAAK,MAAM,MAAM,IAAI;AAClC,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK,GAAI,MAAM,UAAU,IAAI,CAAE;AAAA,IACvC,OAAO;AACL,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAeE,QAAO,MAAgC;AACpD,MAAI;AACF,UAAMH,OAAK,IAAI;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACpDO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,MAAM,KAAK,aAAqB,WAAwB,CAAC,GAA+B;AACtF,UAAM,MAAM,MAAM,gBAAgB,WAAW;AAC7C,UAAM,iBAAiB,MAAM,qBAAqB,aAAa,GAAG;AAClE,UAAM,YAAY,gBAAgB,GAAG;AACrC,UAAM,aAAa,MAAM,iBAAiB,aAAa,GAAG;AAC1D,UAAM,WAAW,MAAM,eAAe,aAAa,GAAG;AACtD,UAAM,cAAc,MAAM,yBAAyB,WAAW;AAC9D,UAAM,WAAW,CAAC,GAAG,eAAe,QAAQ;AAC5C,QAAI,UAAU,SAAS,WAAW;AAChC,eAAS,KAAK,sEAAyB;AAAA,IACzC;AACA,QAAI,YAAY,WAAW;AACzB,eAAS,KAAK,GAAG,YAAY,QAAQ;AAAA,IACvC;AAEA,WAAO;AAAA,MACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,MAAM,KAAK,QAAQ;AAAA,QACnB,gBAAgB,eAAe;AAAA,QAC/B,0BAA0B,eAAe;AAAA,QACzC;AAAA,QACA;AAAA,QACA,UAAU,WAAW,SAAS;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,UAAU,gBAAgB,KAAK,eAAe,OAAO;AAAA,MACrD,QAAQ,MAAM,WAAW,WAAW;AAAA,MACpC,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC7BO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACmB,MACA,WAAwB,SACzC;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,KAAK,SAAiB,SAAyB;AAC7C,QAAI,CAAC,KAAK,MAAM;AACd,cAAQ,OAAO,MAAM,GAAG,OAAO,GAAG,cAAc,OAAO,CAAC;AAAA,CAAI;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,KAAK,SAAiB,SAAyB;AAC7C,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,SAAS,SAAS,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5F;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,KAAK,aAAa,OAAO,YAAY,cAAI,SAAI,OAAO,GAAG,cAAc,OAAO,CAAC;AAAA,CAAI;AAAA,EAC3G;AAAA,EAEA,MAAM,OAAuB;AAC3B,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,MAAM,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACzF;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,GAAG,KAAK,aAAa,OAAO,wBAAwB,8BAAU,SAAI,MAAM,OAAO;AAAA,CAAI;AACxG,QAAI,MAAM,YAAY,QAAW;AAC/B,cAAQ,OAAO,MAAM;AAAA,EAAK,KAAK,aAAa,OAAO,YAAY,cAAI;AAAA,EAAM,YAAY,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACzG;AACA,QAAI,MAAM,kBAAkB;AAC1B,cAAQ,OAAO,MAAM;AAAA,EAAK,KAAK,aAAa,OAAO,eAAe,cAAI;AAAA,IAAQ,MAAM,gBAAgB;AAAA,CAAI;AAAA,IAC1G;AAAA,EACF;AAAA,EAEA,OAAO,QAA6B;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAC3D;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,GAAG,OAAO,OAAO;AAAA,CAAI;AAC1C,eAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,cAAQ,OAAO,MAAM,GAAG,KAAK,aAAa,OAAO,YAAY,cAAI,SAAI,OAAO;AAAA,CAAI;AAAA,IAClF;AACA,QAAI,OAAO,WAAW,QAAQ;AAC5B,cAAQ,OAAO,MAAM;AAAA,EAAK,KAAK,aAAa,OAAO,eAAe,oBAAK;AAAA,CAAK;AAC5E,iBAAW,QAAQ,OAAO,WAAW;AACnC,gBAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,CAAI;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAA0B;AAC/C,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,KAAK,UAAU,OAAO,CAAC;AACpC;AAEA,SAAS,YAAY,SAA0B;AAC7C,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,SAAO,KAAK,UAAU,SAAS,MAAM,CAAC,EACnC,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,IAAI;AACd;;;AZ/DA,eAAsB,qBAAqB,SAAiB,SAAwB;AAClF,QAAM,cAAc,QAAQ,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACxD,QAAM,UAAU,MAAM,sBAAsB,WAAW;AACvD,QAAM,aAAa,IAAI,WAAW,aAAa,aAAa,OAAO;AACnE,QAAM,aAAa,MAAM,WAAW,WAAW;AAC/C,QAAM,WAAwB,kBAAkB,QAAQ,QAAQ,YAAY,SAAS,OAAO;AAC5F,QAAM,SAAS,IAAI,aAAa,QAAQ,QAAQ,IAAI,GAAG,QAAQ;AAE/D,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA,OAAO,QAAQ,QAAQ,OAAO,KAAK;AAAA,IACnC,MAAM,QAAQ,QAAQ,IAAI;AAAA,IAC1B,SAAS,QAAQ,QAAQ,OAAO;AAAA,IAChC,KAAK,QAAQ,QAAQ,GAAG;AAAA,IACxB,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,kBAAkB,QAAQ,SAAS;AAAA,IACnC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,UAAU,IAAI,uBAAuB;AAAA,IACrC,SAAS,IAAI,eAAe;AAAA,IAC5B,cAAc,CAAC,IAAI,cAAc,GAAG,IAAI,aAAa,CAAC;AAAA,EACxD;AACF;;;Aa5CA,SAAS,mBAAAI,wBAAuB;;;ACAhC,SAAS,SAAAC,SAAO,YAAAC,YAAU,iBAAiB;AAC3C,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,WAAS,QAAAC,cAAY;AAkB9B,IAAM,uBAAuB,IAAI,KAAK,KAAK;AAEpC,SAAS,sBAAsB,MAAyB,QAAQ,KAAyB;AAC9F,QAAM,QAAQ,IAAI,kBAAkB,KAAK,EAAE,YAAY;AACvD,MAAI,UAAU,SAAS,IAAI,0BAA0B,KAAK;AACxD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,WAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,+BAA+B,SAA0B;AACvE,SAAO,YAAY;AACrB;AAEA,eAAsB,6BAA6B,gBAA+D;AAChH,QAAM,cAAc,kBAAkB;AACtC,QAAM,QAAQ,MAAM,qBAAqB;AACzC,QAAM,QAAQ,OAAO,SAAS,QAAQ,IAAI,2BAA2B,IAAI,EAAE;AAC3E,QAAM,aAAa,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AAEjE,MAAI,gBAAgB,OAAO;AAC3B,QAAM,aAAa,OAAO,YAAY,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,SAAS,IAAI,aAAa;AAE9F,MAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,QAAI;AACF,sBAAgB,MAAM,wBAAwB,WAAW;AACzD,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,wBAAwB,OAAO;AAAA,MACjC,CAAC;AAAA,IACH,QAAQ;AACN,UAAI,OAAO,eAAe;AACxB,wBAAgB,MAAM;AAAA,MACxB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB,aAAa,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,2BAA2B,eAAe;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,2BAA2B,eAAsC;AACrF,QAAM,QAAS,MAAM,qBAAqB,KAAM;AAAA,IAC9C;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAM,sBAAsB;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,wBAAwB;AAAA,EAC1B,CAAC;AACH;AAEO,SAAS,uBAAuB,cAAqC,UAA+B;AACzG,MAAI,aAAa,MAAM;AACrB,WAAO,qCAAqC,aAAa,cAAc,OAAO,aAAa,aAAa;AAAA,EAC1G;AACA,SAAO,qEAAmB,aAAa,cAAc,sBAAO,aAAa,aAAa;AACxF;AAEA,SAAS,YAAoB;AAC3B,QAAM,OAAO,QAAQ,IAAI,6BAA6B,KAAK,KAAKC,SAAQ;AACxE,SAAOC,OAAK,MAAM,QAAQ,yBAAyB;AACrD;AAEA,eAAe,uBAAyD;AACtE,MAAI;AACF,UAAM,MAAM,MAAMC,WAAS,UAAU,GAAG,MAAM;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,OAAO,kBAAkB,YAAY,OAAO,OAAO,cAAc,UAAU;AACpF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,eAAe,OAAO;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,wBAAwB,OAAO,OAAO,2BAA2B,WAAW,OAAO,yBAAyB;AAAA,IAC9G;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBAAsB,OAAwC;AAC3E,QAAM,OAAO,UAAU;AACvB,QAAMC,QAAMC,UAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACrE;;;ADjHA,eAAsB,qBAAqB,KAAuC;AAChF,MAAI,CAAC,+BAA+B,IAAI,OAAO,GAAG;AAChD;AAAA,EACF;AAEA,QAAM,OAAO,sBAAsB;AACnC,MAAI,SAAS,OAAO;AAClB;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,6BAA6B,IAAI,UAAU;AACtE,MAAI,CAAC,cAAc;AACjB;AAAA,EACF;AAEA,QAAM,UAAU,uBAAuB,cAAc,IAAI,QAAQ;AACjE,MAAI,OAAO,KAAK,OAAO;AAEvB,QAAM,eAAe,QAAQ,IAAI,mCAAmC;AACpE,QAAM,cACJ,SAAS,aAAa,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,gBAAiB,QAAQ,MAAM,SAAS,QAAQ,OAAO;AACzG,MAAI,CAAC,aAAa;AAChB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,sBAAsB,cAAc,IAAI,QAAQ;AACrE,MAAI,WAAW,QAAQ;AACrB,UAAM,2BAA2B,aAAa,aAAa;AAC3D;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,IAAI,aAAa,OAAO,yCAAyC;AAAA,MAC1E,SAAS;AAAA,MACT,kBAAkB,IAAI,aAAa,OAAO,eAAe;AAAA,IAC3D,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,aAAa,gBAAgB,aAAa,eAAe;AAAA,IAC9E,KAAK,IAAI;AAAA,IACT,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,MAAM,CAAC,YAAY,IAAI,OAAO,KAAK,OAAO;AAAA,EAC5C,CAAC;AAED,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA,SACE,IAAI,aAAa,OACb,kBAAkB,aAAa,aAAa,iDAC5C,gCAAY,aAAa,aAAa;AAAA,IAC5C,SAAS;AAAA,IACT,kBAAkB,OAAO,IAAI,OAAO;AAAA,EACtC,CAAC;AACH;AAEA,eAAe,sBACb,cACA,UACuC;AACvC,QAAM,KAAKC,iBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,UAAM,WACJ,aAAa,OACT,mBAAmB,aAAa,cAAc,OAAO,aAAa,aAAa,0CAC/E,iDAAc,aAAa,cAAc,OAAO,aAAa,aAAa;AAChF,UAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,GAAG,KAAK,EAAE,YAAY;AAChE,QAAI,WAAW,OAAO,WAAW,YAAY,WAAW,gBAAM;AAC5D,aAAO;AAAA,IACT;AACA,QAAI,WAAW,OAAO,WAAW,YAAY,WAAW,gBAAM;AAC5D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;A/CzEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,KAAK,EACV,YAAY,sGAA2B,EACvC,wBAAwB,EACxB,QAAQ,WAAW,EACnB,OAAO,gBAAgB,4CAAS,EAChC,OAAO,iBAAiB,8BAAoB,EAC5C,OAAO,qBAAqB,6GAA6B,EACzD,OAAO,SAAS,0EAAc,EAC9B,OAAO,UAAU,2CAAa,EAC9B,OAAO,aAAa,sCAAQ,EAC5B,OAAO,cAAc,sCAAQ;AAEhC,iBAAiB,QAAQ,QAAQ,MAAM,CAAC,EAAE,YAAY,mCAAoB,EAAE,OAAO,KAAK,QAAQ,WAAW,CAAC;AAC5G,iBAAiB,QAAQ,QAAQ,QAAQ,CAAC,EAAE,YAAY,mHAAyB,EAAE,OAAO,KAAK,UAAU,aAAa,CAAC;AACvH,iBAAiB,QAAQ,QAAQ,gBAAgB,CAAC,EAAE,YAAY,4CAAS,EAAE,OAAO,KAAK,kBAAkB,oBAAoB,CAAC;AAC9H,iBAAiB,QAAQ,QAAQ,cAAc,CAAC,EAAE,YAAY,0FAA8B,EAAE,OAAO,KAAK,gBAAgB,kBAAkB,CAAC;AAE7I,IAAM,QAAQ,iBAAiB,QAAQ,QAAQ,OAAO,EAAE,YAAY,wEAAsB,CAAC;AAC3F,WAAW,UAAU,CAAC,UAAU,SAAS,UAAU,SAAS,GAAY;AACtE,mBAAiB,MAAM,QAAQ,MAAM,EAAE,YAAY,0BAAgB,MAAM,EAAE,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC,QAAQ,aAAa,KAAK,MAAM,CAAC,CAAC;AACxI;AACA,WAAW,UAAU,CAAC,QAAQ,SAAS,GAAY;AACjD;AAAA,IACE,MACG,QAAQ,GAAG,MAAM,YAAY,EAC7B,YAAY,oDAAgC,MAAM,EAAE,EACpD,mBAAmB,IAAI,EACvB,mBAAmB;AAAA,EACxB,EAAE,OAAO,KAAK,SAAS,CAAC,KAAK,OAAiB,CAAC,MAAM,aAAa,KAAK,QAAuB,IAAI,CAAC,CAAC;AACtG;AAEA,iBAAiB,QAAQ,QAAQ,QAAQ,EAAE,YAAY,oEAAa,EAAE,OAAO,cAAc,qCAAY,CAAC,EAAE;AAAA,EACxG,KAAK,UAAU,CAAC,KAAK,YAAmC,cAAc,KAAK,EAAE,SAAS,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC;AACnH;AAEA,iBAAiB,QAAQ,QAAQ,QAAQ,EAAE,YAAY,sCAAQ,EAAE,OAAO,UAAU,wDAAW,EAAE,OAAO,UAAU,oEAAa,CAAC,EAAE;AAAA,EAC9H,KAAK,UAAU,aAAa;AAC9B;AAEA,WAAW,WAAW,CAAC,WAAW,WAAW,OAAO,YAAY,MAAM,SAAS,QAAQ,WAAW,gBAAgB,SAAS,GAAG;AAC5H,mBAAiB,QAAQ,QAAQ,GAAG,OAAO,YAAY,EAAE,YAAY,qCAAiB,OAAO,EAAE,EAAE,mBAAmB,IAAI,EAAE,mBAAmB,CAAC,EAAE;AAAA,IAC9I,KAAK,SAAS,CAAC,KAAK,OAAiB,CAAC,MAAM,aAAa,KAAK,SAAS,IAAI,CAAC;AAAA,EAC9E;AACF;AAEA,iBAAiB,QAAQ,QAAQ,iCAAiC,EAAE,YAAY,kEAAqB,EAAE,mBAAmB,IAAI,EAAE,mBAAmB,CAAC,EAAE;AAAA,EACpJ,KAAK,eAAe,CAAC,KAAK,SAAiB,OAAiB,CAAC,MAAM,mBAAmB,KAAK,SAAS,IAAI,CAAC;AAC3G;AAEA,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAU;AAChD,QAAM,OAAO,QAAQ,KAAK,SAAS,QAAQ;AAC3C,QAAM,SAAS,IAAI,aAAa,IAAI;AACpC,QAAM,WAAW,WAAW,KAAK;AACjC,SAAO,MAAM,QAAQ;AACrB,UAAQ,WAAW,SAAS;AAC9B,CAAC;AAED,SAAS,KACP,SACA,SACA;AACA,SAAO,UAAU,SAAY;AAC3B,UAAM,eAAe,KAAK,KAAK,SAAS,CAAC;AACzC,UAAM,OAAO,cAAc,YAAY,IAClC,EAAE,GAAI,aAAa,QAAQ,KAAK,GAAqB,GAAI,aAAa,KAAK,EAAoB,IAC/F,QAAQ,KAAK;AAClB,UAAM,MAAM,MAAM,qBAAqB,SAAS,EAAE,GAAG,MAAM,GAAG,qBAAqB,IAAI,EAAE,CAAC;AAC1F,QAAI;AACF,YAAM,qBAAqB,GAAG;AAC9B,YAAM,gCAAgC,GAAG;AACzC,YAAM,gCAAgC,GAAG;AACzC,YAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,IAC5B,SAAS,OAAO;AACd,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,OAAO,MAAM,QAAQ;AACzB,cAAQ,WAAW,SAAS;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,eAAe,gCAAgC,KAAsE;AACnH,QAAM,WAAW,8BAA8B,IAAI,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,UAAU,0BAA0B,UAAU,IAAI,QAAQ;AAChE,QAAM,aAAa,mBAAmB;AACtC,MAAI,OAAO,KAAK,GAAG,OAAO,IAAI,4BAA4B,YAAY,IAAI,QAAQ,CAAC,EAAE;AAErF,MAAI,eAAe,aAAa,IAAI,OAAO,IAAI,QAAQ,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACpG;AAAA,EACF;AAEA,QAAM,KAAKC,iBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,UAAM,WAAW,IAAI,aAAa,OAAO,4BAA4B;AACrE,UAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,GAAG,KAAK,EAAE,YAAY;AAChE,QAAI,WAAW,OAAO,WAAW,OAAO;AACtC,YAAM,IAAI,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,IAAI,aAAa,OAAO,mDAAmD;AAAA,QACpF,SAAS,EAAE,SAAS,IAAI,SAAS,UAAU,SAAS,UAAU,aAAa,SAAS,YAAY;AAAA,QAChG,kBAAkB,IAAI,aAAa,OAAO,oCAAoC,IAAI,OAAO,MAAM,mEAAsB,IAAI,OAAO;AAAA,MAClI,CAAC;AAAA,IACH;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,SAAS,4BAA4B,YAAmD,UAAgF;AACtK,MAAI,eAAe,WAAW;AAC5B,WAAO,aAAa,OAChB,uEACA;AAAA,EACN;AACA,SAAO,aAAa,OAChB,+EACA;AACN;AAEA,eAAe,gCAAgC,KAAsE;AACnH,MAAI,CAAC,QAAQ,UAAU,kBAAkB,gBAAgB,QAAQ,EAAE,SAAS,IAAI,OAAO,GAAG;AACxF;AAAA,EACF;AACA,QAAMC,SAAQ,MAAM,2BAA2B,IAAI,WAAW;AAC9D,MAAIA,SAAQ,GAAG;AACb,QAAI,OAAO,KAAK,+BAA+BA,QAAO,IAAI,QAAQ,CAAC;AAAA,EACrE;AACF;AAEA,SAAS,cAAc,OAAkC;AACvD,SAAO,iBAAiB;AAC1B;AAEA,SAAS,iBAAiB,SAA2B;AACnD,SAAO,QACJ,OAAO,gBAAgB,4CAAS,EAChC,OAAO,iBAAiB,8BAAoB,EAC5C,OAAO,qBAAqB,6GAA6B,EACzD,OAAO,SAAS,0EAAc,EAC9B,OAAO,UAAU,2CAAa,EAC9B,OAAO,aAAa,sCAAQ,EAC5B,OAAO,cAAc,sCAAQ;AAClC;AAEA,SAAS,qBAAqB,MAAgC;AAC5D,QAAM,SAAS,KAAK,QAAQ,CAAC,QAAS,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,CAAE;AACpE,QAAM,UAAyB,CAAC;AAChC,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,OAAO,UAAU,UAAU;AAC7B;AAAA,IACF;AACA,QAAI,UAAU,WAAW,OAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AAC9D,cAAQ,MAAM,OAAO,QAAQ,CAAC;AAC9B,eAAS;AAAA,IACX,WAAW,MAAM,WAAW,QAAQ,GAAG;AACrC,cAAQ,MAAM,MAAM,MAAM,SAAS,MAAM;AAAA,IAC3C,WAAW,UAAU,cAAc,OAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AACxE,cAAQ,SAAS,OAAO,QAAQ,CAAC;AACjC,eAAS;AAAA,IACX,WAAW,MAAM,WAAW,WAAW,GAAG;AACxC,cAAQ,SAAS,MAAM,MAAM,YAAY,MAAM;AAAA,IACjD,WAAW,UAAU,YAAY,OAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AACtE,cAAQ,OAAO,OAAO,QAAQ,CAAC;AAC/B,eAAS;AAAA,IACX,WAAW,MAAM,WAAW,SAAS,GAAG;AACtC,cAAQ,OAAO,MAAM,MAAM,UAAU,MAAM;AAAA,IAC7C,WAAW,UAAU,SAAS;AAC5B,cAAQ,MAAM;AAAA,IAChB,WAAW,UAAU,UAAU;AAC7B,cAAQ,OAAO;AAAA,IACjB,WAAW,UAAU,aAAa;AAChC,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;","names":["createInterface","readFile","stat","join","count","dirname","join","dirname","join","mkdir","open","readFile","join","mkdir","dirname","open","readFile","join","readFile","join","stat","join","relative","graph","join","readFile","count","stat","mkdir","dirname","join","readFile","join","readFile","stat","join","readFile","stat","join","locks","exists","join","exists","readFile","stat","formatBytes","join","readFile","join","mkdir","dirname","mkdir","dirname","join","mkdir","readdir","readFile","dirname","join","join","graph","mkdir","dirname","readdir","readFile","join","graph","firstLine","mkdir","dirname","stat","join","readFile","join","readFile","dirname","join","parse","join","readOptional","readFile","exists","join","stat","readFile","join","execFile","promisify","execFileAsync","mkdir","readFile","join","readFile","mkdir","join","readFile","join","readOptional","readFile","resolve","mkdir","readFile","stat","join","join","mkdir","stat","readFile","switchHint","mkdir","readFile","stat","dirname","join","exists","join","mkdir","dirname","readFile","stat","mkdir","readFile","stat","dirname","join","exists","join","readExisting","mkdir","dirname","readFile","stat","execFile","promisify","readdir","stat","join","exists","execFile","promisify","execFileAsync","promisify","execFile","spawn","resolve","spawn","execFileAsync","promisify","execFile","readdir","stat","join","relative","exists","createInterface","mkdir","readFile","homedir","dirname","join","homedir","join","readFile","mkdir","dirname","createInterface","createInterface","count"]}
|