@ken-jo/agent-connector 0.4.1 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +2 -2
  2. package/dist/{action-WT7GVRCC.js → action-YCU53FNE.js} +8 -8
  3. package/dist/{amazon-q-COAL3764.js → amazon-q-W574ZX35.js} +2 -2
  4. package/dist/amp-JPBQJJVM.js +666 -0
  5. package/dist/amp-JPBQJJVM.js.map +1 -0
  6. package/dist/{antigravity-AMKKKHS4.js → antigravity-VK2Y3FGV.js} +3 -3
  7. package/dist/{antigravity-cli-XERXEH5W.js → antigravity-cli-D4PCCUG2.js} +3 -3
  8. package/dist/{chunk-DCKFYWGM.js → chunk-2F5QH3D4.js} +36 -36
  9. package/dist/{chunk-RIMVWCZY.js → chunk-6RYPUR6O.js} +5 -5
  10. package/dist/{chunk-QREL7LZJ.js → chunk-7ECYDK5T.js} +2 -2
  11. package/dist/{chunk-O5TWCIJN.js → chunk-CYOAH23F.js} +18 -18
  12. package/dist/{chunk-URHQMFB3.js → chunk-DT6Y7XBI.js} +62 -16
  13. package/dist/chunk-DT6Y7XBI.js.map +1 -0
  14. package/dist/{chunk-2AVLX7GH.js → chunk-HAIMYUEY.js} +3 -3
  15. package/dist/{chunk-4ENJK5S2.js → chunk-MDNX7HTN.js} +2 -2
  16. package/dist/{chunk-EXLS7BSI.js → chunk-NLFPH4S2.js} +10 -2
  17. package/dist/chunk-NLFPH4S2.js.map +1 -0
  18. package/dist/{chunk-CPLK7GTE.js → chunk-PFDUGDOA.js} +351 -34
  19. package/dist/chunk-PFDUGDOA.js.map +1 -0
  20. package/dist/{chunk-EGCBZ2DC.js → chunk-SDPIT4HW.js} +2 -2
  21. package/dist/{chunk-5OWS5CMA.js → chunk-SPWFUHHK.js} +5 -5
  22. package/dist/{chunk-LQRAPXS4.js → chunk-TZQBASI7.js} +4 -2
  23. package/dist/chunk-TZQBASI7.js.map +1 -0
  24. package/dist/{chunk-XJ4S47CT.js → chunk-WFXWJITA.js} +2 -2
  25. package/dist/{chunk-24IDL5RW.js → chunk-YQLQJZ7S.js} +2 -2
  26. package/dist/{claude-code-W4PUFZL5.js → claude-code-ROSIILTM.js} +36 -100
  27. package/dist/claude-code-ROSIILTM.js.map +1 -0
  28. package/dist/cli/sdk.js +4 -4
  29. package/dist/cli.js +1 -1
  30. package/dist/{cline-WRYMNS7Z.js → cline-JUTO4V27.js} +2 -2
  31. package/dist/{codebuff-DH5Y7GAT.js → codebuff-2QUHL6HO.js} +127 -6
  32. package/dist/codebuff-2QUHL6HO.js.map +1 -0
  33. package/dist/{codex-DDHIV767.js → codex-YBBTIDD4.js} +109 -114
  34. package/dist/codex-YBBTIDD4.js.map +1 -0
  35. package/dist/{continue-K43SUHLQ.js → continue-W4TU4JSB.js} +5 -3
  36. package/dist/continue-W4TU4JSB.js.map +1 -0
  37. package/dist/{copilot-cli-Q3SSPT4V.js → copilot-cli-Y74SOP5G.js} +4 -2
  38. package/dist/copilot-cli-Y74SOP5G.js.map +1 -0
  39. package/dist/{crush-MBEH2R3I.js → crush-GMEWLXK5.js} +4 -2
  40. package/dist/{crush-MBEH2R3I.js.map → crush-GMEWLXK5.js.map} +1 -1
  41. package/dist/{cursor-TMBXDYR4.js → cursor-JBS4B3Q4.js} +50 -134
  42. package/dist/cursor-JBS4B3Q4.js.map +1 -0
  43. package/dist/{detect-KG5FG3EV.js → detect-2NIXILMZ.js} +4 -4
  44. package/dist/{doctor-FLZF34Y3.js → doctor-QWJBWALA.js} +8 -8
  45. package/dist/{droid-JC2NT6S4.js → droid-TJMTNCQE.js} +48 -106
  46. package/dist/droid-TJMTNCQE.js.map +1 -0
  47. package/dist/{gemini-cli-ILR7M5X3.js → gemini-cli-RAONGZRG.js} +7 -2
  48. package/dist/gemini-cli-RAONGZRG.js.map +1 -0
  49. package/dist/{goose-SFO5BBGW.js → goose-G4KKM6YU.js} +91 -131
  50. package/dist/goose-G4KKM6YU.js.map +1 -0
  51. package/dist/{hermes-3N7WN4WS.js → hermes-PJDTJE6F.js} +29 -33
  52. package/dist/hermes-PJDTJE6F.js.map +1 -0
  53. package/dist/{hook-XR3Z45FB.js → hook-FDGIQPRC.js} +8 -8
  54. package/dist/index.d.ts +2 -2
  55. package/dist/index.js +2 -2
  56. package/dist/{install-BSR62UHJ.js → install-TLG3QVP3.js} +8 -8
  57. package/dist/{introspect-Nw8hTReX.d.ts → introspect-Cn3MSA4_.d.ts} +1 -1
  58. package/dist/{jetbrains-copilot-NRZHI5PC.js → jetbrains-copilot-DNXSLQE5.js} +4 -2
  59. package/dist/jetbrains-copilot-DNXSLQE5.js.map +1 -0
  60. package/dist/{kilo-5NWOXVSD.js → kilo-FERJ3X46.js} +101 -5
  61. package/dist/kilo-FERJ3X46.js.map +1 -0
  62. package/dist/{kilo-cli-UZ7R5UOP.js → kilo-cli-TDCONH5G.js} +108 -12
  63. package/dist/kilo-cli-TDCONH5G.js.map +1 -0
  64. package/dist/{kimi-2YFK2GBA.js → kimi-RIRD4J5J.js} +12 -2
  65. package/dist/kimi-RIRD4J5J.js.map +1 -0
  66. package/dist/{kiro-YL6AWUYG.js → kiro-X7JVLAN7.js} +4 -2
  67. package/dist/kiro-X7JVLAN7.js.map +1 -0
  68. package/dist/{leaderboard-MJG24O35.js → leaderboard-MXGENYXN.js} +2 -2
  69. package/dist/{mimo-code-FTMGSKMQ.js → mimo-code-RFLQ727H.js} +2 -2
  70. package/dist/{mux-5XZFB44C.js → mux-D77HBSBU.js} +3 -17
  71. package/dist/mux-D77HBSBU.js.map +1 -0
  72. package/dist/{nemoclaw-W5KEJ3WX.js → nemoclaw-LXUTMR56.js} +3 -3
  73. package/dist/{omp-2QMEY6HD.js → omp-CO7IXURG.js} +2 -2
  74. package/dist/{openclaw-EXJEFNZI.js → openclaw-XWJLEW35.js} +3 -3
  75. package/dist/{opencode-WNXYJR4X.js → opencode-QKZ5EIYU.js} +5 -2
  76. package/dist/opencode-QKZ5EIYU.js.map +1 -0
  77. package/dist/{package-ACZXJHWB.js → package-IA56LSC3.js} +6 -6
  78. package/dist/{pi-PVVPVWKG.js → pi-YGBXYWY5.js} +2 -2
  79. package/dist/{qwen-code-G4CXKUHR.js → qwen-code-E2MSEZK6.js} +55 -123
  80. package/dist/qwen-code-E2MSEZK6.js.map +1 -0
  81. package/dist/{roo-code-67TYJIQR.js → roo-code-AGGJ473T.js} +2 -2
  82. package/dist/runtime/index.d.ts +1 -1
  83. package/dist/runtime/index.js +6 -6
  84. package/dist/sdk/index.d.ts +3 -3
  85. package/dist/sdk/index.js +3 -3
  86. package/dist/sdk/test.d.ts +2 -2
  87. package/dist/sdk/test.js +5 -5
  88. package/dist/{serve-GER7URPR.js → serve-RNUCK5F7.js} +8 -8
  89. package/dist/{status-LAJE3BM5.js → status-JOX6RLJU.js} +6 -6
  90. package/dist/{statusline-L376ZPZU.js → statusline-ZVFI5DRT.js} +7 -7
  91. package/dist/{telemetry-B3DX3PWU.js → telemetry-3FN6HDVU.js} +5 -5
  92. package/dist/{trae-7CZZGOGI.js → trae-6L226ZDU.js} +2 -2
  93. package/dist/{types-CRVrFWeU.d.ts → types-_6arHbX9.d.ts} +5 -4
  94. package/dist/{uninstall-ZYTW7YMZ.js → uninstall-SCKZYB4J.js} +8 -8
  95. package/dist/{upgrade-4LUEEOZW.js → upgrade-WU3KZWR4.js} +8 -8
  96. package/dist/{usage-ZFBVQF3H.js → usage-G72SF7JG.js} +2 -2
  97. package/dist/{usage-event-GZ32AGEB.js → usage-event-DHSEBO5T.js} +7 -7
  98. package/dist/{vscode-copilot-MF2CDNMT.js → vscode-copilot-6EOZDLXC.js} +4 -2
  99. package/dist/vscode-copilot-6EOZDLXC.js.map +1 -0
  100. package/dist/{warp-VKG55TAT.js → warp-N5YYN5BF.js} +2 -2
  101. package/dist/{windsurf-FU5G4SHF.js → windsurf-4TGSJIVV.js} +2 -2
  102. package/dist/{zed-SFUHL3GS.js → zed-6P2UFWXU.js} +2 -2
  103. package/package.json +1 -1
  104. package/dist/amp-4U33CU7E.js +0 -300
  105. package/dist/amp-4U33CU7E.js.map +0 -1
  106. package/dist/chunk-CPLK7GTE.js.map +0 -1
  107. package/dist/chunk-EXLS7BSI.js.map +0 -1
  108. package/dist/chunk-LQRAPXS4.js.map +0 -1
  109. package/dist/chunk-URHQMFB3.js.map +0 -1
  110. package/dist/claude-code-W4PUFZL5.js.map +0 -1
  111. package/dist/codebuff-DH5Y7GAT.js.map +0 -1
  112. package/dist/codex-DDHIV767.js.map +0 -1
  113. package/dist/continue-K43SUHLQ.js.map +0 -1
  114. package/dist/copilot-cli-Q3SSPT4V.js.map +0 -1
  115. package/dist/cursor-TMBXDYR4.js.map +0 -1
  116. package/dist/droid-JC2NT6S4.js.map +0 -1
  117. package/dist/gemini-cli-ILR7M5X3.js.map +0 -1
  118. package/dist/goose-SFO5BBGW.js.map +0 -1
  119. package/dist/hermes-3N7WN4WS.js.map +0 -1
  120. package/dist/jetbrains-copilot-NRZHI5PC.js.map +0 -1
  121. package/dist/kilo-5NWOXVSD.js.map +0 -1
  122. package/dist/kilo-cli-UZ7R5UOP.js.map +0 -1
  123. package/dist/kimi-2YFK2GBA.js.map +0 -1
  124. package/dist/kiro-YL6AWUYG.js.map +0 -1
  125. package/dist/mux-5XZFB44C.js.map +0 -1
  126. package/dist/opencode-WNXYJR4X.js.map +0 -1
  127. package/dist/qwen-code-G4CXKUHR.js.map +0 -1
  128. package/dist/vscode-copilot-MF2CDNMT.js.map +0 -1
  129. /package/dist/{action-WT7GVRCC.js.map → action-YCU53FNE.js.map} +0 -0
  130. /package/dist/{amazon-q-COAL3764.js.map → amazon-q-W574ZX35.js.map} +0 -0
  131. /package/dist/{antigravity-AMKKKHS4.js.map → antigravity-VK2Y3FGV.js.map} +0 -0
  132. /package/dist/{antigravity-cli-XERXEH5W.js.map → antigravity-cli-D4PCCUG2.js.map} +0 -0
  133. /package/dist/{chunk-DCKFYWGM.js.map → chunk-2F5QH3D4.js.map} +0 -0
  134. /package/dist/{chunk-RIMVWCZY.js.map → chunk-6RYPUR6O.js.map} +0 -0
  135. /package/dist/{chunk-QREL7LZJ.js.map → chunk-7ECYDK5T.js.map} +0 -0
  136. /package/dist/{chunk-O5TWCIJN.js.map → chunk-CYOAH23F.js.map} +0 -0
  137. /package/dist/{chunk-2AVLX7GH.js.map → chunk-HAIMYUEY.js.map} +0 -0
  138. /package/dist/{chunk-4ENJK5S2.js.map → chunk-MDNX7HTN.js.map} +0 -0
  139. /package/dist/{chunk-EGCBZ2DC.js.map → chunk-SDPIT4HW.js.map} +0 -0
  140. /package/dist/{chunk-5OWS5CMA.js.map → chunk-SPWFUHHK.js.map} +0 -0
  141. /package/dist/{chunk-XJ4S47CT.js.map → chunk-WFXWJITA.js.map} +0 -0
  142. /package/dist/{chunk-24IDL5RW.js.map → chunk-YQLQJZ7S.js.map} +0 -0
  143. /package/dist/{cline-WRYMNS7Z.js.map → cline-JUTO4V27.js.map} +0 -0
  144. /package/dist/{detect-KG5FG3EV.js.map → detect-2NIXILMZ.js.map} +0 -0
  145. /package/dist/{doctor-FLZF34Y3.js.map → doctor-QWJBWALA.js.map} +0 -0
  146. /package/dist/{hook-XR3Z45FB.js.map → hook-FDGIQPRC.js.map} +0 -0
  147. /package/dist/{install-BSR62UHJ.js.map → install-TLG3QVP3.js.map} +0 -0
  148. /package/dist/{leaderboard-MJG24O35.js.map → leaderboard-MXGENYXN.js.map} +0 -0
  149. /package/dist/{mimo-code-FTMGSKMQ.js.map → mimo-code-RFLQ727H.js.map} +0 -0
  150. /package/dist/{nemoclaw-W5KEJ3WX.js.map → nemoclaw-LXUTMR56.js.map} +0 -0
  151. /package/dist/{omp-2QMEY6HD.js.map → omp-CO7IXURG.js.map} +0 -0
  152. /package/dist/{openclaw-EXJEFNZI.js.map → openclaw-XWJLEW35.js.map} +0 -0
  153. /package/dist/{package-ACZXJHWB.js.map → package-IA56LSC3.js.map} +0 -0
  154. /package/dist/{pi-PVVPVWKG.js.map → pi-YGBXYWY5.js.map} +0 -0
  155. /package/dist/{roo-code-67TYJIQR.js.map → roo-code-AGGJ473T.js.map} +0 -0
  156. /package/dist/{serve-GER7URPR.js.map → serve-RNUCK5F7.js.map} +0 -0
  157. /package/dist/{status-LAJE3BM5.js.map → status-JOX6RLJU.js.map} +0 -0
  158. /package/dist/{statusline-L376ZPZU.js.map → statusline-ZVFI5DRT.js.map} +0 -0
  159. /package/dist/{telemetry-B3DX3PWU.js.map → telemetry-3FN6HDVU.js.map} +0 -0
  160. /package/dist/{trae-7CZZGOGI.js.map → trae-6L226ZDU.js.map} +0 -0
  161. /package/dist/{uninstall-ZYTW7YMZ.js.map → uninstall-SCKZYB4J.js.map} +0 -0
  162. /package/dist/{upgrade-4LUEEOZW.js.map → upgrade-WU3KZWR4.js.map} +0 -0
  163. /package/dist/{usage-ZFBVQF3H.js.map → usage-G72SF7JG.js.map} +0 -0
  164. /package/dist/{usage-event-GZ32AGEB.js.map → usage-event-DHSEBO5T.js.map} +0 -0
  165. /package/dist/{warp-VKG55TAT.js.map → warp-N5YYN5BF.js.map} +0 -0
  166. /package/dist/{windsurf-FU5G4SHF.js.map → windsurf-4TGSJIVV.js.map} +0 -0
  167. /package/dist/{zed-SFUHL3GS.js.map → zed-6P2UFWXU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/claude-code/index.ts"],"sourcesContent":["/**\n * adapters/claude-code — Claude Code platform adapter for agent-connector.\n *\n * Generalized from context-mode's proven 15-platform Claude adapter: the served\n * identity is now `ctx.connector` (not a hardcoded \"context-mode\"), and every\n * hook command points at the single stable home binary\n * (`buildHomeBinHookCommand`) so one framework update propagates everywhere.\n *\n * Claude Code is a json-stdio host:\n * - MCP servers: user scope → ~/.claude.json (\"mcpServers\"); project scope →\n * <projectDir>/.mcp.json (\"mcpServers\").\n * - Hooks: <configDir>/settings.json under \"hooks\", keyed by event name, each\n * value an array of { matcher, hooks:[{ type:\"command\", command }] }.\n * - Reply: a `hookSpecificOutput` object (allow|deny|ask + reason,\n * additionalContext, updatedInput) on stdout with exit 0.\n */\n\nimport { copyFileSync, existsSync, lstatSync, readFileSync, realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n CommandDef,\n ConfigPatchDef,\n DetectedPlatform,\n DiagnosticResult,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n JsonValue,\n NotificationEvent,\n PermissionRequestEvent,\n PlatformCapabilities,\n PlatformId,\n PostCompactEvent,\n PostToolUseEvent,\n PostToolUseFailureEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n SkillDef,\n StatuslineContext,\n StopEvent,\n SubagentDef,\n SubagentStartEvent,\n SubagentStopEvent,\n Transport,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { resolveEnvRefsDeep, rewriteEnvRefs } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinStatuslineCommand,\n buildServeWrapperCommand,\n isHomeBinHookCommand,\n isHomeBinStatuslineCommand,\n shouldWrapForTelemetry,\n} from \"../../core/spawn.js\";\nimport {\n type ConfigPatchLedgerEntry,\n addLedgerOwner,\n configPatchManualEdit,\n configPatchNamespaceViolation,\n createLedgerEntry,\n describeJsonValue,\n dropLedgerEntry,\n findLedgerEntry,\n hashJsonValue,\n isValidConfigPatchKey,\n jsonDeepEquals,\n ledgerEntriesOwnedBy,\n loadConfigPatchLedger,\n removeLedgerOwner,\n saveConfigPatchLedger,\n} from \"../../core/config-patch-ledger.js\";\nimport { readRegisteredMeta } from \"../../core/load-connector.js\";\nimport {\n linesOutsideFences,\n listManagedBlocks,\n loadMemoryLedger,\n recordMemoryTarget,\n removeBlocksFromText,\n removeManagedBlocksFile,\n saveMemoryLedger,\n upsertManagedBlockFile,\n} from \"../../core/managed-block.js\";\nimport { backupsDir, ensureDir } from \"../../core/paths.js\";\nimport {\n type ClaudeHookEvent,\n type ClaudeWireInput,\n extractSessionId,\n toolResponseToString,\n} from \"./wire.js\";\nimport { renderCommandMd, renderSkillMd, renderSubagentMd } from \"./render.js\";\n\nconst HOST: PlatformId = \"claude-code\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/**\n * settings.json leaf key the statusline surface owns. Wired through the SAME\n * set-if-absent ownership ledger as configPatch (it is NOT on the configPatch\n * sensitive-key denylist — verified — and is a single top-level leaf), so a\n * non-AC statusLine is never clobbered.\n */\nconst STATUSLINE_KEY = \"statusLine\";\n\n/**\n * Reserved blockId of the SHARED `@AGENTS.md` import bridge in CLAUDE.md\n * (agents-import mode). The `_shared/` prefix cannot collide with a connector\n * blockId (connector ids match ^[a-z0-9][a-z0-9-]*$), and the bridge is\n * refcounted namespace-wide: it is removed only when the LAST agent-connector\n * block leaves the sibling AGENTS.md.\n */\nconst CLAUDE_AGENTS_IMPORT_BLOCK_ID = \"_shared/claude-agents-import\";\n\n/** A single hook registration entry as Claude Code stores it in settings.json. */\ninterface ClaudeHookEntry {\n matcher: string;\n hooks: Array<{ type: \"command\"; command: string }>;\n}\n\n/** Native MCP server entry shapes Claude Code accepts under `mcpServers`. */\ninterface ClaudeStdioServer {\n type: \"stdio\";\n command: string;\n args: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\ninterface ClaudeHttpServer {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Claude Code statusLine command stdin payload (the documented status-line hook\n * input). Every field optional — a refresh only carries what the host knows.\n * `version` and any unmodeled fields stay in StatuslineContext.raw.\n */\ninterface ClaudeStatuslineInput {\n session_id?: string;\n transcript_path?: string;\n cwd?: string;\n version?: string;\n model?: { id?: string; display_name?: string };\n workspace?: { current_dir?: string; project_dir?: string };\n cost?: { total_cost_usd?: number };\n}\n\nexport class ClaudeCodeAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Claude Code\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n preToolUse: true,\n postToolUse: true,\n preCompact: true,\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: true,\n stop: true,\n notification: true,\n // Newer events — Claude Code is the reference host for all four.\n permissionRequest: true,\n postToolUseFailure: true,\n subagentStart: true,\n subagentStop: true,\n // Claude Code can rewrite PreToolUse input (updatedInput) but does NOT let a\n // PostToolUse hook rewrite already-emitted tool output.\n canModifyArgs: true,\n canModifyOutput: false,\n canInjectSessionContext: true,\n // Native passthrough hooks: settings.json hook keys are free-form event\n // names, so any host event (TaskCreated, TeammateIdle, WorktreeCreate, …)\n // declared under platforms[\"claude-code\"].nativeHooks installs verbatim.\n supportsNativeHooks: true,\n // Declarative host-config key patches: claude-code is the ONLY v1 host\n // (set-if-absent leaf keys in settings.json, refcounted ownership ledger,\n // sensitive-key denylist — see SENSITIVE_KEY_RULES below).\n supportsConfigPatch: true,\n // Statusline surface: claude-code is the ONLY v1 host. installStatusline\n // wires settings.json.statusLine = {type:\"command\", command:<home-bin\n // statusline cmd>} through the SAME set-if-absent ownership ledger as\n // configPatch (never clobbers a statusLine agent-connector does not own).\n supportsStatusline: true,\n transports: [\"stdio\", \"http\"],\n // Content surfaces: Claude Code is the reference implementation for all three.\n supportsCommands: true,\n supportsSkills: true,\n supportsSubagents: true,\n // Memory surface — EXCEPTION host: Claude Code reads CLAUDE.md, NOT\n // AGENTS.md (docs are explicit; no AGENTS.md support through v2.1.172), so\n // memoryTargets/installMemory below override the base AGENTS.md default.\n supportsMemory: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".claude\");\n const userSettings = join(userDir, \"settings.json\");\n const userServers = join(homedir(), \".claude.json\");\n const projectServers = join(projectDir, \".mcp.json\");\n const userInstalled =\n existsSync(userDir) || existsSync(userSettings) || existsSync(userServers);\n const projInstalled = existsSync(projectServers);\n const installed = userInstalled || projInstalled;\n // Report the scope/path/reason for the marker that actually matched, so a\n // project-only install isn't misreported as a (non-existent) user install.\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projectServers : userSettings;\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? scope === \"project\"\n ? `found project Claude Code config at ${projectServers}`\n : `found Claude Code config under ${userDir}`\n : `no Claude Code config at ${userDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".claude\")\n : join(homedir(), \".claude\");\n }\n\n getServerConfigPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".mcp.json\")\n : join(homedir(), \".claude.json\");\n }\n\n getHookConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"settings.json\");\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for claude-code\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /** Render a normalized ServerDef into Claude Code's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): ClaudeStdioServer | ClaudeHttpServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {\n const wrapped = buildServeWrapperCommand(\n ctx.homeBinPath,\n ctx.connector.id,\n command,\n args,\n ctx.scope,\n this.id,\n );\n command = wrapped.command;\n args = wrapped.args;\n }\n\n const entry: ClaudeStdioServer = { type: \"stdio\", command, args };\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n if (server.cwd) entry.cwd = resolveEnvRefsDeep(server.cwd);\n return entry;\n }\n\n // http (and any other remote transport we surface) — Claude registers a URL.\n const entry: ClaudeHttpServer = {\n type: \"http\",\n url: rewriteEnvRefs(server.url ?? \"\", claudeEnvToken),\n };\n if (server.headers) {\n entry.headers = this.renderEnv(server.headers) ?? {};\n }\n return entry;\n }\n\n /**\n * Render env/header values. Claude Code supports its own `${VAR}` native\n * interpolation, so translate `${env:VAR}` refs to that native token rather\n * than baking secrets into the file. Literals pass through unchanged.\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(env)) {\n out[k] = rewriteEnvRefs(v, claudeEnvToken);\n }\n return out;\n }\n\n // ── Hook install / uninstall ─────────────────────────────────────────────\n\n installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED hooks. nativeHooks is a\n // sibling, explicitly claude-code-scoped declaration on the same override —\n // it installs regardless (the dev wrote both keys on the same object).\n const normalizedEvents = override?.hooks === false ? [] : connector.hookEvents;\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n\n if (normalizedEvents.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail:\n override?.hooks === false\n ? \"hooks disabled for claude-code\"\n : \"connector declares no hooks\",\n },\n ];\n }\n\n const settingsPath = this.getHookConfigPath(ctx);\n\n // One pass over normalized + NATIVE events: native event-name keys are\n // written VERBATIM (e.g. \"TaskCreated\"), matcher from the def, and the\n // exact same home-bin command shape — so uninstall/doctor/telemetry treat\n // both identically.\n const pending: Array<{ event: string; matcher: string }> = [\n ...normalizedEvents.map((event) => ({\n event: event as string,\n matcher: connector.hooks[event]?.matcher ?? \"\",\n })),\n ...nativeEvents.map((event) => ({\n event,\n matcher: nativeHooks[event]?.matcher ?? \"\",\n })),\n ];\n\n return this.upsertHookEntries(ctx, settingsPath, pending, this.hookDescriptor());\n }\n\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor());\n }\n\n /**\n * Claude's hook-merge descriptor (NESTED shape `{ matcher, hooks: [...] }`):\n * - install find = THIS exact command present in the entry's inner `hooks`;\n * - uninstall = inner-strip ONLY (connector-generic `isOurCommand` over the\n * inner commands, drop entries left empty) — claude never removes a whole\n * entry by ownership, so `ownsEntryForRemove` is a never-true predicate;\n * - every detail string is the literal claude-code wording.\n */\n private hookDescriptor(): HookMergeDescriptor<ClaudeHookEntry> {\n return {\n renderEntry: (_event, matcher, command) => ({\n matcher,\n hooks: [{ type: \"command\", command }],\n }),\n entryOwnsCommand: (entry, command) =>\n (entry.hooks ?? []).some((h) => h.command === command),\n ownsEntryForRemove: () => () => false,\n stripInner: (ctx) => (entry) => {\n const innerBefore = entry.hooks?.length ?? 0;\n const inner = (entry.hooks ?? []).filter((h) => !this.isOurCommand(h.command, ctx));\n return {\n next: inner.length > 0 ? { matcher: entry.matcher ?? \"\", hooks: inner } : null,\n removed: innerBefore - inner.length,\n };\n },\n skipDetail: (event) => `hooks.${event} already registered`,\n removeDetail: (event, removed) => `hooks.${event} (${removed})`,\n absentDetail: \"no hooks section present\",\n noMatchDetail: \"no matching hook entries\",\n };\n }\n\n // ── Declarative host-config key patches (configPatch) ────────────────────\n // FIXED semantics (docs/ARCHITECTURE.md §4): set-if-absent on a single\n // dotted LEAF key of settings.json, skip-warn on ANY conflict (present key,\n // non-object intermediate, drift), refcounted ownership in the persisted\n // ledger at <dataRoot>/state/config-patches.json. Reuses the adapter's\n // existing whole-file settings.json JSON IO (the same handling the hook\n // install performs on this exact file) — Claude Code itself rewrites this\n // file, so format preservation is a non-issue here. NOTE for future hosts:\n // VS Code JSONC needs jsonc-parser modify/applyEdits and Codex TOML needs an\n // anchored edit — core/toml.ts's round-trip is BANNED for configPatch.\n\n /** The ONLY file configPatch may touch on claude-code: settings.json at scope. */\n getPatchableConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"settings.json\");\n }\n\n override installConfigPatches(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const patches = connector.platforms[HOST]?.configPatch ?? [];\n if (patches.length === 0) {\n return [\n { platform: this.id, action: \"skip\", detail: \"connector declares no configPatch entries\" },\n ];\n }\n return this.applyConfigPatches(ctx, patches);\n }\n\n /**\n * The shared set-if-absent / ownership-ledger apply loop behind BOTH\n * {@link installConfigPatches} and {@link installStatusline}. Routing the\n * statusline through the EXACT same path is how a connector's statusLine\n * inherits the configPatch contract verbatim: never clobber a statusLine\n * agent-connector does not own (skip-warn), record prior state + owner,\n * refcounted across connectors, reversible by uninstallConfigPatches.\n */\n private applyConfigPatches(\n ctx: InstallContext,\n patches: ConfigPatchDef[],\n opts: { surfaceLabel?: \"configPatch\" | \"statusline\" } = {},\n ): ChangeRecord[] {\n // The user-facing surface name in every ChangeRecord.detail. \"statusline\"\n // routes the AC-modeled statusLine key through this loop INTERNALLY — that\n // key is namespace-reserved against raw configPatch, so the internal path\n // bypasses the namespace guard (the surface, not a smuggled patch, owns it).\n const surfaceLabel = opts.surfaceLabel ?? \"configPatch\";\n const internal = surfaceLabel !== \"configPatch\";\n const { connector } = ctx;\n const filePath = this.getPatchableConfigPath(ctx);\n // OVERWRITE GUARD (upsertServerInJson precedent): never round-trip a\n // present-but-unparseable settings file into `{}`.\n if (this.isPresentButUnparseable(filePath)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `existing ${filePath} is not parseable; configPatch left unapplied (back it up / fix it, then re-run)`,\n },\n ];\n }\n const settings = this.readJson<Record<string, unknown>>(filePath) ?? {};\n if (typeof settings !== \"object\" || Array.isArray(settings)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `existing ${filePath} is not a JSON object; configPatch left unapplied`,\n },\n ];\n }\n\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n const changes: ChangeRecord[] = [];\n let fileMutated = false;\n let ledgerMutated = false;\n\n for (const patch of patches) {\n // Defense in depth: re-validate grammar + AC-namespace here (a connector\n // loaded from raw meta/JSON must not bypass defineConnector's checks).\n if (!isValidConfigPatchKey(patch.key)) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail:\n `configPatch ${JSON.stringify(patch.key)} refused: not a dotted leaf path ` +\n `(segments must match [A-Za-z0-9_-]+; no array indices)`,\n });\n continue;\n }\n // The statusline surface intentionally models the (now namespace-reserved)\n // statusLine key, so its internal patches skip this guard.\n if (!internal) {\n const namespace = configPatchNamespaceViolation(patch.key);\n if (namespace) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `configPatch refused: ${namespace}`,\n });\n continue;\n }\n }\n // SENSITIVE-KEY DENYLIST — hard refuse, no override flag in v1.\n const sensitive = claudeSensitiveKeyViolation(patch.key);\n if (sensitive) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail:\n `configPatch ${patch.key} refused: matches the claude-code sensitive-key ` +\n `denylist (${sensitive}); security-relevant keys are never patched`,\n });\n continue;\n }\n\n // `${env:VAR}` refs resolve at install time, matching server-entry behavior.\n const desired = resolveEnvRefsDeep(patch.value) as JsonValue;\n const segments = patch.key.split(\".\");\n const leaf = readJsonLeaf(settings, segments);\n const entry = findLedgerEntry(ledger, HOST, filePath, patch.key);\n\n if (leaf.kind === \"blocked\") {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: \"${leaf.atPath}\" exists but is not an ` +\n `object — ${configPatchManualEdit(patch)}`,\n });\n continue;\n }\n\n if (leaf.kind === \"absent\") {\n // SET-IF-ABSENT: the one write path. Intermediates created only as needed.\n writeJsonLeaf(settings, segments, desired);\n fileMutated = true;\n if (entry) {\n // Stale ledger row (key was deleted out from under us): re-assert the\n // value, keep existing owners (they still rely on the key existing),\n // and record what was actually (re)written.\n entry.writtenValue = desired;\n entry.writtenValueHash = hashJsonValue(desired);\n addLedgerOwner(entry, connector.id, connector.version);\n } else {\n createLedgerEntry(ledger, {\n platform: HOST,\n file: filePath,\n key: patch.key,\n value: desired,\n connectorId: connector.id,\n connectorVersion: connector.version,\n });\n }\n ledgerMutated = true;\n changes.push({\n platform: this.id,\n action: \"create\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key}: <absent> → ${describeJsonValue(desired)} (${patch.reason})`,\n });\n continue;\n }\n\n // Key PRESENT — never overwrite; the only question is ownership/refcount.\n if (!entry) {\n // User- (or other-tool-) owned. No ownership is taken even when values\n // happen to match — uninstall must never delete a key we did not create.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: already set to ${describeJsonValue(leaf.value)} ` +\n `(not created by agent-connector; desired ${describeJsonValue(desired)}) — ` +\n configPatchManualEdit(patch),\n });\n continue;\n }\n\n if (!jsonDeepEquals(leaf.value, entry.writtenValue)) {\n // DRIFT: the user edited the value after we wrote it. Never revert —\n // sync re-asserts only ABSENT keys.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key}: value changed since install ` +\n `(current ${describeJsonValue(leaf.value)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\n `leaving in place — ${configPatchManualEdit(patch)}`,\n });\n continue;\n }\n\n if (jsonDeepEquals(desired, leaf.value)) {\n // Same value we own: register as co-owner (refcount++) or plain\n // idempotent skip when this connector is already an owner.\n const owners = entry.owners.map((o) => o.connectorId);\n if (addLedgerOwner(entry, connector.id, connector.version)) {\n ledgerMutated = true;\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key} already installed; registered as co-owner (co-owned with ${owners.join(\", \")})`,\n });\n } else {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key} already installed`,\n });\n }\n continue;\n }\n\n // FIRST-WRITER-WINS: another connector owns this key with a different value.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: already owned by ${entry.owners\n .map((o) => o.connectorId)\n .join(\", \")} with a different value ` +\n `(current ${describeJsonValue(leaf.value)}, desired ${describeJsonValue(desired)}) — ` +\n configPatchManualEdit(patch),\n });\n }\n\n if (fileMutated) this.writeJson(filePath, settings, ctx.dryRun);\n if (ledgerMutated && !ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\n return changes;\n }\n\n override uninstallConfigPatches(ctx: InstallContext): ChangeRecord[] {\n const connectorId = ctx.connector.id;\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n // Keyed off the LEDGER (not the declaration): releases ownership for every\n // file/scope this connector ever patched, even when the uninstall context\n // is a minimal synthetic connector or the scope flag differs from install.\n // EXCLUDE the statusLine key — that surface releases via uninstallStatusline\n // (the installer runs both), so this never double-processes the same row.\n const owned = ledgerEntriesOwnedBy(ledger, HOST, connectorId).filter(\n (e) => e.key !== STATUSLINE_KEY,\n );\n const declared = ctx.connector.platforms[HOST]?.configPatch ?? [];\n const changes: ChangeRecord[] = [];\n\n // Declared patches with NO ownership record anywhere: never delete a key\n // we did not create (rule 1) — explicit skip so the outcome is never silent.\n const ownedKeys = new Set(owned.map((e) => e.key));\n for (const patch of declared) {\n if (!ownedKeys.has(patch.key)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n detail: `configPatch ${patch.key}: no ownership recorded; left untouched`,\n });\n }\n }\n if (owned.length === 0) return changes;\n changes.push(...this.releaseOwnedConfigPatches(ctx, ledger, owned));\n return changes;\n }\n\n /**\n * The shared last-owner-verified release loop behind BOTH\n * {@link uninstallConfigPatches} and {@link uninstallStatusline}: for each\n * already-selected owned ledger entry, drop this connector's ownership and\n * remove the key ONLY when last-owner ∧ value-unchanged ∧ prior-absent (else\n * skip-warn + leave the key). Saves the ledger when it mutated.\n */\n private releaseOwnedConfigPatches(\n ctx: InstallContext,\n ledger: ReturnType<typeof loadConfigPatchLedger>,\n owned: ConfigPatchLedgerEntry[],\n opts: { surfaceLabel?: \"configPatch\" | \"statusline\" } = {},\n ): ChangeRecord[] {\n const surfaceLabel = opts.surfaceLabel ?? \"configPatch\";\n const connectorId = ctx.connector.id;\n const changes: ChangeRecord[] = [];\n let ledgerMutated = false;\n const backedUp = new Set<string>();\n\n // Group by file (entries may span scopes/files).\n const byFile = new Map<string, ConfigPatchLedgerEntry[]>();\n for (const entry of owned) {\n const bucket = byFile.get(entry.file) ?? [];\n bucket.push(entry);\n byFile.set(entry.file, bucket);\n }\n\n for (const [filePath, entries] of byFile) {\n const unparseable = this.isPresentButUnparseable(filePath);\n const settings = unparseable\n ? null\n : this.readJson<Record<string, unknown>>(filePath);\n let fileMutated = false;\n\n for (const entry of entries) {\n const { lastOwner } = removeLedgerOwner(entry, connectorId);\n ledgerMutated = true;\n\n if (!lastOwner) {\n // The shared-flag case: A uninstalls, B still relies on the key.\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} retained: still owned by ${entry.owners\n .map((o) => o.connectorId)\n .join(\", \")}`,\n });\n continue;\n }\n\n // Last owner out → the ledger row is dropped on every branch below;\n // the KEY is removed only on the fully-verified branch.\n dropLedgerEntry(ledger, entry);\n\n if (unparseable) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key}: ${filePath} is not parseable; key left in place (ownership released)`,\n });\n continue;\n }\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} already absent (no settings file); ownership record dropped`,\n });\n continue;\n }\n const leaf = readJsonLeaf(settings, entry.key.split(\".\"));\n if (leaf.kind !== \"present\") {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} already absent; ownership record dropped`,\n });\n continue;\n }\n if (entry.prior?.present !== false || !jsonDeepEquals(leaf.value, entry.writtenValue)) {\n // User edited the value after install (or the row predates the\n // set-if-absent guarantee): deleting would clobber them. Leave it.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${entry.key}: value changed since install ` +\n `(current ${describeJsonValue(leaf.value)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\n `left in place`,\n });\n continue;\n }\n\n // VERIFIED: last owner + current === writtenValue + prior was absent.\n // Back up the exact file before its first mutation, then delete the\n // leaf key (intermediate objects we created are left in place).\n if (!ctx.dryRun && !backedUp.has(filePath) && existsSync(filePath)) {\n const backup = this.backupFileForConfigPatch(filePath);\n backedUp.add(filePath);\n if (backup) {\n changes.push({\n platform: this.id,\n action: \"create\",\n path: backup,\n detail: \"backed up settings before configPatch removal\",\n });\n }\n }\n deleteJsonLeaf(settings, entry.key.split(\".\"));\n fileMutated = true;\n changes.push({\n platform: this.id,\n action: \"remove\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} removed (was ${describeJsonValue(entry.writtenValue)})`,\n });\n }\n\n if (fileMutated && settings) this.writeJson(filePath, settings, ctx.dryRun);\n }\n\n if (ledgerMutated && !ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\n return changes;\n }\n\n // ── Statusline surface (a HUD/status line) ────────────────────────────────\n // Wires settings.json.statusLine = { type:\"command\", command:<home-bin\n // statusline cmd> } through the SAME ownership ledger as configPatch: a\n // synthetic ConfigPatchDef routed through applyConfigPatches, so the statusLine\n // inherits the full set-if-absent contract verbatim — never clobbers a\n // statusLine agent-connector does not own (skip-warn), records prior state +\n // owner, reversible. The home-bin command makes the host exec\n // `<homeBin> statusline claude-code --connector <id>` for every status refresh,\n // which re-imports the connector module and renders the line (runtime/\n // statusline-entrypoint). No telemetry in v1.\n\n /** The synthetic statusLine configPatch this connector would write. */\n private statuslineConfigPatch(ctx: InstallContext): ConfigPatchDef {\n const command = buildHomeBinStatuslineCommand(ctx.homeBinPath, HOST, ctx.connector.id);\n return {\n key: STATUSLINE_KEY,\n value: { type: \"command\", command },\n reason: \"agent-connector statusline surface\",\n };\n }\n\n override installStatusline(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.statusline == null) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no statusline\" }];\n }\n if (connector.platforms[HOST]?.statusline === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"statusline disabled for claude-code\" }];\n }\n // Reuse the configPatch apply path (set-if-absent, ownership ledger, skip-warn\n // on any non-AC statusLine). This is the SAME machinery installConfigPatches\n // uses on this exact file, so the ownership semantics are identical — only the\n // surface LABEL differs (statusLine is namespace-reserved against raw\n // configPatch; this internal path bypasses that guard and owns the key).\n return this.applyConfigPatches(ctx, [this.statuslineConfigPatch(ctx)], {\n surfaceLabel: \"statusline\",\n });\n }\n\n override uninstallStatusline(ctx: InstallContext): ChangeRecord[] {\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n // Release ONLY the statusLine ledger row this connector owns (keyed off the\n // ledger, not the declaration, so an id-only synthetic uninstall still\n // reclaims it). Same last-owner-verified delete as uninstallConfigPatches.\n const owned = ledgerEntriesOwnedBy(ledger, HOST, ctx.connector.id).filter(\n (e) => e.key === STATUSLINE_KEY,\n );\n if (owned.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"statusline: no ownership recorded; left untouched\",\n },\n ];\n }\n return this.releaseOwnedConfigPatches(ctx, ledger, owned, {\n surfaceLabel: \"statusline\",\n });\n }\n\n /**\n * Parse Claude Code's statusLine stdin JSON into the normalized\n * {@link StatuslineContext}. Claude pipes a JSON object to the statusLine\n * command on stdin (model, workspace, cost, etc.); fields the payload omits\n * stay undefined. `raw` keeps the verbatim payload (incl. `version`).\n */\n parseStatusInput(raw: unknown): StatuslineContext {\n const input = (raw ?? {}) as ClaudeStatuslineInput;\n const model: { id?: string; displayName?: string } = {};\n if (typeof input.model?.id === \"string\") model.id = input.model.id;\n if (typeof input.model?.display_name === \"string\") {\n model.displayName = input.model.display_name;\n }\n const cwd =\n typeof input.cwd === \"string\"\n ? input.cwd\n : typeof input.workspace?.current_dir === \"string\"\n ? input.workspace.current_dir\n : undefined;\n\n const ctx: StatuslineContext = {\n host: HOST,\n capabilities: this.capabilities,\n raw,\n };\n if (typeof input.session_id === \"string\" && input.session_id !== \"\") {\n ctx.sessionId = input.session_id;\n }\n if (cwd !== undefined) ctx.cwd = cwd;\n if (model.id !== undefined || model.displayName !== undefined) ctx.model = model;\n if (typeof input.cost?.total_cost_usd === \"number\") {\n ctx.cost = { totalUsd: input.cost.total_cost_usd };\n }\n if (typeof input.transcript_path === \"string\") {\n ctx.transcriptPath = input.transcript_path;\n }\n return ctx;\n }\n\n /** Format the rendered status line into Claude's native reply: stdout = line, exit 0. */\n formatStatusOutput(rendered: string): HookReply {\n return { exitCode: 0, stdout: rendered };\n }\n\n /**\n * Back up ONE exact file (the ledger-recorded patch target, which may belong\n * to a different scope than the current ctx) into the standard backups dir.\n * Best-effort: a failed copy returns null and the caller proceeds — the\n * removal is already value-verified.\n */\n private backupFileForConfigPatch(filePath: string): string | null {\n try {\n ensureDir(backupsDir());\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dest = join(backupsDir(), `${this.id}-${stamp}-${basename(filePath)}`);\n copyFileSync(filePath, dest);\n return dest;\n } catch {\n return null;\n }\n }\n\n /**\n * Doctor: per-ledger-entry configPatch state for this connector —\n * ok → key present and still exactly what we wrote;\n * drifted → user changed the value (we print the manual edit, NEVER\n * auto-fix — sync re-asserts only absent keys);\n * missing → key deleted by the user; sync will re-assert it;\n * orphaned → ledger row whose owners' connector records are all gone.\n * Plus a re-print of the manual edit for declared patches that hold no\n * ownership (skipped at install).\n */\n private configPatchDiagnostics(ctx: InstallContext): DiagnosticResult[] {\n const results: DiagnosticResult[] = [];\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n const connectorId = ctx.connector.id;\n // EXCLUDE the statusLine row: it is owned by the statusline surface and gets\n // its own dedicated health check in getHealthChecks. Reporting it here too\n // would double-report the key and (on a user edit) print a bogus configPatch\n // \"drifted\" hint to restore a configPatch the connector never declared.\n const platformEntries = ledger.entries.filter(\n (e) => e.platform === this.id && e.key !== STATUSLINE_KEY,\n );\n\n for (const entry of platformEntries) {\n const ownedByThis = entry.owners.some((o) => o.connectorId === connectorId);\n if (!ownedByThis) {\n // ORPHAN check (global hygiene): every owner's connector record is gone.\n const orphaned =\n entry.owners.length === 0 ||\n entry.owners.every((o) => readRegisteredMeta(o.connectorId) === null);\n if (orphaned) {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message:\n `orphaned ledger entry in ${entry.file}: owning connector record(s) ` +\n `gone (${entry.owners.map((o) => o.connectorId).join(\", \") || \"none\"})`,\n fix:\n `re-run \\`agent-connector uninstall <owner-id>\\` to release it, or remove ` +\n `${entry.key} from ${entry.file} manually`,\n });\n }\n continue;\n }\n\n const state = this.configPatchState(entry);\n if (state.kind === \"ok\") {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"pass\",\n message: `ok — ${entry.key} = ${describeJsonValue(entry.writtenValue)} (${entry.file})`,\n });\n } else if (state.kind === \"missing\") {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message: `missing — key deleted from ${entry.file} since install`,\n fix: `agent-connector install (sync) will re-assert it`,\n fixable: true,\n });\n } else {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message:\n `drifted — value changed since install (current ${describeJsonValue(state.current)}, ` +\n `wrote ${describeJsonValue(entry.writtenValue)}); never auto-fixed`,\n fix: `manual edit if wanted: set ${entry.key} = ${describeJsonValue(entry.writtenValue)} in ${entry.file}`,\n });\n }\n }\n\n // Declared-but-unowned patches: re-print the manual edit (the patch was\n // skipped at install — conflict, denylist, or simply not installed yet).\n const declared = ctx.connector.platforms[HOST]?.configPatch ?? [];\n const ownedKeys = new Set(\n ledgerEntriesOwnedBy(ledger, HOST, connectorId).map((e) => e.key),\n );\n for (const patch of declared) {\n if (ownedKeys.has(patch.key)) continue;\n results.push({\n check: `${this.name}: configPatch ${patch.key}`,\n status: \"warn\",\n message: `declared but not owned (skipped at install or not yet installed)`,\n fix: configPatchManualEdit(patch),\n });\n }\n return results;\n }\n\n /** Current on-disk state of one owned ledger entry. */\n private configPatchState(\n entry: ConfigPatchLedgerEntry,\n ): { kind: \"ok\" } | { kind: \"missing\" } | { kind: \"drifted\"; current: JsonValue } {\n const settings = this.readJson<Record<string, unknown>>(entry.file);\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) {\n return { kind: \"missing\" };\n }\n const leaf = readJsonLeaf(settings, entry.key.split(\".\"));\n if (leaf.kind !== \"present\") return { kind: \"missing\" };\n if (jsonDeepEquals(leaf.value, entry.writtenValue)) return { kind: \"ok\" };\n return { kind: \"drifted\", current: leaf.value };\n }\n\n override doctor(ctx: InstallContext): DiagnosticResult[] {\n const results = super.doctor(ctx);\n results.push(...this.configPatchDiagnostics(ctx));\n return results;\n }\n\n // ── Content surfaces: commands / skills / subagents ──────────────────────\n // CONTENT-ONLY: pure native-file writers under <configDir>/{commands,skills,\n // agents}. No runtime dispatch, no home-bin pointer, no telemetry wrap. Each\n // method is idempotent (byte-identical → skip) via BaseAdapter.writeContentFile\n // and reversible via removeContentFile. Honors platforms[\"claude-code\"]\n // per-surface false to skip.\n\n private commandsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"commands\");\n }\n private skillsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"skills\");\n }\n private agentsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"agents\");\n }\n\n /** Native command file path: <configDir>/commands/<name>.md. */\n private commandPath(ctx: InstallContext, name: string): string {\n return join(this.commandsDir(ctx), `${name}.md`);\n }\n /** Native skill dir: <configDir>/skills/<name>. */\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.skillsDir(ctx), name);\n }\n /** Native subagent file path: <configDir>/agents/<name>.md. */\n private subagentPath(ctx: InstallContext, name: string): string {\n return join(this.agentsDir(ctx), `${name}.md`);\n }\n\n // ── Commands ──────────────────────────────────────────────────────────────\n\n override installCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.commands === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"commands disabled for claude-code\" }];\n }\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.writeContentFile(\n this.commandPath(ctx, cmd.name),\n this.renderCommand(cmd),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\n );\n }\n\n /** Render a command to md+frontmatter (delegates to the shared renderer). */\n private renderCommand(cmd: CommandDef): string {\n return renderCommandMd(cmd);\n }\n\n // ── Skills ────────────────────────────────────────────────────────────────\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for claude-code\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), this.renderSkill(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n /** Render a skill's SKILL.md (delegates to the shared renderer). */\n private renderSkill(skill: SkillDef): string {\n return renderSkillMd(skill);\n }\n\n // ── Subagents ───────────────────────────────────────────────────────────────\n\n override installSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.subagents === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"subagents disabled for claude-code\" }];\n }\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.writeContentFile(\n this.subagentPath(ctx, agent.name),\n this.renderSubagent(agent),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun),\n );\n }\n\n /** Render a subagent to md+frontmatter (delegates to the shared renderer). */\n private renderSubagent(agent: SubagentDef): string {\n return renderSubagentMd(agent);\n }\n\n // ── Memory surface: CLAUDE.md managed block + AGENTS.md interop ────────────\n // EXCEPTION host. Claude Code reads CLAUDE.md, NOT AGENTS.md (docs verbatim:\n // \"Claude Code reads CLAUDE.md, not AGENTS.md\"; no AGENTS.md support through\n // v2.1.172), so the base AGENTS.md-first default is overridden:\n // - mode \"block\" (default): the managed block goes straight into CLAUDE.md.\n // HTML-comment markers are CORRECT here — Claude strips HTML comments\n // from CLAUDE.md before context injection, so the markers and the\n // do-not-edit notice are INVISIBLE to the model while remaining fully\n // parseable by us for sync/doctor/uninstall.\n // - mode \"agents-import\" (opt-in via platforms[\"claude-code\"].memory.mode):\n // canonical block goes into AGENTS.md, plus a SHARED `@AGENTS.md` import\n // bridge block in CLAUDE.md (Anthropic's documented interop). Opt-in\n // because the import makes Claude read the ENTIRE AGENTS.md — a behavior\n // change agent-connector must not make silently.\n // - AUTO interop: when CLAUDE.md ALREADY imports `@AGENTS.md` (a line\n // outside code fences and outside our own blocks) or IS a symlink\n // resolving to AGENTS.md, the canonical block goes to AGENTS.md and\n // CLAUDE.md is NOT touched — the pre-existing user wiring is never\n // claimed as agent-connector-managed (prevents double-reads and writes\n // \"through\" a symlink). Order-independent: keyed off the import/symlink\n // existing, never off whether the AGENTS.md block was written yet.\n\n /** CLAUDE.md path: project `<projectDir>/CLAUDE.md`, user `~/.claude/CLAUDE.md`. */\n private claudeMdPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \"CLAUDE.md\")\n : join(homedir(), \".claude\", \"CLAUDE.md\");\n }\n\n /** Sibling AGENTS.md at the same scope (agents-import / auto-interop target). */\n private agentsMdPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \"AGENTS.md\")\n : join(homedir(), \".claude\", \"AGENTS.md\");\n }\n\n /**\n * True when the user ALREADY wired CLAUDE.md to AGENTS.md themselves:\n * an `@AGENTS.md` import line outside code fences and outside agent-connector\n * managed blocks (our own bridge must not count), or CLAUDE.md being a\n * symlink that resolves to the sibling AGENTS.md.\n */\n private claudeMdWiredToAgentsMd(ctx: InstallContext): boolean {\n const claudeMd = this.claudeMdPath(ctx);\n if (!existsSync(claudeMd)) return false;\n try {\n if (lstatSync(claudeMd).isSymbolicLink()) {\n const agentsMd = this.agentsMdPath(ctx);\n const resolved = realpathSync(claudeMd);\n const agentsResolved = existsSync(agentsMd) ? realpathSync(agentsMd) : agentsMd;\n if (resolved === agentsResolved) return true;\n }\n } catch {\n /* unreadable link — fall through to the content probe */\n }\n let raw: string;\n try {\n raw = readFileSync(claudeMd, \"utf8\");\n } catch {\n return false;\n }\n // Strip every agent-connector managed block first so OUR bridge import is\n // never mistaken for user wiring (idempotence across modes).\n const withoutBlocks = removeBlocksFromText(raw, { blockIdPrefix: \"\" }).text;\n const importRe = /(^|\\s)@(?:AGENTS\\.md|~\\/\\.claude\\/AGENTS\\.md)(\\s|$)/;\n return linesOutsideFences(withoutBlocks).some((line) => importRe.test(line));\n }\n\n /**\n * Effective memory mode for this install:\n * \"user-import\" — the user already wired CLAUDE.md→AGENTS.md (wins over\n * everything; we never write a duplicate or a second import);\n * \"agents-import\" — explicit opt-in via platforms[\"claude-code\"].memory.mode;\n * \"block\" — the default (managed block directly in CLAUDE.md).\n */\n private effectiveMemoryMode(ctx: InstallContext): \"block\" | \"agents-import\" | \"user-import\" {\n if (this.claudeMdWiredToAgentsMd(ctx)) return \"user-import\";\n return this.memoryOverride(ctx)?.mode === \"agents-import\" ? \"agents-import\" : \"block\";\n }\n\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n // An explicit path override keeps the base resolution (escape hatch wins).\n if (this.memoryOverride(ctx)?.path) return super.memoryTargets(ctx);\n if (ctx.scope !== \"project\" && ctx.scope !== \"user\") return [];\n const mode = this.effectiveMemoryMode(ctx);\n if (mode === \"block\") {\n return [\n {\n path: this.claudeMdPath(ctx),\n reason:\n \"CLAUDE.md (Claude Code reads CLAUDE.md, not AGENTS.md; \" +\n \"HTML-comment markers are stripped from the model's context)\",\n },\n ];\n }\n return [\n {\n path: this.agentsMdPath(ctx),\n reason:\n mode === \"user-import\"\n ? \"AGENTS.md (CLAUDE.md already imports/symlinks it — user wiring respected)\"\n : \"AGENTS.md (agents-import mode; @AGENTS.md bridge managed in CLAUDE.md)\",\n },\n ];\n }\n\n override installMemory(ctx: InstallContext): ChangeRecord[] {\n const changes = super.installMemory(ctx);\n const { connector } = ctx;\n // Bridge management applies only when the generic path actually installed.\n if (connector.platforms[HOST]?.memory === false || (connector.memory ?? []).length === 0) {\n return changes;\n }\n if (ctx.scope !== \"project\" && ctx.scope !== \"user\") return changes;\n if (this.memoryOverride(ctx)?.path) return changes;\n\n const mode = this.effectiveMemoryMode(ctx);\n if (mode === \"user-import\") {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: this.claudeMdPath(ctx),\n detail:\n \"memory: CLAUDE.md already imports AGENTS.md; canonical block in AGENTS.md \" +\n \"suffices (pre-existing user import never claimed as managed)\",\n });\n return changes;\n }\n if (mode !== \"agents-import\") return changes;\n\n // agents-import: ensure the SHARED `@AGENTS.md` bridge block in CLAUDE.md.\n const claudeMd = this.claudeMdPath(ctx);\n const importLine = ctx.scope === \"project\" ? \"@AGENTS.md\" : \"@~/.claude/AGENTS.md\";\n const res = upsertManagedBlockFile(claudeMd, {\n blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n connectorId: \"_shared\",\n content: importLine,\n notice:\n \"Managed by agent-connector (shared bridge). This import makes Claude Code read \" +\n \"AGENTS.md; it is removed automatically when the last agent-connector block \" +\n \"leaves AGENTS.md.\",\n force: ctx.force ?? false,\n dryRun: ctx.dryRun,\n });\n changes.push({\n platform: this.id,\n action: res.action,\n path: claudeMd,\n detail: `memory: ${res.detail} — @AGENTS.md import bridge (agents-import mode)`,\n });\n if (res.backupPath) {\n changes.push({\n platform: this.id,\n action: \"create\",\n path: res.backupPath,\n detail: \"backed up CLAUDE.md before destructive change\",\n });\n }\n if (res.action !== \"warn\" && !ctx.dryRun) {\n const ledger = loadMemoryLedger(connector.id);\n recordMemoryTarget(ledger, {\n platform: this.id,\n scope: ctx.scope,\n path: claudeMd,\n blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n createdFile: res.createdFile,\n hash: res.hash,\n });\n saveMemoryLedger(connector.id, ledger);\n }\n return changes;\n }\n\n override uninstallMemory(ctx: InstallContext): ChangeRecord[] {\n // Capture bridge facts BEFORE super prunes this platform's ledger rows.\n const priorRows = loadMemoryLedger(ctx.connector.id).targets.filter(\n (t) => t.platform === this.id && t.blockId === CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n );\n const changes = super.uninstallMemory(ctx);\n\n // Bridge candidates: the current-scope CLAUDE.md plus any CLAUDE.md the\n // ledger recorded a bridge in (scope drift between install and uninstall).\n const pairs = new Map<string, { agentsMd: string; createdFile: boolean }>();\n if (ctx.scope === \"project\" || ctx.scope === \"user\") {\n pairs.set(this.claudeMdPath(ctx), {\n agentsMd: this.agentsMdPath(ctx),\n createdFile: false,\n });\n }\n for (const row of priorRows) {\n const existing = pairs.get(row.path);\n pairs.set(row.path, {\n agentsMd: existing?.agentsMd ?? join(dirname(row.path), \"AGENTS.md\"),\n createdFile: (existing?.createdFile ?? false) || row.createdFile,\n });\n }\n for (const [claudeMd, { agentsMd, createdFile }] of pairs) {\n changes.push(...this.releaseAgentsImportBridge(ctx, claudeMd, agentsMd, createdFile));\n }\n return changes;\n }\n\n /**\n * Refcounted bridge release: remove the `_shared/claude-agents-import` block\n * from CLAUDE.md ONLY when the sibling AGENTS.md holds zero agent-connector\n * blocks from OTHER connectors (namespace-wide count, excluding this\n * connector's own blocks so the answer is identical on dry-run and real run).\n * A user-authored `@AGENTS.md` import (no markers) is NEVER touched.\n */\n private releaseAgentsImportBridge(\n ctx: InstallContext,\n claudeMd: string,\n agentsMd: string,\n createdFile: boolean,\n ): ChangeRecord[] {\n if (!existsSync(claudeMd)) return [];\n let raw: string;\n try {\n raw = readFileSync(claudeMd, \"utf8\");\n } catch {\n return [];\n }\n if (!listManagedBlocks(raw).some((b) => b.blockId === CLAUDE_AGENTS_IMPORT_BLOCK_ID)) {\n return []; // no managed bridge here (user wiring or block mode) — nothing to release\n }\n let remaining = 0;\n if (existsSync(agentsMd)) {\n try {\n remaining = listManagedBlocks(readFileSync(agentsMd, \"utf8\")).filter(\n (b) => !b.blockId.startsWith(`${ctx.connector.id}/`),\n ).length;\n } catch {\n remaining = 1; // unreadable → conservative: keep the bridge\n }\n }\n if (remaining > 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path: claudeMd,\n detail:\n `memory: @AGENTS.md import bridge retained — ${remaining} agent-connector ` +\n `block(s) from other connectors remain in ${agentsMd}`,\n },\n ];\n }\n return removeManagedBlocksFile(\n claudeMd,\n { blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID },\n { dryRun: ctx.dryRun, deleteFileIfCreated: createdFile },\n ).map((r) => ({\n platform: this.id,\n action: r.action,\n path: r.path,\n detail: `memory: ${r.detail}`,\n }));\n }\n\n /** True when a hook command references our home binary AND this connector id\n * (anchored so a shared-prefix id can't collide — see isHomeBinHookCommand). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const settingsPath = this.getHookConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n // Native passthrough hooks count toward \"declares hooks\" ONLY when declared\n // for this platform (the serialized meta keeps the event-name keys, so this\n // works for doctor's handler-less meta-derived connectors too).\n const declaredHookCount =\n hookEvents.length +\n Object.keys(ctx.connector.platforms[HOST]?.nativeHooks ?? {}).length;\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: settings.json present`,\n check: () => {\n // Same \"only assert what the connector declares\" rule as the\n // content-surface checks below: a hookless connector never writes\n // hooks into settings.json, so its absence is healthy, not a failure.\n if (declaredHookCount === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n return existsSync(settingsPath)\n ? { status: \"OK\", detail: settingsPath }\n : { status: \"FAIL\", detail: `not found: ${settingsPath}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (declaredHookCount === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n const settings = this.readJson<{ hooks?: Record<string, ClaudeHookEntry[]> }>(\n settingsPath,\n );\n if (!settings) return { status: \"FAIL\", detail: `cannot read ${settingsPath}` };\n const hooks = settings.hooks ?? {};\n const registered = Object.values(hooks).some((entries) =>\n (entries ?? []).some((e) =>\n (e.hooks ?? []).some((h) =>\n isHomeBinHookCommand(h.command, homeBin, connectorId),\n ),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : {\n status: \"FAIL\",\n detail: `no hook for ${connectorId} in ${settingsPath}`,\n };\n },\n },\n ];\n\n // Content-surface checks: only assert presence of the files this connector\n // declares (skip silently for surfaces it never asked for).\n for (const cmd of ctx.connector.commands) {\n const p = this.commandPath(ctx, cmd.name);\n checks.push({\n name: `${this.name}: command ${cmd.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const agent of ctx.connector.subagents) {\n const p = this.subagentPath(ctx, agent.name);\n checks.push({\n name: `${this.name}: subagent ${agent.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n\n // Statusline check: only assert it when the connector declares one AND it\n // is not disabled for this host. settings.json.statusLine.command must be OUR\n // home-bin statusline command (ok); present but not ours → drifted/skip-warn\n // (never our concern to fix); absent → missing.\n // Fire the check when the connector DECLARES a statusline (the live-config\n // doctor path) OR when the ownership ledger holds a statusLine row this\n // connector owns (the REGISTERED-connector path: connectorFromMeta can't\n // re-expose the render fn, so statusline comes back undefined — but the\n // ledger row proves the surface was wired). Mirrors uninstallStatusline,\n // which is also ledger-keyed; without this the wired statusLine has ZERO\n // doctor coverage in the registered path (configPatchDiagnostics excludes it).\n const statuslineLedgerOwned = ledgerEntriesOwnedBy(\n loadConfigPatchLedger(ctx.dataRoot),\n HOST,\n connectorId,\n ).some((e) => e.key === STATUSLINE_KEY);\n if (\n (ctx.connector.statusline != null || statuslineLedgerOwned) &&\n ctx.connector.platforms[HOST]?.statusline !== false\n ) {\n checks.push({\n name: `${this.name}: statusline wired`,\n check: () => {\n const settings = this.readJson<{ statusLine?: { command?: unknown } }>(settingsPath);\n const command = settings?.statusLine?.command;\n if (command === undefined) {\n return { status: \"FAIL\", detail: `statusLine not set in ${settingsPath}` };\n }\n if (\n typeof command === \"string\" &&\n isHomeBinStatuslineCommand(command, homeBin, connectorId)\n ) {\n return { status: \"OK\", detail: \"statusLine command present\" };\n }\n // Present but not ours — a non-AC statusLine we must never clobber.\n return {\n status: \"FAIL\",\n detail: `statusLine in ${settingsPath} is not agent-connector's (left untouched)`,\n };\n },\n });\n }\n return checks;\n }\n\n // ── Runtime: parse Claude stdin JSON → normalized event ──────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as ClaudeWireInput;\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\n const sessionId = extractSessionId(input);\n const projectDir = typeof input.cwd === \"string\" ? input.cwd : undefined;\n\n const base = {\n hostPlatform: HOST,\n connectorId,\n sessionId,\n raw,\n ...(projectDir !== undefined ? { projectDir } : {}),\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(toolResponseToString(input.tool_response) !== undefined\n ? { toolOutput: toolResponseToString(input.tool_response) }\n : {}),\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = {\n ...base,\n source: normalizeSessionSource(input.source),\n };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = {\n ...base,\n ...(typeof input.reason === \"string\" ? { reason: input.reason } : {}),\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = {\n ...base,\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"PermissionRequest\": {\n const ev: PermissionRequestEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(Array.isArray(input.permission_suggestions)\n ? { permissionSuggestions: input.permission_suggestions }\n : {}),\n };\n return ev;\n }\n case \"PostToolUseFailure\": {\n const ev: PostToolUseFailureEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n error: typeof input.error === \"string\" ? input.error : \"\",\n ...(typeof input.tool_use_id === \"string\"\n ? { toolUseId: input.tool_use_id }\n : {}),\n ...(typeof input.is_interrupt === \"boolean\"\n ? { isInterrupt: input.is_interrupt }\n : {}),\n ...(typeof input.duration_ms === \"number\"\n ? { durationMs: input.duration_ms }\n : {}),\n };\n return ev;\n }\n case \"SubagentStart\": {\n const ev: SubagentStartEvent = {\n ...base,\n ...(typeof input.agent_id === \"string\" ? { agentId: input.agent_id } : {}),\n ...(typeof input.agent_type === \"string\"\n ? { agentType: input.agent_type }\n : {}),\n };\n return ev;\n }\n case \"SubagentStop\": {\n // agent_id/agent_type stay optional — the SDK does not reliably\n // populate agent_type on SubagentStop (real-world quirk).\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof input.agent_id === \"string\" ? { agentId: input.agent_id } : {}),\n ...(typeof input.agent_type === \"string\"\n ? { agentType: input.agent_type }\n : {}),\n ...(typeof input.agent_transcript_path === \"string\"\n ? { agentTranscriptPath: input.agent_transcript_path }\n : {}),\n ...(typeof input.last_assistant_message === \"string\"\n ? { lastAssistantMessage: input.last_assistant_message }\n : {}),\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n // Claude Code does NOT wire PostCompact as a normalized lifecycle hook\n // (capabilities.postCompact is unset, so installHooks never registers\n // it) — but the exhaustive guard below requires a case for every\n // HookEventName. This arm is a SAFE passthrough: it normalizes the\n // PreCompact-shaped `trigger` defensively, so a manual\n // `hook claude-code PostCompact` invocation normalizes instead of\n // throwing. It mirrors the PreCompact case byte-for-byte.\n const ev: PostCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n default: {\n // Exhaustive guard — every HookEventName is handled above.\n const _never: never = event;\n throw new Error(`unsupported claude-code hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Claude native hook reply ──────────────\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const hookEventName = event as ClaudeHookEvent;\n const decision = response.decision ?? \"allow\";\n\n // PermissionRequest replies use Claude's nested decision{behavior} envelope\n // and are the ONE event where an EXPLICIT \"allow\" is an ACTIVE grant (it\n // suppresses the permission dialog) rather than passthrough:\n // allow → decision{behavior:\"allow\"} (+updatedInput when set);\n // Claude still enforces its own deny rules — an allow\n // never overrides a matching deny rule (host-enforced).\n // modify → an allow grant carrying updatedInput.\n // deny → decision{behavior:\"deny\", message} (shown to Claude).\n // ask/context/void → NO decision output: fall through to the native\n // dialog (the dialog IS the ask).\n if (event === \"PermissionRequest\") {\n if (response.decision === \"deny\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n decision: {\n behavior: \"deny\",\n message: response.reason ?? \"Blocked by hook\",\n },\n },\n });\n }\n if (\n response.decision === \"allow\" ||\n (response.decision === \"modify\" && response.updatedInput)\n ) {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n decision: {\n behavior: \"allow\",\n ...(response.updatedInput\n ? { updatedInput: response.updatedInput }\n : {}),\n },\n },\n });\n }\n return { exitCode: 0 };\n }\n\n // PostToolUseFailure (feedback beside the error) and SubagentStart (context\n // injected at the start of the SUBAGENT's conversation) are observe/context-\n // only on Claude: \"context\" emits additionalContext, and a \"deny\" DEGRADES\n // to the same shape carrying the reason (the tool already failed / the\n // spawn is not blockable). Everything else passes through.\n if (event === \"PostToolUseFailure\" || event === \"SubagentStart\") {\n const context =\n decision === \"context\"\n ? response.additionalContext\n : decision === \"deny\"\n ? response.reason ?? response.additionalContext\n : undefined;\n if (context) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, additionalContext: context },\n });\n }\n return { exitCode: 0 };\n }\n\n // deny → block the action with a reason (exit 0; JSON carries the decision).\n // Claude's deny shape is EVENT-SPECIFIC: PreToolUse uses\n // hookSpecificOutput.permissionDecision, but Stop / SubagentStop /\n // UserPromptSubmit / PostToolUse honor only the TOP-LEVEL\n // {\"decision\":\"block\",\"reason\"} — rendering those as permissionDecision is\n // silently ignored by Claude (found porting oh-my-claudecode: its ralph\n // persistence loop denies the Stop event, which never blocked through the\n // old shape). A SubagentStop block keeps the subagent running with `reason`\n // as its next instruction (Stop semantics).\n if (decision === \"deny\") {\n if (\n event === \"Stop\" ||\n event === \"SubagentStop\" ||\n event === \"UserPromptSubmit\" ||\n event === \"PostToolUse\"\n ) {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n });\n }\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n });\n }\n\n // ask → prompt the user to confirm.\n if (decision === \"ask\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n permissionDecision: \"ask\",\n permissionDecisionReason:\n response.reason ?? \"Confirmation required by hook\",\n },\n });\n }\n\n // modify → rewrite PreToolUse input (only where Claude supports it).\n if (decision === \"modify\") {\n if (event === \"PreToolUse\" && response.updatedInput) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, updatedInput: response.updatedInput },\n });\n }\n // Output rewrite is unsupported on Claude; fall through to allow.\n }\n\n // context → inject soft guidance (also the SessionStart context path).\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, additionalContext: response.additionalContext },\n });\n }\n\n // allow / void / unsupported-degradation → pass through with exit 0.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// configPatch: sensitive-key denylist + JSON leaf-path helpers\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * SENSITIVE-KEY DENYLIST (claude-code, v1) — THE documented list. configPatch\n * targeting any key below is HARD-REFUSED (warn ChangeRecord, never applied;\n * no override flag in v1). Rationale: configPatch writes bare host keys with\n * no inherent attribution, and these keys are security-relevant — permission\n * grants, tool allowlists, credential/auth helpers, login pinning, and any\n * env var that can reroute credentials or traffic. The OMC case\n * `env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` passes; credential rerouting and\n * self-granted permissions do not. Reviewed whenever the host matrix updates.\n *\n * permissions, permissions.* — self-granted permission rules\n * allowedTools / disallowedTools (.*) — tool allowlist tampering\n * apiKey* (e.g. apiKeyHelper) — credential helpers\n * awsAuthRefresh / awsCredentialExport — AWS credential plumbing\n * forceLoginMethod / forceLoginOrgUUID — login/org pinning\n * otelHeadersHelper — telemetry-header (token) helper\n * hooks*, mcpServers* (+ enable/enabled/disabledMcpjsonServers)\n * — refused upstream by the\n * agent-connector NAMESPACE guard\n * env.ANTHROPIC_* — API key / base-URL rerouting\n * env.AWS_* — AWS credentials\n * env.*_PROXY — traffic interception\n * env.*TOKEN* / env.*KEY* / env.*SECRET* — generic credential patterns\n */\nconst SENSITIVE_KEY_RULES: ReadonlyArray<{ re: RegExp; label: string }> = [\n { re: /^permissions(\\.|$)/, label: \"permissions\" },\n { re: /^allowedTools(\\.|$)/, label: \"allowedTools\" },\n { re: /^disallowedTools(\\.|$)/, label: \"disallowedTools\" },\n { re: /^apiKey/i, label: \"apiKey*\" },\n { re: /^awsAuthRefresh$/, label: \"awsAuthRefresh\" },\n { re: /^awsCredentialExport$/, label: \"awsCredentialExport\" },\n { re: /^forceLoginMethod$/, label: \"forceLoginMethod\" },\n { re: /^forceLoginOrgUUID$/, label: \"forceLoginOrgUUID\" },\n { re: /^otelHeadersHelper$/, label: \"otelHeadersHelper\" },\n { re: /^env\\.ANTHROPIC_/, label: \"env.ANTHROPIC_*\" },\n { re: /^env\\.AWS_/, label: \"env.AWS_*\" },\n { re: /^env\\.[^.]*_PROXY(\\.|$)/i, label: \"env.*_PROXY\" },\n { re: /^env\\.[^.]*TOKEN/i, label: \"env.*TOKEN*\" },\n { re: /^env\\.[^.]*KEY/i, label: \"env.*KEY*\" },\n { re: /^env\\.[^.]*SECRET/i, label: \"env.*SECRET*\" },\n];\n\n/**\n * The matched denylist pattern label when `key` is sensitive on claude-code,\n * else null. Exported so tests and docs stay pinned to the real list.\n */\nexport function claudeSensitiveKeyViolation(key: string): string | null {\n for (const rule of SENSITIVE_KEY_RULES) {\n if (rule.re.test(key)) return rule.label;\n }\n return null;\n}\n\n/** Result of looking up a dotted leaf path in a parsed JSON object. */\ntype JsonLeafLookup =\n | { kind: \"absent\" }\n | { kind: \"present\"; value: JsonValue }\n | { kind: \"blocked\"; atPath: string };\n\n/**\n * Walk `segments` (a validated dotted leaf path) through `root`. \"blocked\"\n * reports the first intermediate that exists but is not a plain object —\n * the skip-warn case (we never replace a non-object intermediate).\n */\nfunction readJsonLeaf(root: Record<string, unknown>, segments: string[]): JsonLeafLookup {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const next = node[segments[i]!];\n if (next === undefined) return { kind: \"absent\" };\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) {\n return { kind: \"blocked\", atPath: segments.slice(0, i + 1).join(\".\") };\n }\n node = next as Record<string, unknown>;\n }\n const leaf = node[segments[segments.length - 1]!];\n if (leaf === undefined) return { kind: \"absent\" };\n return { kind: \"present\", value: leaf as JsonValue };\n}\n\n/**\n * Write `value` at the leaf, creating ONLY absent intermediate objects along\n * the way (callers must have verified the path is not blocked).\n */\nfunction writeJsonLeaf(\n root: Record<string, unknown>,\n segments: string[],\n value: JsonValue,\n): void {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!;\n const next = node[seg];\n if (next === undefined) {\n const created: Record<string, unknown> = {};\n node[seg] = created;\n node = created;\n } else {\n node = next as Record<string, unknown>;\n }\n }\n node[segments[segments.length - 1]!] = value;\n}\n\n/**\n * Delete the leaf key only. Intermediate objects — even ones we created — are\n * deliberately left in place (harmless; pruning risks collateral).\n */\nfunction deleteJsonLeaf(root: Record<string, unknown>, segments: string[]): void {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const next = node[segments[i]!];\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) return;\n node = next as Record<string, unknown>;\n }\n delete node[segments[segments.length - 1]!];\n}\n\n/** Claude Code native interpolation token: `${env:VAR}` → `${VAR}`. */\nfunction claudeEnvToken(name: string): string {\n return `\\${${name}}`;\n}\n\nfunction normalizeSessionSource(source: string | undefined): SessionStartEvent[\"source\"] {\n switch (source) {\n case \"compact\":\n return \"compact\";\n case \"resume\":\n return \"resume\";\n case \"clear\":\n return \"clear\";\n default:\n return \"startup\";\n }\n}\n\nexport const adapter = new ClaudeCodeAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
package/dist/cli/sdk.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "../chunk-O5TWCIJN.js";
4
+ } from "../chunk-CYOAH23F.js";
5
5
  import {
6
6
  loadConnectorFromPath
7
- } from "../chunk-24IDL5RW.js";
8
- import "../chunk-4ENJK5S2.js";
9
- import "../chunk-DCKFYWGM.js";
7
+ } from "../chunk-YQLQJZ7S.js";
8
+ import "../chunk-MDNX7HTN.js";
9
+ import "../chunk-2F5QH3D4.js";
10
10
  import "../chunk-FAHIMJRU.js";
