@agntn/harnesses 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"agents-sync.mjs","names":["delay","readIfExists","parseToml"],"sources":["../../src/resolve.ts","../../src/harness.ts","../../src/harnesses/antigravity.ts","../../src/harnesses/claude.ts","../../src/harnesses/codex.ts","../../src/harnesses/cursor.ts","../../src/harnesses/freebuff.ts","../../src/harnesses/gemini.ts","../../src/harnesses/github-copilot.ts","../../src/harnesses/grok.ts","../../src/harnesses/mastracode.ts","../../src/harnesses/omp.ts","../../src/harnesses/opencode.ts","../../src/harnesses/pi.ts","../../src/harnesses/prime-agent.ts","../../src/harnesses/index.ts","../../src/registry.ts","../../src/mcp-servers.ts","../../src/agents-sync.ts"],"sourcesContent":["import os from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ResolveOptions } from \"./types.ts\";\n\n/**\n * Every marker a path template can carry, matched in one pass so a substituted\n * value is never scanned for markers again.\n */\nconst PATH_MARKERS = /^~(?=\\/|$)|\\$\\{HOME\\}|\\$\\{PROJECT_ROOT\\}|%([^%]+)%/g;\n\nexport function resolvePathTemplate(template: string, options: ResolveOptions = {}): string {\n const homeDir = options.homeDir ?? os.homedir();\n const projectRoot = options.projectRoot ?? process.cwd();\n\n return template.replaceAll(PATH_MARKERS, (match: string, name: string | undefined) => {\n if (match === \"${PROJECT_ROOT}\") return projectRoot;\n if (name === undefined) return homeDir;\n return process.env[name] ?? match;\n });\n}\n\n/**\n * The agntn config directory: $XDG_CONFIG_HOME/agntn or ~/.config/agntn.\n *\n * @param options - Path-resolution overrides.\n * @returns {string} The resolved agntn configuration directory.\n */\nexport function agntnConfigDir(options: ResolveOptions = {}): string {\n const base =\n process.env.XDG_CONFIG_HOME && process.env.XDG_CONFIG_HOME !== \"\"\n ? process.env.XDG_CONFIG_HOME\n : join(options.homeDir ?? os.homedir(), \".config\");\n return join(base, \"agntn\");\n}\n","import { addAbortListener } from \"node:events\";\nimport { existsSync } from \"node:fs\";\nimport { execFile, execFileSync, spawn } from \"node:child_process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { join } from \"node:path\";\nimport type {\n HarnessDetection,\n HarnessId,\n HarnessInvocation,\n HarnessInvocationModes,\n HarnessModelListing,\n InvokeOptions,\n InvokeResult,\n ListModelsOptions,\n ListModelsResult,\n AvailableModel,\n McpConfigFile,\n PathCandidate,\n StorageDescriptor,\n HarnessCapabilities,\n ResolveOptions,\n ResolvedPaths,\n Platform,\n} from \"./types.ts\";\nimport { resolvePathTemplate } from \"./resolve.ts\";\n\nconst SUPPORTED_PLATFORMS: Record<Platform, true> = {\n linux: true,\n darwin: true,\n win32: true,\n};\n\ntype CommandOptions = Readonly<{\n cwd?: string;\n env?: Readonly<Record<string, string>>;\n timeoutMs?: number;\n signal?: AbortSignal;\n}>;\n\ntype InvocationOptions = Readonly<{\n model?: string;\n structured?: boolean;\n tools?: boolean;\n readOnly?: boolean;\n}>;\n\ntype InvocationMode = keyof HarnessInvocationModes;\n\nconst ALTERNATE_INVOCATION_MODE: Partial<Record<InvocationMode, InvocationMode>> = {\n advisor: \"agent\",\n advisorStructured: \"agentStructured\",\n agent: \"advisor\",\n agentStructured: \"advisorStructured\",\n};\n\nconst INVOCATION_MODE_DESCRIPTION: Record<InvocationMode, string> = {\n advisor: \"advisor without tools\",\n advisorStructured: \"structured (JSON) advisor without tools\",\n readOnly: \"read-only full agent\",\n readOnlyStructured: \"structured (JSON) read-only full agent\",\n agent: \"full agent\",\n agentStructured: \"structured (JSON) full agent\",\n};\n\nconst INVOCATION_RETRY_HINT: Partial<Record<InvocationMode, string>> = {\n advisor: \"; retry with tools: true to start its full agent\",\n advisorStructured: \"; retry with tools: true to start its full agent\",\n agent: \"; retry with tools: false to use its advisor without tools\",\n agentStructured: \"; retry with tools: false to use its advisor without tools\",\n};\n\nfunction requestedInvocationMode(options: InvocationOptions): InvocationMode {\n if (options.readOnly === true) {\n return options.structured === true ? \"readOnlyStructured\" : \"readOnly\";\n }\n if (options.tools === true) return options.structured === true ? \"agentStructured\" : \"agent\";\n return options.structured === true ? \"advisorStructured\" : \"advisor\";\n}\n\nfunction invocationTemplate(\n invocation: HarnessInvocation,\n mode: InvocationMode,\n): readonly string[] | undefined {\n switch (mode) {\n case \"advisor\":\n return invocation.noToolsArgs;\n case \"advisorStructured\":\n return invocation.noToolsJsonArgs;\n case \"readOnly\":\n return invocation.readOnlyArgs;\n case \"readOnlyStructured\":\n return invocation.readOnlyJsonArgs;\n case \"agent\":\n return invocation.args;\n case \"agentStructured\":\n return invocation.jsonArgs;\n }\n}\n\nfunction invocationRetryHint(\n invocation: HarnessInvocation,\n mode: InvocationMode,\n options: InvocationOptions,\n): string {\n const withoutStructured = requestedInvocationMode({ ...options, structured: false });\n if (options.structured === true) {\n if (invocationTemplate(invocation, withoutStructured)) {\n return \"; retry with structured: false\";\n }\n const alternateWithoutStructured = ALTERNATE_INVOCATION_MODE[withoutStructured];\n if (\n alternateWithoutStructured !== undefined &&\n invocationTemplate(invocation, alternateWithoutStructured)\n ) {\n return `; retry with structured: false and tools: ${!options.tools}`;\n }\n }\n\n const alternateMode = ALTERNATE_INVOCATION_MODE[mode];\n const alternateAvailable =\n alternateMode === undefined ? undefined : invocationTemplate(invocation, alternateMode);\n return alternateAvailable ? (INVOCATION_RETRY_HINT[mode] ?? \"\") : \"\";\n}\n\n/**\n * Orders two dotted versions numerically; a pre-release tag sorts below its release.\n *\n * @param a - Left version.\n * @param b - Right version.\n * @returns {number} Negative when a is older, positive when newer, zero when equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const [aBase = \"\", aPre] = a.split(\"-\", 2);\n const [bBase = \"\", bPre] = b.split(\"-\", 2);\n const left = aBase.split(\".\").map(Number);\n const right = bBase.split(\".\").map(Number);\n for (let i = 0; i < Math.max(left.length, right.length); i++) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return Number(aPre === undefined) - Number(bPre === undefined);\n}\n\nfunction buildInvocationArgs(\n template: readonly string[],\n prompt: string,\n modelArgs: readonly string[] | undefined,\n model: string | undefined,\n): string[] {\n const args = template.map((arg) => arg.replaceAll(\"{prompt}\", () => prompt));\n if (model !== undefined && modelArgs) {\n args.push(...modelArgs.map((arg) => arg.replaceAll(\"{model}\", () => model)));\n }\n return args;\n}\n\nfunction signalProcessGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if (!(error instanceof Error && \"code\" in error && error.code === \"ESRCH\")) throw error;\n }\n}\n\n/**\n * Keep escalation alive even when the root exits before its descendants.\n * @param pid - Root of the command's process group or Windows tree.\n */\nasync function terminateCommand(pid: number): Promise<void> {\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve, reject) => {\n execFile(\n join(process.env.SystemRoot ?? \"C:\\\\Windows\", \"System32\", \"taskkill.exe\"),\n [\"/PID\", String(pid), \"/T\", \"/F\"],\n { windowsHide: true, timeout: 2000, killSignal: \"SIGKILL\" },\n (error) => (error ? reject(error) : resolve()),\n );\n });\n return;\n }\n\n signalProcessGroup(pid, \"SIGTERM\");\n await delay(500);\n signalProcessGroup(pid, \"SIGKILL\");\n}\n\nfunction executeCommand(\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): Promise<InvokeResult> {\n return new Promise((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let stopped: \"timeout\" | \"abort\" | undefined;\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let abortListener: ReturnType<typeof addAbortListener> | undefined;\n\n if (options.signal?.aborted) {\n stopped = \"abort\";\n finish(null);\n return;\n }\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached:\n process.platform !== \"win32\" &&\n (Boolean(options.timeoutMs) || options.signal !== undefined),\n });\n\n if (options.timeoutMs) timer = setTimeout(() => stop(\"timeout\"), options.timeoutMs);\n if (options.signal) abortListener = addAbortListener(options.signal, () => stop(\"abort\"));\n\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\");\n });\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", fail);\n child.on(\"close\", (code) => {\n if (stopped === undefined) finish(code);\n });\n\n function cleanup(): void {\n if (timer) clearTimeout(timer);\n abortListener?.[Symbol.dispose]();\n }\n\n function fail(error: unknown): void {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n }\n\n function stop(reason: \"timeout\" | \"abort\"): void {\n if (settled || stopped !== undefined) return;\n stopped = reason;\n cleanup();\n if (child.pid === undefined) return;\n void terminateCommand(child.pid).then(\n () => {\n child.stdout.destroy();\n child.stderr.destroy();\n finish(null);\n },\n (error: unknown) => {\n child.stdout.destroy();\n child.stderr.destroy();\n fail(error);\n },\n );\n }\n\n function finish(code: number | null): void {\n if (settled) return;\n settled = true;\n cleanup();\n resolve({\n command,\n args: [...args],\n stdout,\n stderr,\n exitCode: stopped === undefined ? code : null,\n timedOut: stopped === \"timeout\",\n aborted: stopped === \"abort\",\n });\n }\n });\n}\n\nexport abstract class Harness {\n abstract readonly id: HarnessId;\n abstract readonly name: string;\n abstract readonly binaries: string[];\n abstract readonly config: PathCandidate[];\n abstract readonly sessions: PathCandidate[];\n abstract readonly persistence: StorageDescriptor[];\n abstract readonly instructions: PathCandidate[];\n abstract readonly skills: PathCandidate[];\n abstract readonly commands: PathCandidate[];\n abstract readonly hooks: PathCandidate[];\n abstract readonly capabilities: HarnessCapabilities;\n abstract readonly detection: HarnessDetection;\n /** Non-interactive invocation recipe; null when the harness has no headless mode. */\n abstract readonly invocation: HarnessInvocation | null;\n /** Native model-listing recipe; null when the harness cannot enumerate available models. */\n readonly modelListing: HarnessModelListing | null = null;\n /** Config files that hold MCP server definitions; empty when unknown or unsupported. */\n readonly mcpConfigs: McpConfigFile[] = [];\n /**\n * The user-scope global instructions file this harness reads, as a path\n * template; null when there is no stable file (or another harness's file\n * covers it via vendor compatibility).\n */\n readonly agentsFile: string | null = null;\n\n isInstalled(): boolean {\n const cmd = process.platform === \"win32\" ? \"where\" : \"which\";\n return this.binaries.some((binary) => {\n try {\n execFileSync(cmd, [binary], { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n });\n }\n\n detectEnv(): boolean {\n return this.detection.envVars.some((v) => !!process.env[v]);\n }\n\n detectProject(cwd?: string): boolean {\n const dir = cwd ?? process.cwd();\n return this.detection.projectMarkers.some((marker) => existsSync(join(dir, marker)));\n }\n\n get version(): string | null {\n for (const binary of this.binaries) {\n try {\n const output = execFileSync(binary, [\"--version\"], {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n });\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n if (match?.[1]) return match[1];\n } catch {\n continue;\n }\n }\n return null;\n }\n\n /**\n * Invocation modes available without fallback or prompt-only restrictions.\n *\n * @returns {HarnessInvocationModes} The exact supported invocation modes.\n */\n get invocationModes(): HarnessInvocationModes {\n return {\n advisor: this.invocation?.noToolsArgs !== undefined,\n advisorStructured: this.invocation?.noToolsJsonArgs !== undefined,\n readOnly: this.invocation?.readOnlyArgs !== undefined,\n readOnlyStructured: this.invocation?.readOnlyJsonArgs !== undefined,\n agent: this.invocation?.args !== undefined,\n agentStructured: this.invocation?.jsonArgs !== undefined,\n };\n }\n\n /**\n * Expands the invocation template for one prompt, without spawning anything.\n * Returns null when the harness has no headless mode, or no structured mode\n * when `structured` is requested.\n *\n * @param prompt - Prompt inserted into the invocation template.\n * @param options - Requested model and execution mode.\n * @returns {{ command: string, args: string[] } | null} The executable invocation, or null.\n */\n buildInvocation(\n prompt: string,\n options: InvocationOptions = {},\n ): { command: string; args: string[] } | null {\n if (!this.invocation) return null;\n const command = this.invocation.binary ?? this.binaries[0];\n if (!command) return null;\n if (options.model !== undefined && !this.invocation.modelArgs) return null;\n const template = invocationTemplate(this.invocation, requestedInvocationMode(options));\n if (!template) return null;\n return {\n command,\n args: buildInvocationArgs(template, prompt, this.invocation.modelArgs, options.model),\n };\n }\n\n /**\n * Explains why an invocation option set cannot be built, or returns null when supported.\n *\n * @param options - Requested model and execution mode.\n * @returns {string | null} The incompatibility reason, or null when supported.\n */\n invocationError(options: InvocationOptions = {}): string | null {\n if (!this.invocation) return `Harness ${this.id} has no non-interactive invocation`;\n if (options.model !== undefined && !this.invocation.modelArgs) {\n return `Harness ${this.id} does not support model selection`;\n }\n const mode = requestedInvocationMode(options);\n if (invocationTemplate(this.invocation, mode)) return null;\n\n const error = `Harness ${this.id} has no ${INVOCATION_MODE_DESCRIPTION[mode]} invocation`;\n return `${error}${invocationRetryHint(this.invocation, mode, options)}`;\n }\n\n /**\n * Runs one prompt through the harness non-interactively and collects the\n * output. stdin is closed so a harness that falls back to interactive mode\n * exits instead of waiting forever.\n *\n * @param prompt - Prompt sent to the harness.\n * @param options - Invocation, environment, timeout, and cancellation options.\n * @returns {Promise<InvokeResult>} The completed process result.\n */\n invoke(prompt: string, options: InvokeOptions = {}): Promise<InvokeResult> {\n const invocationOptions = {\n model: options.model,\n structured: options.structured,\n tools: options.tools,\n readOnly: options.readOnly,\n };\n const built = this.buildInvocation(prompt, invocationOptions);\n if (!built) {\n return Promise.reject(\n new Error(this.invocationError(invocationOptions) ?? \"Invalid invocation\"),\n );\n }\n const versionError = this.readOnlyVersionError(invocationOptions);\n if (versionError) return Promise.reject(new Error(versionError));\n\n return executeCommand(built.command, built.args, options);\n }\n\n /**\n * Explains why the installed CLI cannot run a read-only recipe that carries a\n * version floor, or returns null when no floor applies or the installed\n * version meets it. An unknown version fails closed, like a missing recipe.\n *\n * @param options - Requested execution mode.\n * @returns {string | null} The version incompatibility, or null when the run may proceed.\n */\n private readOnlyVersionError(options: InvocationOptions): string | null {\n const floor = this.invocation?.readOnlyMinVersion;\n if (floor === undefined || options.readOnly !== true) return null;\n const installed = this.version;\n const error = `Harness ${this.id} requires version ${floor} or newer for read-only runs`;\n if (installed === null) return `${error}; installed version unknown`;\n if (compareVersions(installed, floor) < 0) return `${error}; installed ${installed}`;\n return null;\n }\n\n /**\n * Expands the native model-listing recipe without spawning anything.\n *\n * @param search - Optional native model search filter.\n * @returns {{ command: string, args: string[] } | null} The command, or null when unsupported.\n */\n buildModelListInvocation(search?: string): { command: string; args: string[] } | null {\n if (!this.modelListing) return null;\n const command = this.binaries[0];\n if (!command) return null;\n const template = search === undefined ? this.modelListing.args : this.modelListing.searchArgs;\n if (!template) return null;\n return {\n command,\n args: template.map((arg) => arg.replaceAll(\"{search}\", () => search ?? \"\")),\n };\n }\n\n /**\n * Runs the harness's native model-listing command and normalizes its output.\n * stdin is closed for the same reason as {@link invoke}.\n *\n * @param options - Search, environment, timeout, and cancellation options.\n * @returns {Promise<ListModelsResult>} The normalized command and model result.\n */\n async listModels(options: ListModelsOptions = {}): Promise<ListModelsResult> {\n const built = this.buildModelListInvocation(options.search);\n if (!built) {\n throw new Error(\n this.modelListing\n ? `Harness ${this.id} does not support filtering its model listing`\n : `Harness ${this.id} does not support model listing`,\n );\n }\n\n const result = await executeCommand(built.command, built.args, options);\n return {\n ...result,\n models:\n !result.timedOut && !result.aborted && result.exitCode === 0\n ? this.parseModelListingOutput(result.stdout)\n : [],\n };\n }\n\n /**\n * Converts a successful native model-listing response to the shared shape.\n *\n * @param _stdout - Native command output to parse.\n */\n protected parseModelListingOutput(_stdout: string): AvailableModel[] {\n throw new Error(`Harness ${this.id} does not implement model-list output parsing`);\n }\n\n /**\n * Filters one candidate list to the platform and expands its path\n * templates: the shared pipeline behind {@link resolve} and the MCP\n * config surface.\n *\n * @param entries - Candidate paths to filter and resolve.\n * @param options - Platform and path-resolution overrides.\n * @returns {T[]} Resolved candidates supported on the selected platform.\n */\n resolveCandidates<T extends PathCandidate>(\n entries: readonly T[],\n options: ResolveOptions = {},\n ): T[] {\n const raw = options.platform ?? process.platform;\n\n if (!Object.hasOwn(SUPPORTED_PLATFORMS, raw)) {\n throw new Error(`Unsupported platform: ${raw}. Expected one of: linux, darwin, win32`);\n }\n\n const platform = raw as Platform;\n\n return entries\n .filter((entry) => !entry.platforms || entry.platforms.includes(platform))\n .map((entry) => ({ ...entry, path: resolvePathTemplate(entry.path, options) }));\n }\n\n resolve(options: ResolveOptions = {}): ResolvedPaths {\n return {\n config: this.resolveCandidates(this.config, options),\n sessions: this.resolveCandidates(this.sessions, options),\n instructions: this.resolveCandidates(this.instructions, options),\n skills: this.resolveCandidates(this.skills, options),\n commands: this.resolveCandidates(this.commands, options),\n hooks: this.resolveCandidates(this.hooks, options),\n };\n }\n}\n\nexport type HarnessConstructor = new () => Harness;\n","import { Harness } from \"../harness.ts\";\n\nexport default class Antigravity extends Harness {\n readonly id = \"antigravity\";\n readonly name = \"Google Antigravity CLI\";\n readonly binaries = [\"agy\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: true,\n video: true,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.gemini/config/config.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Shared Antigravity configuration and user settings.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"CLI-specific settings, including trusted workspaces.\",\n },\n {\n path: \"~/.gemini/config/skills.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Explicit registrations of skill directories outside the default locations.\",\n },\n {\n path: \"~/.gemini/config/plugins.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Explicit registrations of plugin directories outside the default locations.\",\n },\n {\n path: \".agents/skills.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace registrations of skill directories outside .agents/skills/.\",\n },\n {\n path: \".agents/plugins.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace registrations of plugin directories outside .agents/plugins/.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.gemini/antigravity-cli/conversations/\",\n scope: \"data\",\n level: \"official\",\n note: \"Persisted CLI conversations.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"CLI prompt history.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/conversation_summaries.db\",\n scope: \"data\",\n level: \"official\",\n note: \"Conversation summary index.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and project metadata.\" },\n { format: \"JSONL\", level: \"official\", note: \"Prompt history.\" },\n { format: \"SQLite\", level: \"official\", note: \"Conversation summary index.\" },\n { format: \"Protocol Buffers\", level: \"official\", note: \"Conversation and runtime state.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"~/.gemini/config/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global rules in the shared Antigravity customization root.\",\n },\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace instructions; GEMINI.md is also supported.\",\n },\n {\n path: \"GEMINI.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace instructions compatible with Gemini CLI.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/config/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".agents/hooks.json\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/config/hooks.json\", scope: \"user\", level: \"official\" },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"--print\", \"{prompt}\"],\n jsonArgs: [\"--print\", \"--output-format\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive print mode.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.gemini/config/mcp_config.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"antigravity\",\n },\n ];\n override readonly agentsFile = \"~/.gemini/config/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".antigravitycli\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Claude extends Harness {\n readonly id = \"claude\";\n readonly name = \"Anthropic Claude Code\";\n readonly binaries = [\"claude\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n { path: \"~/.claude/settings.json\", scope: \"user\", level: \"official\" },\n {\n path: \"~/.claude.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global MCP server configurations.\",\n },\n {\n path: \".claude/settings.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".claude/settings.local.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Local overrides, typically gitignored.\",\n },\n {\n path: \".claude/.mcp.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped MCP server configurations.\",\n },\n {\n path: \"/etc/claude-code/managed-settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\"],\n note: \"Enterprise managed settings.\",\n },\n {\n path: \"/Library/Application Support/ClaudeCode/managed-settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"darwin\"],\n note: \"Enterprise managed settings.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.claude/projects/<dash-encoded-cwd>/*.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format.\",\n },\n {\n path: \"~/.claude/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Global prompt history across all projects.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and MCP config files.\" },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session transcripts and global history.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"CLAUDE.md\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Alternative project-level location.\",\n },\n {\n path: \"~/.claude/CLAUDE.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".claude/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".claude/commands/\",\n scope: \"project\",\n level: \"official\",\n note: \"Legacy slash commands, merged into skills.\",\n },\n {\n path: \"~/.claude/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Legacy global slash commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".claude/hooks/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/hooks/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level hooks.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"{prompt}\", \"--tools\", \"\"],\n noToolsJsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\", \"--tools\", \"\"],\n readOnlyArgs: [\"-p\", \"{prompt}\", \"--strict-mcp-config\", \"--tools\", \"Read,Glob,Grep\"],\n readOnlyJsonArgs: [\n \"-p\",\n \"--output-format\",\n \"json\",\n \"{prompt}\",\n \"--strict-mcp-config\",\n \"--tools\",\n \"Read,Glob,Grep\",\n ],\n readOnlyMinVersion: \"2.1.175\",\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Headless print mode; add --output-format json for structured output. Read-only runs keep the built-in Read, Glob and Grep tools and --strict-mcp-config drops every configured MCP server, so no write tool exists whatever permission mode the settings carry; verified on 2.1.175 and 2.1.268. --permission-mode plan does not qualify: its shell commands run through the auto mode classifier, which let a file write through.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.claude.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.claude/CLAUDE.md\";\n readonly detection = {\n envVars: [\"CLAUDE_CODE\", \"CLAUDECODE\", \"CLAUDE_CODE_ENTRYPOINT\", \"CLAUDE_CONFIG_DIR\"],\n projectMarkers: [\n \".claude/settings.json\",\n \".claude/settings.local.json\",\n \".claude/skills\",\n \"CLAUDE.md\",\n ],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Codex extends Harness {\n readonly id = \"codex\";\n readonly name = \"OpenAI Codex CLI\";\n readonly binaries = [\"codex\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n { path: \"~/.codex/config.toml\", scope: \"user\", level: \"official\" },\n {\n path: \".codex/config.toml\",\n scope: \"project\",\n level: \"official\",\n note: \"Searched from cwd up to project root (.git boundary).\",\n },\n {\n path: \"/etc/codex/config.toml\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\", \"darwin\"],\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.codex/sessions/\",\n scope: \"data\",\n level: \"official\",\n note: \"Session rollouts in JSONL format, organized by date.\",\n },\n {\n path: \"~/.codex/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Command history.\",\n },\n {\n path: \"~/.codex/state_5.sqlite\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite state database for threads and agent state.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"TOML\", level: \"official\", note: \"Configuration files.\" },\n { format: \"JSONL\", level: \"official\", note: \"Conversation transcripts.\" },\n { format: \"SQLite\", level: \"official\", note: \"Thread and agent state.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"AGENTS.override.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Local override, takes precedence over AGENTS.md.\",\n },\n {\n path: \"~/.codex/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.codex/AGENTS.override.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global override, takes precedence over global AGENTS.md.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".codex/skills/\", scope: \"project\", level: \"official\" },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.codex/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Deprecated, use ~/.agents/skills/ instead.\",\n },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n {\n path: \"/etc/codex/skills/\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\", \"darwin\"],\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"exec\", \"--skip-git-repo-check\", \"{prompt}\"],\n jsonArgs: [\"exec\", \"--skip-git-repo-check\", \"--json\", \"{prompt}\"],\n readOnlyArgs: [\"exec\", \"--skip-git-repo-check\", \"--sandbox\", \"read-only\", \"{prompt}\"],\n readOnlyJsonArgs: [\n \"exec\",\n \"--skip-git-repo-check\",\n \"--sandbox\",\n \"read-only\",\n \"--json\",\n \"{prompt}\",\n ],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive exec subcommand; add --json for structured output.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.codex/config.toml\",\n scope: \"user\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n {\n path: \".codex/config.toml\",\n scope: \"project\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.codex/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".codex\", \"AGENTS.md\", \"AGENTS.override.md\", \".agents/skills\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Cursor extends Harness {\n readonly id = \"cursor\";\n readonly name = \"Cursor\";\n readonly binaries = [\"cursor\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.cursor/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and rules files.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \".cursor/rules/skilld-activation.mdc\",\n scope: \"project\",\n level: \"official\",\n note: \"MDC format rule for skill activation.\",\n },\n {\n path: \".cursorrules\",\n scope: \"project\",\n level: \"official\",\n note: \"Legacy project-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".cursor/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.cursor/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Cursor natively scans Claude skills directory.\",\n },\n {\n path: \".codex/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Cursor natively scans Codex skills directory.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n binary: \"cursor-agent\",\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\"],\n level: \"community\",\n note: \"Cursor CLI agent binary, separate from the editor binary.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.cursor/mcp.json\",\n scope: \"user\",\n level: \"community\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".cursor/mcp.json\",\n scope: \"project\",\n level: \"community\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n readonly detection = {\n envVars: [\"CURSOR_SESSION\", \"CURSOR_TRACE_ID\"],\n projectMarkers: [\".cursor\", \".cursorrules\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Freebuff extends Harness {\n readonly id = \"freebuff\";\n readonly name = \"Freebuff\";\n readonly binaries = [\"freebuff\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.config/manicode/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Freebuff is Codebuff-based; user data lives under ~/.config/manicode/ on all platforms.\",\n },\n {\n path: \"~/.config/manicode/credentials.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Authentication credentials.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.config/manicode/projects/<project-name>/chats/<timestamp>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-chat directories with chat-messages.json, chat-meta.json, run-state.json, and log.jsonl.\",\n },\n {\n path: \"~/.config/manicode/message-history.json\",\n scope: \"data\",\n level: \"official\",\n note: \"Prompt history.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, credentials, chat messages, and run state.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Per-chat logs (log.jsonl).\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Knowledge files; scaffolded by the init flow. knowledge.md, *.knowledge.md, and CLAUDE.md in any project directory are loaded the same way.\",\n },\n {\n path: \"knowledge.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Per-directory project knowledge.\",\n },\n {\n path: \"~/.AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"User-level knowledge files in the home directory; ~/.knowledge.md and ~/.CLAUDE.md are accepted too. Read-only for the agent.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n {\n path: \".agents/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Also the install target for community skills via npx skills add; .agents/types/ holds agent template types.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = null;\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.agents/mcp.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".agents/mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n note: \"The parent directory's .agents/mcp.json is scanned too; agent templates can also embed their own mcpServers.\",\n },\n ];\n override readonly agentsFile = \"~/.AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".agents\", \"knowledge.md\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Gemini extends Harness {\n readonly id = \"gemini\";\n readonly name = \"Google Gemini CLI\";\n readonly binaries = [\"gemini\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: true,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.gemini/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \".gemini/settings.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"/etc/gemini-cli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\"],\n },\n {\n path: \"/Library/Application Support/GeminiCli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"darwin\"],\n },\n {\n path: \"%PROGRAMDATA%/gemini-cli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"win32\"],\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.gemini/history/<project-id>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Conversation history per project (project-id is a slug from projects.json).\",\n },\n {\n path: \"~/.gemini/tmp/<project-id>/chats/\",\n scope: \"data\",\n level: \"official\",\n note: \"Active chat session data.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings files.\" },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Session and history records.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"GEMINI.md\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.gemini/GEMINI.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global instruction/memory file.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".gemini/skills/\", scope: \"project\", level: \"official\" },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/skills/\", scope: \"user\", level: \"official\" },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".gemini/commands/\",\n scope: \"project\",\n level: \"official\",\n note: \"Custom commands in TOML format.\",\n },\n {\n path: \"~/.gemini/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global custom commands in TOML format.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"{prompt}\", \"--output-format\", \"json\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive (headless) mode.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.gemini/settings.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".gemini/settings.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.gemini/GEMINI.md\";\n readonly detection = {\n envVars: [\"GEMINI_CLI\"],\n projectMarkers: [\".gemini\", \"GEMINI.md\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class GitHubCopilot extends Harness {\n readonly id = \"github-copilot\";\n readonly name = \"GitHub Copilot\";\n readonly binaries = [\"copilot\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.copilot/config.json\",\n scope: \"user\",\n level: \"inferred\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Configuration files.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \".github/copilot-instructions.md\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".github/instructions/\",\n scope: \"project\",\n level: \"official\",\n note: \"Modular instructions in .instructions.md files.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".github/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Copilot auto-detects Claude skills directory.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n binary: \"copilot\",\n args: [\"-p\", \"{prompt}\"],\n level: \"community\",\n note: \"GitHub Copilot CLI, separate from the editor integration.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \".vscode/mcp.json\",\n scope: \"project\",\n level: \"community\",\n format: \"json\",\n key: [\"servers\"],\n dialect: \"vscode\",\n },\n ];\n readonly detection = {\n envVars: [\"COPILOT_RUN_APP\"],\n projectMarkers: [\".github/copilot-instructions.md\", \".github/skills\", \".github/instructions\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Grok extends Harness {\n readonly id = \"grok\";\n readonly name = \"xAI Grok CLI\";\n readonly binaries = [\"grok\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.grok/config.toml\",\n scope: \"user\",\n level: \"official\",\n note: \"Base directory overridable with GROK_HOME.\",\n },\n {\n path: \".grok/config.toml\",\n scope: \"project\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.grok/sessions/<encoded-cwd>/<session-id>/updates.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Authoritative ACP session update stream (conversation + tool calls); session dirs also hold chat_history.jsonl, summary.json, rewind_points.jsonl.\",\n },\n {\n path: \"~/.grok/sessions/<encoded-cwd>/prompt_history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project prompt history.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"TOML\", level: \"official\", note: \"Configuration files.\" },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session update streams, chat history, prompt history.\",\n },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Session state files (summary.json, plan.json, signals.json).\",\n },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Local FTS5 index over session titles and prompts for sessions search.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Also accepts Agents.md, AGENT.md, Claude.md, CLAUDE.md, CLAUDE.local.md; every matching file in a directory is loaded.\",\n },\n {\n path: \".grok/rules/\",\n scope: \"project\",\n level: \"official\",\n note: \"*.md rules scanned at each level from repo root to cwd; .claude/rules/ and .cursor/rules/ scanned via vendor compatibility.\",\n },\n {\n path: \"~/.grok/rules/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level rules.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".grok/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".grok/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level slash commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".grok/hooks/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/hooks/\",\n scope: \"user\",\n level: \"official\",\n note: \"JSON hook definitions (e.g. session-start.json); Claude/Cursor hook sources scanned via vendor compatibility.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"{prompt}\", \"--output-format\", \"json\"],\n readOnlyArgs: [\"-p\", \"{prompt}\", \"--sandbox\", \"read-only\"],\n readOnlyJsonArgs: [\"-p\", \"{prompt}\", \"--sandbox\", \"read-only\", \"--output-format\", \"json\"],\n readOnlyMinVersion: \"1.0.13\",\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"-p is short for --single; add --output-format json for structured output. --sandbox read-only is kernel-enforced (Landlock, Seatbelt) regardless of the inherited permission mode and still allows writes to ~/.grok and temp dirs; verified on Linux with 1.0.13 and 1.0.25.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.grok/config.toml\",\n scope: \"user\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n note: \"grok mcp add/remove manage this file; Claude and Cursor configs are also scanned via vendor compatibility.\",\n },\n {\n path: \".grok/config.toml\",\n scope: \"project\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n ];\n readonly detection = {\n envVars: [\"GROK_SESSION_ID\", \"GROK_WORKSPACE_ROOT\", \"GROK_HOME\"],\n projectMarkers: [\".grok\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class MastraCode extends Harness {\n readonly id = \"mastracode\";\n readonly name = \"Mastra Code\";\n readonly binaries = [\"mastracode\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \".mastracode/mcp.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped MCP server configurations.\",\n },\n {\n path: \"~/.mastracode/mcp.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global MCP server configurations.\",\n },\n {\n path: \".mastracode/hooks.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped hooks.\",\n },\n {\n path: \"~/.mastracode/hooks.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global hooks.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.local/share/mastracode/mastra.db\",\n scope: \"data\",\n level: \"official\",\n platforms: [\"linux\"],\n note: \"LibSQL database with threads, messages, and observational memory.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"MCP and hooks config files.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"LibSQL database for threads, messages, and observational memory.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Supported for Claude Code compatibility.\",\n },\n {\n path: \".claude/CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \".mastracode/AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Alternative project-level location.\",\n },\n {\n path: \"~/.claude/CLAUDE.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \"~/.mastracode/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".mastracode/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.mastracode/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".mastracode/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.mastracode/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n {\n path: \".mastracode/hooks.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"~/.mastracode/hooks.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global hooks.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = null;\n readonly detection = {\n envVars: [],\n projectMarkers: [\".mastracode\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Omp extends Harness {\n readonly id = \"omp\";\n readonly name = \"OMP (oh-my-pi)\";\n readonly binaries = [\"omp\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.omp/agent/config.yml\",\n scope: \"user\",\n level: \"official\",\n note: \"Agent dir overridable with PI_CODING_AGENT_DIR; profiles use ~/.omp/profiles/<name>/agent.\",\n },\n {\n path: \"~/.omp/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \"~/.omp/agent/mcp.json\",\n scope: \"user\",\n level: \"official\",\n note: \"MCP server configurations.\",\n },\n { path: \".omp/config.yml\", scope: \"project\", level: \"official\" },\n { path: \".omp/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.omp/agent/sessions/<dash-encoded-cwd>/<timestamp>_<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format; session ids are UUIDv7.\",\n },\n {\n path: \"~/.omp/agent/history.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite prompt history.\",\n },\n {\n path: \"~/.omp/agent/agent.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite agent state database.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"YAML\", level: \"official\", note: \"config.yml configuration files.\" },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"settings.json and mcp.json.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Session transcripts.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Agent state, prompt history, model catalog (agent.db, history.db, models.db).\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Discovered by walking up from cwd; CLAUDE.md and other vendor files loaded via compatibility providers (claude, codex, gemini, cursor, opencode, and more).\",\n },\n { path: \".omp/AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \".omp/RULES.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Sticky always-apply rules.\",\n },\n {\n path: \"~/.omp/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.omp/agent/RULES.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global sticky always-apply rules.\",\n },\n {\n path: \"~/.omp/agent/PERSONALITY.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Overrides the system prompt's personality block; replaces the configured personality preset.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n {\n path: \".omp/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Scanned in ancestor directories from cwd, closest first.\",\n },\n { path: \"~/.omp/agent/skills/\", scope: \"user\", level: \"official\" },\n {\n path: \"~/.omp/agent/managed-skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Auto-generated managed skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".omp/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.omp/agent/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model={model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output. --no-tools disables only OMP's bundled tools, so it cannot provide an advisor mode without tools.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.omp/agent/mcp.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".omp/mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.omp/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"OMP_PROFILE\", \"PI_CODING_AGENT_DIR\"],\n projectMarkers: [\".omp\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class OpenCode extends Harness {\n readonly id = \"opencode\";\n readonly name = \"OpenCode CLI\";\n readonly binaries = [\"opencode\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.config/opencode/opencode.jsonc\",\n scope: \"user\",\n level: \"official\",\n note: \"XDG-based, same path on all platforms.\",\n },\n {\n path: \"~/.config/opencode/opencode.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \"opencode.jsonc\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"opencode.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".opencode/opencode.jsonc\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".opencode/opencode.json\",\n scope: \"project\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.local/share/opencode/opencode.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite database with sessions, messages, and parts. XDG-based, same path on all platforms.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON/JSONC\", level: \"official\", note: \"Config files.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Session and message storage via Drizzle ORM.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Supported for Claude Code compatibility.\",\n },\n {\n path: \"~/.config/opencode/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".opencode/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"run\", \"{prompt}\"],\n jsonArgs: [\"run\", \"--format\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.config/opencode/opencode.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcp\"],\n dialect: \"opencode\",\n },\n {\n path: \"opencode.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcp\"],\n dialect: \"opencode\",\n },\n ];\n override readonly agentsFile = \"~/.config/opencode/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".opencode\", \"opencode.jsonc\", \"opencode.json\"],\n };\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { Harness } from \"../harness.ts\";\nimport type { AvailableModel } from \"../types.ts\";\n\nconst MODEL_HEADERS = [\"provider\", \"model\", \"context\", \"max-out\", \"thinking\", \"images\"];\n\nfunction parseTokenCount(value: string, harness: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)([KM])?$/.exec(value);\n if (!match?.[1]) throw new Error(`Invalid ${harness} token count: ${JSON.stringify(value)}`);\n const multiplier = match[2] === \"M\" ? 1_000_000 : match[2] === \"K\" ? 1_000 : 1;\n return Number(match[1]) * multiplier;\n}\n\nfunction parseBoolean(value: string, column: string, harness: string): boolean {\n if (value === \"yes\") return true;\n if (value === \"no\") return false;\n throw new Error(`Invalid ${harness} ${column} value: ${JSON.stringify(value)}`);\n}\n\n/**\n * Parses the model table Pi and its forks print, one row per model with\n * two or more spaces between columns.\n *\n * @param stdout - Native model-listing output.\n * @param harness - Harness name for error messages.\n * @returns {AvailableModel[]} The normalized models; empty when the CLI reports no matching models.\n */\nexport function parsePiModelTable(stdout: string, harness: string): AvailableModel[] {\n const lines = stripVTControlCharacters(stdout)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const first = lines[0];\n if (!first) throw new Error(`Unexpected empty ${harness} model-list output`);\n if (first.startsWith(\"No models available.\") || first.startsWith(\"No models matching \")) {\n return [];\n }\n\n const headers = first.split(/\\s{2,}/);\n if (\n headers.length !== MODEL_HEADERS.length ||\n headers.some((value, i) => value !== MODEL_HEADERS[i])\n ) {\n throw new Error(`Unexpected ${harness} model-list header: ${JSON.stringify(first)}`);\n }\n\n return lines.slice(1).map((line) => {\n const columns = line.split(/\\s{2,}/);\n const [provider, id, context, maxOutput, thinking, images] = columns;\n if (\n columns.length !== MODEL_HEADERS.length ||\n !provider ||\n !id ||\n !context ||\n !maxOutput ||\n !thinking ||\n !images\n ) {\n throw new Error(`Unexpected ${harness} model-list row: ${JSON.stringify(line)}`);\n }\n return {\n provider,\n id,\n contextWindow: parseTokenCount(context, harness),\n maxOutputTokens: parseTokenCount(maxOutput, harness),\n thinking: parseBoolean(thinking, \"thinking\", harness),\n images: parseBoolean(images, \"images\", harness),\n };\n });\n}\n\nexport default class Pi extends Harness {\n readonly id = \"pi\";\n readonly name = \"Pi Coding Agent\";\n readonly binaries = [\"pi\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.pi/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Config dir overridable with PI_CODING_AGENT_DIR.\",\n },\n { path: \".pi/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.pi/agent/sessions/<dash-encoded-cwd>/<timestamp>_<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format; session ids are UUIDv7. Overridable with PI_CODING_AGENT_SESSION_DIR or --session-dir.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, auth, trust, models, and keybindings files.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Session transcripts.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Loaded from parent directories and cwd; CLAUDE.md accepted as an alternative, AGENTS.override.md takes precedence over both in a directory.\",\n },\n {\n path: \".pi/SYSTEM.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Replaces the default system prompt; APPEND_SYSTEM.md appends instead.\",\n },\n {\n path: \"~/.pi/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.pi/agent/SYSTEM.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global system prompt replacement; APPEND_SYSTEM.md appends instead.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".pi/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.pi/agent/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".pi/prompts/\",\n scope: \"project\",\n level: \"official\",\n note: \"Prompt templates invoked as slash commands.\",\n },\n {\n path: \"~/.pi/agent/prompts/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt templates.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"--no-tools\", \"{prompt}\"],\n noToolsJsonArgs: [\"-p\", \"--no-tools\", \"--mode\", \"json\", \"{prompt}\"],\n readOnlyArgs: [\"-p\", \"--tools\", \"read,grep,find,ls\", \"{prompt}\"],\n readOnlyJsonArgs: [\"-p\", \"--tools\", \"read,grep,find,ls\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output.\",\n };\n override readonly modelListing: Harness[\"modelListing\"] = {\n args: [\"--list-models\"],\n searchArgs: [\"--list-models\", \"{search}\"],\n level: \"official\",\n note: \"Lists models with configured provider authentication; accepts an optional fuzzy search.\",\n };\n override readonly agentsFile = \"~/.pi/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"PI_CODING_AGENT\", \"PI_SESSION_ID\", \"PI_SESSION_FILE\"],\n projectMarkers: [\".pi\"],\n };\n\n protected override parseModelListingOutput(stdout: string): AvailableModel[] {\n return parsePiModelTable(stdout, \"Pi\");\n }\n}\n","import { Harness } from \"../harness.ts\";\nimport { parsePiModelTable } from \"./pi.ts\";\nimport type { AvailableModel } from \"../types.ts\";\n\nexport default class PrimeAgent extends Harness {\n readonly id = \"prime-agent\";\n readonly name = \"Prime Agent\";\n readonly binaries = [\"prime-agent\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.prime/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Config dir overridable with PRIME_AGENT_CODING_AGENT_DIR.\",\n },\n { path: \".prime/agent/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.prime/agent/sessions/<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Flat directory of JSONL transcripts whose header records the working directory; session ids are UUIDv7. Overridable with PRIME_AGENT_SESSION_DIR or --session-dir.\",\n },\n {\n path: \"~/.prime/agent/session-artifacts/<session-id>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-session Python kernel state, scheduled jobs, harness state and child session transcripts under sub-<id>/.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, auth, telemetry, model cache and session artifact state files.\",\n },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session transcripts, the RLM spawn ledger and structured logs.\",\n },\n {\n format: \"dill\",\n level: \"official\",\n note: \"Pickled Python REPL state (kernel-state.dill) in session artifacts.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Loaded from parent directories and cwd; CLAUDE.md accepted as an alternative.\",\n },\n {\n path: \".prime/agent/SYSTEM.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Replaces the default system prompt; APPEND_SYSTEM.md appends instead.\",\n },\n {\n path: \"~/.prime/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions; CLAUDE.md accepted as an alternative.\",\n },\n {\n path: \"~/.prime/agent/SYSTEM.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global system prompt replacement; APPEND_SYSTEM.md appends instead.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".prime/agent/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".agents/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Also scanned in ancestor directories up to the Git repository root; root .md files are ignored there.\",\n },\n {\n path: \"~/.prime/agent/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \"~/.agents/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Shared skills directory; root .md files are ignored there.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".prime/agent/prompts/\",\n scope: \"project\",\n level: \"official\",\n note: \"Prompt templates invoked as slash commands.\",\n },\n {\n path: \"~/.prime/agent/prompts/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt templates.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"--no-tools\", \"{prompt}\"],\n noToolsJsonArgs: [\"-p\", \"--no-tools\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output. No read-only mode: the only built-in tool is a Python REPL and the worker and kernel processes are not a security sandbox.\",\n };\n override readonly modelListing: Harness[\"modelListing\"] = {\n args: [\"model\", \"list\"],\n searchArgs: [\"model\", \"list\", \"{search}\"],\n level: \"official\",\n note: \"Lists models with configured provider authentication; accepts an optional fuzzy search. --list-models was removed.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.prime/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"prime\",\n note: 'prime-agent mcp add/remove manage this map; project settings entries are ignored for execution. Stdio env values are {\"env\": \"NAME\"} references, written from \"${NAME}\" values; literals are refused because the kernel rejects them at connect time.',\n },\n ];\n override readonly agentsFile = \"~/.prime/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"PRIME_AGENT_KERNEL_OWNER_PID\"],\n projectMarkers: [\".prime/agent\"],\n };\n\n protected override parseModelListingOutput(stdout: string): AvailableModel[] {\n return parsePiModelTable(stdout, \"Prime Agent\");\n }\n}\n","import type { HarnessConstructor } from \"../harness.ts\";\nimport Antigravity from \"./antigravity.ts\";\nimport Claude from \"./claude.ts\";\nimport Codex from \"./codex.ts\";\nimport Cursor from \"./cursor.ts\";\nimport Freebuff from \"./freebuff.ts\";\nimport Gemini from \"./gemini.ts\";\nimport GitHubCopilot from \"./github-copilot.ts\";\nimport Grok from \"./grok.ts\";\nimport MastraCode from \"./mastracode.ts\";\nimport Omp from \"./omp.ts\";\nimport OpenCode from \"./opencode.ts\";\nimport Pi from \"./pi.ts\";\nimport PrimeAgent from \"./prime-agent.ts\";\n\nexport const harnesses: HarnessConstructor[] = [\n Antigravity,\n Claude,\n Codex,\n Cursor,\n Freebuff,\n Gemini,\n GitHubCopilot,\n Grok,\n MastraCode,\n Omp,\n OpenCode,\n // Prime Agent is a Pi fork that still exports PI_CODING_AGENT, so its own\n // env marker must be checked before Pi's.\n PrimeAgent,\n Pi,\n];\n","import type { Harness, HarnessConstructor } from \"./harness.ts\";\nimport { harnesses } from \"./harnesses/index.ts\";\nimport type { HarnessId } from \"./types.ts\";\n\nlet registry: Map<HarnessId, Harness> | undefined;\n\nfunction getRegistry(): Map<HarnessId, Harness> {\n if (!registry) {\n registry = new Map();\n for (const HarnessClass of harnesses) {\n const harness = new HarnessClass();\n registry.set(harness.id, harness);\n }\n }\n return registry;\n}\n\nexport function registerHarness(HarnessClass: HarnessConstructor): Harness {\n const harness = new HarnessClass();\n getRegistry().set(harness.id, harness);\n return harness;\n}\n\nexport function getHarness(id: HarnessId): Harness {\n const harness = getRegistry().get(id);\n if (!harness) throw new Error(`Unknown harness: ${id}`);\n return harness;\n}\n\nexport function listHarnesses(): HarnessId[] {\n return [...getRegistry().keys()];\n}\n\nexport function isHarnessId(id: string): id is HarnessId {\n return getRegistry().has(id as HarnessId);\n}\n\nexport function getAllHarnesses(): Harness[] {\n return [...getRegistry().values()];\n}\n\n/**\n * Detect the active agent from environment variables.\n * Returns the first match since env detection is unambiguous.\n *\n * @returns {Harness | null} The detected harness, or null when none matches.\n */\nexport function detectHarnessFromEnv(): Harness | null {\n for (const harness of getRegistry().values()) {\n if (harness.detectEnv()) return harness;\n }\n return null;\n}\n\n/**\n * Detect which agents have project-level markers in the given directory.\n * Returns all matches (multiple agents can be configured in the same project).\n *\n * @param cwd - Directory to inspect; defaults to the current working directory.\n * @returns {Harness[]} Every harness whose project markers match.\n */\nexport function detectProjectHarnesses(cwd?: string): Harness[] {\n return [...getRegistry().values()].filter((harness) => harness.detectProject(cwd));\n}\n\n/**\n * Detect the most likely active agent. Priority:\n * 1. Env vars (running inside agent = unambiguous)\n * 2. Single project-level match\n * 3. null if ambiguous or no match\n *\n * @param cwd - Directory to inspect for project markers.\n * @returns {Harness | null} The unambiguous active harness, or null.\n */\nexport function detectHarness(cwd?: string): Harness | null {\n const fromEnv = detectHarnessFromEnv();\n if (fromEnv) return fromEnv;\n\n let match: Harness | null = null;\n for (const harness of getRegistry().values()) {\n if (harness.detectProject(cwd)) {\n if (match) return null;\n match = harness;\n }\n }\n return match;\n}\n","/**\n * Normalized MCP server management across harness config dialects.\n *\n * Reads and writes work for every declared config file. JSON writes are a\n * parse/serialize round trip. TOML configs (codex, grok) carry user comments\n * that a round trip would destroy, so TOML writes are surgical line edits:\n * only the target server's section is removed or appended, the result is\n * re-parsed and checked against the intended state before anything is\n * written, and every write lands atomically via a temp file rename.\n */\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport type { Harness } from \"./harness.ts\";\nimport { agntnConfigDir } from \"./resolve.ts\";\nimport type { EvidenceLevel, McpConfigFile, McpServerConfig, ResolveOptions } from \"./types.ts\";\n\n/** One resolved config file together with the servers it declares. */\nexport interface McpConfigListing {\n path: string;\n scope: McpConfigFile[\"scope\"];\n format: McpConfigFile[\"format\"];\n level: EvidenceLevel;\n note?: string;\n exists: boolean;\n servers: McpServerConfig[];\n /** Set when the file exists but could not be parsed. */\n error?: string;\n}\n\n/**\n * MCP config project paths are anchored to the project root, unlike the\n * plain candidate surface which leaves them relative for display.\n *\n * @param harness - Harness whose MCP config paths should be resolved.\n * @param options - Platform and path-resolution overrides.\n * @returns {Array<{ entry: McpConfigFile, path: string }>} Resolved config descriptors.\n */\nfunction resolveConfigs(\n harness: Harness,\n options: ResolveOptions,\n): Array<{ entry: McpConfigFile; path: string }> {\n return harness.resolveCandidates(harness.mcpConfigs, options).map((entry) => ({\n entry,\n path: isAbsolute(entry.path)\n ? entry.path\n : join(options.projectRoot ?? process.cwd(), entry.path),\n }));\n}\n\n/**\n * Reads a file, mapping a missing one to null instead of an error.\n *\n * @param path - File path to read.\n * @returns {string | null} File contents, or null when missing.\n */\nfunction readIfExists(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction drill(\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n root: Record<string, unknown>,\n key: readonly string[],\n create?: \"create\",\n): Record<string, unknown> | undefined {\n let node: unknown = root;\n for (const part of key) {\n if (typeof node !== \"object\" || node === null) return undefined;\n const record = node as Record<string, unknown>;\n if (create && (typeof record[part] !== \"object\" || record[part] === null)) {\n record[part] = {};\n }\n node = record[part];\n }\n return typeof node === \"object\" && node !== null ? (node as Record<string, unknown>) : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isObjectRecord(value) || Array.isArray(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === \"string\") out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n return value.filter((item): item is string => typeof item === \"string\");\n}\n\n/**\n * Builds an object with the undefined-valued keys left out.\n *\n * @param source - Object whose undefined properties should be omitted.\n * @returns {T} The compacted object.\n */\nfunction compact<T extends Record<string, unknown>>(source: T): T {\n return Object.fromEntries(Object.entries(source).filter(([, value]) => value !== undefined)) as T;\n}\n\nfunction stringField(record: Readonly<Record<string, unknown>>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanField(record: Readonly<Record<string, unknown>>, key: string): boolean | undefined {\n const value = record[key];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction normalizeAntigravity(\n name: string,\n raw: Readonly<Record<string, unknown>>,\n): McpServerConfig {\n const url = stringField(raw, \"serverUrl\");\n return compact({\n name,\n transport: url ? (\"sse\" as const) : (\"stdio\" as const),\n command: stringField(raw, \"command\"),\n args: asStringArray(raw.args),\n env: asStringRecord(raw.env),\n url,\n });\n}\n\nfunction normalizeOpenCode(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n const command = asStringArray(raw.command) ?? [];\n const url = stringField(raw, \"url\");\n return compact({\n name,\n transport: raw.type === \"remote\" || url ? (\"http\" as const) : (\"stdio\" as const),\n command: command[0],\n args: command.length > 1 ? command.slice(1) : undefined,\n env: asStringRecord(raw.environment),\n url,\n headers: asStringRecord(raw.headers),\n enabled: booleanField(raw, \"enabled\"),\n });\n}\n\nfunction standardUrl(raw: Readonly<Record<string, unknown>>): string | undefined {\n return stringField(raw, \"httpUrl\") ?? stringField(raw, \"url\");\n}\n\nfunction standardTransport(\n declared: string | undefined,\n url: string | undefined,\n): McpServerConfig[\"transport\"] {\n if (declared === \"sse\") return \"sse\";\n if (declared === \"http\" || url) return \"http\";\n return \"stdio\";\n}\n\nfunction normalizeStandard(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n const url = standardUrl(raw);\n return compact({\n name,\n transport: standardTransport(stringField(raw, \"type\"), url),\n command: stringField(raw, \"command\"),\n args: asStringArray(raw.args),\n env: asStringRecord(raw.env),\n url,\n headers: asStringRecord(raw.headers),\n enabled: booleanField(raw, \"enabled\"),\n });\n}\n\n/** An env value that is exactly `${NAME}` stands for the variable NAME of the harness environment. */\nconst ENV_REFERENCE = /^\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/;\n\n/** Thrown when a server's env cannot be written the way the target dialect requires. */\nexport class McpEnvError extends Error {\n override readonly name = \"McpEnvError\";\n}\n\nfunction envReference(value: string): string | undefined {\n return ENV_REFERENCE.exec(value)?.[1];\n}\n\n/**\n * Reads a Prime Agent env map, where each value is a {\"env\": \"NAME\"}\n * reference, into the shared `${NAME}` spelling. Literal strings are kept\n * as found so the listing shows what the file holds.\n *\n * @param value - Raw `env` field of a Prime Agent server entry.\n * @returns {Record<string, string> | undefined} The env map, or undefined when empty.\n */\nfunction primeEnv(value: unknown): Record<string, string> | undefined {\n if (!isObjectRecord(value) || Array.isArray(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") out[key] = raw;\n else if (isObjectRecord(raw) && typeof raw.env === \"string\") out[key] = `\\${${raw.env}}`;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizePrime(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n return compact({ ...normalizeStandard(name, raw), env: primeEnv(raw.env) });\n}\n\n/**\n * Maps one raw config entry to the normalized shape, per dialect.\n *\n * @param name - Server name from the containing map.\n * @param raw - Raw dialect-specific server entry.\n * @param dialect - Harness config dialect.\n * @returns {McpServerConfig} The normalized server entry.\n */\nfunction normalizeEntry(\n name: string,\n raw: Readonly<Record<string, unknown>>,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig {\n if (dialect === \"antigravity\") return normalizeAntigravity(name, raw);\n if (dialect === \"opencode\") return normalizeOpenCode(name, raw);\n if (dialect === \"prime\") return normalizePrime(name, raw);\n return normalizeStandard(name, raw);\n}\n\nfunction denormalizeAntigravity(server: McpServerConfig): Record<string, unknown> {\n if (server.url) return { serverUrl: server.url };\n return compact({\n command: server.command,\n args: server.args?.length ? server.args : undefined,\n env: server.env,\n });\n}\n\nfunction denormalizeOpenCode(server: McpServerConfig): Record<string, unknown> {\n if (server.url) {\n return compact({\n type: \"remote\",\n url: server.url,\n headers: server.headers,\n enabled: server.enabled,\n });\n }\n return compact({\n type: \"local\",\n command: [server.command ?? \"\", ...(server.args ?? [])],\n environment: server.env,\n enabled: server.enabled,\n });\n}\n\nfunction denormalizeStandard(server: McpServerConfig): Record<string, unknown> {\n return compact({\n type: server.transport,\n command: server.command,\n args: server.args?.length ? server.args : undefined,\n env: server.env,\n url: server.url,\n headers: server.headers,\n enabled: server.enabled,\n });\n}\n\n/**\n * Prime Agent's kernel hands stdio servers a trimmed environment plus the\n * variables the entry names, so its env map holds references only. A\n * literal has no way in and is refused rather than written as a server\n * that fails on its first connection.\n *\n * @param server - Normalized server whose env values are `${NAME}` references.\n * @returns {Record<string, unknown>} The Prime Agent entry.\n */\nfunction denormalizePrime(server: McpServerConfig): Record<string, unknown> {\n const env = server.env\n ? Object.fromEntries(\n Object.entries(server.env).map(([key, value]) => [\n key,\n { env: requirePrimeReference(server, key, value) },\n ]),\n )\n : undefined;\n return compact({ ...denormalizeStandard(server), env });\n}\n\nfunction requirePrimeReference(server: McpServerConfig, key: string, value: string): string {\n const reference = envReference(value);\n if (reference === undefined) {\n throw new McpEnvError(\n `${server.name}: Prime Agent takes only environment references in env; write ${key} as \"\\${NAME}\" and export NAME where prime-agent runs`,\n );\n }\n return reference;\n}\n\n/**\n * Shapes a server's env for one dialect before it is compared or written:\n * Prime Agent keeps `${NAME}` references and refuses literals, every other\n * dialect gets the references resolved from the environment of this\n * process, the same way `~` and `${HOME}` are expanded before a sync.\n *\n * @param server - Normalized server, possibly carrying references.\n * @param dialect - Target harness config dialect.\n * @returns {McpServerConfig} The server as the dialect can hold it.\n */\nfunction resolveEnvReferences(\n server: McpServerConfig,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig {\n if (!server.env) return server;\n if (dialect === \"prime\") {\n for (const [key, value] of Object.entries(server.env))\n requirePrimeReference(server, key, value);\n return server;\n }\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(server.env)) {\n const reference = envReference(value);\n if (reference === undefined) {\n env[key] = value;\n continue;\n }\n // process.env inherits Object.prototype, so a bare lookup would turn\n // ${constructor} into a function; only own string values count.\n const resolved = Object.hasOwn(process.env, reference) ? process.env[reference] : undefined;\n if (typeof resolved !== \"string\") {\n throw new McpEnvError(\n `${server.name}: env ${key} references ${reference}, which is not set in this environment`,\n );\n }\n env[key] = resolved;\n }\n return { ...server, env };\n}\n\n/**\n * Converts a normalized server back to the raw shape one dialect expects.\n *\n * @param server - Normalized server configuration.\n * @param dialect - Target harness config dialect.\n * @returns {Record<string, unknown>} The dialect-specific entry.\n */\nfunction denormalizeEntry(\n server: McpServerConfig,\n dialect: McpConfigFile[\"dialect\"],\n): Record<string, unknown> {\n if (dialect === \"antigravity\") return denormalizeAntigravity(server);\n if (dialect === \"opencode\") return denormalizeOpenCode(server);\n if (dialect === \"prime\") return denormalizePrime(server);\n return denormalizeStandard(server);\n}\n\nfunction listingBase(entry: McpConfigFile, path: string): McpConfigListing {\n return compact({\n path,\n scope: entry.scope,\n format: entry.format,\n level: entry.level,\n note: entry.note,\n exists: false,\n servers: [],\n });\n}\n\nfunction configServerMap(raw: string, entry: McpConfigFile): Record<string, unknown> {\n const parsed = entry.format === \"toml\" ? parseToml(raw) : (JSON.parse(raw) as unknown);\n return drill(isObjectRecord(parsed) ? parsed : {}, entry.key) ?? {};\n}\n\nfunction normalizeServerMap(\n map: Readonly<Record<string, unknown>>,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig[] {\n const servers: McpServerConfig[] = [];\n for (const [name, rawEntry] of Object.entries(map)) {\n if (isObjectRecord(rawEntry)) servers.push(normalizeEntry(name, rawEntry, dialect));\n }\n return servers;\n}\n\nfunction listMcpConfig(entry: McpConfigFile, path: string): McpConfigListing {\n const base = listingBase(entry, path);\n try {\n const raw = readIfExists(path);\n if (raw === null) return base;\n const servers = normalizeServerMap(configServerMap(raw, entry), entry.dialect);\n return { ...base, exists: true, servers };\n } catch (error) {\n return {\n ...base,\n exists: true,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Lists the MCP servers a harness has configured, per declared config file.\n * Missing files come back with `exists: false`; unparsable ones carry `error`.\n *\n * @param harness - Harness whose configs should be read.\n * @param options - Platform and path-resolution overrides.\n * @returns {McpConfigListing[]} One listing per declared config file.\n */\nexport function listMcpServers(harness: Harness, options: ResolveOptions = {}): McpConfigListing[] {\n return resolveConfigs(harness, options).map(({ entry, path }) => listMcpConfig(entry, path));\n}\n\nfunction writableConfig(\n harness: Harness,\n scope: \"user\" | \"project\",\n options: ResolveOptions,\n): { entry: McpConfigFile; path: string } {\n const config = resolveConfigs(harness, options).find(({ entry }) => entry.scope === scope);\n if (!config) {\n throw new Error(`Harness ${harness.id} has no ${scope}-scope MCP config`);\n }\n return config;\n}\n\nfunction writeAtomically(path: string, content: string): void {\n mkdirSync(dirname(path), { recursive: true });\n const temp = join(dirname(path), `.${Date.now()}-${process.pid}.mcp.tmp`);\n writeFileSync(temp, content);\n renameSync(temp, path);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction tomlValue(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction tomlKeyPart(name: string): string {\n return /^[A-Za-z0-9_-]+$/.test(name) ? name : JSON.stringify(name);\n}\n\n/**\n * Renders one server as TOML sections, scalars before sub-tables.\n *\n * @param key - TOML path containing the server map.\n * @param server - Server to serialize.\n * @returns {string} The rendered TOML section block.\n */\nfunction tomlSections(key: readonly string[], server: McpServerConfig): string {\n const head = [...key, server.name].map(tomlKeyPart).join(\".\");\n const lines = [`[${head}]`];\n if (server.command) lines.push(`command = ${tomlValue(server.command)}`);\n if (server.args?.length) lines.push(`args = [${server.args.map(tomlValue).join(\", \")}]`);\n if (server.url) lines.push(`url = ${tomlValue(server.url)}`);\n if (server.enabled !== undefined) lines.push(`enabled = ${server.enabled}`);\n for (const [subKey, record] of [\n [\"env\", server.env],\n [\"headers\", server.headers],\n ] as const) {\n if (!record) continue;\n lines.push(\"\", `[${head}.${subKey}]`);\n for (const [k, v] of Object.entries(record)) {\n lines.push(`${tomlKeyPart(k)} = ${tomlValue(v)}`);\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Deletes the lines that define one server in a TOML config: its\n * `[key.name]` section (with sub-tables) and any `name = {...}` inline\n * assignment inside the bare `[key]` table. Every other line survives\n * byte-for-byte, comments included.\n *\n * @param raw - Original TOML text.\n * @param key - TOML path containing the server map.\n * @param name - Server name to remove.\n * @returns {string} TOML text without the target server.\n */\nfunction stripTomlServer(raw: string, key: readonly string[], name: string): string {\n const prefix = escapeRegExp(key.map(tomlKeyPart).join(\".\"));\n const namePart = `(?:${escapeRegExp(tomlKeyPart(name))}|${escapeRegExp(JSON.stringify(name))})`;\n const sectionRe = new RegExp(`^\\\\s*\\\\[${prefix}\\\\.${namePart}(\\\\.[^\\\\]]+)?\\\\]`);\n const bareTableRe = new RegExp(`^\\\\s*\\\\[${prefix}\\\\]\\\\s*(#.*)?$`);\n const anyHeaderRe = /^\\s*\\[/;\n const inlineRe = new RegExp(`^\\\\s*${namePart}\\\\s*=`);\n\n const kept: string[] = [];\n let inTargetSection = false;\n let inBareTable = false;\n for (const line of raw.split(\"\\n\")) {\n if (anyHeaderRe.test(line)) {\n inTargetSection = sectionRe.test(line);\n inBareTable = bareTableRe.test(line);\n } else if (inBareTable && inlineRe.test(line)) {\n continue;\n }\n if (inTargetSection) continue;\n kept.push(line);\n }\n return kept.join(\"\\n\");\n}\n\nfunction serverMapFromToml(raw: string, key: readonly string[]): Record<string, unknown> {\n const parsed = parseToml(raw);\n return drill(parsed as Record<string, unknown>, key) ?? {};\n}\n\n/**\n * Verifies a surgical TOML edit before it is written: the result must still\n * parse, hold the expected state for the target server, and leave every other\n * server untouched.\n *\n * @param beforeMap - Server map before the edit.\n * @param after - Candidate TOML text after the edit.\n * @param key - TOML path containing the server map.\n * @param name - Target server name.\n * @param shouldExist - Whether the target must remain after the edit.\n */\nfunction assertTomlEdit(\n beforeMap: Readonly<Record<string, unknown>>,\n after: string,\n key: readonly string[],\n name: string,\n shouldExist: boolean,\n): void {\n let afterMap: Record<string, unknown>;\n try {\n afterMap = serverMapFromToml(after, key);\n } catch (error) {\n throw new Error(\n `TOML edit produced an unparsable file, aborting: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (Object.hasOwn(afterMap, name) !== shouldExist) {\n throw new Error(\n `TOML edit did not leave server ${name} ${shouldExist ? \"present\" : \"absent\"}, aborting`,\n );\n }\n\n for (const other of new Set([...Object.keys(beforeMap), ...Object.keys(afterMap)])) {\n if (other === name) continue;\n if (JSON.stringify(beforeMap[other]) !== JSON.stringify(afterMap[other])) {\n throw new Error(`TOML edit touched servers other than ${name}, aborting`);\n }\n }\n}\n\nfunction addTomlServer(path: string, key: readonly string[], server: McpServerConfig): boolean {\n const before = readIfExists(path) ?? \"\";\n const beforeMap = serverMapFromToml(before, key);\n const replaced = Object.hasOwn(beforeMap, server.name);\n const stripped = replaced ? stripTomlServer(before, key, server.name) : before;\n const body = stripped.replace(/\\s+$/, \"\");\n const after = body ? `${body}\\n\\n${tomlSections(key, server)}` : tomlSections(key, server);\n assertTomlEdit(beforeMap, after, key, server.name, true);\n writeAtomically(path, after);\n return replaced;\n}\n\nfunction removeTomlServer(path: string, key: readonly string[], name: string): boolean {\n const before = readIfExists(path);\n if (before === null) return false;\n const beforeMap = serverMapFromToml(before, key);\n if (!Object.hasOwn(beforeMap, name)) return false;\n const after = stripTomlServer(before, key, name);\n assertTomlEdit(beforeMap, after, key, name, false);\n writeAtomically(path, after);\n return true;\n}\n\n/**\n * Adds (or replaces) one MCP server in a harness's config. The rest of the\n * file is preserved: JSON through a parse/serialize round trip (formatting\n * normalizes to two-space indentation), TOML through a surgical line edit.\n *\n * @param harness - Target harness.\n * @param server - Normalized server configuration to write.\n * @param scope - User or project config scope.\n * @param options - Platform and path-resolution overrides.\n * @returns {{ path: string, replaced: boolean }} The written path and replacement status.\n */\nexport function addMcpServer(\n harness: Harness,\n server: McpServerConfig,\n scope: \"user\" | \"project\" = \"user\",\n options: ResolveOptions = {},\n): { path: string; replaced: boolean } {\n const { entry, path } = writableConfig(harness, scope, options);\n const resolved = resolveEnvReferences(server, entry.dialect);\n\n if (entry.format === \"toml\") {\n return { path, replaced: addTomlServer(path, entry.key, resolved) };\n }\n\n const root = JSON.parse(readIfExists(path) ?? \"{}\") as Record<string, unknown>;\n const map = drill(root, entry.key, \"create\");\n if (!map) throw new Error(`Config at ${path} has a non-object at ${entry.key.join(\".\")}`);\n\n const replaced = Object.hasOwn(map, server.name);\n map[server.name] = denormalizeEntry(resolved, entry.dialect);\n writeAtomically(path, `${JSON.stringify(root, null, 2)}\\n`);\n return { path, replaced };\n}\n\n/**\n * Removes one MCP server from a harness's config.\n *\n * @param harness - Target harness.\n * @param name - Server name to remove.\n * @param scope - User or project config scope.\n * @param options - Platform and path-resolution overrides.\n * @returns {{ path: string, removed: boolean }} The targeted path and removal status.\n */\nexport function removeMcpServer(\n harness: Harness,\n name: string,\n scope: \"user\" | \"project\" = \"user\",\n options: ResolveOptions = {},\n): { path: string; removed: boolean } {\n const { entry, path } = writableConfig(harness, scope, options);\n\n if (entry.format === \"toml\") {\n return { path, removed: removeTomlServer(path, entry.key, name) };\n }\n\n const raw = readIfExists(path);\n if (raw === null) return { path, removed: false };\n\n const root = JSON.parse(raw) as Record<string, unknown>;\n const map = drill(root, entry.key);\n if (!map || !Object.hasOwn(map, name)) return { path, removed: false };\n\n delete map[name];\n writeAtomically(path, `${JSON.stringify(root, null, 2)}\\n`);\n return { path, removed: true };\n}\n\ntype JsoncState = \"code\" | \"string\" | \"escape\" | \"line-comment\" | \"block-comment\";\n\ntype JsoncContext = Readonly<{\n text: string;\n index: number;\n character: string;\n next: string | undefined;\n}>;\n\ntype JsoncStep = Readonly<{\n state: JsoncState;\n output: string;\n advance: number;\n}>;\n\ntype JsoncScanner = (context: JsoncContext) => JsoncStep;\n\nfunction trailingJsoncComma(text: string, index: number): boolean {\n const rest = text.slice(index + 1);\n const significant = rest.replaceAll(/\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\/|\\s+/g, \"\");\n return significant.startsWith(\"}\") || significant.startsWith(\"]\");\n}\n\nfunction scanJsoncCode(context: JsoncContext): JsoncStep {\n const { character, next } = context;\n if (character === '\"') return { state: \"string\", output: character, advance: 0 };\n if (character === \"/\" && next === \"/\") {\n return { state: \"line-comment\", output: \"\", advance: 1 };\n }\n if (character === \"/\" && next === \"*\") {\n return { state: \"block-comment\", output: \"\", advance: 1 };\n }\n if (character === \",\" && trailingJsoncComma(context.text, context.index)) {\n return { state: \"code\", output: \"\", advance: 0 };\n }\n return { state: \"code\", output: character, advance: 0 };\n}\n\nfunction scanJsoncString({ character }: JsoncContext): JsoncStep {\n if (character === \"\\\\\") return { state: \"escape\", output: character, advance: 0 };\n if (character === '\"') return { state: \"code\", output: character, advance: 0 };\n return { state: \"string\", output: character, advance: 0 };\n}\n\nfunction scanJsoncEscape({ character }: JsoncContext): JsoncStep {\n return { state: \"string\", output: character, advance: 0 };\n}\n\nfunction scanJsoncLineComment({ character }: JsoncContext): JsoncStep {\n if (character === \"\\n\") return { state: \"code\", output: character, advance: 0 };\n return { state: \"line-comment\", output: \"\", advance: 0 };\n}\n\nfunction scanJsoncBlockComment({ character, next }: JsoncContext): JsoncStep {\n if (character === \"*\" && next === \"/\") {\n return { state: \"code\", output: \"\", advance: 1 };\n }\n return { state: \"block-comment\", output: \"\", advance: 0 };\n}\n\nconst JSONC_SCANNERS: Record<JsoncState, JsoncScanner> = {\n code: scanJsoncCode,\n string: scanJsoncString,\n escape: scanJsoncEscape,\n \"line-comment\": scanJsoncLineComment,\n \"block-comment\": scanJsoncBlockComment,\n};\n\n/**\n * Strips JSONC extensions (comments and trailing commas) so the master sync\n * file can be read with JSON.parse. String contents are left untouched.\n *\n * @param text - JSONC source text.\n * @returns {unknown} The parsed JSON value.\n */\nexport function parseJsonc(text: string): unknown {\n let out = \"\";\n let state: JsoncState = \"code\";\n for (let index = 0; index < text.length; index++) {\n const character = text[index] as string;\n const step: JsoncStep = JSONC_SCANNERS[state]({\n text,\n index,\n character,\n next: text[index + 1],\n });\n out += step.output;\n state = step.state;\n index += step.advance;\n }\n return JSON.parse(out);\n}\n\n/**\n * Resolves the master sync file path: $XDG_CONFIG_HOME or ~/.config.\n *\n * @param options - Path-resolution overrides.\n * @returns {string} The resolved master MCP config path.\n */\nexport function masterMcpPath(options: ResolveOptions = {}): string {\n return join(agntnConfigDir(options), \"mcp.jsonc\");\n}\n\n/** One harness's outcome of a sync run. */\nexport interface SyncTargetResult {\n id: string;\n path?: string;\n /** Reason this harness could not be targeted; `results` is empty then. */\n skipped?: string;\n /** Set when the master list excludes this harness; master-listed names are withdrawn. */\n excluded?: true;\n results: Array<{\n name: string;\n action: \"added\" | \"replaced\" | \"removed\" | \"unchanged\" | \"skipped\";\n /** Why a master server could not be written to this harness. */\n reason?: string;\n }>;\n}\n\n/** Outcome of resetting the harness configs to the master list. */\nexport interface SyncReport {\n source: string;\n servers: string[];\n targets: SyncTargetResult[];\n}\n\nfunction canonical(server: McpServerConfig): string {\n return JSON.stringify(\n Object.fromEntries(Object.entries(server).sort(([a], [b]) => a.localeCompare(b))),\n );\n}\n\n/**\n * Expands a leading `~` and `${HOME}` in master-list values. Harnesses spawn\n * MCP commands without a shell, so the expansion has to happen here: the\n * synced configs always carry absolute paths.\n *\n * @param value - Master-list value to expand.\n * @param home - Home directory used for expansion.\n * @returns {string} The expanded value.\n */\nfunction expandHome(value: string, home: string): string {\n return value.replaceAll(/^~(?=\\/|$)|\\$\\{HOME\\}/g, () => home);\n}\n\nfunction expandServerHome(server: McpServerConfig, home: string): McpServerConfig {\n return compact({\n ...server,\n command: server.command === undefined ? undefined : expandHome(server.command, home),\n args: server.args?.map((arg) => expandHome(arg, home)),\n env: server.env\n ? Object.fromEntries(Object.entries(server.env).map(([k, v]) => [k, expandHome(v, home)]))\n : undefined,\n });\n}\n\nfunction requiredMasterServerMap(\n root: Readonly<Record<string, unknown>>,\n path: string,\n): Record<string, unknown> {\n const map = drill(root as Record<string, unknown>, [\"mcpServers\"]);\n if (!map) throw new Error(`Master MCP list at ${path} has no mcpServers object`);\n return map;\n}\n\nfunction normalizeMasterServers(\n map: Readonly<Record<string, unknown>>,\n home: string,\n): McpServerConfig[] {\n const servers: McpServerConfig[] = [];\n for (const [name, rawEntry] of Object.entries(map)) {\n if (isObjectRecord(rawEntry)) {\n servers.push(expandServerHome(normalizeEntry(name, rawEntry, \"standard\"), home));\n }\n }\n return servers;\n}\n\nfunction masterExcludes(value: unknown, path: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Master MCP list at ${path} has an invalid excludes: expected an array of harness ids`,\n );\n }\n return value as string[];\n}\n\n/**\n * Reads and normalizes the master list; throws when the file is missing or invalid.\n *\n * @param options - Path-resolution overrides.\n * @returns {{ path: string, servers: McpServerConfig[], excludes: string[] }} The master list.\n */\nexport function readMasterMcpServers(options: ResolveOptions = {}): {\n path: string;\n servers: McpServerConfig[];\n /** Harness ids the master list opts out of syncing. */\n excludes: string[];\n} {\n const path = masterMcpPath(options);\n const raw = readIfExists(path);\n if (raw === null) throw new Error(`No master MCP list at ${path}`);\n\n const parsed = parseJsonc(raw);\n const root = isObjectRecord(parsed) ? parsed : {};\n const map = requiredMasterServerMap(root, path);\n return {\n path,\n servers: normalizeMasterServers(map, options.homeDir ?? homedir()),\n excludes: masterExcludes(root.excludes, path),\n };\n}\n\ntype MasterSyncInput = Readonly<{\n path: string;\n servers: readonly McpServerConfig[];\n excludes: readonly string[];\n}>;\n\nfunction optionalPath(path: string | undefined): {} | { path: string } {\n return path === undefined ? {} : { path };\n}\n\nfunction existingServers(listing: McpConfigListing | undefined): Map<string, string> {\n return new Map((listing?.servers ?? []).map((server) => [server.name, canonical(server)]));\n}\n\nfunction withdrawMasterServersFromExcludedHarness(\n harness: Harness,\n existing: ReadonlyMap<string, string>,\n masterNames: ReadonlySet<string>,\n initialPath: string | undefined,\n options: ResolveOptions,\n): SyncTargetResult {\n const results: SyncTargetResult[\"results\"] = [];\n let path = initialPath;\n for (const name of existing.keys()) {\n if (!masterNames.has(name)) continue;\n const removed = removeMcpServer(harness, name, \"user\", options);\n if (removed.removed) {\n path = removed.path;\n results.push({ name, action: \"removed\" });\n }\n }\n return { id: harness.id, ...optionalPath(path), excluded: true, results };\n}\n\nfunction syncIncludedHarness(\n harness: Harness,\n master: MasterSyncInput,\n existing: ReadonlyMap<string, string>,\n masterNames: ReadonlySet<string>,\n initialPath: string | undefined,\n options: ResolveOptions,\n): SyncTargetResult {\n const results: SyncTargetResult[\"results\"] = [];\n let path = initialPath;\n const { dialect } = writableConfig(harness, \"user\", options).entry;\n for (const server of master.servers) {\n try {\n const resolved = resolveEnvReferences(server, dialect);\n if (existing.get(server.name) === canonical(resolved)) {\n results.push({ name: server.name, action: \"unchanged\" });\n continue;\n }\n const written = addMcpServer(harness, resolved, \"user\", options);\n path = written.path;\n results.push({ name: server.name, action: written.replaced ? \"replaced\" : \"added\" });\n } catch (error) {\n // One server the dialect cannot hold must not stop the rest of the list.\n if (!(error instanceof McpEnvError)) throw error;\n results.push({ name: server.name, action: \"skipped\", reason: error.message });\n }\n }\n for (const name of existing.keys()) {\n if (masterNames.has(name)) continue;\n const removed = removeMcpServer(harness, name, \"user\", options);\n if (removed.removed) {\n path = removed.path;\n results.push({ name, action: \"removed\" });\n }\n }\n return { id: harness.id, ...optionalPath(path), results };\n}\n\nfunction syncMcpTarget(\n harness: Harness,\n master: MasterSyncInput,\n masterNames: ReadonlySet<string>,\n options: ResolveOptions,\n): SyncTargetResult {\n const hasUserConfig = harness.mcpConfigs.some((candidate) => candidate.scope === \"user\");\n if (!hasUserConfig) {\n return { id: harness.id, skipped: \"no user-scope MCP config\", results: [] };\n }\n\n const listing = listMcpServers(harness, options).find((item) => item.scope === \"user\");\n if (listing?.error) {\n return {\n id: harness.id,\n path: listing.path,\n skipped: `existing config is unreadable: ${listing.error}`,\n results: [],\n };\n }\n\n const existing = existingServers(listing);\n if (master.excludes.includes(harness.id)) {\n return withdrawMasterServersFromExcludedHarness(\n harness,\n existing,\n masterNames,\n listing?.path,\n options,\n );\n }\n return syncIncludedHarness(harness, master, existing, masterNames, listing?.path, options);\n}\n\n/**\n * Resets each harness's user-scope MCP config to exactly the master list:\n * missing servers are added, drifted ones replaced, and servers absent from\n * the master are removed. The master file is the single source of truth.\n *\n * @param harnesses - Harnesses to synchronize.\n * @param options - Platform and path-resolution overrides.\n * @returns {SyncReport} Per-harness synchronization outcomes.\n */\nexport function syncMcpServers(\n harnesses: readonly Harness[],\n options: ResolveOptions = {},\n): SyncReport {\n const master = readMasterMcpServers(options);\n const masterNames = new Set(master.servers.map((server) => server.name));\n return {\n source: master.path,\n servers: master.servers.map((server) => server.name),\n targets: harnesses.map((harness) => syncMcpTarget(harness, master, masterNames, options)),\n };\n}\n","/**\n * Symlink-based sync of the global agent instructions file across harnesses.\n *\n * The master file (default ~/.config/agntn/AGENTS.md, overridable via\n * ~/.config/agntn/agents.jsonc) is the single physical copy; every harness's\n * user-scope instructions file becomes a symlink to it, so an edit made\n * through any harness lands in the master and is visible everywhere at once.\n * Explicit companion files are linked beside each instructions target. Sync\n * is a doctor: it creates missing links, repairs wrong ones, adopts diverged\n * regular files (content moved to a backup, then relinked), and in check mode\n * only reports.\n */\nimport {\n lstatSync,\n mkdirSync,\n readFileSync,\n readlinkSync,\n renameSync,\n symlinkSync,\n unlinkSync,\n} from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, posix, resolve, win32 } from \"node:path\";\nimport type { Harness } from \"./harness.ts\";\nimport { parseJsonc } from \"./mcp-servers.ts\";\nimport { agntnConfigDir, resolvePathTemplate } from \"./resolve.ts\";\nimport type { ResolveOptions } from \"./types.ts\";\n\n/** Configuration read from agents.jsonc. */\nexport interface AgentsConfig {\n /** The master instructions file every harness links to. */\n source: string;\n /** Relative files to link beside every harness instructions target. */\n companions: string[];\n /** Harness ids the sync leaves untouched. */\n excludes: string[];\n /** Path the config was read from; absent when defaults were used. */\n configPath?: string;\n}\n\nexport type AgentsSyncAction = \"linked\" | \"relinked\" | \"adopted\" | \"unchanged\" | \"skipped\";\n\n/** One companion file's outcome for a harness target. */\nexport interface AgentsCompanionTargetResult {\n readonly source: string;\n readonly path: string;\n readonly action: Exclude<AgentsSyncAction, \"skipped\">;\n /** Backup path for an adopted file, or a check-mode note. */\n readonly detail?: string;\n}\n\n/** One harness's outcome of an agents sync run. */\nexport interface AgentsTargetResult {\n id: string;\n path?: string;\n action: AgentsSyncAction;\n /** Reason for a skip, or the backup path for an adopted diverged file. */\n detail?: string;\n /** Companion outcomes, present when companions are configured. */\n companions?: readonly AgentsCompanionTargetResult[];\n}\n\n/** Outcome of one agents sync/doctor run. */\nexport interface AgentsSyncReport {\n source: string;\n check: boolean;\n targets: AgentsTargetResult[];\n}\n\nfunction readIfExists(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction agentsConfigRecord(raw: string, configPath: string): Record<string, unknown> {\n const parsed = parseJsonc(raw);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(`Agents config at ${configPath} is not an object`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction agentsSource(\n value: unknown,\n defaultSource: string,\n options: ResolveOptions,\n configPath: string,\n): string {\n if (value === undefined) return defaultSource;\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Agents config at ${configPath} has an invalid source: expected a path string`);\n }\n const expanded = resolvePathTemplate(value, options);\n // A relative source would produce cwd-dependent, dangling links in every\n // harness, so anchor it to the config directory it was declared in.\n return isAbsolute(expanded) ? expanded : join(agntnConfigDir(options), expanded);\n}\n\nfunction agentsExcludes(value: unknown, configPath: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Agents config at ${configPath} has an invalid excludes: expected an array of harness ids`,\n );\n }\n return value as string[];\n}\n\nfunction companionPath(value: string, configPath: string): string {\n const normalized = posix.normalize(value.replaceAll(\"\\\\\", \"/\"));\n if (\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n posix.isAbsolute(normalized) ||\n win32.parse(value).root !== \"\"\n ) {\n throw new Error(\n `Agents config at ${configPath} has an unsafe companion path: ${JSON.stringify(normalized)}`,\n );\n }\n return normalized.endsWith(\"/\") ? normalized.slice(0, -1) : normalized;\n}\n\nfunction comparablePath(path: string): string {\n // Reject lexical and case-only aliases on every platform so one config\n // remains portable to the case-insensitive filesystems common on Windows\n // and macOS.\n return resolve(path).toLowerCase();\n}\n\nfunction agentsCompanions(value: unknown, configPath: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Agents config at ${configPath} has invalid companions: expected an array of relative paths`,\n );\n }\n\n const companions = (value as string[]).map((path) => companionPath(path, configPath));\n const comparable = companions.map(comparablePath);\n if (new Set(comparable).size !== comparable.length) {\n throw new Error(`Agents config at ${configPath} has duplicate companion paths`);\n }\n return companions;\n}\n\n/**\n * Reads agents.jsonc; missing file falls back to defaults.\n *\n * @param options - Path-resolution overrides.\n * @returns {AgentsConfig} The normalized sync configuration.\n */\nexport function readAgentsConfig(options: ResolveOptions = {}): AgentsConfig {\n const configPath = join(agntnConfigDir(options), \"agents.jsonc\");\n const defaults: AgentsConfig = {\n source: join(agntnConfigDir(options), \"AGENTS.md\"),\n companions: [],\n excludes: [],\n };\n\n const raw = readIfExists(configPath);\n if (raw === null) return defaults;\n\n const record = agentsConfigRecord(raw, configPath);\n return {\n source: agentsSource(record.source, defaults.source, options, configPath),\n companions: agentsCompanions(record.companions, configPath),\n excludes: agentsExcludes(record.excludes, configPath),\n configPath,\n };\n}\n\ntype LinkState =\n | { readonly kind: \"missing\" }\n | { readonly kind: \"correct-link\" }\n | { readonly kind: \"wrong-link\" }\n | { readonly kind: \"identical-file\" }\n | { readonly kind: \"diverged-file\" };\n\nfunction inspectRegularFile(path: string, source: string): LinkState {\n const content = readIfExists(path) ?? \"\";\n const sourceContent = readIfExists(source) ?? \"\";\n if (content.trim() === \"\" || content === sourceContent) return { kind: \"identical-file\" };\n return { kind: \"diverged-file\" };\n}\n\nfunction inspectTarget(path: string, source: string): LinkState {\n let stats;\n try {\n stats = lstatSync(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { kind: \"missing\" };\n throw error;\n }\n\n if (stats.isSymbolicLink()) {\n // Compare the literal link target, not realpath: the master path is the\n // stable interface (it may itself be a link into a versioned backend),\n // and a harness file linking straight past it would stop following when\n // the backend behind the master changes.\n const target = readlinkSync(path);\n const resolved = isAbsolute(target) ? target : resolve(dirname(path), target);\n return resolved === source ? { kind: \"correct-link\" } : { kind: \"wrong-link\" };\n }\n\n return inspectRegularFile(path, source);\n}\n\n/**\n * Replaces whatever sits at `path` with a symlink to `source`, atomically.\n *\n * @param path - Harness instructions path to replace.\n * @param source - Master instructions path to link.\n */\nfunction relink(path: string, source: string): void {\n mkdirSync(dirname(path), { recursive: true });\n const temp = join(dirname(path), `.${Date.now()}-${process.pid}.agents.tmp`);\n symlinkSync(source, temp);\n renameSync(temp, path);\n}\n\ntype AgentsFileResult = Omit<AgentsCompanionTargetResult, \"source\">;\n\nconst CHECK_ACTION: Record<LinkState[\"kind\"], AgentsFileResult[\"action\"]> = {\n missing: \"linked\",\n \"correct-link\": \"unchanged\",\n \"wrong-link\": \"relinked\",\n \"identical-file\": \"relinked\",\n \"diverged-file\": \"adopted\",\n};\n\nfunction applyFileTarget(\n id: string,\n path: string,\n source: string,\n state: LinkState,\n options: ResolveOptions,\n): AgentsFileResult {\n if (state.kind === \"diverged-file\") {\n const backupDir = join(agntnConfigDir(options), \"diverged\");\n mkdirSync(backupDir, { recursive: true });\n const backup = join(backupDir, `${id}-${basename(path)}-${Date.now()}.md`);\n renameSync(path, backup);\n relink(path, source);\n return { path, action: \"adopted\", detail: backup };\n }\n\n if (state.kind === \"wrong-link\") unlinkSync(path);\n if (state.kind === \"wrong-link\" || state.kind === \"identical-file\") {\n relink(path, source);\n return { path, action: \"relinked\" };\n }\n\n relink(path, source);\n return { path, action: \"linked\" };\n}\n\nfunction syncFileTarget(\n id: string,\n path: string,\n source: string,\n check: boolean,\n options: ResolveOptions,\n): AgentsFileResult {\n const state = inspectTarget(path, source);\n if (state.kind === \"correct-link\") return { path, action: \"unchanged\" };\n if (check) {\n return {\n path,\n action: CHECK_ACTION[state.kind],\n detail: \"check mode: not applied\",\n };\n }\n return applyFileTarget(id, path, source, state, options);\n}\n\nfunction syncTarget(\n harness: Harness,\n config: AgentsConfig,\n check: boolean,\n options: ResolveOptions,\n): AgentsTargetResult {\n if (config.excludes.includes(harness.id)) {\n return { id: harness.id, action: \"skipped\", detail: \"excluded by the agents config\" };\n }\n if (!harness.agentsFile) {\n return {\n id: harness.id,\n action: \"skipped\",\n detail: \"no stable user-scope instructions file\",\n };\n }\n\n const path = resolvePathTemplate(harness.agentsFile, options);\n const target = syncFileTarget(harness.id, path, config.source, check, options);\n if (config.companions.length === 0) return { id: harness.id, ...target };\n\n const companions = config.companions.map((relativePath) => {\n const source = resolve(dirname(config.source), relativePath);\n const companionPath = resolve(dirname(path), relativePath);\n return {\n source,\n ...syncFileTarget(harness.id, companionPath, source, check, options),\n };\n });\n return { id: harness.id, ...target, companions };\n}\n\nfunction preflightCompanions(\n harnesses: readonly Harness[],\n config: AgentsConfig,\n options: ResolveOptions,\n): void {\n for (const relativePath of config.companions) {\n const source = resolve(dirname(config.source), relativePath);\n if (comparablePath(source) === comparablePath(config.source)) {\n throw new Error(`Companion path resolves to the master agents file: ${relativePath}`);\n }\n if (readIfExists(source) === null) {\n throw new Error(`No companion agents file at ${source}`);\n }\n }\n\n for (const harness of harnesses) {\n if (config.excludes.includes(harness.id) || !harness.agentsFile) continue;\n const path = resolvePathTemplate(harness.agentsFile, options);\n const collision = config.companions.find(\n (relativePath) =>\n comparablePath(resolve(dirname(path), relativePath)) === comparablePath(path),\n );\n if (collision !== undefined) {\n throw new Error(`Companion path collides with ${harness.id} instructions: ${collision}`);\n }\n }\n}\n\n/**\n * Links every harness's user-scope instructions file to the master. In check\n * mode nothing is written; the report shows what a real run would do.\n *\n * @param harnesses - Harnesses to inspect or update.\n * @param check - Report intended changes without writing them.\n * @param options - Path-resolution overrides.\n * @returns {AgentsSyncReport} Per-harness synchronization outcomes.\n */\nexport function syncAgentsFiles(\n harnesses: readonly Harness[],\n check = false,\n options: ResolveOptions = {},\n): AgentsSyncReport {\n const config = readAgentsConfig(options);\n if (readIfExists(config.source) === null) {\n throw new Error(`No master agents file at ${config.source}`);\n }\n preflightCompanions(harnesses, config, options);\n return {\n source: config.source,\n check,\n targets: harnesses.map((harness) => syncTarget(harness, config, check, options)),\n };\n}\n"],"mappings":"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CV,aAAA,CAAA;EACF,MAAA;EACF,OAAA;;ECzFA,QAAqB;EACV,KAAK,CAAA,YAAA;EACL,SAAO;CAChB,GAAS;EACA,MAAA;EACP,OAAK;EACL,OAAA;EACA,QAAO;EACP,KAAA,CAAA,YAAO;EACP,SAAO;EACP,MAAA;CACF,CAAA;CACA,aACE;CACE,YAAM;EACN,SAAO,CAAA;EACP,gBAAO,CAAA,WAAA,cAAA;CACP;AACF;AAGE,IAAA,SAAO,cAAA,QAAA;CACP,KAAA;CACA,OAAM;CACR,WACF,CAAA,QAAA;CACA,eACE;EACE,KAAA;EACA,QAAO;EACP,OAAO;EACP,OAAM;EACR,OACA;EACE,WAAM;CACN;CACA,SAAO;EACP;GAEJ,MAAA;GACS,OAAA;GAEL,OAAQ;EACR;EACA;GACF,MACA;GAAE,OAAQ;GAAS,OAAO;EAAY;EACxC;GACS,MAAA;GACP,OAAA;GACE,OAAM;GACN,WAAO,CAAA,OAAA;EACP;EACA;GACF,MAAA;GACA,OAAA;GACE,OAAM;GACN,WAAO,CAAA,QAAA;EACP;EACA;GACF,MAAA;GACA,OAAA;GACE,OAAM;GACN,WAAO,CAAA,OAAA;EACP;CACA;CACF,WAAA,CAAA;EACF,MAAA;EACS,OAAA;EAEL,OAAM;EACN,MAAA;CACA,GAAA;EACA,MAAM;EAEV,OAAA;EACS,OAAA;EACA,MAAA;CACT,CAAS;CACT,cACE,CAAA;EACE,QAAM;EACN,OAAO;EACP,MAAA;CACA,GAAA;EACA,QAAM;EACN,OAAA;EACF,MACA;CACE,CAAA;CACA,eAAO,CAAA;EACP,MAAA;EACA,OAAA;EACA,OAAM;CACN,GAAA;EACA,MAAM;EAEV,OAAA;EACkB,OAAA;EACT,MAAA;CACP,CAAA;CACA,SAAA;EACF;GACF,MAAA;;GCvGA,OAAqB;EACV;EACA;GACA,MAAA;GACA,OAAA;GACP,OAAK;EACL;EACA;GACA,MAAO;GACP,OAAO;GACP,OAAA;EACF;EACS;GACP,MAAA;GACE,OAAM;GACN,OAAO;EACP;CACF;CACA,WAAA,CAAA;EACE,MAAA;EACA,OAAA;EACA,OAAA;EACF,MA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"}
1
+ {"version":3,"file":"agents-sync.mjs","names":["delay","readIfExists","parseToml"],"sources":["../../src/resolve.ts","../../src/harness.ts","../../src/harnesses/antigravity.ts","../../src/harnesses/claude.ts","../../src/harnesses/codex.ts","../../src/harnesses/cursor.ts","../../src/harnesses/freebuff.ts","../../src/harnesses/gemini.ts","../../src/harnesses/github-copilot.ts","../../src/harnesses/grok.ts","../../src/harnesses/mastracode.ts","../../src/harnesses/omp.ts","../../src/harnesses/opencode.ts","../../src/harnesses/pi.ts","../../src/harnesses/prime-agent.ts","../../src/harnesses/index.ts","../../src/registry.ts","../../src/mcp-servers.ts","../../src/agents-sync.ts"],"sourcesContent":["import os from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ResolveOptions } from \"./types.ts\";\n\n/**\n * Every marker a path template can carry, matched in one pass so a substituted\n * value is never scanned for markers again.\n */\nconst PATH_MARKERS = /^~(?=\\/|$)|\\$\\{HOME\\}|\\$\\{PROJECT_ROOT\\}|%([^%]+)%/g;\n\nexport function resolvePathTemplate(template: string, options: ResolveOptions = {}): string {\n const homeDir = options.homeDir ?? os.homedir();\n const projectRoot = options.projectRoot ?? process.cwd();\n\n return template.replaceAll(PATH_MARKERS, (match: string, name: string | undefined) => {\n if (match === \"${PROJECT_ROOT}\") return projectRoot;\n if (name === undefined) return homeDir;\n return process.env[name] ?? match;\n });\n}\n\n/**\n * The agntn config directory: $XDG_CONFIG_HOME/agntn or ~/.config/agntn.\n *\n * @param options - Path-resolution overrides.\n * @returns {string} The resolved agntn configuration directory.\n */\nexport function agntnConfigDir(options: ResolveOptions = {}): string {\n const base =\n process.env.XDG_CONFIG_HOME && process.env.XDG_CONFIG_HOME !== \"\"\n ? process.env.XDG_CONFIG_HOME\n : join(options.homeDir ?? os.homedir(), \".config\");\n return join(base, \"agntn\");\n}\n","import { addAbortListener } from \"node:events\";\nimport { existsSync } from \"node:fs\";\nimport { execFile, execFileSync, spawn } from \"node:child_process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { join } from \"node:path\";\nimport type {\n HarnessDetection,\n HarnessId,\n HarnessInvocation,\n HarnessInvocationModes,\n HarnessModelListing,\n InvokeOptions,\n InvokeResult,\n ListModelsOptions,\n ListModelsResult,\n AvailableModel,\n McpConfigFile,\n PathCandidate,\n StorageDescriptor,\n HarnessCapabilities,\n ResolveOptions,\n ResolvedPaths,\n Platform,\n} from \"./types.ts\";\nimport { resolvePathTemplate } from \"./resolve.ts\";\n\nconst SUPPORTED_PLATFORMS: Record<Platform, true> = {\n linux: true,\n darwin: true,\n win32: true,\n};\n\ntype CommandOptions = Readonly<{\n cwd?: string;\n env?: Readonly<Record<string, string>>;\n timeoutMs?: number;\n signal?: AbortSignal;\n}>;\n\ntype InvocationOptions = Readonly<{\n model?: string;\n structured?: boolean;\n tools?: boolean;\n readOnly?: boolean;\n}>;\n\ntype InvocationMode = keyof HarnessInvocationModes;\n\nconst ALTERNATE_INVOCATION_MODE: Partial<Record<InvocationMode, InvocationMode>> = {\n advisor: \"agent\",\n advisorStructured: \"agentStructured\",\n agent: \"advisor\",\n agentStructured: \"advisorStructured\",\n};\n\nconst INVOCATION_MODE_DESCRIPTION: Record<InvocationMode, string> = {\n advisor: \"advisor without tools\",\n advisorStructured: \"structured (JSON) advisor without tools\",\n readOnly: \"read-only full agent\",\n readOnlyStructured: \"structured (JSON) read-only full agent\",\n agent: \"full agent\",\n agentStructured: \"structured (JSON) full agent\",\n};\n\nconst INVOCATION_RETRY_HINT: Partial<Record<InvocationMode, string>> = {\n advisor: \"; retry with tools: true to start its full agent\",\n advisorStructured: \"; retry with tools: true to start its full agent\",\n agent: \"; retry with tools: false to use its advisor without tools\",\n agentStructured: \"; retry with tools: false to use its advisor without tools\",\n};\n\nfunction requestedInvocationMode(options: InvocationOptions): InvocationMode {\n if (options.readOnly === true) {\n return options.structured === true ? \"readOnlyStructured\" : \"readOnly\";\n }\n if (options.tools === true) return options.structured === true ? \"agentStructured\" : \"agent\";\n return options.structured === true ? \"advisorStructured\" : \"advisor\";\n}\n\nfunction invocationTemplate(\n invocation: HarnessInvocation,\n mode: InvocationMode,\n): readonly string[] | undefined {\n switch (mode) {\n case \"advisor\":\n return invocation.noToolsArgs;\n case \"advisorStructured\":\n return invocation.noToolsJsonArgs;\n case \"readOnly\":\n return invocation.readOnlyArgs;\n case \"readOnlyStructured\":\n return invocation.readOnlyJsonArgs;\n case \"agent\":\n return invocation.args;\n case \"agentStructured\":\n return invocation.jsonArgs;\n }\n}\n\nfunction invocationRetryHint(\n invocation: HarnessInvocation,\n mode: InvocationMode,\n options: InvocationOptions,\n): string {\n const withoutStructured = requestedInvocationMode({ ...options, structured: false });\n if (options.structured === true) {\n if (invocationTemplate(invocation, withoutStructured)) {\n return \"; retry with structured: false\";\n }\n const alternateWithoutStructured = ALTERNATE_INVOCATION_MODE[withoutStructured];\n if (\n alternateWithoutStructured !== undefined &&\n invocationTemplate(invocation, alternateWithoutStructured)\n ) {\n return `; retry with structured: false and tools: ${!options.tools}`;\n }\n }\n\n const alternateMode = ALTERNATE_INVOCATION_MODE[mode];\n const alternateAvailable =\n alternateMode === undefined ? undefined : invocationTemplate(invocation, alternateMode);\n return alternateAvailable ? (INVOCATION_RETRY_HINT[mode] ?? \"\") : \"\";\n}\n\n/**\n * Orders two dotted versions numerically; a pre-release tag sorts below its release.\n *\n * @param a - Left version.\n * @param b - Right version.\n * @returns {number} Negative when a is older, positive when newer, zero when equal.\n */\nfunction compareVersions(a: string, b: string): number {\n const [aBase = \"\", aPre] = a.split(\"-\", 2);\n const [bBase = \"\", bPre] = b.split(\"-\", 2);\n const left = aBase.split(\".\").map(Number);\n const right = bBase.split(\".\").map(Number);\n for (let i = 0; i < Math.max(left.length, right.length); i++) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return Number(aPre === undefined) - Number(bPre === undefined);\n}\n\nfunction buildInvocationArgs(\n template: readonly string[],\n prompt: string,\n modelArgs: readonly string[] | undefined,\n model: string | undefined,\n): string[] {\n const args = template.map((arg) => arg.replaceAll(\"{prompt}\", () => prompt));\n if (model !== undefined && modelArgs) {\n args.push(...modelArgs.map((arg) => arg.replaceAll(\"{model}\", () => model)));\n }\n return args;\n}\n\nfunction signalProcessGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if (!(error instanceof Error && \"code\" in error && error.code === \"ESRCH\")) throw error;\n }\n}\n\n/**\n * Keep escalation alive even when the root exits before its descendants.\n * @param pid - Root of the command's process group or Windows tree.\n */\nasync function terminateCommand(pid: number): Promise<void> {\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve, reject) => {\n execFile(\n join(process.env.SystemRoot ?? \"C:\\\\Windows\", \"System32\", \"taskkill.exe\"),\n [\"/PID\", String(pid), \"/T\", \"/F\"],\n { windowsHide: true, timeout: 2000, killSignal: \"SIGKILL\" },\n (error) => (error ? reject(error) : resolve()),\n );\n });\n return;\n }\n\n signalProcessGroup(pid, \"SIGTERM\");\n await delay(500);\n signalProcessGroup(pid, \"SIGKILL\");\n}\n\nfunction executeCommand(\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): Promise<InvokeResult> {\n return new Promise((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let stopped: \"timeout\" | \"abort\" | undefined;\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let abortListener: ReturnType<typeof addAbortListener> | undefined;\n\n if (options.signal?.aborted) {\n stopped = \"abort\";\n finish(null);\n return;\n }\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached:\n process.platform !== \"win32\" &&\n (Boolean(options.timeoutMs) || options.signal !== undefined),\n });\n\n if (options.timeoutMs) timer = setTimeout(() => stop(\"timeout\"), options.timeoutMs);\n if (options.signal) abortListener = addAbortListener(options.signal, () => stop(\"abort\"));\n\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\");\n });\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", fail);\n child.on(\"close\", (code) => {\n if (stopped === undefined) finish(code);\n });\n\n function cleanup(): void {\n if (timer) clearTimeout(timer);\n abortListener?.[Symbol.dispose]();\n }\n\n function fail(error: unknown): void {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n }\n\n function stop(reason: \"timeout\" | \"abort\"): void {\n if (settled || stopped !== undefined) return;\n stopped = reason;\n cleanup();\n if (child.pid === undefined) return;\n void terminateCommand(child.pid).then(\n () => {\n child.stdout.destroy();\n child.stderr.destroy();\n finish(null);\n },\n (error: unknown) => {\n child.stdout.destroy();\n child.stderr.destroy();\n fail(error);\n },\n );\n }\n\n function finish(code: number | null): void {\n if (settled) return;\n settled = true;\n cleanup();\n resolve({\n command,\n args: [...args],\n stdout,\n stderr,\n exitCode: stopped === undefined ? code : null,\n timedOut: stopped === \"timeout\",\n aborted: stopped === \"abort\",\n });\n }\n });\n}\n\nexport abstract class Harness {\n abstract readonly id: HarnessId;\n abstract readonly name: string;\n abstract readonly binaries: string[];\n abstract readonly config: PathCandidate[];\n abstract readonly sessions: PathCandidate[];\n abstract readonly persistence: StorageDescriptor[];\n abstract readonly instructions: PathCandidate[];\n abstract readonly skills: PathCandidate[];\n abstract readonly commands: PathCandidate[];\n abstract readonly hooks: PathCandidate[];\n abstract readonly capabilities: HarnessCapabilities;\n abstract readonly detection: HarnessDetection;\n /** Non-interactive invocation recipe; null when the harness has no headless mode. */\n abstract readonly invocation: HarnessInvocation | null;\n /** Native model-listing recipe; null when the harness cannot enumerate available models. */\n readonly modelListing: HarnessModelListing | null = null;\n /** Config files that hold MCP server definitions; empty when unknown or unsupported. */\n readonly mcpConfigs: McpConfigFile[] = [];\n /**\n * The user-scope global instructions file this harness reads, as a path\n * template; null when there is no stable file (or another harness's file\n * covers it via vendor compatibility).\n */\n readonly agentsFile: string | null = null;\n\n isInstalled(): boolean {\n const cmd = process.platform === \"win32\" ? \"where\" : \"which\";\n return this.binaries.some((binary) => {\n try {\n execFileSync(cmd, [binary], { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n });\n }\n\n detectEnv(): boolean {\n return this.detection.envVars.some((v) => !!process.env[v]);\n }\n\n detectProject(cwd?: string): boolean {\n const dir = cwd ?? process.cwd();\n return this.detection.projectMarkers.some((marker) => existsSync(join(dir, marker)));\n }\n\n get version(): string | null {\n for (const binary of this.binaries) {\n try {\n const output = execFileSync(binary, [\"--version\"], {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n });\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n if (match?.[1]) return match[1];\n } catch {\n continue;\n }\n }\n return null;\n }\n\n /**\n * Invocation modes available without fallback or prompt-only restrictions.\n *\n * @returns {HarnessInvocationModes} The exact supported invocation modes.\n */\n get invocationModes(): HarnessInvocationModes {\n return {\n advisor: this.invocation?.noToolsArgs !== undefined,\n advisorStructured: this.invocation?.noToolsJsonArgs !== undefined,\n readOnly: this.invocation?.readOnlyArgs !== undefined,\n readOnlyStructured: this.invocation?.readOnlyJsonArgs !== undefined,\n agent: this.invocation?.args !== undefined,\n agentStructured: this.invocation?.jsonArgs !== undefined,\n };\n }\n\n /**\n * Expands the invocation template for one prompt, without spawning anything.\n * Returns null when the harness has no headless mode, or no structured mode\n * when `structured` is requested.\n *\n * @param prompt - Prompt inserted into the invocation template.\n * @param options - Requested model and execution mode.\n * @returns {{ command: string, args: string[] } | null} The executable invocation, or null.\n */\n buildInvocation(\n prompt: string,\n options: InvocationOptions = {},\n ): { command: string; args: string[] } | null {\n if (!this.invocation) return null;\n const command = this.invocation.binary ?? this.binaries[0];\n if (!command) return null;\n if (options.model !== undefined && !this.invocation.modelArgs) return null;\n const template = invocationTemplate(this.invocation, requestedInvocationMode(options));\n if (!template) return null;\n return {\n command,\n args: buildInvocationArgs(template, prompt, this.invocation.modelArgs, options.model),\n };\n }\n\n /**\n * Explains why an invocation option set cannot be built, or returns null when supported.\n *\n * @param options - Requested model and execution mode.\n * @returns {string | null} The incompatibility reason, or null when supported.\n */\n invocationError(options: InvocationOptions = {}): string | null {\n if (!this.invocation) return `Harness ${this.id} has no non-interactive invocation`;\n if (options.model !== undefined && !this.invocation.modelArgs) {\n return `Harness ${this.id} does not support model selection`;\n }\n const mode = requestedInvocationMode(options);\n if (invocationTemplate(this.invocation, mode)) return null;\n\n const error = `Harness ${this.id} has no ${INVOCATION_MODE_DESCRIPTION[mode]} invocation`;\n return `${error}${invocationRetryHint(this.invocation, mode, options)}`;\n }\n\n /**\n * Runs one prompt through the harness non-interactively and collects the\n * output. stdin is closed so a harness that falls back to interactive mode\n * exits instead of waiting forever.\n *\n * @param prompt - Prompt sent to the harness.\n * @param options - Invocation, environment, timeout, and cancellation options.\n * @returns {Promise<InvokeResult>} The completed process result.\n */\n invoke(prompt: string, options: InvokeOptions = {}): Promise<InvokeResult> {\n const invocationOptions = {\n model: options.model,\n structured: options.structured,\n tools: options.tools,\n readOnly: options.readOnly,\n };\n const built = this.buildInvocation(prompt, invocationOptions);\n if (!built) {\n return Promise.reject(\n new Error(this.invocationError(invocationOptions) ?? \"Invalid invocation\"),\n );\n }\n const versionError = this.readOnlyVersionError(invocationOptions);\n if (versionError) return Promise.reject(new Error(versionError));\n\n return executeCommand(built.command, built.args, options);\n }\n\n /**\n * Explains why the installed CLI cannot run a read-only recipe that carries a\n * version floor, or returns null when no floor applies or the installed\n * version meets it. An unknown version fails closed, like a missing recipe.\n *\n * @param options - Requested execution mode.\n * @returns {string | null} The version incompatibility, or null when the run may proceed.\n */\n private readOnlyVersionError(options: InvocationOptions): string | null {\n const floor = this.invocation?.readOnlyMinVersion;\n if (floor === undefined || options.readOnly !== true) return null;\n const installed = this.version;\n const error = `Harness ${this.id} requires version ${floor} or newer for read-only runs`;\n if (installed === null) return `${error}; installed version unknown`;\n if (compareVersions(installed, floor) < 0) return `${error}; installed ${installed}`;\n return null;\n }\n\n /**\n * Expands the native model-listing recipe without spawning anything.\n *\n * @param search - Optional native model search filter.\n * @returns {{ command: string, args: string[] } | null} The command, or null when unsupported.\n */\n buildModelListInvocation(search?: string): { command: string; args: string[] } | null {\n if (!this.modelListing) return null;\n const command = this.binaries[0];\n if (!command) return null;\n const template = search === undefined ? this.modelListing.args : this.modelListing.searchArgs;\n if (!template) return null;\n return {\n command,\n args: template.map((arg) => arg.replaceAll(\"{search}\", () => search ?? \"\")),\n };\n }\n\n /**\n * Runs the harness's native model-listing command and normalizes its output.\n * stdin is closed for the same reason as {@link invoke}.\n *\n * @param options - Search, environment, timeout, and cancellation options.\n * @returns {Promise<ListModelsResult>} The normalized command and model result.\n */\n async listModels(options: ListModelsOptions = {}): Promise<ListModelsResult> {\n const built = this.buildModelListInvocation(options.search);\n if (!built) {\n throw new Error(\n this.modelListing\n ? `Harness ${this.id} does not support filtering its model listing`\n : `Harness ${this.id} does not support model listing`,\n );\n }\n\n const result = await executeCommand(built.command, built.args, options);\n return {\n ...result,\n models:\n !result.timedOut && !result.aborted && result.exitCode === 0\n ? this.parseModelListingOutput(result.stdout)\n : [],\n };\n }\n\n /**\n * Converts a successful native model-listing response to the shared shape.\n *\n * @param _stdout - Native command output to parse.\n */\n protected parseModelListingOutput(_stdout: string): AvailableModel[] {\n throw new Error(`Harness ${this.id} does not implement model-list output parsing`);\n }\n\n /**\n * Filters one candidate list to the platform and expands its path\n * templates: the shared pipeline behind {@link resolve} and the MCP\n * config surface.\n *\n * @param entries - Candidate paths to filter and resolve.\n * @param options - Platform and path-resolution overrides.\n * @returns {T[]} Resolved candidates supported on the selected platform.\n */\n resolveCandidates<T extends PathCandidate>(\n entries: readonly T[],\n options: ResolveOptions = {},\n ): T[] {\n const raw = options.platform ?? process.platform;\n\n if (!Object.hasOwn(SUPPORTED_PLATFORMS, raw)) {\n throw new Error(`Unsupported platform: ${raw}. Expected one of: linux, darwin, win32`);\n }\n\n const platform = raw as Platform;\n\n return entries\n .filter((entry) => !entry.platforms || entry.platforms.includes(platform))\n .map((entry) => ({ ...entry, path: resolvePathTemplate(entry.path, options) }));\n }\n\n resolve(options: ResolveOptions = {}): ResolvedPaths {\n return {\n config: this.resolveCandidates(this.config, options),\n sessions: this.resolveCandidates(this.sessions, options),\n instructions: this.resolveCandidates(this.instructions, options),\n skills: this.resolveCandidates(this.skills, options),\n commands: this.resolveCandidates(this.commands, options),\n hooks: this.resolveCandidates(this.hooks, options),\n };\n }\n}\n\nexport type HarnessConstructor = new () => Harness;\n","import { Harness } from \"../harness.ts\";\n\nexport default class Antigravity extends Harness {\n readonly id = \"antigravity\";\n readonly name = \"Google Antigravity CLI\";\n readonly binaries = [\"agy\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: true,\n video: true,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.gemini/config/config.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Shared Antigravity configuration and user settings.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"CLI-specific settings, including trusted workspaces.\",\n },\n {\n path: \"~/.gemini/config/skills.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Explicit registrations of skill directories outside the default locations.\",\n },\n {\n path: \"~/.gemini/config/plugins.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Explicit registrations of plugin directories outside the default locations.\",\n },\n {\n path: \".agents/skills.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace registrations of skill directories outside .agents/skills/.\",\n },\n {\n path: \".agents/plugins.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace registrations of plugin directories outside .agents/plugins/.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.gemini/antigravity-cli/conversations/\",\n scope: \"data\",\n level: \"official\",\n note: \"Persisted CLI conversations.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"CLI prompt history.\",\n },\n {\n path: \"~/.gemini/antigravity-cli/conversation_summaries.db\",\n scope: \"data\",\n level: \"official\",\n note: \"Conversation summary index.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and project metadata.\" },\n { format: \"JSONL\", level: \"official\", note: \"Prompt history.\" },\n { format: \"SQLite\", level: \"official\", note: \"Conversation summary index.\" },\n { format: \"Protocol Buffers\", level: \"official\", note: \"Conversation and runtime state.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"~/.gemini/config/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global rules in the shared Antigravity customization root.\",\n },\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace instructions; GEMINI.md is also supported.\",\n },\n {\n path: \"GEMINI.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Workspace instructions compatible with Gemini CLI.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/config/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".agents/hooks.json\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/config/hooks.json\", scope: \"user\", level: \"official\" },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"--print\", \"{prompt}\"],\n jsonArgs: [\"--print\", \"--output-format\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive print mode.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.gemini/config/mcp_config.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"antigravity\",\n },\n ];\n override readonly agentsFile = \"~/.gemini/config/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".antigravitycli\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Claude extends Harness {\n readonly id = \"claude\";\n readonly name = \"Anthropic Claude Code\";\n readonly binaries = [\"claude\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n { path: \"~/.claude/settings.json\", scope: \"user\", level: \"official\" },\n {\n path: \"~/.claude.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global MCP server configurations.\",\n },\n {\n path: \".claude/settings.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".claude/settings.local.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Local overrides, typically gitignored.\",\n },\n {\n path: \".claude/.mcp.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped MCP server configurations.\",\n },\n {\n path: \"/etc/claude-code/managed-settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\"],\n note: \"Enterprise managed settings.\",\n },\n {\n path: \"/Library/Application Support/ClaudeCode/managed-settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"darwin\"],\n note: \"Enterprise managed settings.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.claude/projects/<dash-encoded-cwd>/*.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format.\",\n },\n {\n path: \"~/.claude/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Global prompt history across all projects.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and MCP config files.\" },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session transcripts and global history.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"CLAUDE.md\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Alternative project-level location.\",\n },\n {\n path: \"~/.claude/CLAUDE.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".claude/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".claude/commands/\",\n scope: \"project\",\n level: \"official\",\n note: \"Legacy slash commands, merged into skills.\",\n },\n {\n path: \"~/.claude/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Legacy global slash commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".claude/hooks/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/hooks/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level hooks.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"{prompt}\", \"--tools\", \"\"],\n noToolsJsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\", \"--tools\", \"\"],\n readOnlyArgs: [\"-p\", \"{prompt}\", \"--strict-mcp-config\", \"--tools\", \"Read,Glob,Grep\"],\n readOnlyJsonArgs: [\n \"-p\",\n \"--output-format\",\n \"json\",\n \"{prompt}\",\n \"--strict-mcp-config\",\n \"--tools\",\n \"Read,Glob,Grep\",\n ],\n readOnlyMinVersion: \"2.1.175\",\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Headless print mode; add --output-format json for structured output. Read-only runs keep the built-in Read, Glob and Grep tools and --strict-mcp-config drops every configured MCP server, so no write tool exists whatever permission mode the settings carry; verified on 2.1.175 and 2.1.268. --permission-mode plan does not qualify: its shell commands run through the auto mode classifier, which let a file write through.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.claude.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.claude/CLAUDE.md\";\n readonly detection = {\n envVars: [\"CLAUDE_CODE\", \"CLAUDECODE\", \"CLAUDE_CODE_ENTRYPOINT\", \"CLAUDE_CONFIG_DIR\"],\n projectMarkers: [\n \".claude/settings.json\",\n \".claude/settings.local.json\",\n \".claude/skills\",\n \"CLAUDE.md\",\n ],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Codex extends Harness {\n readonly id = \"codex\";\n readonly name = \"OpenAI Codex CLI\";\n readonly binaries = [\"codex\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n { path: \"~/.codex/config.toml\", scope: \"user\", level: \"official\" },\n {\n path: \".codex/config.toml\",\n scope: \"project\",\n level: \"official\",\n note: \"Searched from cwd up to project root (.git boundary).\",\n },\n {\n path: \"/etc/codex/config.toml\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\", \"darwin\"],\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.codex/sessions/\",\n scope: \"data\",\n level: \"official\",\n note: \"Session rollouts in JSONL format, organized by date.\",\n },\n {\n path: \"~/.codex/history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Command history.\",\n },\n {\n path: \"~/.codex/state_5.sqlite\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite state database for threads and agent state.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"TOML\", level: \"official\", note: \"Configuration files.\" },\n { format: \"JSONL\", level: \"official\", note: \"Conversation transcripts.\" },\n { format: \"SQLite\", level: \"official\", note: \"Thread and agent state.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"AGENTS.override.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Local override, takes precedence over AGENTS.md.\",\n },\n {\n path: \"~/.codex/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.codex/AGENTS.override.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global override, takes precedence over global AGENTS.md.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".codex/skills/\", scope: \"project\", level: \"official\" },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.codex/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Deprecated, use ~/.agents/skills/ instead.\",\n },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n {\n path: \"/etc/codex/skills/\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\", \"darwin\"],\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"exec\", \"--skip-git-repo-check\", \"{prompt}\"],\n jsonArgs: [\"exec\", \"--skip-git-repo-check\", \"--json\", \"{prompt}\"],\n readOnlyArgs: [\"exec\", \"--skip-git-repo-check\", \"--sandbox\", \"read-only\", \"{prompt}\"],\n readOnlyJsonArgs: [\n \"exec\",\n \"--skip-git-repo-check\",\n \"--sandbox\",\n \"read-only\",\n \"--json\",\n \"{prompt}\",\n ],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive exec subcommand; add --json for structured output.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.codex/config.toml\",\n scope: \"user\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n {\n path: \".codex/config.toml\",\n scope: \"project\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.codex/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".codex\", \"AGENTS.md\", \"AGENTS.override.md\", \".agents/skills\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Cursor extends Harness {\n readonly id = \"cursor\";\n readonly name = \"Cursor\";\n readonly binaries = [\"cursor\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.cursor/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings and rules files.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \".cursor/rules/skilld-activation.mdc\",\n scope: \"project\",\n level: \"official\",\n note: \"MDC format rule for skill activation.\",\n },\n {\n path: \".cursorrules\",\n scope: \"project\",\n level: \"official\",\n note: \"Legacy project-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".cursor/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.cursor/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Cursor natively scans Claude skills directory.\",\n },\n {\n path: \".codex/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Cursor natively scans Codex skills directory.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n binary: \"cursor-agent\",\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--output-format\", \"json\", \"{prompt}\"],\n level: \"community\",\n note: \"Cursor CLI agent binary, separate from the editor binary.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.cursor/mcp.json\",\n scope: \"user\",\n level: \"community\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".cursor/mcp.json\",\n scope: \"project\",\n level: \"community\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n readonly detection = {\n envVars: [\"CURSOR_SESSION\", \"CURSOR_TRACE_ID\"],\n projectMarkers: [\".cursor\", \".cursorrules\"],\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { Harness } from \"../harness.ts\";\n\nexport default class Freebuff extends Harness {\n readonly id = \"freebuff\";\n readonly name = \"Freebuff\";\n readonly binaries = [\"freebuff\"];\n\n override get version(): string | null {\n const configDir = join(homedir(), \".config\", \"manicode\");\n const binaryName = process.platform === \"win32\" ? \"freebuff.exe\" : \"freebuff\";\n if (!existsSync(join(configDir, binaryName))) return null;\n\n try {\n const metadata: unknown = JSON.parse(\n readFileSync(join(configDir, \"freebuff-metadata.json\"), \"utf8\"),\n );\n if (\n typeof metadata === \"object\" &&\n metadata !== null &&\n \"version\" in metadata &&\n typeof metadata.version === \"string\" &&\n metadata.version !== \"\"\n ) {\n return metadata.version;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.config/manicode/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Freebuff is Codebuff-based; user data lives under ~/.config/manicode/ on all platforms.\",\n },\n {\n path: \"~/.config/manicode/credentials.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Authentication credentials.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.config/manicode/projects/<project-name>/chats/<timestamp>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-chat directories with chat-messages.json, chat-meta.json, run-state.json, and log.jsonl.\",\n },\n {\n path: \"~/.config/manicode/message-history.json\",\n scope: \"data\",\n level: \"official\",\n note: \"Prompt history.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, credentials, chat messages, and run state.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Per-chat logs (log.jsonl).\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Knowledge files; scaffolded by the init flow. knowledge.md, *.knowledge.md, and CLAUDE.md in any project directory are loaded the same way.\",\n },\n {\n path: \"knowledge.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Per-directory project knowledge.\",\n },\n {\n path: \"~/.AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"User-level knowledge files in the home directory; ~/.knowledge.md and ~/.CLAUDE.md are accepted too. Read-only for the agent.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n {\n path: \".agents/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Also the install target for community skills via npx skills add; .agents/types/ holds agent template types.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = null;\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.agents/mcp.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".agents/mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n note: \"The parent directory's .agents/mcp.json is scanned too; agent templates can also embed their own mcpServers.\",\n },\n ];\n override readonly agentsFile = \"~/.AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".agents\", \"knowledge.md\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Gemini extends Harness {\n readonly id = \"gemini\";\n readonly name = \"Google Gemini CLI\";\n readonly binaries = [\"gemini\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: true,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.gemini/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \".gemini/settings.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"/etc/gemini-cli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"linux\"],\n },\n {\n path: \"/Library/Application Support/GeminiCli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"darwin\"],\n },\n {\n path: \"%PROGRAMDATA%/gemini-cli/settings.json\",\n scope: \"system\",\n level: \"official\",\n platforms: [\"win32\"],\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.gemini/history/<project-id>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Conversation history per project (project-id is a slug from projects.json).\",\n },\n {\n path: \"~/.gemini/tmp/<project-id>/chats/\",\n scope: \"data\",\n level: \"official\",\n note: \"Active chat session data.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Settings files.\" },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Session and history records.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"GEMINI.md\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.gemini/GEMINI.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global instruction/memory file.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".gemini/skills/\", scope: \"project\", level: \"official\" },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n { path: \"~/.gemini/skills/\", scope: \"user\", level: \"official\" },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".gemini/commands/\",\n scope: \"project\",\n level: \"official\",\n note: \"Custom commands in TOML format.\",\n },\n {\n path: \"~/.gemini/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global custom commands in TOML format.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"{prompt}\", \"--output-format\", \"json\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Non-interactive (headless) mode.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.gemini/settings.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".gemini/settings.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.gemini/GEMINI.md\";\n readonly detection = {\n envVars: [\"GEMINI_CLI\"],\n projectMarkers: [\".gemini\", \"GEMINI.md\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class GitHubCopilot extends Harness {\n readonly id = \"github-copilot\";\n readonly name = \"GitHub Copilot\";\n readonly binaries = [\"copilot\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.copilot/config.json\",\n scope: \"user\",\n level: \"inferred\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"Configuration files.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \".github/copilot-instructions.md\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".github/instructions/\",\n scope: \"project\",\n level: \"official\",\n note: \"Modular instructions in .instructions.md files.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".github/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Copilot auto-detects Claude skills directory.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n binary: \"copilot\",\n args: [\"-p\", \"{prompt}\"],\n level: \"community\",\n note: \"GitHub Copilot CLI, separate from the editor integration.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \".vscode/mcp.json\",\n scope: \"project\",\n level: \"community\",\n format: \"json\",\n key: [\"servers\"],\n dialect: \"vscode\",\n },\n ];\n readonly detection = {\n envVars: [\"COPILOT_RUN_APP\"],\n projectMarkers: [\".github/copilot-instructions.md\", \".github/skills\", \".github/instructions\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Grok extends Harness {\n readonly id = \"grok\";\n readonly name = \"xAI Grok CLI\";\n readonly binaries = [\"grok\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.grok/config.toml\",\n scope: \"user\",\n level: \"official\",\n note: \"Base directory overridable with GROK_HOME.\",\n },\n {\n path: \".grok/config.toml\",\n scope: \"project\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.grok/sessions/<encoded-cwd>/<session-id>/updates.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Authoritative ACP session update stream (conversation + tool calls); session dirs also hold chat_history.jsonl, summary.json, rewind_points.jsonl.\",\n },\n {\n path: \"~/.grok/sessions/<encoded-cwd>/prompt_history.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project prompt history.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"TOML\", level: \"official\", note: \"Configuration files.\" },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session update streams, chat history, prompt history.\",\n },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Session state files (summary.json, plan.json, signals.json).\",\n },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Local FTS5 index over session titles and prompts for sessions search.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Also accepts Agents.md, AGENT.md, Claude.md, CLAUDE.md, CLAUDE.local.md; every matching file in a directory is loaded.\",\n },\n {\n path: \".grok/rules/\",\n scope: \"project\",\n level: \"official\",\n note: \"*.md rules scanned at each level from repo root to cwd; .claude/rules/ and .cursor/rules/ scanned via vendor compatibility.\",\n },\n {\n path: \"~/.grok/rules/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level rules.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".grok/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".grok/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level slash commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n { path: \".grok/hooks/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.grok/hooks/\",\n scope: \"user\",\n level: \"official\",\n note: \"JSON hook definitions (e.g. session-start.json); Claude/Cursor hook sources scanned via vendor compatibility.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"{prompt}\", \"--output-format\", \"json\"],\n readOnlyArgs: [\"-p\", \"{prompt}\", \"--sandbox\", \"read-only\"],\n readOnlyJsonArgs: [\"-p\", \"{prompt}\", \"--sandbox\", \"read-only\", \"--output-format\", \"json\"],\n readOnlyMinVersion: \"1.0.13\",\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"-p is short for --single; add --output-format json for structured output. --sandbox read-only is kernel-enforced (Landlock, Seatbelt) regardless of the inherited permission mode and still allows writes to ~/.grok and temp dirs; verified on Linux with 1.0.13 and 1.0.25.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.grok/config.toml\",\n scope: \"user\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n note: \"grok mcp add/remove manage this file; Claude and Cursor configs are also scanned via vendor compatibility.\",\n },\n {\n path: \".grok/config.toml\",\n scope: \"project\",\n level: \"official\",\n format: \"toml\",\n key: [\"mcp_servers\"],\n dialect: \"standard\",\n },\n ];\n readonly detection = {\n envVars: [\"GROK_SESSION_ID\", \"GROK_WORKSPACE_ROOT\", \"GROK_HOME\"],\n projectMarkers: [\".grok\"],\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { Harness } from \"../harness.ts\";\n\nfunction packageVersion(commandPath: string): string | null {\n try {\n const require = createRequire(realpathSync(commandPath));\n const metadata: unknown = JSON.parse(\n readFileSync(require.resolve(\"mastracode/package.json\"), \"utf8\"),\n );\n if (\n typeof metadata === \"object\" &&\n metadata !== null &&\n \"version\" in metadata &&\n typeof metadata.version === \"string\" &&\n metadata.version !== \"\"\n ) {\n return metadata.version;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport default class MastraCode extends Harness {\n readonly id = \"mastracode\";\n readonly name = \"Mastra Code\";\n readonly binaries = [\"mastracode\"];\n\n override get version(): string | null {\n const locator = process.platform === \"win32\" ? \"where\" : \"which\";\n let output: string;\n try {\n output = execFileSync(locator, [this.binaries[0] ?? \"mastracode\"], {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n });\n } catch {\n return null;\n }\n\n const paths = output.split(/\\r?\\n/u).filter((path) => path !== \"\");\n for (const path of paths) {\n const version = packageVersion(path);\n if (version !== null) return version;\n }\n return null;\n }\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \".mastracode/mcp.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped MCP server configurations.\",\n },\n {\n path: \"~/.mastracode/mcp.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global MCP server configurations.\",\n },\n {\n path: \".mastracode/hooks.json\",\n scope: \"project\",\n level: \"official\",\n note: \"Project-scoped hooks.\",\n },\n {\n path: \"~/.mastracode/hooks.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global hooks.\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.local/share/mastracode/mastra.db\",\n scope: \"data\",\n level: \"official\",\n platforms: [\"linux\"],\n note: \"LibSQL database with threads, messages, and observational memory.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON\", level: \"official\", note: \"MCP and hooks config files.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"LibSQL database for threads, messages, and observational memory.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Supported for Claude Code compatibility.\",\n },\n {\n path: \".claude/CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \".mastracode/AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Alternative project-level location.\",\n },\n {\n path: \"~/.claude/CLAUDE.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \"~/.mastracode/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".mastracode/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.mastracode/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".mastracode/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.mastracode/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [\n {\n path: \".mastracode/hooks.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"~/.mastracode/hooks.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Global hooks.\",\n },\n ];\n readonly invocation: Harness[\"invocation\"] = null;\n readonly detection = {\n envVars: [],\n projectMarkers: [\".mastracode\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class Omp extends Harness {\n readonly id = \"omp\";\n readonly name = \"OMP (oh-my-pi)\";\n readonly binaries = [\"omp\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.omp/agent/config.yml\",\n scope: \"user\",\n level: \"official\",\n note: \"Agent dir overridable with PI_CODING_AGENT_DIR; profiles use ~/.omp/profiles/<name>/agent.\",\n },\n {\n path: \"~/.omp/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \"~/.omp/agent/mcp.json\",\n scope: \"user\",\n level: \"official\",\n note: \"MCP server configurations.\",\n },\n { path: \".omp/config.yml\", scope: \"project\", level: \"official\" },\n { path: \".omp/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.omp/agent/sessions/<dash-encoded-cwd>/<timestamp>_<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format; session ids are UUIDv7.\",\n },\n {\n path: \"~/.omp/agent/history.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite prompt history.\",\n },\n {\n path: \"~/.omp/agent/agent.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite agent state database.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"YAML\", level: \"official\", note: \"config.yml configuration files.\" },\n {\n format: \"JSON\",\n level: \"official\",\n note: \"settings.json and mcp.json.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Session transcripts.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Agent state, prompt history, model catalog (agent.db, history.db, models.db).\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Discovered by walking up from cwd; CLAUDE.md and other vendor files loaded via compatibility providers (claude, codex, gemini, cursor, opencode, and more).\",\n },\n { path: \".omp/AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \".omp/RULES.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Sticky always-apply rules.\",\n },\n {\n path: \"~/.omp/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.omp/agent/RULES.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global sticky always-apply rules.\",\n },\n {\n path: \"~/.omp/agent/PERSONALITY.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Overrides the system prompt's personality block; replaces the configured personality preset.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n {\n path: \".omp/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Scanned in ancestor directories from cwd, closest first.\",\n },\n { path: \"~/.omp/agent/skills/\", scope: \"user\", level: \"official\" },\n {\n path: \"~/.omp/agent/managed-skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Auto-generated managed skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n { path: \".omp/commands/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.omp/agent/commands/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt commands.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model={model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output. --no-tools disables only OMP's bundled tools, so it cannot provide an advisor mode without tools.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.omp/agent/mcp.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n {\n path: \".omp/mcp.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"standard\",\n },\n ];\n override readonly agentsFile = \"~/.omp/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"OMP_PROFILE\", \"PI_CODING_AGENT_DIR\"],\n projectMarkers: [\".omp\"],\n };\n}\n","import { Harness } from \"../harness.ts\";\n\nexport default class OpenCode extends Harness {\n readonly id = \"opencode\";\n readonly name = \"OpenCode CLI\";\n readonly binaries = [\"opencode\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.config/opencode/opencode.jsonc\",\n scope: \"user\",\n level: \"official\",\n note: \"XDG-based, same path on all platforms.\",\n },\n {\n path: \"~/.config/opencode/opencode.json\",\n scope: \"user\",\n level: \"official\",\n },\n {\n path: \"opencode.jsonc\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \"opencode.json\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".opencode/opencode.jsonc\",\n scope: \"project\",\n level: \"official\",\n },\n {\n path: \".opencode/opencode.json\",\n scope: \"project\",\n level: \"official\",\n },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.local/share/opencode/opencode.db\",\n scope: \"data\",\n level: \"official\",\n note: \"SQLite database with sessions, messages, and parts. XDG-based, same path on all platforms.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n { format: \"JSON/JSONC\", level: \"official\", note: \"Config files.\" },\n {\n format: \"SQLite\",\n level: \"official\",\n note: \"Session and message storage via Drizzle ORM.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n { path: \"AGENTS.md\", scope: \"project\", level: \"official\" },\n {\n path: \"CLAUDE.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Supported for Claude Code compatibility.\",\n },\n {\n path: \"~/.config/opencode/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".opencode/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".claude/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n { path: \".agents/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.claude/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Claude Code compatible.\",\n },\n { path: \"~/.agents/skills/\", scope: \"user\", level: \"official\" },\n ];\n readonly commands: Harness[\"commands\"] = [];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"run\", \"{prompt}\"],\n jsonArgs: [\"run\", \"--format\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.config/opencode/opencode.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcp\"],\n dialect: \"opencode\",\n },\n {\n path: \"opencode.json\",\n scope: \"project\",\n level: \"official\",\n format: \"json\",\n key: [\"mcp\"],\n dialect: \"opencode\",\n },\n ];\n override readonly agentsFile = \"~/.config/opencode/AGENTS.md\";\n readonly detection = {\n envVars: [],\n projectMarkers: [\".opencode\", \"opencode.jsonc\", \"opencode.json\"],\n };\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { Harness } from \"../harness.ts\";\nimport type { AvailableModel } from \"../types.ts\";\n\nconst MODEL_HEADERS = [\"provider\", \"model\", \"context\", \"max-out\", \"thinking\", \"images\"];\n\nfunction parseTokenCount(value: string, harness: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)([KM])?$/.exec(value);\n if (!match?.[1]) throw new Error(`Invalid ${harness} token count: ${JSON.stringify(value)}`);\n const multiplier = match[2] === \"M\" ? 1_000_000 : match[2] === \"K\" ? 1_000 : 1;\n return Number(match[1]) * multiplier;\n}\n\nfunction parseBoolean(value: string, column: string, harness: string): boolean {\n if (value === \"yes\") return true;\n if (value === \"no\") return false;\n throw new Error(`Invalid ${harness} ${column} value: ${JSON.stringify(value)}`);\n}\n\n/**\n * Parses the model table Pi and its forks print, one row per model with\n * two or more spaces between columns.\n *\n * @param stdout - Native model-listing output.\n * @param harness - Harness name for error messages.\n * @returns {AvailableModel[]} The normalized models; empty when the CLI reports no matching models.\n */\nexport function parsePiModelTable(stdout: string, harness: string): AvailableModel[] {\n const lines = stripVTControlCharacters(stdout)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const first = lines[0];\n if (!first) throw new Error(`Unexpected empty ${harness} model-list output`);\n if (first.startsWith(\"No models available.\") || first.startsWith(\"No models matching \")) {\n return [];\n }\n\n const headers = first.split(/\\s{2,}/);\n if (\n headers.length !== MODEL_HEADERS.length ||\n headers.some((value, i) => value !== MODEL_HEADERS[i])\n ) {\n throw new Error(`Unexpected ${harness} model-list header: ${JSON.stringify(first)}`);\n }\n\n return lines.slice(1).map((line) => {\n const columns = line.split(/\\s{2,}/);\n const [provider, id, context, maxOutput, thinking, images] = columns;\n if (\n columns.length !== MODEL_HEADERS.length ||\n !provider ||\n !id ||\n !context ||\n !maxOutput ||\n !thinking ||\n !images\n ) {\n throw new Error(`Unexpected ${harness} model-list row: ${JSON.stringify(line)}`);\n }\n return {\n provider,\n id,\n contextWindow: parseTokenCount(context, harness),\n maxOutputTokens: parseTokenCount(maxOutput, harness),\n thinking: parseBoolean(thinking, \"thinking\", harness),\n images: parseBoolean(images, \"images\", harness),\n };\n });\n}\n\nexport default class Pi extends Harness {\n readonly id = \"pi\";\n readonly name = \"Pi Coding Agent\";\n readonly binaries = [\"pi\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.pi/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Config dir overridable with PI_CODING_AGENT_DIR.\",\n },\n { path: \".pi/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.pi/agent/sessions/<dash-encoded-cwd>/<timestamp>_<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-project session transcripts in JSONL format; session ids are UUIDv7. Overridable with PI_CODING_AGENT_SESSION_DIR or --session-dir.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, auth, trust, models, and keybindings files.\",\n },\n { format: \"JSONL\", level: \"official\", note: \"Session transcripts.\" },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Loaded from parent directories and cwd; CLAUDE.md accepted as an alternative, AGENTS.override.md takes precedence over both in a directory.\",\n },\n {\n path: \".pi/SYSTEM.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Replaces the default system prompt; APPEND_SYSTEM.md appends instead.\",\n },\n {\n path: \"~/.pi/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions.\",\n },\n {\n path: \"~/.pi/agent/SYSTEM.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global system prompt replacement; APPEND_SYSTEM.md appends instead.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".pi/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \"~/.pi/agent/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".pi/prompts/\",\n scope: \"project\",\n level: \"official\",\n note: \"Prompt templates invoked as slash commands.\",\n },\n {\n path: \"~/.pi/agent/prompts/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt templates.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"--no-tools\", \"{prompt}\"],\n noToolsJsonArgs: [\"-p\", \"--no-tools\", \"--mode\", \"json\", \"{prompt}\"],\n readOnlyArgs: [\"-p\", \"--tools\", \"read,grep,find,ls\", \"{prompt}\"],\n readOnlyJsonArgs: [\"-p\", \"--tools\", \"read,grep,find,ls\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output.\",\n };\n override readonly modelListing: Harness[\"modelListing\"] = {\n args: [\"--list-models\"],\n searchArgs: [\"--list-models\", \"{search}\"],\n level: \"official\",\n note: \"Lists models with configured provider authentication; accepts an optional fuzzy search.\",\n };\n override readonly agentsFile = \"~/.pi/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"PI_CODING_AGENT\", \"PI_SESSION_ID\", \"PI_SESSION_FILE\"],\n projectMarkers: [\".pi\"],\n };\n\n protected override parseModelListingOutput(stdout: string): AvailableModel[] {\n return parsePiModelTable(stdout, \"Pi\");\n }\n}\n","import { Harness } from \"../harness.ts\";\nimport { parsePiModelTable } from \"./pi.ts\";\nimport type { AvailableModel } from \"../types.ts\";\n\nexport default class PrimeAgent extends Harness {\n readonly id = \"prime-agent\";\n readonly name = \"Prime Agent\";\n readonly binaries = [\"prime-agent\"];\n readonly capabilities = {\n mcp: true,\n vision: true,\n audio: false,\n video: false,\n tools: true,\n streaming: true,\n };\n readonly config: Harness[\"config\"] = [\n {\n path: \"~/.prime/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n note: \"Config dir overridable with PRIME_AGENT_CODING_AGENT_DIR.\",\n },\n { path: \".prime/agent/settings.json\", scope: \"project\", level: \"official\" },\n ];\n readonly sessions: Harness[\"sessions\"] = [\n {\n path: \"~/.prime/agent/sessions/<session-id>.jsonl\",\n scope: \"data\",\n level: \"official\",\n note: \"Flat directory of JSONL transcripts whose header records the working directory; session ids are UUIDv7. Overridable with PRIME_AGENT_SESSION_DIR or --session-dir.\",\n },\n {\n path: \"~/.prime/agent/session-artifacts/<session-id>/\",\n scope: \"data\",\n level: \"official\",\n note: \"Per-session Python kernel state, scheduled jobs, harness state and child session transcripts under sub-<id>/.\",\n },\n ];\n readonly persistence: Harness[\"persistence\"] = [\n {\n format: \"JSON\",\n level: \"official\",\n note: \"Settings, auth, telemetry, model cache and session artifact state files.\",\n },\n {\n format: \"JSONL\",\n level: \"official\",\n note: \"Session transcripts, the RLM spawn ledger and structured logs.\",\n },\n {\n format: \"dill\",\n level: \"official\",\n note: \"Pickled Python REPL state (kernel-state.dill) in session artifacts.\",\n },\n ];\n readonly instructions: Harness[\"instructions\"] = [\n {\n path: \"AGENTS.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Loaded from parent directories and cwd; CLAUDE.md accepted as an alternative.\",\n },\n {\n path: \".prime/agent/SYSTEM.md\",\n scope: \"project\",\n level: \"official\",\n note: \"Replaces the default system prompt; APPEND_SYSTEM.md appends instead.\",\n },\n {\n path: \"~/.prime/agent/AGENTS.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level instructions; CLAUDE.md accepted as an alternative.\",\n },\n {\n path: \"~/.prime/agent/SYSTEM.md\",\n scope: \"user\",\n level: \"official\",\n note: \"Global system prompt replacement; APPEND_SYSTEM.md appends instead.\",\n },\n ];\n readonly skills: Harness[\"skills\"] = [\n { path: \".prime/agent/skills/\", scope: \"project\", level: \"official\" },\n {\n path: \".agents/skills/\",\n scope: \"project\",\n level: \"official\",\n note: \"Also scanned in ancestor directories up to the Git repository root; root .md files are ignored there.\",\n },\n {\n path: \"~/.prime/agent/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level skills.\",\n },\n {\n path: \"~/.agents/skills/\",\n scope: \"user\",\n level: \"official\",\n note: \"Shared skills directory; root .md files are ignored there.\",\n },\n ];\n readonly commands: Harness[\"commands\"] = [\n {\n path: \".prime/agent/prompts/\",\n scope: \"project\",\n level: \"official\",\n note: \"Prompt templates invoked as slash commands.\",\n },\n {\n path: \"~/.prime/agent/prompts/\",\n scope: \"user\",\n level: \"official\",\n note: \"Global user-level prompt templates.\",\n },\n ];\n readonly hooks: Harness[\"hooks\"] = [];\n readonly invocation: Harness[\"invocation\"] = {\n args: [\"-p\", \"{prompt}\"],\n jsonArgs: [\"-p\", \"--mode\", \"json\", \"{prompt}\"],\n noToolsArgs: [\"-p\", \"--no-tools\", \"{prompt}\"],\n noToolsJsonArgs: [\"-p\", \"--no-tools\", \"--mode\", \"json\", \"{prompt}\"],\n modelArgs: [\"--model\", \"{model}\"],\n level: \"official\",\n note: \"Add --mode json for structured event output. No read-only mode: the only built-in tool is a Python REPL and the worker and kernel processes are not a security sandbox.\",\n };\n override readonly modelListing: Harness[\"modelListing\"] = {\n args: [\"model\", \"list\"],\n searchArgs: [\"model\", \"list\", \"{search}\"],\n level: \"official\",\n note: \"Lists models with configured provider authentication; accepts an optional fuzzy search. --list-models was removed.\",\n };\n override readonly mcpConfigs: Harness[\"mcpConfigs\"] = [\n {\n path: \"~/.prime/agent/settings.json\",\n scope: \"user\",\n level: \"official\",\n format: \"json\",\n key: [\"mcpServers\"],\n dialect: \"prime\",\n note: 'prime-agent mcp add/remove manage this map; project settings entries are ignored for execution. Stdio env values are {\"env\": \"NAME\"} references, written from \"${NAME}\" values; literals are refused because the kernel rejects them at connect time.',\n },\n ];\n override readonly agentsFile = \"~/.prime/agent/AGENTS.md\";\n readonly detection = {\n envVars: [\"PRIME_AGENT_KERNEL_OWNER_PID\"],\n projectMarkers: [\".prime/agent\"],\n };\n\n protected override parseModelListingOutput(stdout: string): AvailableModel[] {\n return parsePiModelTable(stdout, \"Prime Agent\");\n }\n}\n","import type { HarnessConstructor } from \"../harness.ts\";\nimport Antigravity from \"./antigravity.ts\";\nimport Claude from \"./claude.ts\";\nimport Codex from \"./codex.ts\";\nimport Cursor from \"./cursor.ts\";\nimport Freebuff from \"./freebuff.ts\";\nimport Gemini from \"./gemini.ts\";\nimport GitHubCopilot from \"./github-copilot.ts\";\nimport Grok from \"./grok.ts\";\nimport MastraCode from \"./mastracode.ts\";\nimport Omp from \"./omp.ts\";\nimport OpenCode from \"./opencode.ts\";\nimport Pi from \"./pi.ts\";\nimport PrimeAgent from \"./prime-agent.ts\";\n\nexport const harnesses: HarnessConstructor[] = [\n Antigravity,\n Claude,\n Codex,\n Cursor,\n Freebuff,\n Gemini,\n GitHubCopilot,\n Grok,\n MastraCode,\n Omp,\n OpenCode,\n // Prime Agent is a Pi fork that still exports PI_CODING_AGENT, so its own\n // env marker must be checked before Pi's.\n PrimeAgent,\n Pi,\n];\n","import type { Harness, HarnessConstructor } from \"./harness.ts\";\nimport { harnesses } from \"./harnesses/index.ts\";\nimport type { HarnessId } from \"./types.ts\";\n\nlet registry: Map<HarnessId, Harness> | undefined;\n\nfunction getRegistry(): Map<HarnessId, Harness> {\n if (!registry) {\n registry = new Map();\n for (const HarnessClass of harnesses) {\n const harness = new HarnessClass();\n registry.set(harness.id, harness);\n }\n }\n return registry;\n}\n\nexport function registerHarness(HarnessClass: HarnessConstructor): Harness {\n const harness = new HarnessClass();\n getRegistry().set(harness.id, harness);\n return harness;\n}\n\nexport function getHarness(id: HarnessId): Harness {\n const harness = getRegistry().get(id);\n if (!harness) throw new Error(`Unknown harness: ${id}`);\n return harness;\n}\n\nexport function listHarnesses(): HarnessId[] {\n return [...getRegistry().keys()];\n}\n\nexport function isHarnessId(id: string): id is HarnessId {\n return getRegistry().has(id as HarnessId);\n}\n\nexport function getAllHarnesses(): Harness[] {\n return [...getRegistry().values()];\n}\n\n/**\n * Detect the active agent from environment variables.\n * Returns the first match since env detection is unambiguous.\n *\n * @returns {Harness | null} The detected harness, or null when none matches.\n */\nexport function detectHarnessFromEnv(): Harness | null {\n for (const harness of getRegistry().values()) {\n if (harness.detectEnv()) return harness;\n }\n return null;\n}\n\n/**\n * Detect which agents have project-level markers in the given directory.\n * Returns all matches (multiple agents can be configured in the same project).\n *\n * @param cwd - Directory to inspect; defaults to the current working directory.\n * @returns {Harness[]} Every harness whose project markers match.\n */\nexport function detectProjectHarnesses(cwd?: string): Harness[] {\n return [...getRegistry().values()].filter((harness) => harness.detectProject(cwd));\n}\n\n/**\n * Detect the most likely active agent. Priority:\n * 1. Env vars (running inside agent = unambiguous)\n * 2. Single project-level match\n * 3. null if ambiguous or no match\n *\n * @param cwd - Directory to inspect for project markers.\n * @returns {Harness | null} The unambiguous active harness, or null.\n */\nexport function detectHarness(cwd?: string): Harness | null {\n const fromEnv = detectHarnessFromEnv();\n if (fromEnv) return fromEnv;\n\n let match: Harness | null = null;\n for (const harness of getRegistry().values()) {\n if (harness.detectProject(cwd)) {\n if (match) return null;\n match = harness;\n }\n }\n return match;\n}\n","/**\n * Normalized MCP server management across harness config dialects.\n *\n * Reads and writes work for every declared config file. JSON writes are a\n * parse/serialize round trip. TOML configs (codex, grok) carry user comments\n * that a round trip would destroy, so TOML writes are surgical line edits:\n * only the target server's section is removed or appended, the result is\n * re-parsed and checked against the intended state before anything is\n * written, and every write lands atomically via a temp file rename.\n */\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport type { Harness } from \"./harness.ts\";\nimport { agntnConfigDir } from \"./resolve.ts\";\nimport type { EvidenceLevel, McpConfigFile, McpServerConfig, ResolveOptions } from \"./types.ts\";\n\n/** One resolved config file together with the servers it declares. */\nexport interface McpConfigListing {\n path: string;\n scope: McpConfigFile[\"scope\"];\n format: McpConfigFile[\"format\"];\n level: EvidenceLevel;\n note?: string;\n exists: boolean;\n servers: McpServerConfig[];\n /** Set when the file exists but could not be parsed. */\n error?: string;\n}\n\n/**\n * MCP config project paths are anchored to the project root, unlike the\n * plain candidate surface which leaves them relative for display.\n *\n * @param harness - Harness whose MCP config paths should be resolved.\n * @param options - Platform and path-resolution overrides.\n * @returns {Array<{ entry: McpConfigFile, path: string }>} Resolved config descriptors.\n */\nfunction resolveConfigs(\n harness: Harness,\n options: ResolveOptions,\n): Array<{ entry: McpConfigFile; path: string }> {\n return harness.resolveCandidates(harness.mcpConfigs, options).map((entry) => ({\n entry,\n path: isAbsolute(entry.path)\n ? entry.path\n : join(options.projectRoot ?? process.cwd(), entry.path),\n }));\n}\n\n/**\n * Reads a file, mapping a missing one to null instead of an error.\n *\n * @param path - File path to read.\n * @returns {string | null} File contents, or null when missing.\n */\nfunction readIfExists(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction drill(\n /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n root: Record<string, unknown>,\n key: readonly string[],\n create?: \"create\",\n): Record<string, unknown> | undefined {\n let node: unknown = root;\n for (const part of key) {\n if (typeof node !== \"object\" || node === null) return undefined;\n const record = node as Record<string, unknown>;\n if (create && (typeof record[part] !== \"object\" || record[part] === null)) {\n record[part] = {};\n }\n node = record[part];\n }\n return typeof node === \"object\" && node !== null ? (node as Record<string, unknown>) : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isObjectRecord(value) || Array.isArray(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === \"string\") out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n return value.filter((item): item is string => typeof item === \"string\");\n}\n\n/**\n * Builds an object with the undefined-valued keys left out.\n *\n * @param source - Object whose undefined properties should be omitted.\n * @returns {T} The compacted object.\n */\nfunction compact<T extends Record<string, unknown>>(source: T): T {\n return Object.fromEntries(Object.entries(source).filter(([, value]) => value !== undefined)) as T;\n}\n\nfunction stringField(record: Readonly<Record<string, unknown>>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanField(record: Readonly<Record<string, unknown>>, key: string): boolean | undefined {\n const value = record[key];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction normalizeAntigravity(\n name: string,\n raw: Readonly<Record<string, unknown>>,\n): McpServerConfig {\n const url = stringField(raw, \"serverUrl\");\n return compact({\n name,\n transport: url ? (\"sse\" as const) : (\"stdio\" as const),\n command: stringField(raw, \"command\"),\n args: asStringArray(raw.args),\n env: asStringRecord(raw.env),\n url,\n });\n}\n\nfunction normalizeOpenCode(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n const command = asStringArray(raw.command) ?? [];\n const url = stringField(raw, \"url\");\n return compact({\n name,\n transport: raw.type === \"remote\" || url ? (\"http\" as const) : (\"stdio\" as const),\n command: command[0],\n args: command.length > 1 ? command.slice(1) : undefined,\n env: asStringRecord(raw.environment),\n url,\n headers: asStringRecord(raw.headers),\n enabled: booleanField(raw, \"enabled\"),\n });\n}\n\nfunction standardUrl(raw: Readonly<Record<string, unknown>>): string | undefined {\n return stringField(raw, \"httpUrl\") ?? stringField(raw, \"url\");\n}\n\nfunction standardTransport(\n declared: string | undefined,\n url: string | undefined,\n): McpServerConfig[\"transport\"] {\n if (declared === \"sse\") return \"sse\";\n if (declared === \"http\" || url) return \"http\";\n return \"stdio\";\n}\n\nfunction normalizeStandard(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n const url = standardUrl(raw);\n return compact({\n name,\n transport: standardTransport(stringField(raw, \"type\"), url),\n command: stringField(raw, \"command\"),\n args: asStringArray(raw.args),\n env: asStringRecord(raw.env),\n url,\n headers: asStringRecord(raw.headers),\n enabled: booleanField(raw, \"enabled\"),\n });\n}\n\n/** An env value that is exactly `${NAME}` stands for the variable NAME of the harness environment. */\nconst ENV_REFERENCE = /^\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/;\n\n/** Thrown when a server's env cannot be written the way the target dialect requires. */\nexport class McpEnvError extends Error {\n override readonly name = \"McpEnvError\";\n}\n\nfunction envReference(value: string): string | undefined {\n return ENV_REFERENCE.exec(value)?.[1];\n}\n\n/**\n * Reads a Prime Agent env map, where each value is a {\"env\": \"NAME\"}\n * reference, into the shared `${NAME}` spelling. Literal strings are kept\n * as found so the listing shows what the file holds.\n *\n * @param value - Raw `env` field of a Prime Agent server entry.\n * @returns {Record<string, string> | undefined} The env map, or undefined when empty.\n */\nfunction primeEnv(value: unknown): Record<string, string> | undefined {\n if (!isObjectRecord(value) || Array.isArray(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") out[key] = raw;\n else if (isObjectRecord(raw) && typeof raw.env === \"string\") out[key] = `\\${${raw.env}}`;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizePrime(name: string, raw: Readonly<Record<string, unknown>>): McpServerConfig {\n return compact({ ...normalizeStandard(name, raw), env: primeEnv(raw.env) });\n}\n\n/**\n * Maps one raw config entry to the normalized shape, per dialect.\n *\n * @param name - Server name from the containing map.\n * @param raw - Raw dialect-specific server entry.\n * @param dialect - Harness config dialect.\n * @returns {McpServerConfig} The normalized server entry.\n */\nfunction normalizeEntry(\n name: string,\n raw: Readonly<Record<string, unknown>>,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig {\n if (dialect === \"antigravity\") return normalizeAntigravity(name, raw);\n if (dialect === \"opencode\") return normalizeOpenCode(name, raw);\n if (dialect === \"prime\") return normalizePrime(name, raw);\n return normalizeStandard(name, raw);\n}\n\nfunction denormalizeAntigravity(server: McpServerConfig): Record<string, unknown> {\n if (server.url) return { serverUrl: server.url };\n return compact({\n command: server.command,\n args: server.args?.length ? server.args : undefined,\n env: server.env,\n });\n}\n\nfunction denormalizeOpenCode(server: McpServerConfig): Record<string, unknown> {\n if (server.url) {\n return compact({\n type: \"remote\",\n url: server.url,\n headers: server.headers,\n enabled: server.enabled,\n });\n }\n return compact({\n type: \"local\",\n command: [server.command ?? \"\", ...(server.args ?? [])],\n environment: server.env,\n enabled: server.enabled,\n });\n}\n\nfunction denormalizeStandard(server: McpServerConfig): Record<string, unknown> {\n return compact({\n type: server.transport,\n command: server.command,\n args: server.args?.length ? server.args : undefined,\n env: server.env,\n url: server.url,\n headers: server.headers,\n enabled: server.enabled,\n });\n}\n\n/**\n * Prime Agent's kernel hands stdio servers a trimmed environment plus the\n * variables the entry names, so its env map holds references only. A\n * literal has no way in and is refused rather than written as a server\n * that fails on its first connection.\n *\n * @param server - Normalized server whose env values are `${NAME}` references.\n * @returns {Record<string, unknown>} The Prime Agent entry.\n */\nfunction denormalizePrime(server: McpServerConfig): Record<string, unknown> {\n const env = server.env\n ? Object.fromEntries(\n Object.entries(server.env).map(([key, value]) => [\n key,\n { env: requirePrimeReference(server, key, value) },\n ]),\n )\n : undefined;\n return compact({ ...denormalizeStandard(server), env });\n}\n\nfunction requirePrimeReference(server: McpServerConfig, key: string, value: string): string {\n const reference = envReference(value);\n if (reference === undefined) {\n throw new McpEnvError(\n `${server.name}: Prime Agent takes only environment references in env; write ${key} as \"\\${NAME}\" and export NAME where prime-agent runs`,\n );\n }\n return reference;\n}\n\n/**\n * Shapes a server's env for one dialect before it is compared or written:\n * Prime Agent keeps `${NAME}` references and refuses literals, every other\n * dialect gets the references resolved from the environment of this\n * process, the same way `~` and `${HOME}` are expanded before a sync.\n *\n * @param server - Normalized server, possibly carrying references.\n * @param dialect - Target harness config dialect.\n * @returns {McpServerConfig} The server as the dialect can hold it.\n */\nfunction resolveEnvReferences(\n server: McpServerConfig,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig {\n if (!server.env) return server;\n if (dialect === \"prime\") {\n for (const [key, value] of Object.entries(server.env))\n requirePrimeReference(server, key, value);\n return server;\n }\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(server.env)) {\n const reference = envReference(value);\n if (reference === undefined) {\n env[key] = value;\n continue;\n }\n // process.env inherits Object.prototype, so a bare lookup would turn\n // ${constructor} into a function; only own string values count.\n const resolved = Object.hasOwn(process.env, reference) ? process.env[reference] : undefined;\n if (typeof resolved !== \"string\") {\n throw new McpEnvError(\n `${server.name}: env ${key} references ${reference}, which is not set in this environment`,\n );\n }\n env[key] = resolved;\n }\n return { ...server, env };\n}\n\n/**\n * Converts a normalized server back to the raw shape one dialect expects.\n *\n * @param server - Normalized server configuration.\n * @param dialect - Target harness config dialect.\n * @returns {Record<string, unknown>} The dialect-specific entry.\n */\nfunction denormalizeEntry(\n server: McpServerConfig,\n dialect: McpConfigFile[\"dialect\"],\n): Record<string, unknown> {\n if (dialect === \"antigravity\") return denormalizeAntigravity(server);\n if (dialect === \"opencode\") return denormalizeOpenCode(server);\n if (dialect === \"prime\") return denormalizePrime(server);\n return denormalizeStandard(server);\n}\n\nfunction listingBase(entry: McpConfigFile, path: string): McpConfigListing {\n return compact({\n path,\n scope: entry.scope,\n format: entry.format,\n level: entry.level,\n note: entry.note,\n exists: false,\n servers: [],\n });\n}\n\nfunction configServerMap(raw: string, entry: McpConfigFile): Record<string, unknown> {\n const parsed = entry.format === \"toml\" ? parseToml(raw) : (JSON.parse(raw) as unknown);\n return drill(isObjectRecord(parsed) ? parsed : {}, entry.key) ?? {};\n}\n\nfunction normalizeServerMap(\n map: Readonly<Record<string, unknown>>,\n dialect: McpConfigFile[\"dialect\"],\n): McpServerConfig[] {\n const servers: McpServerConfig[] = [];\n for (const [name, rawEntry] of Object.entries(map)) {\n if (isObjectRecord(rawEntry)) servers.push(normalizeEntry(name, rawEntry, dialect));\n }\n return servers;\n}\n\nfunction listMcpConfig(entry: McpConfigFile, path: string): McpConfigListing {\n const base = listingBase(entry, path);\n try {\n const raw = readIfExists(path);\n if (raw === null) return base;\n const servers = normalizeServerMap(configServerMap(raw, entry), entry.dialect);\n return { ...base, exists: true, servers };\n } catch (error) {\n return {\n ...base,\n exists: true,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Lists the MCP servers a harness has configured, per declared config file.\n * Missing files come back with `exists: false`; unparsable ones carry `error`.\n *\n * @param harness - Harness whose configs should be read.\n * @param options - Platform and path-resolution overrides.\n * @returns {McpConfigListing[]} One listing per declared config file.\n */\nexport function listMcpServers(harness: Harness, options: ResolveOptions = {}): McpConfigListing[] {\n return resolveConfigs(harness, options).map(({ entry, path }) => listMcpConfig(entry, path));\n}\n\nfunction writableConfig(\n harness: Harness,\n scope: \"user\" | \"project\",\n options: ResolveOptions,\n): { entry: McpConfigFile; path: string } {\n const config = resolveConfigs(harness, options).find(({ entry }) => entry.scope === scope);\n if (!config) {\n throw new Error(`Harness ${harness.id} has no ${scope}-scope MCP config`);\n }\n return config;\n}\n\nfunction writeAtomically(path: string, content: string): void {\n mkdirSync(dirname(path), { recursive: true });\n const temp = join(dirname(path), `.${Date.now()}-${process.pid}.mcp.tmp`);\n writeFileSync(temp, content);\n renameSync(temp, path);\n}\n\nfunction tomlValue(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction tomlKeyPart(name: string): string {\n return /^[A-Za-z0-9_-]+$/.test(name) ? name : JSON.stringify(name);\n}\n\n/**\n * Renders one server as TOML sections, scalars before sub-tables.\n *\n * @param key - TOML path containing the server map.\n * @param server - Server to serialize.\n * @returns {string} The rendered TOML section block.\n */\nfunction tomlSections(key: readonly string[], server: McpServerConfig): string {\n const head = [...key, server.name].map(tomlKeyPart).join(\".\");\n const lines = [`[${head}]`];\n if (server.command) lines.push(`command = ${tomlValue(server.command)}`);\n if (server.args?.length) lines.push(`args = [${server.args.map(tomlValue).join(\", \")}]`);\n if (server.url) lines.push(`url = ${tomlValue(server.url)}`);\n if (server.enabled !== undefined) lines.push(`enabled = ${server.enabled}`);\n for (const [subKey, record] of [\n [\"env\", server.env],\n [\"headers\", server.headers],\n ] as const) {\n if (!record) continue;\n lines.push(\"\", `[${head}.${subKey}]`);\n for (const [k, v] of Object.entries(record)) {\n lines.push(`${tomlKeyPart(k)} = ${tomlValue(v)}`);\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Deletes the lines that define one server in a TOML config: its\n * `[key.name]` section (with sub-tables) and any `name = {...}` inline\n * assignment inside the bare `[key]` table. Every other line survives\n * byte-for-byte, comments included.\n *\n * @param raw - Original TOML text.\n * @param key - TOML path containing the server map.\n * @param name - Server name to remove.\n * @returns {string} TOML text without the target server.\n */\nfunction stripTomlServer(raw: string, key: readonly string[], name: string): string {\n const prefix = RegExp.escape(key.map(tomlKeyPart).join(\".\"));\n const namePart = `(?:${RegExp.escape(tomlKeyPart(name))}|${RegExp.escape(JSON.stringify(name))})`;\n const sectionRe = new RegExp(`^\\\\s*\\\\[${prefix}\\\\.${namePart}(\\\\.[^\\\\]]+)?\\\\]`);\n const bareTableRe = new RegExp(`^\\\\s*\\\\[${prefix}\\\\]\\\\s*(#.*)?$`);\n const anyHeaderRe = /^\\s*\\[/;\n const inlineRe = new RegExp(`^\\\\s*${namePart}\\\\s*=`);\n\n const kept: string[] = [];\n let inTargetSection = false;\n let inBareTable = false;\n for (const line of raw.split(\"\\n\")) {\n if (anyHeaderRe.test(line)) {\n inTargetSection = sectionRe.test(line);\n inBareTable = bareTableRe.test(line);\n } else if (inBareTable && inlineRe.test(line)) {\n continue;\n }\n if (inTargetSection) continue;\n kept.push(line);\n }\n return kept.join(\"\\n\");\n}\n\nfunction serverMapFromToml(raw: string, key: readonly string[]): Record<string, unknown> {\n const parsed = parseToml(raw);\n return drill(parsed as Record<string, unknown>, key) ?? {};\n}\n\n/**\n * Verifies a surgical TOML edit before it is written: the result must still\n * parse, hold the expected state for the target server, and leave every other\n * server untouched.\n *\n * @param beforeMap - Server map before the edit.\n * @param after - Candidate TOML text after the edit.\n * @param key - TOML path containing the server map.\n * @param name - Target server name.\n * @param shouldExist - Whether the target must remain after the edit.\n */\nfunction assertTomlEdit(\n beforeMap: Readonly<Record<string, unknown>>,\n after: string,\n key: readonly string[],\n name: string,\n shouldExist: boolean,\n): void {\n let afterMap: Record<string, unknown>;\n try {\n afterMap = serverMapFromToml(after, key);\n } catch (error) {\n throw new Error(\n `TOML edit produced an unparsable file, aborting: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (Object.hasOwn(afterMap, name) !== shouldExist) {\n throw new Error(\n `TOML edit did not leave server ${name} ${shouldExist ? \"present\" : \"absent\"}, aborting`,\n );\n }\n\n for (const other of new Set([...Object.keys(beforeMap), ...Object.keys(afterMap)])) {\n if (other === name) continue;\n if (JSON.stringify(beforeMap[other]) !== JSON.stringify(afterMap[other])) {\n throw new Error(`TOML edit touched servers other than ${name}, aborting`);\n }\n }\n}\n\nfunction addTomlServer(path: string, key: readonly string[], server: McpServerConfig): boolean {\n const before = readIfExists(path) ?? \"\";\n const beforeMap = serverMapFromToml(before, key);\n const replaced = Object.hasOwn(beforeMap, server.name);\n const stripped = replaced ? stripTomlServer(before, key, server.name) : before;\n const body = stripped.replace(/\\s+$/, \"\");\n const after = body ? `${body}\\n\\n${tomlSections(key, server)}` : tomlSections(key, server);\n assertTomlEdit(beforeMap, after, key, server.name, true);\n writeAtomically(path, after);\n return replaced;\n}\n\nfunction removeTomlServer(path: string, key: readonly string[], name: string): boolean {\n const before = readIfExists(path);\n if (before === null) return false;\n const beforeMap = serverMapFromToml(before, key);\n if (!Object.hasOwn(beforeMap, name)) return false;\n const after = stripTomlServer(before, key, name);\n assertTomlEdit(beforeMap, after, key, name, false);\n writeAtomically(path, after);\n return true;\n}\n\n/**\n * Adds (or replaces) one MCP server in a harness's config. The rest of the\n * file is preserved: JSON through a parse/serialize round trip (formatting\n * normalizes to two-space indentation), TOML through a surgical line edit.\n *\n * @param harness - Target harness.\n * @param server - Normalized server configuration to write.\n * @param scope - User or project config scope.\n * @param options - Platform and path-resolution overrides.\n * @returns {{ path: string, replaced: boolean }} The written path and replacement status.\n */\nexport function addMcpServer(\n harness: Harness,\n server: McpServerConfig,\n scope: \"user\" | \"project\" = \"user\",\n options: ResolveOptions = {},\n): { path: string; replaced: boolean } {\n const { entry, path } = writableConfig(harness, scope, options);\n const resolved = resolveEnvReferences(server, entry.dialect);\n\n if (entry.format === \"toml\") {\n return { path, replaced: addTomlServer(path, entry.key, resolved) };\n }\n\n const root = JSON.parse(readIfExists(path) ?? \"{}\") as Record<string, unknown>;\n const map = drill(root, entry.key, \"create\");\n if (!map) throw new Error(`Config at ${path} has a non-object at ${entry.key.join(\".\")}`);\n\n const replaced = Object.hasOwn(map, server.name);\n map[server.name] = denormalizeEntry(resolved, entry.dialect);\n writeAtomically(path, `${JSON.stringify(root, null, 2)}\\n`);\n return { path, replaced };\n}\n\n/**\n * Removes one MCP server from a harness's config.\n *\n * @param harness - Target harness.\n * @param name - Server name to remove.\n * @param scope - User or project config scope.\n * @param options - Platform and path-resolution overrides.\n * @returns {{ path: string, removed: boolean }} The targeted path and removal status.\n */\nexport function removeMcpServer(\n harness: Harness,\n name: string,\n scope: \"user\" | \"project\" = \"user\",\n options: ResolveOptions = {},\n): { path: string; removed: boolean } {\n const { entry, path } = writableConfig(harness, scope, options);\n\n if (entry.format === \"toml\") {\n return { path, removed: removeTomlServer(path, entry.key, name) };\n }\n\n const raw = readIfExists(path);\n if (raw === null) return { path, removed: false };\n\n const root = JSON.parse(raw) as Record<string, unknown>;\n const map = drill(root, entry.key);\n if (!map || !Object.hasOwn(map, name)) return { path, removed: false };\n\n delete map[name];\n writeAtomically(path, `${JSON.stringify(root, null, 2)}\\n`);\n return { path, removed: true };\n}\n\ntype JsoncState = \"code\" | \"string\" | \"escape\" | \"line-comment\" | \"block-comment\";\n\ntype JsoncContext = Readonly<{\n text: string;\n index: number;\n character: string;\n next: string | undefined;\n}>;\n\ntype JsoncStep = Readonly<{\n state: JsoncState;\n output: string;\n advance: number;\n}>;\n\ntype JsoncScanner = (context: JsoncContext) => JsoncStep;\n\nfunction trailingJsoncComma(text: string, index: number): boolean {\n const rest = text.slice(index + 1);\n const significant = rest.replaceAll(/\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\/|\\s+/g, \"\");\n return significant.startsWith(\"}\") || significant.startsWith(\"]\");\n}\n\nfunction scanJsoncCode(context: JsoncContext): JsoncStep {\n const { character, next } = context;\n if (character === '\"') return { state: \"string\", output: character, advance: 0 };\n if (character === \"/\" && next === \"/\") {\n return { state: \"line-comment\", output: \"\", advance: 1 };\n }\n if (character === \"/\" && next === \"*\") {\n return { state: \"block-comment\", output: \"\", advance: 1 };\n }\n if (character === \",\" && trailingJsoncComma(context.text, context.index)) {\n return { state: \"code\", output: \"\", advance: 0 };\n }\n return { state: \"code\", output: character, advance: 0 };\n}\n\nfunction scanJsoncString({ character }: JsoncContext): JsoncStep {\n if (character === \"\\\\\") return { state: \"escape\", output: character, advance: 0 };\n if (character === '\"') return { state: \"code\", output: character, advance: 0 };\n return { state: \"string\", output: character, advance: 0 };\n}\n\nfunction scanJsoncEscape({ character }: JsoncContext): JsoncStep {\n return { state: \"string\", output: character, advance: 0 };\n}\n\nfunction scanJsoncLineComment({ character }: JsoncContext): JsoncStep {\n if (character === \"\\n\") return { state: \"code\", output: character, advance: 0 };\n return { state: \"line-comment\", output: \"\", advance: 0 };\n}\n\nfunction scanJsoncBlockComment({ character, next }: JsoncContext): JsoncStep {\n if (character === \"*\" && next === \"/\") {\n return { state: \"code\", output: \"\", advance: 1 };\n }\n return { state: \"block-comment\", output: \"\", advance: 0 };\n}\n\nconst JSONC_SCANNERS: Record<JsoncState, JsoncScanner> = {\n code: scanJsoncCode,\n string: scanJsoncString,\n escape: scanJsoncEscape,\n \"line-comment\": scanJsoncLineComment,\n \"block-comment\": scanJsoncBlockComment,\n};\n\n/**\n * Strips JSONC extensions (comments and trailing commas) so the master sync\n * file can be read with JSON.parse. String contents are left untouched.\n *\n * @param text - JSONC source text.\n * @returns {unknown} The parsed JSON value.\n */\nexport function parseJsonc(text: string): unknown {\n let out = \"\";\n let state: JsoncState = \"code\";\n for (let index = 0; index < text.length; index++) {\n const character = text[index] as string;\n const step: JsoncStep = JSONC_SCANNERS[state]({\n text,\n index,\n character,\n next: text[index + 1],\n });\n out += step.output;\n state = step.state;\n index += step.advance;\n }\n return JSON.parse(out);\n}\n\n/**\n * Resolves the master sync file path: $XDG_CONFIG_HOME or ~/.config.\n *\n * @param options - Path-resolution overrides.\n * @returns {string} The resolved master MCP config path.\n */\nexport function masterMcpPath(options: ResolveOptions = {}): string {\n return join(agntnConfigDir(options), \"mcp.jsonc\");\n}\n\n/** One harness's outcome of a sync run. */\nexport interface SyncTargetResult {\n id: string;\n path?: string;\n /** Reason this harness could not be targeted; `results` is empty then. */\n skipped?: string;\n /** Set when the master list excludes this harness; master-listed names are withdrawn. */\n excluded?: true;\n results: Array<{\n name: string;\n action: \"added\" | \"replaced\" | \"removed\" | \"unchanged\" | \"skipped\";\n /** Why a master server could not be written to this harness. */\n reason?: string;\n }>;\n}\n\n/** Outcome of resetting the harness configs to the master list. */\nexport interface SyncReport {\n source: string;\n servers: string[];\n targets: SyncTargetResult[];\n}\n\nfunction canonical(server: McpServerConfig): string {\n return JSON.stringify(\n Object.fromEntries(Object.entries(server).sort(([a], [b]) => a.localeCompare(b))),\n );\n}\n\n/**\n * Expands a leading `~` and `${HOME}` in master-list values. Harnesses spawn\n * MCP commands without a shell, so the expansion has to happen here: the\n * synced configs always carry absolute paths.\n *\n * @param value - Master-list value to expand.\n * @param home - Home directory used for expansion.\n * @returns {string} The expanded value.\n */\nfunction expandHome(value: string, home: string): string {\n return value.replaceAll(/^~(?=\\/|$)|\\$\\{HOME\\}/g, () => home);\n}\n\nfunction expandServerHome(server: McpServerConfig, home: string): McpServerConfig {\n return compact({\n ...server,\n command: server.command === undefined ? undefined : expandHome(server.command, home),\n args: server.args?.map((arg) => expandHome(arg, home)),\n env: server.env\n ? Object.fromEntries(Object.entries(server.env).map(([k, v]) => [k, expandHome(v, home)]))\n : undefined,\n });\n}\n\nfunction requiredMasterServerMap(\n root: Readonly<Record<string, unknown>>,\n path: string,\n): Record<string, unknown> {\n const map = drill(root as Record<string, unknown>, [\"mcpServers\"]);\n if (!map) throw new Error(`Master MCP list at ${path} has no mcpServers object`);\n return map;\n}\n\nfunction normalizeMasterServers(\n map: Readonly<Record<string, unknown>>,\n home: string,\n): McpServerConfig[] {\n const servers: McpServerConfig[] = [];\n for (const [name, rawEntry] of Object.entries(map)) {\n if (isObjectRecord(rawEntry)) {\n servers.push(expandServerHome(normalizeEntry(name, rawEntry, \"standard\"), home));\n }\n }\n return servers;\n}\n\nfunction masterExcludes(value: unknown, path: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Master MCP list at ${path} has an invalid excludes: expected an array of harness ids`,\n );\n }\n return value as string[];\n}\n\n/**\n * Reads and normalizes the master list; throws when the file is missing or invalid.\n *\n * @param options - Path-resolution overrides.\n * @returns {{ path: string, servers: McpServerConfig[], excludes: string[] }} The master list.\n */\nexport function readMasterMcpServers(options: ResolveOptions = {}): {\n path: string;\n servers: McpServerConfig[];\n /** Harness ids the master list opts out of syncing. */\n excludes: string[];\n} {\n const path = masterMcpPath(options);\n const raw = readIfExists(path);\n if (raw === null) throw new Error(`No master MCP list at ${path}`);\n\n const parsed = parseJsonc(raw);\n const root = isObjectRecord(parsed) ? parsed : {};\n const map = requiredMasterServerMap(root, path);\n return {\n path,\n servers: normalizeMasterServers(map, options.homeDir ?? homedir()),\n excludes: masterExcludes(root.excludes, path),\n };\n}\n\ntype MasterSyncInput = Readonly<{\n path: string;\n servers: readonly McpServerConfig[];\n excludes: readonly string[];\n}>;\n\nfunction optionalPath(path: string | undefined): {} | { path: string } {\n return path === undefined ? {} : { path };\n}\n\nfunction existingServers(listing: McpConfigListing | undefined): Map<string, string> {\n return new Map((listing?.servers ?? []).map((server) => [server.name, canonical(server)]));\n}\n\nfunction withdrawMasterServersFromExcludedHarness(\n harness: Harness,\n existing: ReadonlyMap<string, string>,\n masterNames: ReadonlySet<string>,\n initialPath: string | undefined,\n options: ResolveOptions,\n): SyncTargetResult {\n const results: SyncTargetResult[\"results\"] = [];\n let path = initialPath;\n for (const name of existing.keys()) {\n if (!masterNames.has(name)) continue;\n const removed = removeMcpServer(harness, name, \"user\", options);\n if (removed.removed) {\n path = removed.path;\n results.push({ name, action: \"removed\" });\n }\n }\n return { id: harness.id, ...optionalPath(path), excluded: true, results };\n}\n\nfunction syncIncludedHarness(\n harness: Harness,\n master: MasterSyncInput,\n existing: ReadonlyMap<string, string>,\n masterNames: ReadonlySet<string>,\n initialPath: string | undefined,\n options: ResolveOptions,\n): SyncTargetResult {\n const results: SyncTargetResult[\"results\"] = [];\n let path = initialPath;\n const { dialect } = writableConfig(harness, \"user\", options).entry;\n for (const server of master.servers) {\n try {\n const resolved = resolveEnvReferences(server, dialect);\n if (existing.get(server.name) === canonical(resolved)) {\n results.push({ name: server.name, action: \"unchanged\" });\n continue;\n }\n const written = addMcpServer(harness, resolved, \"user\", options);\n path = written.path;\n results.push({ name: server.name, action: written.replaced ? \"replaced\" : \"added\" });\n } catch (error) {\n // One server the dialect cannot hold must not stop the rest of the list.\n if (!(error instanceof McpEnvError)) throw error;\n results.push({ name: server.name, action: \"skipped\", reason: error.message });\n }\n }\n for (const name of existing.keys()) {\n if (masterNames.has(name)) continue;\n const removed = removeMcpServer(harness, name, \"user\", options);\n if (removed.removed) {\n path = removed.path;\n results.push({ name, action: \"removed\" });\n }\n }\n return { id: harness.id, ...optionalPath(path), results };\n}\n\nfunction syncMcpTarget(\n harness: Harness,\n master: MasterSyncInput,\n masterNames: ReadonlySet<string>,\n options: ResolveOptions,\n): SyncTargetResult {\n const hasUserConfig = harness.mcpConfigs.some((candidate) => candidate.scope === \"user\");\n if (!hasUserConfig) {\n return { id: harness.id, skipped: \"no user-scope MCP config\", results: [] };\n }\n\n const listing = listMcpServers(harness, options).find((item) => item.scope === \"user\");\n if (listing?.error) {\n return {\n id: harness.id,\n path: listing.path,\n skipped: `existing config is unreadable: ${listing.error}`,\n results: [],\n };\n }\n\n const existing = existingServers(listing);\n if (master.excludes.includes(harness.id)) {\n return withdrawMasterServersFromExcludedHarness(\n harness,\n existing,\n masterNames,\n listing?.path,\n options,\n );\n }\n return syncIncludedHarness(harness, master, existing, masterNames, listing?.path, options);\n}\n\n/**\n * Resets each harness's user-scope MCP config to exactly the master list:\n * missing servers are added, drifted ones replaced, and servers absent from\n * the master are removed. The master file is the single source of truth.\n *\n * @param harnesses - Harnesses to synchronize.\n * @param options - Platform and path-resolution overrides.\n * @returns {SyncReport} Per-harness synchronization outcomes.\n */\nexport function syncMcpServers(\n harnesses: readonly Harness[],\n options: ResolveOptions = {},\n): SyncReport {\n const master = readMasterMcpServers(options);\n const masterNames = new Set(master.servers.map((server) => server.name));\n return {\n source: master.path,\n servers: master.servers.map((server) => server.name),\n targets: harnesses.map((harness) => syncMcpTarget(harness, master, masterNames, options)),\n };\n}\n","/**\n * Symlink-based sync of the global agent instructions file across harnesses.\n *\n * The master file (default ~/.config/agntn/AGENTS.md, overridable via\n * ~/.config/agntn/agents.jsonc) is the single physical copy; every harness's\n * user-scope instructions file becomes a symlink to it, so an edit made\n * through any harness lands in the master and is visible everywhere at once.\n * Explicit companion files are linked beside each instructions target. Sync\n * is a doctor: it creates missing links, repairs wrong ones, adopts diverged\n * regular files (content moved to a backup, then relinked), and in check mode\n * only reports.\n */\nimport {\n lstatSync,\n mkdirSync,\n readFileSync,\n readlinkSync,\n renameSync,\n symlinkSync,\n unlinkSync,\n} from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, posix, resolve, win32 } from \"node:path\";\nimport type { Harness } from \"./harness.ts\";\nimport { parseJsonc } from \"./mcp-servers.ts\";\nimport { agntnConfigDir, resolvePathTemplate } from \"./resolve.ts\";\nimport type { ResolveOptions } from \"./types.ts\";\n\n/** Configuration read from agents.jsonc. */\nexport interface AgentsConfig {\n /** The master instructions file every harness links to. */\n source: string;\n /** Relative files to link beside every harness instructions target. */\n companions: string[];\n /** Harness ids the sync leaves untouched. */\n excludes: string[];\n /** Path the config was read from; absent when defaults were used. */\n configPath?: string;\n}\n\nexport type AgentsSyncAction = \"linked\" | \"relinked\" | \"adopted\" | \"unchanged\" | \"skipped\";\n\n/** One companion file's outcome for a harness target. */\nexport interface AgentsCompanionTargetResult {\n readonly source: string;\n readonly path: string;\n readonly action: Exclude<AgentsSyncAction, \"skipped\">;\n /** Backup path for an adopted file, or a check-mode note. */\n readonly detail?: string;\n}\n\n/** One harness's outcome of an agents sync run. */\nexport interface AgentsTargetResult {\n id: string;\n path?: string;\n action: AgentsSyncAction;\n /** Reason for a skip, or the backup path for an adopted diverged file. */\n detail?: string;\n /** Companion outcomes, present when companions are configured. */\n companions?: readonly AgentsCompanionTargetResult[];\n}\n\n/** Outcome of one agents sync/doctor run. */\nexport interface AgentsSyncReport {\n source: string;\n check: boolean;\n targets: AgentsTargetResult[];\n}\n\nfunction readIfExists(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction agentsConfigRecord(raw: string, configPath: string): Record<string, unknown> {\n const parsed = parseJsonc(raw);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(`Agents config at ${configPath} is not an object`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction agentsSource(\n value: unknown,\n defaultSource: string,\n options: ResolveOptions,\n configPath: string,\n): string {\n if (value === undefined) return defaultSource;\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Agents config at ${configPath} has an invalid source: expected a path string`);\n }\n const expanded = resolvePathTemplate(value, options);\n // A relative source would produce cwd-dependent, dangling links in every\n // harness, so anchor it to the config directory it was declared in.\n return isAbsolute(expanded) ? expanded : join(agntnConfigDir(options), expanded);\n}\n\nfunction agentsExcludes(value: unknown, configPath: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Agents config at ${configPath} has an invalid excludes: expected an array of harness ids`,\n );\n }\n return value as string[];\n}\n\nfunction companionPath(value: string, configPath: string): string {\n const normalized = posix.normalize(value.replaceAll(\"\\\\\", \"/\"));\n if (\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n posix.isAbsolute(normalized) ||\n win32.parse(value).root !== \"\"\n ) {\n throw new Error(\n `Agents config at ${configPath} has an unsafe companion path: ${JSON.stringify(normalized)}`,\n );\n }\n return normalized.endsWith(\"/\") ? normalized.slice(0, -1) : normalized;\n}\n\nfunction comparablePath(path: string): string {\n // Reject lexical and case-only aliases on every platform so one config\n // remains portable to the case-insensitive filesystems common on Windows\n // and macOS.\n return resolve(path).toLowerCase();\n}\n\nfunction agentsCompanions(value: unknown, configPath: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(\n `Agents config at ${configPath} has invalid companions: expected an array of relative paths`,\n );\n }\n\n const companions = (value as string[]).map((path) => companionPath(path, configPath));\n const comparable = companions.map(comparablePath);\n if (new Set(comparable).size !== comparable.length) {\n throw new Error(`Agents config at ${configPath} has duplicate companion paths`);\n }\n return companions;\n}\n\n/**\n * Reads agents.jsonc; missing file falls back to defaults.\n *\n * @param options - Path-resolution overrides.\n * @returns {AgentsConfig} The normalized sync configuration.\n */\nexport function readAgentsConfig(options: ResolveOptions = {}): AgentsConfig {\n const configPath = join(agntnConfigDir(options), \"agents.jsonc\");\n const defaults: AgentsConfig = {\n source: join(agntnConfigDir(options), \"AGENTS.md\"),\n companions: [],\n excludes: [],\n };\n\n const raw = readIfExists(configPath);\n if (raw === null) return defaults;\n\n const record = agentsConfigRecord(raw, configPath);\n return {\n source: agentsSource(record.source, defaults.source, options, configPath),\n companions: agentsCompanions(record.companions, configPath),\n excludes: agentsExcludes(record.excludes, configPath),\n configPath,\n };\n}\n\ntype LinkState =\n | { readonly kind: \"missing\" }\n | { readonly kind: \"correct-link\" }\n | { readonly kind: \"wrong-link\" }\n | { readonly kind: \"identical-file\" }\n | { readonly kind: \"diverged-file\" };\n\nfunction inspectRegularFile(path: string, source: string): LinkState {\n const content = readIfExists(path) ?? \"\";\n const sourceContent = readIfExists(source) ?? \"\";\n if (content.trim() === \"\" || content === sourceContent) return { kind: \"identical-file\" };\n return { kind: \"diverged-file\" };\n}\n\nfunction inspectTarget(path: string, source: string): LinkState {\n let stats;\n try {\n stats = lstatSync(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { kind: \"missing\" };\n throw error;\n }\n\n if (stats.isSymbolicLink()) {\n // Compare the literal link target, not realpath: the master path is the\n // stable interface (it may itself be a link into a versioned backend),\n // and a harness file linking straight past it would stop following when\n // the backend behind the master changes.\n const target = readlinkSync(path);\n const resolved = isAbsolute(target) ? target : resolve(dirname(path), target);\n return resolved === source ? { kind: \"correct-link\" } : { kind: \"wrong-link\" };\n }\n\n return inspectRegularFile(path, source);\n}\n\n/**\n * Replaces whatever sits at `path` with a symlink to `source`, atomically.\n *\n * @param path - Harness instructions path to replace.\n * @param source - Master instructions path to link.\n */\nfunction relink(path: string, source: string): void {\n mkdirSync(dirname(path), { recursive: true });\n const temp = join(dirname(path), `.${Date.now()}-${process.pid}.agents.tmp`);\n symlinkSync(source, temp);\n renameSync(temp, path);\n}\n\ntype AgentsFileResult = Omit<AgentsCompanionTargetResult, \"source\">;\n\nconst CHECK_ACTION: Record<LinkState[\"kind\"], AgentsFileResult[\"action\"]> = {\n missing: \"linked\",\n \"correct-link\": \"unchanged\",\n \"wrong-link\": \"relinked\",\n \"identical-file\": \"relinked\",\n \"diverged-file\": \"adopted\",\n};\n\nfunction applyFileTarget(\n id: string,\n path: string,\n source: string,\n state: LinkState,\n options: ResolveOptions,\n): AgentsFileResult {\n if (state.kind === \"diverged-file\") {\n const backupDir = join(agntnConfigDir(options), \"diverged\");\n mkdirSync(backupDir, { recursive: true });\n const backup = join(backupDir, `${id}-${basename(path)}-${Date.now()}.md`);\n renameSync(path, backup);\n relink(path, source);\n return { path, action: \"adopted\", detail: backup };\n }\n\n if (state.kind === \"wrong-link\") unlinkSync(path);\n if (state.kind === \"wrong-link\" || state.kind === \"identical-file\") {\n relink(path, source);\n return { path, action: \"relinked\" };\n }\n\n relink(path, source);\n return { path, action: \"linked\" };\n}\n\nfunction syncFileTarget(\n id: string,\n path: string,\n source: string,\n check: boolean,\n options: ResolveOptions,\n): AgentsFileResult {\n const state = inspectTarget(path, source);\n if (state.kind === \"correct-link\") return { path, action: \"unchanged\" };\n if (check) {\n return {\n path,\n action: CHECK_ACTION[state.kind],\n detail: \"check mode: not applied\",\n };\n }\n return applyFileTarget(id, path, source, state, options);\n}\n\nfunction syncTarget(\n harness: Harness,\n config: AgentsConfig,\n check: boolean,\n options: ResolveOptions,\n): AgentsTargetResult {\n if (config.excludes.includes(harness.id)) {\n return { id: harness.id, action: \"skipped\", detail: \"excluded by the agents config\" };\n }\n if (!harness.agentsFile) {\n return {\n id: harness.id,\n action: \"skipped\",\n detail: \"no stable user-scope instructions file\",\n };\n }\n\n const path = resolvePathTemplate(harness.agentsFile, options);\n const target = syncFileTarget(harness.id, path, config.source, check, options);\n if (config.companions.length === 0) return { id: harness.id, ...target };\n\n const companions = config.companions.map((relativePath) => {\n const source = resolve(dirname(config.source), relativePath);\n const companionPath = resolve(dirname(path), relativePath);\n return {\n source,\n ...syncFileTarget(harness.id, companionPath, source, check, options),\n };\n });\n return { id: harness.id, ...target, companions };\n}\n\nfunction preflightCompanions(\n harnesses: readonly Harness[],\n config: AgentsConfig,\n options: ResolveOptions,\n): void {\n for (const relativePath of config.companions) {\n const source = resolve(dirname(config.source), relativePath);\n if (comparablePath(source) === comparablePath(config.source)) {\n throw new Error(`Companion path resolves to the master agents file: ${relativePath}`);\n }\n if (readIfExists(source) === null) {\n throw new Error(`No companion agents file at ${source}`);\n }\n }\n\n for (const harness of harnesses) {\n if (config.excludes.includes(harness.id) || !harness.agentsFile) continue;\n const path = resolvePathTemplate(harness.agentsFile, options);\n const collision = config.companions.find(\n (relativePath) =>\n comparablePath(resolve(dirname(path), relativePath)) === comparablePath(path),\n );\n if (collision !== undefined) {\n throw new Error(`Companion path collides with ${harness.id} instructions: ${collision}`);\n }\n }\n}\n\n/**\n * Links every harness's user-scope instructions file to the master. In check\n * mode nothing is written; the report shows what a real run would do.\n *\n * @param harnesses - Harnesses to inspect or update.\n * @param check - Report intended changes without writing them.\n * @param options - Path-resolution overrides.\n * @returns {AgentsSyncReport} Per-harness synchronization outcomes.\n */\nexport function syncAgentsFiles(\n harnesses: readonly Harness[],\n check = false,\n options: ResolveOptions = {},\n): AgentsSyncReport {\n const config = readAgentsConfig(options);\n if (readIfExists(config.source) === null) {\n throw new Error(`No master agents file at ${config.source}`);\n }\n preflightCompanions(harnesses, config, options);\n return {\n source: config.source,\n check,\n targets: harnesses.map((harness) => syncTarget(harness, config, check, options)),\n };\n}\n"],"mappings":"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"}