context-mode 1.0.168 → 2.0.0-next.5

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 (395) hide show
  1. package/.claude-plugin/marketplace.json +4 -22
  2. package/.claude-plugin/plugin.json +9 -24
  3. package/SHA256SUMS +31 -0
  4. package/claude-code/skills/ctx-doctor/SKILL.md +6 -0
  5. package/claude-code/skills/ctx-stats/SKILL.md +6 -0
  6. package/claude-code/skills/ctx-upgrade/SKILL.md +6 -0
  7. package/cli.mjs +6744 -0
  8. package/copilot/plugin.json +14 -0
  9. package/fixtures/hook-roundtrip.json +22 -0
  10. package/gemini-extension.json +14 -0
  11. package/hook.mjs +202 -0
  12. package/hooks/claude-code.json +50 -0
  13. package/hooks/codex.json +50 -0
  14. package/hooks/copilot-cli.json +33 -0
  15. package/hooks/hooks.json +16 -111
  16. package/hooks/kiro.json +69 -0
  17. package/hooks/qwen.json +50 -0
  18. package/hooks/vscode.json +40 -0
  19. package/hooks/zcode.json +53 -0
  20. package/opencode/plugin.js +22456 -0
  21. package/package.json +29 -114
  22. package/pi/index.js +50841 -0
  23. package/pi/skills/ctx-doctor/SKILL.md +6 -0
  24. package/pi/skills/ctx-stats/SKILL.md +6 -0
  25. package/pi/skills/ctx-upgrade/SKILL.md +6 -0
  26. package/qwen-extension.json +15 -0
  27. package/run.mjs +5633 -0
  28. package/search.mjs +5633 -0
  29. package/server.mjs +48198 -0
  30. package/skills/ctx-doctor/SKILL.md +3 -19
  31. package/skills/ctx-stats/SKILL.md +3 -23
  32. package/skills/ctx-upgrade/SKILL.md +3 -28
  33. package/.codex-plugin/hooks.json +0 -65
  34. package/.codex-plugin/mcp.json +0 -13
  35. package/.codex-plugin/plugin.json +0 -31
  36. package/.openclaw-plugin/index.ts +0 -12
  37. package/.openclaw-plugin/openclaw.plugin.json +0 -38
  38. package/.openclaw-plugin/package.json +0 -28
  39. package/LICENSE +0 -94
  40. package/README.md +0 -1619
  41. package/bin/statusline.mjs +0 -378
  42. package/build/adapters/antigravity/index.d.ts +0 -51
  43. package/build/adapters/antigravity/index.js +0 -169
  44. package/build/adapters/antigravity-cli/index.d.ts +0 -51
  45. package/build/adapters/antigravity-cli/index.js +0 -342
  46. package/build/adapters/base.d.ts +0 -92
  47. package/build/adapters/base.js +0 -135
  48. package/build/adapters/claude-code/config.d.ts +0 -8
  49. package/build/adapters/claude-code/config.js +0 -8
  50. package/build/adapters/claude-code/hooks.d.ts +0 -106
  51. package/build/adapters/claude-code/hooks.js +0 -183
  52. package/build/adapters/claude-code/index.d.ts +0 -80
  53. package/build/adapters/claude-code/index.js +0 -569
  54. package/build/adapters/claude-code-base.d.ts +0 -49
  55. package/build/adapters/claude-code-base.js +0 -113
  56. package/build/adapters/client-map.d.ts +0 -10
  57. package/build/adapters/client-map.js +0 -42
  58. package/build/adapters/codex/config.d.ts +0 -8
  59. package/build/adapters/codex/config.js +0 -8
  60. package/build/adapters/codex/hooks.d.ts +0 -55
  61. package/build/adapters/codex/hooks.js +0 -64
  62. package/build/adapters/codex/index.d.ts +0 -87
  63. package/build/adapters/codex/index.js +0 -992
  64. package/build/adapters/codex/paths.d.ts +0 -1
  65. package/build/adapters/codex/paths.js +0 -12
  66. package/build/adapters/codex/usage.d.ts +0 -107
  67. package/build/adapters/codex/usage.js +0 -227
  68. package/build/adapters/copilot-base.d.ts +0 -94
  69. package/build/adapters/copilot-base.js +0 -297
  70. package/build/adapters/copilot-cli/hooks.d.ts +0 -33
  71. package/build/adapters/copilot-cli/hooks.js +0 -64
  72. package/build/adapters/copilot-cli/index.d.ts +0 -48
  73. package/build/adapters/copilot-cli/index.js +0 -341
  74. package/build/adapters/cursor/config.d.ts +0 -4
  75. package/build/adapters/cursor/config.js +0 -4
  76. package/build/adapters/cursor/hooks.d.ts +0 -55
  77. package/build/adapters/cursor/hooks.js +0 -82
  78. package/build/adapters/cursor/index.d.ts +0 -64
  79. package/build/adapters/cursor/index.js +0 -517
  80. package/build/adapters/detect.d.ts +0 -136
  81. package/build/adapters/detect.js +0 -623
  82. package/build/adapters/gemini-cli/config.d.ts +0 -8
  83. package/build/adapters/gemini-cli/config.js +0 -8
  84. package/build/adapters/gemini-cli/hooks.d.ts +0 -83
  85. package/build/adapters/gemini-cli/hooks.js +0 -115
  86. package/build/adapters/gemini-cli/index.d.ts +0 -80
  87. package/build/adapters/gemini-cli/index.js +0 -483
  88. package/build/adapters/jetbrains-copilot/config.d.ts +0 -8
  89. package/build/adapters/jetbrains-copilot/config.js +0 -8
  90. package/build/adapters/jetbrains-copilot/hooks.d.ts +0 -59
  91. package/build/adapters/jetbrains-copilot/hooks.js +0 -87
  92. package/build/adapters/jetbrains-copilot/index.d.ts +0 -31
  93. package/build/adapters/jetbrains-copilot/index.js +0 -131
  94. package/build/adapters/kimi/config.d.ts +0 -8
  95. package/build/adapters/kimi/config.js +0 -8
  96. package/build/adapters/kimi/hooks.d.ts +0 -28
  97. package/build/adapters/kimi/hooks.js +0 -34
  98. package/build/adapters/kimi/index.d.ts +0 -66
  99. package/build/adapters/kimi/index.js +0 -537
  100. package/build/adapters/kimi/paths.d.ts +0 -21
  101. package/build/adapters/kimi/paths.js +0 -52
  102. package/build/adapters/kimi/usage.d.ts +0 -82
  103. package/build/adapters/kimi/usage.js +0 -217
  104. package/build/adapters/kiro/hooks.d.ts +0 -61
  105. package/build/adapters/kiro/hooks.js +0 -94
  106. package/build/adapters/kiro/index.d.ts +0 -61
  107. package/build/adapters/kiro/index.js +0 -301
  108. package/build/adapters/omp/index.d.ts +0 -65
  109. package/build/adapters/omp/index.js +0 -182
  110. package/build/adapters/omp/plugin.d.ts +0 -81
  111. package/build/adapters/omp/plugin.js +0 -331
  112. package/build/adapters/omp/usage.d.ts +0 -49
  113. package/build/adapters/omp/usage.js +0 -110
  114. package/build/adapters/openclaw/config.d.ts +0 -8
  115. package/build/adapters/openclaw/config.js +0 -8
  116. package/build/adapters/openclaw/hooks.d.ts +0 -50
  117. package/build/adapters/openclaw/hooks.js +0 -61
  118. package/build/adapters/openclaw/index.d.ts +0 -74
  119. package/build/adapters/openclaw/index.js +0 -439
  120. package/build/adapters/openclaw/mcp-tools.d.ts +0 -54
  121. package/build/adapters/openclaw/mcp-tools.js +0 -207
  122. package/build/adapters/openclaw/plugin.d.ts +0 -141
  123. package/build/adapters/openclaw/plugin.js +0 -818
  124. package/build/adapters/openclaw/session-db.d.ts +0 -55
  125. package/build/adapters/openclaw/session-db.js +0 -88
  126. package/build/adapters/openclaw/usage.d.ts +0 -34
  127. package/build/adapters/openclaw/usage.js +0 -52
  128. package/build/adapters/openclaw/workspace-router.d.ts +0 -29
  129. package/build/adapters/openclaw/workspace-router.js +0 -64
  130. package/build/adapters/opencode/config.d.ts +0 -8
  131. package/build/adapters/opencode/config.js +0 -8
  132. package/build/adapters/opencode/hooks.d.ts +0 -38
  133. package/build/adapters/opencode/hooks.js +0 -50
  134. package/build/adapters/opencode/index.d.ts +0 -67
  135. package/build/adapters/opencode/index.js +0 -463
  136. package/build/adapters/opencode/plugin.d.ts +0 -184
  137. package/build/adapters/opencode/plugin.js +0 -558
  138. package/build/adapters/opencode/zod3tov4.d.ts +0 -1
  139. package/build/adapters/opencode/zod3tov4.js +0 -132
  140. package/build/adapters/pi/extension.d.ts +0 -81
  141. package/build/adapters/pi/extension.js +0 -861
  142. package/build/adapters/pi/index.d.ts +0 -57
  143. package/build/adapters/pi/index.js +0 -173
  144. package/build/adapters/pi/mcp-bridge.d.ts +0 -268
  145. package/build/adapters/pi/mcp-bridge.js +0 -894
  146. package/build/adapters/qwen-code/hooks.d.ts +0 -26
  147. package/build/adapters/qwen-code/hooks.js +0 -29
  148. package/build/adapters/qwen-code/index.d.ts +0 -40
  149. package/build/adapters/qwen-code/index.js +0 -361
  150. package/build/adapters/qwen-code/usage.d.ts +0 -90
  151. package/build/adapters/qwen-code/usage.js +0 -222
  152. package/build/adapters/types.d.ts +0 -360
  153. package/build/adapters/types.js +0 -118
  154. package/build/adapters/vscode-copilot/config.d.ts +0 -8
  155. package/build/adapters/vscode-copilot/config.js +0 -8
  156. package/build/adapters/vscode-copilot/hooks.d.ts +0 -71
  157. package/build/adapters/vscode-copilot/hooks.js +0 -98
  158. package/build/adapters/vscode-copilot/index.d.ts +0 -32
  159. package/build/adapters/vscode-copilot/index.js +0 -222
  160. package/build/adapters/zed/index.d.ts +0 -40
  161. package/build/adapters/zed/index.js +0 -163
  162. package/build/cache-heal.d.ts +0 -48
  163. package/build/cache-heal.js +0 -150
  164. package/build/cli.d.ts +0 -34
  165. package/build/cli.js +0 -1827
  166. package/build/concurrency/runPool.d.ts +0 -36
  167. package/build/concurrency/runPool.js +0 -51
  168. package/build/db-base.d.ts +0 -179
  169. package/build/db-base.js +0 -569
  170. package/build/executor.d.ts +0 -72
  171. package/build/executor.js +0 -678
  172. package/build/exit-classify.d.ts +0 -19
  173. package/build/exit-classify.js +0 -12
  174. package/build/fetch-cache.d.ts +0 -13
  175. package/build/fetch-cache.js +0 -15
  176. package/build/lifecycle.d.ts +0 -124
  177. package/build/lifecycle.js +0 -278
  178. package/build/openclaw/mcp-tools.d.ts +0 -54
  179. package/build/openclaw/mcp-tools.js +0 -198
  180. package/build/openclaw/workspace-router.d.ts +0 -29
  181. package/build/openclaw/workspace-router.js +0 -64
  182. package/build/openclaw-plugin.d.ts +0 -130
  183. package/build/openclaw-plugin.js +0 -626
  184. package/build/opencode-plugin.d.ts +0 -122
  185. package/build/opencode-plugin.js +0 -375
  186. package/build/pi-extension.d.ts +0 -14
  187. package/build/pi-extension.js +0 -451
  188. package/build/routing-block.d.ts +0 -8
  189. package/build/routing-block.js +0 -86
  190. package/build/runPool.d.ts +0 -36
  191. package/build/runPool.js +0 -51
  192. package/build/runtime.d.ts +0 -71
  193. package/build/runtime.js +0 -659
  194. package/build/search/auto-memory.d.ts +0 -47
  195. package/build/search/auto-memory.js +0 -170
  196. package/build/search/ctx-search-schema.d.ts +0 -90
  197. package/build/search/ctx-search-schema.js +0 -135
  198. package/build/search/flood-guard.d.ts +0 -57
  199. package/build/search/flood-guard.js +0 -80
  200. package/build/search/unified.d.ts +0 -56
  201. package/build/search/unified.js +0 -104
  202. package/build/security.d.ts +0 -206
  203. package/build/security.js +0 -780
  204. package/build/server.d.ts +0 -184
  205. package/build/server.js +0 -4542
  206. package/build/session/analytics.d.ts +0 -745
  207. package/build/session/analytics.js +0 -2369
  208. package/build/session/db.d.ts +0 -468
  209. package/build/session/db.js +0 -1308
  210. package/build/session/error-classifier.d.ts +0 -87
  211. package/build/session/error-classifier.js +0 -303
  212. package/build/session/event-emit.d.ts +0 -48
  213. package/build/session/event-emit.js +0 -101
  214. package/build/session/extract.d.ts +0 -333
  215. package/build/session/extract.js +0 -2688
  216. package/build/session/model-prices.json +0 -429
  217. package/build/session/persist-tool-calls.d.ts +0 -54
  218. package/build/session/persist-tool-calls.js +0 -105
  219. package/build/session/pricing.d.ts +0 -64
  220. package/build/session/pricing.js +0 -151
  221. package/build/session/project-attribution.d.ts +0 -73
  222. package/build/session/project-attribution.js +0 -245
  223. package/build/session/purge.d.ts +0 -138
  224. package/build/session/purge.js +0 -240
  225. package/build/session/snapshot.d.ts +0 -46
  226. package/build/session/snapshot.js +0 -532
  227. package/build/store-directory.d.ts +0 -56
  228. package/build/store-directory.js +0 -254
  229. package/build/store.d.ts +0 -147
  230. package/build/store.js +0 -1714
  231. package/build/tool-naming.d.ts +0 -4
  232. package/build/tool-naming.js +0 -24
  233. package/build/truncate.d.ts +0 -57
  234. package/build/truncate.js +0 -142
  235. package/build/types.d.ts +0 -117
  236. package/build/types.js +0 -20
  237. package/build/util/claude-config.d.ts +0 -32
  238. package/build/util/claude-config.js +0 -84
  239. package/build/util/hook-config.d.ts +0 -27
  240. package/build/util/hook-config.js +0 -76
  241. package/build/util/jsonc.d.ts +0 -14
  242. package/build/util/jsonc.js +0 -104
  243. package/build/util/plugin-cache-integrity.d.ts +0 -51
  244. package/build/util/plugin-cache-integrity.js +0 -146
  245. package/build/util/project-dir.d.ts +0 -149
  246. package/build/util/project-dir.js +0 -340
  247. package/build/util/sibling-mcp.d.ts +0 -79
  248. package/build/util/sibling-mcp.js +0 -181
  249. package/cli.bundle.mjs +0 -1235
  250. package/configs/antigravity/GEMINI.md +0 -68
  251. package/configs/antigravity/mcp_config.json +0 -7
  252. package/configs/antigravity-cli/hooks/hooks.json +0 -37
  253. package/configs/antigravity-cli/hooks.json +0 -37
  254. package/configs/antigravity-cli/mcp_config.json +0 -10
  255. package/configs/antigravity-cli/plugin.json +0 -14
  256. package/configs/antigravity-cli/rules/context-mode.md +0 -77
  257. package/configs/antigravity-cli/skills/context-mode/SKILL.md +0 -77
  258. package/configs/claude-code/CLAUDE.md +0 -91
  259. package/configs/codex/AGENTS.md +0 -99
  260. package/configs/codex/config.toml +0 -8
  261. package/configs/codex/hooks.json +0 -47
  262. package/configs/copilot-cli/.github/plugin/plugin.json +0 -23
  263. package/configs/copilot-cli/.mcp.json +0 -12
  264. package/configs/copilot-cli/README.md +0 -47
  265. package/configs/copilot-cli/hooks.json +0 -41
  266. package/configs/copilot-cli/skills/context-mode/SKILL.md +0 -38
  267. package/configs/cursor/context-mode.mdc +0 -76
  268. package/configs/cursor/hooks.json +0 -21
  269. package/configs/cursor/mcp.json +0 -7
  270. package/configs/gemini-cli/GEMINI.md +0 -88
  271. package/configs/gemini-cli/mcp.json +0 -7
  272. package/configs/gemini-cli/settings.json +0 -60
  273. package/configs/jetbrains-copilot/copilot-instructions.md +0 -80
  274. package/configs/jetbrains-copilot/hooks.json +0 -16
  275. package/configs/jetbrains-copilot/mcp.json +0 -7
  276. package/configs/kilo/AGENTS.md +0 -84
  277. package/configs/kilo/kilo.json +0 -6
  278. package/configs/kimi/hooks.json +0 -54
  279. package/configs/kiro/KIRO.md +0 -84
  280. package/configs/kiro/agent.json +0 -18
  281. package/configs/kiro/mcp.json +0 -7
  282. package/configs/omp/SYSTEM.md +0 -85
  283. package/configs/omp/mcp.json +0 -7
  284. package/configs/openclaw/AGENTS.md +0 -87
  285. package/configs/openclaw/openclaw.json +0 -13
  286. package/configs/opencode/AGENTS.md +0 -84
  287. package/configs/opencode/opencode.json +0 -6
  288. package/configs/pi/AGENTS.md +0 -3
  289. package/configs/qwen-code/QWEN.md +0 -91
  290. package/configs/vscode-copilot/copilot-instructions.md +0 -80
  291. package/configs/vscode-copilot/hooks.json +0 -16
  292. package/configs/vscode-copilot/mcp.json +0 -7
  293. package/configs/zed/AGENTS.md +0 -68
  294. package/hooks/antigravity-cli/payload.mjs +0 -98
  295. package/hooks/antigravity-cli/posttooluse.mjs +0 -138
  296. package/hooks/antigravity-cli/pretooluse.mjs +0 -78
  297. package/hooks/antigravity-cli/stop.mjs +0 -58
  298. package/hooks/auto-injection.mjs +0 -102
  299. package/hooks/cache-heal-utils.mjs +0 -379
  300. package/hooks/codex/platform.mjs +0 -1
  301. package/hooks/codex/posttooluse.mjs +0 -66
  302. package/hooks/codex/precompact.mjs +0 -70
  303. package/hooks/codex/pretooluse.mjs +0 -42
  304. package/hooks/codex/sessionstart.mjs +0 -121
  305. package/hooks/codex/stop.mjs +0 -138
  306. package/hooks/codex/userpromptsubmit.mjs +0 -75
  307. package/hooks/copilot-cli/posttooluse.mjs +0 -79
  308. package/hooks/copilot-cli/precompact.mjs +0 -66
  309. package/hooks/copilot-cli/pretooluse.mjs +0 -41
  310. package/hooks/copilot-cli/sessionstart.mjs +0 -121
  311. package/hooks/copilot-cli/stop.mjs +0 -59
  312. package/hooks/copilot-cli/userpromptsubmit.mjs +0 -77
  313. package/hooks/core/codex-caps.mjs +0 -112
  314. package/hooks/core/formatters.mjs +0 -356
  315. package/hooks/core/mcp-ready.mjs +0 -109
  316. package/hooks/core/platform-detect.mjs +0 -49
  317. package/hooks/core/routing.mjs +0 -1017
  318. package/hooks/core/stdin.mjs +0 -90
  319. package/hooks/core/tool-naming.mjs +0 -57
  320. package/hooks/cursor/afteragentresponse.mjs +0 -74
  321. package/hooks/cursor/hooks.json +0 -31
  322. package/hooks/cursor/posttooluse.mjs +0 -72
  323. package/hooks/cursor/pretooluse.mjs +0 -26
  324. package/hooks/cursor/sessionstart.mjs +0 -97
  325. package/hooks/cursor/stop.mjs +0 -48
  326. package/hooks/ensure-deps.mjs +0 -254
  327. package/hooks/formatters/claude-code.mjs +0 -113
  328. package/hooks/formatters/cursor.mjs +0 -37
  329. package/hooks/formatters/gemini-cli.mjs +0 -55
  330. package/hooks/formatters/vscode-copilot.mjs +0 -55
  331. package/hooks/gemini-cli/aftermodel.mjs +0 -70
  332. package/hooks/gemini-cli/aftertool.mjs +0 -61
  333. package/hooks/gemini-cli/beforeagent.mjs +0 -99
  334. package/hooks/gemini-cli/beforetool.mjs +0 -27
  335. package/hooks/gemini-cli/precompress.mjs +0 -55
  336. package/hooks/gemini-cli/sessionstart.mjs +0 -137
  337. package/hooks/heal-partial-install.mjs +0 -712
  338. package/hooks/jetbrains-copilot/posttooluse.mjs +0 -61
  339. package/hooks/jetbrains-copilot/precompact.mjs +0 -55
  340. package/hooks/jetbrains-copilot/pretooluse.mjs +0 -27
  341. package/hooks/jetbrains-copilot/sessionstart.mjs +0 -124
  342. package/hooks/kimi/platform.mjs +0 -1
  343. package/hooks/kimi/posttooluse.mjs +0 -72
  344. package/hooks/kimi/precompact.mjs +0 -80
  345. package/hooks/kimi/pretooluse.mjs +0 -42
  346. package/hooks/kimi/sessionend.mjs +0 -61
  347. package/hooks/kimi/sessionstart.mjs +0 -113
  348. package/hooks/kimi/stop.mjs +0 -132
  349. package/hooks/kimi/userpromptsubmit.mjs +0 -90
  350. package/hooks/kiro/agentspawn.mjs +0 -97
  351. package/hooks/kiro/posttooluse.mjs +0 -51
  352. package/hooks/kiro/pretooluse.mjs +0 -64
  353. package/hooks/kiro/userpromptsubmit.mjs +0 -88
  354. package/hooks/normalize-hooks.mjs +0 -323
  355. package/hooks/platform-bridge.mjs +0 -340
  356. package/hooks/posttooluse.mjs +0 -187
  357. package/hooks/precompact.mjs +0 -100
  358. package/hooks/pretooluse.mjs +0 -227
  359. package/hooks/qwen-code/platform.mjs +0 -1
  360. package/hooks/qwen-code/stop.mjs +0 -168
  361. package/hooks/routing-block.mjs +0 -105
  362. package/hooks/run-hook.mjs +0 -95
  363. package/hooks/security.bundle.mjs +0 -2
  364. package/hooks/session-attribution.bundle.mjs +0 -1
  365. package/hooks/session-db.bundle.mjs +0 -144
  366. package/hooks/session-directive.mjs +0 -520
  367. package/hooks/session-extract.bundle.mjs +0 -3
  368. package/hooks/session-helpers.mjs +0 -428
  369. package/hooks/session-loaders.mjs +0 -448
  370. package/hooks/session-snapshot.bundle.mjs +0 -32
  371. package/hooks/sessionstart.mjs +0 -464
  372. package/hooks/stop.mjs +0 -82
  373. package/hooks/suppress-stderr.mjs +0 -25
  374. package/hooks/userpromptsubmit.mjs +0 -108
  375. package/hooks/vscode-copilot/posttooluse.mjs +0 -61
  376. package/hooks/vscode-copilot/precompact.mjs +0 -55
  377. package/hooks/vscode-copilot/pretooluse.mjs +0 -27
  378. package/hooks/vscode-copilot/sessionstart.mjs +0 -129
  379. package/openclaw.plugin.json +0 -38
  380. package/scripts/heal-better-sqlite3.mjs +0 -430
  381. package/scripts/heal-installed-plugins.mjs +0 -598
  382. package/scripts/plugin-cache-integrity.mjs +0 -248
  383. package/scripts/postinstall.mjs +0 -384
  384. package/server.bundle.mjs +0 -1161
  385. package/skills/.ignore +0 -7
  386. package/skills/context-mode/SKILL.md +0 -300
  387. package/skills/context-mode/references/anti-patterns.md +0 -283
  388. package/skills/context-mode/references/patterns-javascript.md +0 -298
  389. package/skills/context-mode/references/patterns-python.md +0 -304
  390. package/skills/context-mode/references/patterns-shell.md +0 -277
  391. package/skills/ctx-index/SKILL.md +0 -46
  392. package/skills/ctx-insight/SKILL.md +0 -24
  393. package/skills/ctx-purge/SKILL.md +0 -49
  394. package/skills/ctx-search/SKILL.md +0 -35
  395. package/start.mjs +0 -616