11
11
  import "../chunk-N6HH7K6P.js";
12
12
  import "../chunk-TRQKHP7D.js";
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "./chunk-O5TWCIJN.js";
4
+ } from "./chunk-CYOAH23F.js";
5
5
 
6
6
  // src/cli/index.ts
7
7
  main(process.argv.slice(2)).then((code) => {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-DBQMX75U.js";
5
5
  import {
6
6
  BaseAdapter
7
- } from "./chunk-CPLK7GTE.js";
7
+ } from "./chunk-PFDUGDOA.js";
8
8
  import "./chunk-7L6ITC4T.js";
9
9
  import {
10
10
  buildServeWrapperCommand,
@@ -439,4 +439,4 @@ export {
439
439
  adapter,
440
440
  cline_default as default
441
441
  };
442
- //# sourceMappingURL=cline-WRYMNS7Z.js.map
442
+ //# sourceMappingURL=cline-JUTO4V27.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-DBQMX75U.js";
5
5
  import {
6
6
  BaseAdapter
7
- } from "./chunk-CPLK7GTE.js";
7
+ } from "./chunk-PFDUGDOA.js";
8
8
  import "./chunk-7L6ITC4T.js";
9
9
  import {
10
10
  buildServeWrapperCommand,
@@ -40,6 +40,12 @@ function rewriteEnvRefsDeep(value) {
40
40
  }
41
41
  return value;
42
42
  }
43
+ function renderAgentField(key, value) {
44
+ const k = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);
45
+ const json = JSON.stringify(value, null, 2);
46
+ const v = json.includes("\n") ? json.replace(/\n/g, "\n ") : json;
47
+ return ` ${k}: ${v},`;
48
+ }
43
49
  var CodebuffAdapter = class extends BaseAdapter {
44
50
  id = HOST;
45
51
  name = "Codebuff";
@@ -68,10 +74,14 @@ var CodebuffAdapter = class extends BaseAdapter {
68
74
  // sdk/src/skills/load-skills.ts — the frontmatter `name` MUST equal the dir
69
75
  // name. Commands have no native Codebuff surface. Subagents ARE natively
70
76
  // supported — executable .agents/*.ts AgentDefinition modules (codebuff docs:
71
- // "Create a new TypeScript file in .agents/") — but rendering one is coupled
72
- // to the codebuff SDK's AgentDefinition schema, so supportsSubagents stays
73
- // false (deferred), NOT because the surface is absent.
74
- supportsSkills: true
77
+ // "Create a new TypeScript file in .agents/") — and are now WIRED:
78
+ // installSubagents emits one `.agents/<id>.ts` AgentDefinition module per
79
+ // declared subagent (PROJECT scope; see renderSubagent), each
80
+ // default-exporting the AgentDefinition object WITHOUT the type-only
81
+ // `agent-definition` import (erased at runtime; emitting it would only couple
82
+ // the module to a generated types file that may not exist).
83
+ supportsSkills: true,
84
+ supportsSubagents: true
75
85
  };
76
86
  // ── Detection ────────────────────────────────────────────────────────────
77
87
  detectInstalled(projectDir) {
@@ -262,6 +272,108 @@ var CodebuffAdapter = class extends BaseAdapter {
262
272
  if (skill.extra) Object.assign(frontmatter, skill.extra);
263
273
  return this.renderFrontmatterMd(frontmatter, skill.body);
264
274
  }
275
+ // ── Content surfaces: subagents ───────────────────────────────────────────
276
+ // CONTENT-ONLY: pure native-file writers (no runtime dispatch, no home-bin
277
+ // pointer, no telemetry wrap). Idempotent via writeContentFile, reversible via
278
+ // removeContentFile. Honors platforms["codebuff"].subagents === false.
279
+ //
280
+ // Native location: codebuff agents are executable TypeScript modules in the
281
+ // PROJECT .agents/ dir — <projectDir>/.agents/<id>.ts (codebuff docs:
282
+ // "Create a new TypeScript file in .agents/"). No user-scope agents dir is
283
+ // documented, so user scope warn-skips (the warp/amp project-scoped precedent).
284
+ /** Native subagent module path: <configDir>/<name>.ts (= .agents/<name>.ts). */
285
+ subagentPath(ctx, name) {
286
+ return join(this.getConfigDir(ctx), `${name}.ts`);
287
+ }
288
+ installSubagents(ctx) {
289
+ const { connector } = ctx;
290
+ if (connector.platforms[HOST]?.subagents === false) {
291
+ return [{ platform: this.id, action: "skip", detail: "subagents disabled for codebuff" }];
292
+ }
293
+ if (connector.subagents.length === 0) {
294
+ return [{ platform: this.id, action: "skip", detail: "connector declares no subagents" }];
295
+ }
296
+ if (ctx.scope !== "project") {
297
+ return [
298
+ {
299
+ platform: this.id,
300
+ action: "warn",
301
+ detail: `codebuff subagents are project-scoped only (.agents/*.ts; no documented user-scope agents dir); ${connector.subagents.length} skipped`
302
+ }
303
+ ];
304
+ }
305
+ return connector.subagents.map(
306
+ (agent) => this.writeContentFile(
307
+ this.subagentPath(ctx, agent.name),
308
+ this.renderSubagent(agent),
309
+ ctx.dryRun
310
+ )
311
+ );
312
+ }
313
+ uninstallSubagents(ctx) {
314
+ const { connector } = ctx;
315
+ if (connector.subagents.length === 0) {
316
+ return [{ platform: this.id, action: "skip", detail: "connector declares no subagents" }];
317
+ }
318
+ if (ctx.scope !== "project") {
319
+ return [
320
+ { platform: this.id, action: "skip", detail: "codebuff subagents are project-scoped only" }
321
+ ];
322
+ }
323
+ return connector.subagents.map(
324
+ (agent) => this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun)
325
+ );
326
+ }
327
+ /**
328
+ * Render a subagent into a Codebuff `.agents/<id>.ts` AgentDefinition module:
329
+ *
330
+ * const definition = {
331
+ * id: "<name>",
332
+ * ...
333
+ * };
334
+ *
335
+ * export default definition;
336
+ *
337
+ * Emitted WITHOUT the `import { AgentDefinition } from './types/agent-definition'`
338
+ * line the docs show: that import is TYPE-ONLY (erased at runtime), so omitting
339
+ * it avoids coupling the module to a generated types file that may not exist —
340
+ * a bare object literal + default export is a complete, valid AgentDefinition.
341
+ *
342
+ * Field mapping (ONLY fields AC's SubagentDef can populate; nothing fabricated):
343
+ * id ← name (already kebab-case → a valid codebuff id)
344
+ * displayName ← name
345
+ * spawnerPrompt ← description (the delegation hint)
346
+ * model ← model (OMITTED when the connector declares none)
347
+ * toolNames ← tools.allow (OMITTED when none declared)
348
+ * instructionsPrompt ← prompt (the system prompt / instructions body)
349
+ * SubagentDef.readonly is NOT mapped: Codebuff expresses tool access through the
350
+ * `toolNames` allowlist and documents no read-only permission flag, and AC has no
351
+ * verified read-only tool taxonomy to synthesize one — so a readonly hint is
352
+ * carried only if the author restricts `tools.allow` themselves (or via `extra`).
353
+ * `extra` is merged LAST as the documented escape hatch — the only way to reach
354
+ * codebuff AgentDefinition fields AC does not model (version, outputMode,
355
+ * spawnableAgents, inputSchema, …); its values come from the connector author,
356
+ * never invented here.
357
+ */
358
+ renderSubagent(agent) {
359
+ const def = {
360
+ id: agent.name,
361
+ displayName: agent.name,
362
+ spawnerPrompt: agent.description
363
+ };
364
+ if (agent.model !== void 0) def.model = agent.model;
365
+ const allow = agent.tools?.allow;
366
+ if (allow && allow.length > 0) def.toolNames = [...allow];
367
+ def.instructionsPrompt = agent.prompt;
368
+ if (agent.extra) Object.assign(def, agent.extra);
369
+ const body = Object.entries(def).map(([k, v]) => renderAgentField(k, v)).join("\n");
370
+ return `const definition = {
371
+ ${body}
372
+ };
373
+
374
+ export default definition;
375
+ `;
376
+ }
265
377
  // ── Hooks (unavailable — Codebuff is mcp-only) ────────────────────────────
266
378
  installHooks(_ctx) {
267
379
  return [
@@ -315,6 +427,15 @@ var CodebuffAdapter = class extends BaseAdapter {
315
427
  check: () => existsSync(p) ? { status: "OK", detail: p } : { status: "FAIL", detail: `not found: ${p}` }
316
428
  });
317
429
  }
430
+ if (ctx.scope === "project") {
431
+ for (const agent of ctx.connector.subagents) {
432
+ const p = this.subagentPath(ctx, agent.name);
433
+ checks.push({
434
+ name: `${this.name}: subagent ${agent.name} present`,
435
+ check: () => existsSync(p) ? { status: "OK", detail: p } : { status: "FAIL", detail: `not found: ${p}` }
436
+ });
437
+ }
438
+ }
318
439
  return checks;
319
440
  }