@@ -1,623 +0,0 @@
1
- /**
2
- * adapters/detect — Auto-detect which platform is running.
3
- *
4
- * Detection priority:
5
- * 1. Environment variables (high confidence)
6
- * 2. Config directory existence (medium confidence)
7
- * 3. Fallback to Claude Code (low confidence — most common)
8
- *
9
- * Verified env vars per platform (from source code audit):
10
- * - Claude Code: CLAUDE_CODE_ENTRYPOINT, CLAUDE_PLUGIN_ROOT,
11
- * CLAUDE_PROJECT_DIR, CLAUDE_SESSION_ID | ~/.claude/
12
- * - Gemini CLI: GEMINI_PROJECT_DIR (hooks), GEMINI_CLI (MCP) | ~/.gemini/
13
- * - KiloCode: KILO, KILO_PID | ~/.config/kilo/
14
- * - OpenCode: OPENCODE_PROJECT_DIR, OPENCODE_CLIENT,
15
- * OPENCODE_TERMINAL, OPENCODE, OPENCODE_PID |
16
- * ~/.config/opencode/
17
- * - OpenClaw: OPENCLAW_HOME, OPENCLAW_CLI | ~/.openclaw/
18
- * - Codex CLI: CODEX_CI, CODEX_THREAD_ID | ~/.codex/
19
- * - Cursor: CURSOR_TRACE_ID (MCP), CURSOR_CLI (terminal) | ~/.cursor/
20
- * - VS Code Copilot: VSCODE_PID, VSCODE_CWD | ~/.vscode/
21
- * - JetBrains Copilot: IDEA_INITIAL_DIRECTORY, IDEA_HOME, JETBRAINS_CLIENT_ID | ~/.config/JetBrains/
22
- */
23
- import { existsSync, readFileSync } from "node:fs";
24
- import { resolve } from "node:path";
25
- import { homedir } from "node:os";
26
- import { CLIENT_NAME_TO_PLATFORM } from "./client-map.js";
27
- let claudeCodePluginCache = null;
28
- function claudeCodeHasContextModePlugin() {
29
- if (claudeCodePluginCache !== null) {
30
- return claudeCodePluginCache !== "miss" && claudeCodePluginCache.hasCM;
31
- }
32
- try {
33
- const path = resolve(homedir(), ".claude", "plugins", "installed_plugins.json");
34
- const raw = readFileSync(path, "utf-8");
35
- const parsed = JSON.parse(raw);
36
- const keys = [
37
- ...Object.keys(parsed.plugins ?? {}),
38
- ...Object.keys(parsed.enabledPlugins ?? {}),
39
- ];
40
- const hasCM = keys.some((k) => k.includes("context-mode"));
41
- claudeCodePluginCache = { hasCM };
42
- return hasCM;
43
- }
44
- catch {
45
- claudeCodePluginCache = "miss";
46
- return false;
47
- }
48
- }
49
- /** Test-only: reset the installed_plugins.json memo so each test starts cold. */
50
- export function __resetClaudeCodePluginCacheForTests() {
51
- claudeCodePluginCache = null;
52
- }
53
- /**
54
- * Test-only: pretend installed_plugins.json does not exist (or has no
55
- * context-mode entry). Lets tests that exercise the genuine vscode-copilot
56
- * env-var path run on a developer machine that actually has context-mode
57
- * installed as a Claude Code plugin.
58
- */
59
- export function __seedClaudeCodePluginCacheMissForTests() {
60
- claudeCodePluginCache = "miss";
61
- }
62
- /**
63
- * High-confidence env vars per platform, checked in priority order.
64
- * Single source of truth — consumed by detectPlatform() below, by
65
- * `resolveProjectDir({ strictPlatform })` for cascade construction, and by
66
- * Pi's bridge env scrub. Tests also iterate this map to clear platform-
67
- * related env vars deterministically.
68
- *
69
- * The map shape is `Map<PlatformId, ReadonlyArray<PlatformEnvEntry>>`. Use
70
- * `getEnvVarNames(p)` to get just the names (legacy `string[]` shape).
71
- */
72
- const _PLATFORM_ENV_VARS_RAW = [
73
- // Order matters: forks listed BEFORE the fork's parent so collision
74
- // detection works. Every entry verified against platform's own runtime
75
- // source code (PR #376 follow-up: full audit, May 2026 — see git blame).
76
- // Claude Code — verified against a live `env` dump (2026-05-11):
77
- // CLAUDE_CODE_ENTRYPOINT=cli (set on every CC session)
78
- // CLAUDE_PLUGIN_ROOT=/Users/.../<version> (set when a plugin is loaded)
79
- // CLAUDE_PROJECT_DIR=/Users/.../project (set in hooks context)
80
- // CLAUDE_SESSION_ID=<uuid> (legacy session marker)
81
- // CLAUDE_CODE_ENTRYPOINT and CLAUDE_PLUGIN_ROOT are CC-exclusive — they
82
- // are the disambiguators for issue #539 (Claude Code running inside a
83
- // VS Code integrated terminal that has VSCODE_PID set). They MUST be
84
- // checked here so detect resolves to claude-code BEFORE falling through
85
- // to vscode-copilot below.
86
- ["claude-code", [
87
- { name: "CLAUDE_CODE_ENTRYPOINT", role: "identification" },
88
- { name: "CLAUDE_PLUGIN_ROOT", role: "identification" },
89
- { name: "CLAUDE_PROJECT_DIR", role: "workspace" },
90
- { name: "CLAUDE_SESSION_ID", role: "identification" },
91
- ]],
92
- // antigravity (Electron/VSCode fork) — google-gemini/gemini-cli
93
- // packages/core/src/ide/detect-ide.ts checks ANTIGRAVITY_CLI_ALIAS as the
94
- // canonical Antigravity marker. Listed before vscode-copilot.
95
- ["antigravity", [
96
- { name: "ANTIGRAVITY_CLI_ALIAS", role: "identification" },
97
- ]],
98
- // cursor (VSCode fork) — listed before vscode-copilot. CURSOR_TRACE_ID has
99
- // 800+ hits in major OSS detection libs (Vercel Next.js, Bun, Google
100
- // gemini-cli, Nx, CrewAI). CURSOR_CWD is the documented workspace var
101
- // (issue #521) — listed first so workspace cascade picks it up.
102
- ["cursor", [
103
- { name: "CURSOR_CWD", role: "workspace" },
104
- { name: "CURSOR_TRACE_ID", role: "identification" },
105
- { name: "CURSOR_CLI", role: "identification" },
106
- ]],
107
- // kilo (OpenCode fork) — Kilo-Org/kilocode packages/opencode/src/index.ts:138 + 139
108
- // sets `process.env.KILO = 1` + `process.env.KILO_PID = String(process.pid)`.
109
- ["kilo", [
110
- { name: "KILO", role: "identification" },
111
- { name: "KILO_PID", role: "identification" },
112
- ]],
113
- // opencode — sst/opencode packages/opencode/src/index.ts:108-109 sets
114
- // OPENCODE=1 + OPENCODE_PID=<pid> on CLI invocations. OpenCode desktop
115
- // shells also expose OPENCODE_CLIENT=desktop and OPENCODE_TERMINAL=1.
116
- // OPENCODE_PROJECT_DIR is the documented workspace var (consumed by the
117
- // legacy resolver cascade) — listed first so the workspace cascade picks
118
- // it up under strict mode.
119
- ["opencode", [
120
- { name: "OPENCODE_PROJECT_DIR", role: "workspace" },
121
- { name: "OPENCODE_CLIENT", role: "identification" },
122
- { name: "OPENCODE_TERMINAL", role: "identification" },
123
- { name: "OPENCODE", role: "identification" },
124
- { name: "OPENCODE_PID", role: "identification" },
125
- ]],
126
- // zed — zed-industries/zed crates/terminal/src/terminal.rs sets ZED_TERM=true
127
- // in `insert_zed_terminal_env()`. Google's gemini-cli uses ZED_SESSION_ID.
128
- ["zed", [
129
- { name: "ZED_SESSION_ID", role: "identification" },
130
- { name: "ZED_TERM", role: "identification" },
131
- ]],
132
- // codex — openai/codex codex-rs/core/src/exec_env.rs sets CODEX_THREAD_ID
133
- // per exec; unified_exec/process_manager.rs sets CODEX_CI in CI mode.
134
- ["codex", [
135
- { name: "CODEX_THREAD_ID", role: "identification" },
136
- { name: "CODEX_CI", role: "identification" },
137
- ]],
138
- // gemini-cli — GEMINI_PROJECT_DIR per google-gemini/gemini-cli
139
- // docs/hooks/index.md; GEMINI_CLI is the MCP-server sentinel.
140
- ["gemini-cli", [
141
- { name: "GEMINI_PROJECT_DIR", role: "workspace" },
142
- { name: "GEMINI_CLI", role: "identification" },
143
- ]],
144
- // vscode-copilot — VSCODE_PID + VSCODE_CWD set by microsoft/vscode bootstrap.
145
- // Listed AFTER cursor and antigravity since they inherit these vars as forks.
146
- ["vscode-copilot", [
147
- { name: "VSCODE_CWD", role: "workspace" },
148
- { name: "VSCODE_PID", role: "identification" },
149
- ]],
150
- // jetbrains-copilot — IDEA_INITIAL_DIRECTORY set by JetBrains launcher.
151
- // (IDEA_HOME and JETBRAINS_CLIENT_ID removed — no source-line evidence.)
152
- ["jetbrains-copilot", [
153
- { name: "IDEA_INITIAL_DIRECTORY", role: "workspace" },
154
- ]],
155
- // qwen-code — QWEN_PROJECT_DIR per QwenLM/qwen-code docs/users/features/hooks.md.
156
- // (QWEN_SESSION_ID removed — 0 hits in qwen-code repository.)
157
- ["qwen-code", [
158
- { name: "QWEN_PROJECT_DIR", role: "workspace" },
159
- ]],
160
- // omp (can1357/oh-my-pi). PI_CODING_AGENT_DIR is the upstream
161
- // agent-dir override per `packages/utils/src/dirs.ts:193`. Listed
162
- // BEFORE pi so OMP is not misclassified as Pi when both are installed.
163
- ["omp", [
164
- { name: "PI_CODING_AGENT_DIR", role: "workspace" },
165
- ]],
166
- // pi — Issue #542 marker correction. PI_PROJECT_DIR is a consumer-set
167
- // var (read by src/adapters/pi/extension.ts) but is NOT auto-set by
168
- // the Pi runtime — verified against
169
- // refs/platforms/oh-my-pi/packages/coding-agent/src/mcp/transports/stdio.ts:55-63
170
- // (env passthrough only, no synthesis). The Pi runtime DOES set
171
- // PI_CONFIG_DIR (config dir override), PI_SESSION_FILE (active session
172
- // path), PI_COMPILED (binary build marker), and PI_CODING_AGENT=true
173
- // in package-spawned MCP children (#760). PI_CODING_AGENT_DIR is owned
174
- // by OMP above; keep it there.
175
- //
176
- // Issue #545 — PI_WORKSPACE_DIR / PI_PROJECT_DIR are workspace vars set
177
- // by Pi's bridge so the resolver picks them up under strict mode.
178
- // PI_WORKSPACE_DIR comes first (extension-set, freshest) before
179
- // PI_PROJECT_DIR (user override) per registry-author cascade order.
180
- ["pi", [
181
- // Issue #545 — workspace vars set by Pi's bridge so resolveProjectDir
182
- // under strict mode picks them up. detect=false because PI_*_DIR are
183
- // consumer-set and must NOT misclassify a non-Pi host as Pi (#542).
184
- { name: "PI_WORKSPACE_DIR", role: "workspace", detect: false },
185
- { name: "PI_PROJECT_DIR", role: "workspace", detect: false },
186
- { name: "PI_CONFIG_DIR", role: "identification" },
187
- { name: "PI_SESSION_FILE", role: "identification" },
188
- { name: "PI_COMPILED", role: "identification" },
189
- { name: "PI_CODING_AGENT", role: "identification" },
190
- ]],
191
- // openclaw — removed (runtime never sets OPENCLAW_HOME or OPENCLAW_CLI;
192
- // detection falls through to ~/.openclaw/ config-dir tier below).
193
- // kiro — not listed (no auto-set process env vars; ~/.kiro/ config-dir tier).
194
- ];
195
- export const PLATFORM_ENV_VARS = new Map(_PLATFORM_ENV_VARS_RAW);
196
- /**
197
- * Backwards-compat shim: legacy `string[]` shape used by detection logic and
198
- * by tests that iterate the registry to clear env vars. Always returns the
199
- * names in registry order.
200
- */
201
- export function getEnvVarNames(platform) {
202
- return (PLATFORM_ENV_VARS.get(platform) ?? []).map((e) => e.name);
203
- }
204
- /**
205
- * Issue #545 — return only role=workspace env var names for a platform, in
206
- * registry order. Empty array for adapters with no workspace var (e.g.
207
- * codex, kilo, zed, antigravity, openclaw, kiro). Consumed by
208
- * `resolveProjectDir({ strictPlatform })` to build the cascade.
209
- */
210
- export function workspaceEnvVarsFor(platform) {
211
- return (PLATFORM_ENV_VARS.get(platform) ?? [])
212
- .filter((e) => e.role === "workspace")
213
- .map((e) => e.name);
214
- }
215
- /**
216
- * Issue #545 — return the union of workspace env vars from ALL platforms
217
- * EXCEPT the given one. Consumed by Pi's bridge env scrub (strip foreign
218
- * workspace vars from spawned MCP child) and by the matrix regression test.
219
- */
220
- export function foreignWorkspaceEnv(platform) {
221
- const ban = new Set();
222
- for (const [p, vars] of PLATFORM_ENV_VARS) {
223
- if (p === platform)
224
- continue;
225
- for (const v of vars) {
226
- if (v.role === "workspace")
227
- ban.add(v.name);
228
- }
229
- }
230
- return ban;
231
- }
232
- /**
233
- * Issue #561 — return the union of identification env vars from ALL
234
- * platforms EXCEPT the given one. Sibling of `foreignWorkspaceEnv`,
235
- * filtered on `role === "identification"` instead of "workspace".
236
- *
237
- * Consumed by Pi's bridge env scrub: when Pi spawns the context-mode
238
- * MCP child, the child inherits the host shell env including any
239
- * identification vars set by a co-resident Claude Code session
240
- * (CLAUDE_CODE_ENTRYPOINT / CLAUDE_PLUGIN_ROOT). Without scrubbing,
241
- * `detectPlatform()` in the child falls through env priority order and
242
- * resolves to claude-code first — Pi's session data then writes into
243
- * `~/.claude/context-mode/` instead of Pi's own dir. Scrubbing FOREIGN
244
- * identification vars (everyone else's) preserves Pi's OWN identification
245
- * vars (PI_CONFIG_DIR / PI_SESSION_FILE / PI_COMPILED) so the child still
246
- * detects pi correctly.
247
- *
248
- * Algorithmic, registry-driven — adding adapter #16 grows the scrub
249
- * automatically (no edit to mcp-bridge.ts).
250
- */
251
- export function foreignIdentificationEnv(platform) {
252
- const ban = new Set();
253
- for (const [p, vars] of PLATFORM_ENV_VARS) {
254
- if (p === platform)
255
- continue;
256
- for (const v of vars) {
257
- if (v.role === "identification")
258
- ban.add(v.name);
259
- }
260
- }
261
- return ban;
262
- }
263
- /**
264
- * Sync map from platform identifier → home-relative path segments where that
265
- * platform stores its config. Mirrors the `super([...])` argument passed by
266
- * each adapter — kept in sync as the single source of truth used when we need
267
- * a session dir BEFORE an adapter has been instantiated (race window between
268
- * MCP server start and `initialize` handshake completion).
269
- *
270
- * Returns `null` for "unknown" or any string outside the supported set so the
271
- * caller can decide on a safe fallback.
272
- */
273
- export function getSessionDirSegments(platform) {
274
- switch (platform) {
275
- case "claude-code": return [".claude"];
276
- case "gemini-cli": return [".gemini"];
277
- case "antigravity": return [".gemini"];
278
- case "antigravity-cli": return [".gemini"];
279
- case "openclaw": return [".openclaw"];
280
- case "codex": return [".codex"];
281
- case "cursor": return [".cursor"];
282
- case "vscode-copilot": return [".vscode"];
283
- case "copilot-cli": return [".copilot"];
284
- case "kiro": return [".kiro"];
285
- case "pi": return [".pi"];
286
- case "omp": return [".omp"];
287
- case "qwen-code": return [".qwen"];
288
- case "kimi": return [".kimi-code"];
289
- case "kilo": return [".config", "kilo"];
290
- case "opencode": return [".config", "opencode"];
291
- case "zed": return [".config", "zed"];
292
- case "jetbrains-copilot": return [".config", "JetBrains"];
293
- default: return null;
294
- }
295
- }
296
- /**
297
- * Detect the current platform by checking env vars and config dirs.
298
- *
299
- * @param clientInfo - Optional MCP clientInfo from initialize handshake.
300
- * When provided, takes highest priority (zero-config detection).
301
- */
302
- export function detectPlatform(clientInfo) {
303
- // ── Highest priority: MCP clientInfo ──────────────────
304
- if (clientInfo?.name) {
305
- const platform = CLIENT_NAME_TO_PLATFORM[clientInfo.name];
306
- if (platform) {
307
- return {
308
- platform,
309
- confidence: "high",
310
- reason: `MCP clientInfo.name="${clientInfo.name}"`,
311
- };
312
- }
313
- // Qwen Code uses dynamic client names: qwen-cli-mcp-client-<serverName>
314
- if (clientInfo.name.startsWith("qwen-cli-mcp-client")) {
315
- return {
316
- platform: "qwen-code",
317
- confidence: "high",
318
- reason: `MCP clientInfo.name="${clientInfo.name}" (qwen-cli pattern)`,
319
- };
320
- }
321
- }
322
- // ── Explicit platform override ────────────────────────
323
- const platformOverride = process.env.CONTEXT_MODE_PLATFORM;
324
- if (platformOverride) {
325
- const validPlatforms = [
326
- "claude-code", "gemini-cli", "kilo", "opencode", "codex",
327
- "vscode-copilot", "jetbrains-copilot", "copilot-cli", "cursor", "antigravity", "antigravity-cli", "kiro", "pi", "omp", "zed", "qwen-code", "kimi",
328
- ];
329
- if (validPlatforms.includes(platformOverride)) {
330
- return {
331
- platform: platformOverride,
332
- confidence: "high",
333
- reason: `CONTEXT_MODE_PLATFORM=${platformOverride} override`,
334
- };
335
- }
336
- }
337
- // ── High confidence: environment variables ─────────────
338
- for (const [platform, vars] of PLATFORM_ENV_VARS) {
339
- if (vars.some((v) => v.detect !== false && process.env[v.name])) {
340
- // Issue #539 belt-and-suspenders: VSCODE_PID/VSCODE_CWD are exported
341
- // by VS Code into EVERY child process — including a Claude Code CLI
342
- // launched from the integrated terminal. If env vars alone want to
343
- // resolve to vscode-copilot, but ~/.claude/plugins/installed_plugins.json
344
- // lists context-mode as a Claude Code plugin, the runtime must be
345
- // Claude Code (VS Code Copilot has no plugin concept). The env-var
346
- // tier above already handles the common case via CLAUDE_CODE_ENTRYPOINT
347
- // / CLAUDE_PLUGIN_ROOT; this branch covers MCP-server-only boots where
348
- // those vars have not propagated yet.
349
- if (platform === "vscode-copilot" && claudeCodeHasContextModePlugin()) {
350
- return {
351
- platform: "claude-code",
352
- confidence: "high",
353
- reason: "VSCODE_PID set but ~/.claude/plugins/installed_plugins.json lists context-mode (issue #539 fallback)",
354
- };
355
- }
356
- return {
357
- platform,
358
- confidence: "high",
359
- reason: `${vars.filter((v) => v.detect !== false).map((v) => v.name).join(" or ")} env var set`,
360
- };
361
- }
362
- }
363
- // ── Medium confidence: config directory existence ──────
364
- const home = homedir();
365
- // Issue #774 — dedicated CLI agents (Antigravity CLI `agy`, GitHub Copilot
366
- // CLI) MUST be probed BEFORE the generic ~/.claude and ~/.gemini fallbacks.
367
- // A user migrating from gemini-cli to `agy` keeps ~/.claude AND ~/.gemini, so
368
- // the ~/.claude check below otherwise wins and `context-mode doctor`
369
- // mis-detected `agy` as Claude Code — pointing storage at ~/.claude and
370
- // reporting the wrong platform (reproduced in #774).
371
- //
372
- // Regression guard (whole-branch detection-ordering review): these markers
373
- // are deliberately narrow so they cannot relocate an existing Claude Code
374
- // user's storage from a bare shell. The antigravity-cli markers are either
375
- // agy-exclusive (`~/.local/bin/agy`, `~/.gemini/antigravity-cli`) or map to
376
- // the SAME `~/.gemini` root as gemini-cli (so a mis-detect is storage-neutral
377
- // and never collides with `~/.gemini/settings.json` (gemini-cli) or
378
- // `~/.gemini/antigravity/` (Antigravity IDE)). The copilot-cli marker is
379
- // gated on a context-mode-written file (NOT a bare `~/.copilot/` directory),
380
- // so a Claude Code user who merely co-installed GitHub Copilot CLI — but has
381
- // not configured context-mode for it — is NOT pulled away from ~/.claude.
382
- // GitHub Copilot CLI's config root is relocatable via COPILOT_HOME (the
383
- // documented relocation env, incl. on Windows), so the marker must honor it —
384
- // not just ~/.copilot. Mirrors copilotCliHome() in copilot-cli/index.ts.
385
- const copilotHome = (() => {
386
- const raw = process.env.COPILOT_HOME;
387
- if (raw && raw.trim() !== "") {
388
- return raw.startsWith("~") ? resolve(home, raw.replace(/^~[/\\]?/, "")) : resolve(raw);
389
- }
390
- return resolve(home, ".copilot");
391
- })();
392
- const copilotConfigured = existsSync(resolve(copilotHome, "mcp-config.json")) ||
393
- existsSync(resolve(copilotHome, "hooks", "context-mode.json"));
394
- // A non-empty COPILOT_HOME is an explicit user/session selection, not a
395
- // passive co-install marker. Respect it before agy's global markers so a
396
- // Copilot doctor run in an isolated COPILOT_HOME is not stolen by an
397
- // unrelated ~/.local/bin/agy or ~/.gemini/config/mcp_config.json.
398
- if (process.env.COPILOT_HOME?.trim() && copilotConfigured) {
399
- return {
400
- platform: "copilot-cli",
401
- confidence: "medium",
402
- reason: "context-mode config in explicit COPILOT_HOME exists (mcp-config.json or hooks/context-mode.json)",
403
- };
404
- }
405
- if (existsSync(resolve(home, ".local", "bin", "agy")) ||
406
- existsSync(resolve(home, ".gemini", "antigravity-cli")) ||
407
- existsSync(resolve(home, ".gemini", "config", "mcp_config.json"))) {
408
- return {
409
- platform: "antigravity-cli",
410
- confidence: "medium",
411
- reason: "Antigravity CLI marker exists (~/.local/bin/agy, ~/.gemini/antigravity-cli, or ~/.gemini/config/mcp_config.json)",
412
- };
413
- }
414
- if (copilotConfigured) {
415
- return {
416
- platform: "copilot-cli",
417
- confidence: "medium",
418
- reason: "context-mode config in Copilot CLI home exists (mcp-config.json or hooks/context-mode.json; honors COPILOT_HOME)",
419
- };
420
- }
421
- if (existsSync(resolve(home, ".claude"))) {
422
- return {
423
- platform: "claude-code",
424
- confidence: "medium",
425
- reason: "~/.claude/ directory exists",
426
- };
427
- }
428
- if (existsSync(resolve(home, ".gemini"))) {
429
- return {
430
- platform: "gemini-cli",
431
- confidence: "medium",
432
- reason: "~/.gemini/ directory exists",
433
- };
434
- }
435
- if (existsSync(resolve(home, ".codex"))) {
436
- return {
437
- platform: "codex",
438
- confidence: "medium",
439
- reason: "~/.codex/ directory exists",
440
- };
441
- }
442
- // Issue #542 — CLI agents BEFORE host IDEs.
443
- //
444
- // Cursor (a VSCode fork) is the most installed editor across our user
445
- // base. Checking ~/.cursor/ first means every CLI agent co-installed
446
- // with Cursor (Pi, OMP, Kiro, Qwen) silently routes through
447
- // CursorAdapter even though the agent owns the session — Cursor merely
448
- // hosts the terminal. Reorder: agents (.kiro/.omp/.pi/.qwen/.openclaw)
449
- // win the medium-confidence tier, editors (~/.cursor/, ~/.vscode/,
450
- // JetBrains) lose. Verified by the detect-config-dir.test.ts matrix.
451
- if (existsSync(resolve(home, ".kiro"))) {
452
- return {
453
- platform: "kiro",
454
- confidence: "medium",
455
- reason: "~/.kiro/ directory exists",
456
- };
457
- }
458
- // OMP listed BEFORE pi: shared ~/.pi history with OMP-only ~/.omp/ marker.
459
- if (existsSync(resolve(home, ".omp"))) {
460
- return {
461
- platform: "omp",
462
- confidence: "medium",
463
- reason: "~/.omp/ directory exists",
464
- };
465
- }
466
- if (existsSync(resolve(home, ".pi"))) {
467
- return {
468
- platform: "pi",
469
- confidence: "medium",
470
- reason: "~/.pi/ directory exists",
471
- };
472
- }
473
- if (existsSync(resolve(home, ".qwen"))) {
474
- return {
475
- platform: "qwen-code",
476
- confidence: "medium",
477
- reason: "~/.qwen/ directory exists",
478
- };
479
- }
480
- if (existsSync(resolve(home, ".kimi-code"))) {
481
- return {
482
- platform: "kimi",
483
- confidence: "medium",
484
- reason: "~/.kimi-code/ directory exists",
485
- };
486
- }
487
- if (existsSync(resolve(home, ".openclaw"))) {
488
- return {
489
- platform: "openclaw",
490
- confidence: "medium",
491
- reason: "~/.openclaw/ directory exists",
492
- };
493
- }
494
- // Cursor / host IDEs — checked AFTER all CLI agents (issue #542).
495
- if (existsSync(resolve(home, ".cursor"))) {
496
- return {
497
- platform: "cursor",
498
- confidence: "medium",
499
- reason: "~/.cursor/ directory exists",
500
- };
501
- }
502
- if (existsSync(resolve(home, ".config", "kilo"))) {
503
- return {
504
- platform: "kilo",
505
- confidence: "medium",
506
- reason: "~/.config/kilo/ directory exists",
507
- };
508
- }
509
- if (existsSync(resolve(home, ".config", "JetBrains"))) {
510
- return {
511
- platform: "jetbrains-copilot",
512
- confidence: "medium",
513
- reason: "~/.config/JetBrains/ directory exists",
514
- };
515
- }
516
- if (existsSync(resolve(home, ".config", "opencode"))) {
517
- return {
518
- platform: "opencode",
519
- confidence: "medium",
520
- reason: "~/.config/opencode/ directory exists",
521
- };
522
- }
523
- if (existsSync(resolve(home, ".config", "zed"))) {
524
- return {
525
- platform: "zed",
526
- confidence: "medium",
527
- reason: "~/.config/zed/ directory exists",
528
- };
529
- }
530
- // ── Low confidence: fallback ───────────────────────────
531
- return {
532
- platform: "claude-code",
533
- confidence: "low",
534
- reason: "No platform detected, defaulting to Claude Code",
535
- };
536
- }
537
- /**
538
- * Get the adapter instance for a given platform.
539
- * Lazily imports platform-specific adapter modules.
540
- */
541
- export async function getAdapter(platform) {
542
- const target = platform ?? detectPlatform().platform;
543
- switch (target) {
544
- case "claude-code": {
545
- const { ClaudeCodeAdapter } = await import("./claude-code/index.js");
546
- return new ClaudeCodeAdapter();
547
- }
548
- case "gemini-cli": {
549
- const { GeminiCLIAdapter } = await import("./gemini-cli/index.js");
550
- return new GeminiCLIAdapter();
551
- }
552
- case "kilo":
553
- case "opencode": {
554
- const { OpenCodeAdapter } = await import("./opencode/index.js");
555
- return new OpenCodeAdapter(target);
556
- }
557
- case "openclaw": {
558
- const { OpenClawAdapter } = await import("./openclaw/index.js");
559
- return new OpenClawAdapter();
560
- }
561
- case "codex": {
562
- const { CodexAdapter } = await import("./codex/index.js");
563
- return new CodexAdapter();
564
- }
565
- case "vscode-copilot": {
566
- const { VSCodeCopilotAdapter } = await import("./vscode-copilot/index.js");
567
- return new VSCodeCopilotAdapter();
568
- }
569
- case "jetbrains-copilot": {
570
- const { JetBrainsCopilotAdapter } = await import("./jetbrains-copilot/index.js");
571
- return new JetBrainsCopilotAdapter();
572
- }
573
- case "copilot-cli": {
574
- const { CopilotCliAdapter } = await import("./copilot-cli/index.js");
575
- return new CopilotCliAdapter();
576
- }
577
- case "cursor": {
578
- const { CursorAdapter } = await import("./cursor/index.js");
579
- return new CursorAdapter();
580
- }
581
- case "antigravity": {
582
- const { AntigravityAdapter } = await import("./antigravity/index.js");
583
- return new AntigravityAdapter();
584
- }
585
- case "antigravity-cli": {
586
- const { AntigravityCliAdapter } = await import("./antigravity-cli/index.js");
587
- return new AntigravityCliAdapter();
588
- }
589
- case "kiro": {
590
- const { KiroAdapter } = await import("./kiro/index.js");
591
- return new KiroAdapter();
592
- }
593
- case "zed": {
594
- const { ZedAdapter } = await import("./zed/index.js");
595
- return new ZedAdapter();
596
- }
597
- case "qwen-code": {
598
- const { QwenCodeAdapter } = await import("./qwen-code/index.js");
599
- return new QwenCodeAdapter();
600
- }
601
- case "omp": {
602
- const { OMPAdapter } = await import("./omp/index.js");
603
- return new OMPAdapter();
604
- }
605
- case "pi": {
606
- // Issue #473 follow-up: without this case, getAdapter("pi") fell
607
- // through to ClaudeCodeAdapter and Pi sessions wrote into
608
- // ~/.claude/context-mode/. PiAdapter pins storage to ~/.pi/.
609
- const { PiAdapter } = await import("./pi/index.js");
610
- return new PiAdapter();
611
- }
612
- case "kimi": {
613
- const { KimiAdapter } = await import("./kimi/index.js");
614
- return new KimiAdapter();
615
- }
616
- default: {
617
- // Unsupported platform — fall back to Claude Code adapter
618
- // (MCP server works everywhere, hooks may not)
619
- const { ClaudeCodeAdapter } = await import("./claude-code/index.js");
620
- return new ClaudeCodeAdapter();
621
- }
622
- }
623
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * adapters/gemini-cli/config — Thin re-exports from GeminiCLIAdapter.
3
- *
4
- * This module exists for backward compatibility. All logic lives in the
5
- * adapter class (index.ts). New code should use getAdapter() from detect.ts.
6
- */
7
- export { GeminiCLIAdapter } from "./index.js";
8
- export { HOOK_TYPES, HOOK_SCRIPTS, REQUIRED_HOOKS, OPTIONAL_HOOKS } from "./hooks.js";
@@ -1,8 +0,0 @@
1
- /**
2
- * adapters/gemini-cli/config — Thin re-exports from GeminiCLIAdapter.
3
- *
4
- * This module exists for backward compatibility. All logic lives in the
5
- * adapter class (index.ts). New code should use getAdapter() from detect.ts.
6
- */
7
- export { GeminiCLIAdapter } from "./index.js";
8
- export { HOOK_TYPES, HOOK_SCRIPTS, REQUIRED_HOOKS, OPTIONAL_HOOKS } from "./hooks.js";