320
441
  };
@@ -325,4 +446,4 @@ export {
325
446
  adapter,
326
447
  codebuff_default as default
327
448
  };
328
- //# sourceMappingURL=codebuff-DH5Y7GAT.js.map
449
+ //# sourceMappingURL=codebuff-2QUHL6HO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/codebuff/index.ts"],"sourcesContent":["/**\n * adapters/codebuff — Codebuff platform adapter for agent-connector.\n *\n * Codebuff is an **mcp-only** host: it exposes no lifecycle hook system, and MCP\n * is its extensibility mechanism. This adapter therefore installs only the MCP\n * server and reports hooks as unavailable (mirrors the Warp reference path that\n * validates the `mcp-only` paradigm end-to-end).\n *\n * MCP config (SPEC):\n * - project scope (preferred) → <projectDir>/.agents/mcp.json\n * - user scope → ~/.agents/mcp.json\n * Both are JSON, root key \"mcpServers\". There is no separate hook file — the\n * hook \"config path\" is the same mcp.json so the generic doctor/backup behave\n * sensibly.\n *\n * A stdio server entry is the standard `{ type:\"stdio\", command, args, env }`\n * shape. Codebuff supports native `$VAR` interpolation, so `${env:VAR}` refs are\n * rewritten to Codebuff's native `$VAR` token (rewriteEnvRefs) rather than being\n * resolved to literals — secrets are never baked into the config file.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, InstallContext } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookParadigm,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n SkillDef,\n SubagentDef,\n Transport,\n} from \"../../core/types.js\";\nimport { rewriteEnvRefs } from \"../../core/interpolate.js\";\nimport {\n buildServeWrapperCommand,\n shouldWrapForTelemetry,\n} from \"../../core/spawn.js\";\n\nconst HOST: PlatformId = \"codebuff\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/**\n * Render `${env:VAR}`/`${env:VAR:-default}` into Codebuff's native `$VAR` token.\n *\n * When the portable ref carried a default (`${env:VAR:-fallback}`), Codebuff's\n * native `$VAR` token cannot express it — so a bare native token would silently\n * DROP the default. Instead, resolve the default at install time: emit the live\n * value when VAR is set and non-empty, else the literal fallback. The native\n * token is only emitted when there is no default to preserve.\n */\nconst toNativeRef = (name: string, def?: string): string => {\n if (def !== undefined) {\n const v = process.env[name];\n return v != null && v !== \"\" ? v : def;\n }\n return `$${name}`;\n};\n\n/** Recursively rewrite every `${env:VAR}` ref in a JSON-ish value to `$VAR`. */\nfunction rewriteEnvRefsDeep<T>(value: T): T {\n if (typeof value === \"string\") {\n return rewriteEnvRefs(value, toNativeRef) as unknown as T;\n }\n if (Array.isArray(value)) {\n return value.map((v) => rewriteEnvRefsDeep(v)) as unknown as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = rewriteEnvRefsDeep(v);\n return out as T;\n }\n return value;\n}\n\n/**\n * Render one AgentDefinition field as a ` key: value,` line for the emitted\n * `.agents/<id>.ts` module. The value is serialized with JSON.stringify (correct\n * string/array/object escaping); a known-identifier key is emitted unquoted, and\n * anything else (only reachable via `extra`) is quoted. Multi-line JSON (arrays /\n * nested objects) is reindented so it sits under the 2-space object body.\n */\nfunction renderAgentField(key: string, value: unknown): string {\n const k = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n const json = JSON.stringify(value, null, 2);\n const v = json.includes(\"\\n\") ? json.replace(/\\n/g, \"\\n \") : json;\n return ` ${k}: ${v},`;\n}\n\n/**\n * Native MCP server entry shapes Codebuff accepts under `mcpServers`.\n * A stdio entry is tagged with `type:\"stdio\"`; remote transports carry a `url`.\n */\ninterface CodebuffStdioServer {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\ninterface CodebuffHttpServer {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\nexport class CodebuffAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Codebuff\";\n readonly paradigm: HookParadigm = \"mcp-only\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block via the BaseAdapter default\n // (memoryTargets: project <projectDir>/AGENTS.md; user scope where documented).\n supportsMemory: true,\n // Codebuff has no lifecycle hook system — every hook capability is false.\n preToolUse: false,\n postToolUse: false,\n preCompact: false,\n sessionStart: false,\n sessionEnd: false,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // Codebuff registers stdio and Streamable HTTP MCP servers.\n transports: [\"stdio\", \"http\"],\n // Content surfaces: Codebuff reads AgentSkills from\n // <configDir>/skills/<name>/SKILL.md (configDir is .agents, so the path is\n // .agents/skills/<name>/SKILL.md). Verified against codebuff source\n // sdk/src/skills/load-skills.ts — the frontmatter `name` MUST equal the dir\n // name. Commands have no native Codebuff surface. Subagents ARE natively\n // supported — executable .agents/*.ts AgentDefinition modules (codebuff docs:\n // \"Create a new TypeScript file in .agents/\") — and are now WIRED:\n // installSubagents emits one `.agents/<id>.ts` AgentDefinition module per\n // declared subagent (PROJECT scope; see renderSubagent), each\n // default-exporting the AgentDefinition object WITHOUT the type-only\n // `agent-definition` import (erased at runtime; emitting it would only couple\n // the module to a generated types file that may not exist).\n supportsSkills: true,\n supportsSubagents: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".agents\");\n const userMcp = join(userDir, \"mcp.json\");\n const projDir = join(projectDir, \".agents\");\n const projMcp = join(projDir, \"mcp.json\");\n\n const userInstalled = existsSync(userDir) || existsSync(userMcp);\n const projInstalled = existsSync(projDir) || existsSync(projMcp);\n const installed = userInstalled || projInstalled;\n // Project is the preferred scope; fall back to user when only that matched.\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projMcp : userMcp;\n\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? `found Codebuff config (${scope})`\n : `no .agents config dir at ${userDir} or ${projDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".agents\")\n : join(homedir(), \".agents\");\n }\n\n getServerConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"mcp.json\");\n }\n\n /**\n * Codebuff has no hook file — hooks are not a thing here. The hook \"config\n * path\" is the same mcp.json so the generic doctor/backup behave sensibly.\n */\n getHookConfigPath(ctx: InstallContext): string {\n return this.getServerConfigPath(ctx);\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for codebuff\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /** Render a normalized ServerDef into Codebuff's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): CodebuffStdioServer | CodebuffHttpServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n if (shouldWrapForTelemetry(server, ctx.connector.telemetry)) {\n const wrapped = buildServeWrapperCommand(\n ctx.homeBinPath,\n ctx.connector.id,\n command,\n args,\n ctx.scope,\n this.id,\n );\n command = wrapped.command;\n args = wrapped.args;\n }\n\n // Codebuff supports native `$VAR` interpolation, so rewrite every\n // ${env:VAR} ref to `$VAR` rather than baking literals into the config.\n const entry: CodebuffStdioServer = {\n type: \"stdio\",\n command: rewriteEnvRefsDeep(command),\n };\n if (args.length > 0) entry.args = rewriteEnvRefsDeep(args);\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n return entry;\n }\n\n // http (and any other remote transport) — Codebuff registers a URL.\n const entry: CodebuffHttpServer = {\n type: \"http\",\n url: rewriteEnvRefsDeep(server.url ?? \"\"),\n };\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /**\n * Render env/header values. Codebuff supports native `$VAR` interpolation, so\n * rewrite `${env:VAR}` references to `$VAR` rather than resolving to literals.\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n return rewriteEnvRefsDeep({ ...env });\n }\n\n // ── Content surfaces: skills ──────────────────────────────────────────────\n // CONTENT-ONLY: pure native-file writers. No runtime dispatch, no home-bin\n // pointer, no telemetry wrap. Each method is idempotent (byte-identical →\n // skip) via writeContentFile and reversible via removeContentFile. Honors\n // platforms[\"codebuff\"].skills === false to skip. Both user and project scope\n // are supported (configDir resolves per scope).\n //\n // Native location:\n // skill → <configDir>/skills/<name>/SKILL.md (+ resources)\n // configDir is .agents, so .agents/skills/<name>/SKILL.md. Verified\n // against codebuff source sdk/src/skills/load-skills.ts — the\n // frontmatter `name` MUST equal the dir name.\n\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.getConfigDir(ctx), \"skills\", name);\n }\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for codebuff\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), this.renderSkill(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n /**\n * Render a skill's SKILL.md: frontmatter (name, description + optional model,\n * allowed-tools, disable-model-invocation) + body. UNIFORM with every other\n * skill-supporting platform — only the parent dir differs. Codebuff requires\n * the frontmatter `name` to equal the dir name (load-skills.ts), which holds\n * because skillDir uses skill.name for both.\n */\n private renderSkill(skill: SkillDef): string {\n const frontmatter: Record<string, unknown> = {\n name: skill.name,\n description: skill.description,\n };\n if (skill.model !== undefined) frontmatter.model = skill.model;\n const allow = skill.tools?.allow;\n if (allow && allow.length > 0) frontmatter[\"allowed-tools\"] = allow.join(\", \");\n if (skill.disableModelInvocation !== undefined) {\n frontmatter[\"disable-model-invocation\"] = skill.disableModelInvocation;\n }\n if (skill.extra) Object.assign(frontmatter, skill.extra);\n return this.renderFrontmatterMd(frontmatter, skill.body);\n }\n\n // ── Content surfaces: subagents ───────────────────────────────────────────\n // CONTENT-ONLY: pure native-file writers (no runtime dispatch, no home-bin\n // pointer, no telemetry wrap). Idempotent via writeContentFile, reversible via\n // removeContentFile. Honors platforms[\"codebuff\"].subagents === false.\n //\n // Native location: codebuff agents are executable TypeScript modules in the\n // PROJECT .agents/ dir — <projectDir>/.agents/<id>.ts (codebuff docs:\n // \"Create a new TypeScript file in .agents/\"). No user-scope agents dir is\n // documented, so user scope warn-skips (the warp/amp project-scoped precedent).\n\n /** Native subagent module path: <configDir>/<name>.ts (= .agents/<name>.ts). */\n private subagentPath(ctx: InstallContext, name: string): string {\n return join(this.getConfigDir(ctx), `${name}.ts`);\n }\n\n override installSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.subagents === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"subagents disabled for codebuff\" }];\n }\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n // codebuff agents live in the PROJECT .agents/ dir; no user-scope agents dir\n // is documented, so user scope warn-skips (mirrors warp/amp project-scoped).\n if (ctx.scope !== \"project\") {\n return [\n {\n platform: this.id,\n action: \"warn\",\n detail:\n \"codebuff subagents are project-scoped only (.agents/*.ts; no documented \" +\n `user-scope agents dir); ${connector.subagents.length} skipped`,\n },\n ];\n }\n return connector.subagents.map((agent) =>\n this.writeContentFile(\n this.subagentPath(ctx, agent.name),\n this.renderSubagent(agent),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n if (ctx.scope !== \"project\") {\n return [\n { platform: this.id, action: \"skip\", detail: \"codebuff subagents are project-scoped only\" },\n ];\n }\n return connector.subagents.map((agent) =>\n this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun),\n );\n }\n\n /**\n * Render a subagent into a Codebuff `.agents/<id>.ts` AgentDefinition module:\n *\n * const definition = {\n * id: \"<name>\",\n * ...\n * };\n *\n * export default definition;\n *\n * Emitted WITHOUT the `import { AgentDefinition } from './types/agent-definition'`\n * line the docs show: that import is TYPE-ONLY (erased at runtime), so omitting\n * it avoids coupling the module to a generated types file that may not exist —\n * a bare object literal + default export is a complete, valid AgentDefinition.\n *\n * Field mapping (ONLY fields AC's SubagentDef can populate; nothing fabricated):\n * id ← name (already kebab-case → a valid codebuff id)\n * displayName ← name\n * spawnerPrompt ← description (the delegation hint)\n * model ← model (OMITTED when the connector declares none)\n * toolNames ← tools.allow (OMITTED when none declared)\n * instructionsPrompt ← prompt (the system prompt / instructions body)\n * SubagentDef.readonly is NOT mapped: Codebuff expresses tool access through the\n * `toolNames` allowlist and documents no read-only permission flag, and AC has no\n * verified read-only tool taxonomy to synthesize one — so a readonly hint is\n * carried only if the author restricts `tools.allow` themselves (or via `extra`).\n * `extra` is merged LAST as the documented escape hatch — the only way to reach\n * codebuff AgentDefinition fields AC does not model (version, outputMode,\n * spawnableAgents, inputSchema, …); its values come from the connector author,\n * never invented here.\n */\n private renderSubagent(agent: SubagentDef): string {\n const def: Record<string, unknown> = {\n id: agent.name,\n displayName: agent.name,\n spawnerPrompt: agent.description,\n };\n if (agent.model !== undefined) def.model = agent.model;\n const allow = agent.tools?.allow;\n if (allow && allow.length > 0) def.toolNames = [...allow];\n def.instructionsPrompt = agent.prompt;\n if (agent.extra) Object.assign(def, agent.extra);\n\n const body = Object.entries(def)\n .map(([k, v]) => renderAgentField(k, v))\n .join(\"\\n\");\n return `const definition = {\\n${body}\\n};\\n\\nexport default definition;\\n`;\n }\n\n // ── Hooks (unavailable — Codebuff is mcp-only) ────────────────────────────\n\n installHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Codebuff is mcp-only)\",\n },\n ];\n }\n\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Codebuff is mcp-only)\",\n },\n ];\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const mcpPath = this.getServerConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: mcp.json present`,\n check: () =>\n existsSync(mcpPath)\n ? { status: \"OK\", detail: mcpPath }\n : { status: \"FAIL\", detail: `not found: ${mcpPath}` },\n },\n {\n name: `${this.name}: server entry registered`,\n check: () => {\n // Only assert what the connector declares: a server-less connector\n // never writes a server entry, so its absence is healthy.\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(mcpPath);\n const bucket = cfg?.[MCP_ROOT_KEY];\n if (!cfg || !bucket) {\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\n }\n return connectorId in bucket\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\n : {\n status: \"FAIL\",\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`,\n };\n },\n },\n ];\n\n // Content-surface checks: assert presence only for the skills this connector\n // declares (a skill-less connector writes none, so absence is healthy).\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n // Subagent checks: codebuff agents are PROJECT-scoped .agents/*.ts modules,\n // so assert presence only at project scope (user scope warn-skips install).\n if (ctx.scope === \"project\") {\n for (const agent of ctx.connector.subagents) {\n const p = this.subagentPath(ctx, agent.name);\n checks.push({\n name: `${this.name}: subagent ${agent.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n }\n return checks;\n }\n}\n\nexport const adapter = new CodebuffAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}