@cleocode/adapters 2026.4.0 → 2026.4.2

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 (289) hide show
  1. package/dist/index.d.ts +9 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +724 -630
  4. package/dist/index.js.map +3 -3
  5. package/dist/providers/claude-code/adapter.d.ts +21 -1
  6. package/dist/providers/claude-code/adapter.d.ts.map +1 -1
  7. package/dist/providers/claude-code/context-monitor.d.ts +11 -0
  8. package/dist/providers/claude-code/context-monitor.d.ts.map +1 -1
  9. package/dist/providers/claude-code/hooks.d.ts +7 -0
  10. package/dist/providers/claude-code/hooks.d.ts.map +1 -1
  11. package/dist/providers/claude-code/index.d.ts +16 -1
  12. package/dist/providers/claude-code/index.d.ts.map +1 -1
  13. package/dist/providers/claude-code/install.d.ts +10 -18
  14. package/dist/providers/claude-code/install.d.ts.map +1 -1
  15. package/dist/providers/claude-code/paths.d.ts +8 -0
  16. package/dist/providers/claude-code/paths.d.ts.map +1 -1
  17. package/dist/providers/claude-code/spawn.d.ts +7 -0
  18. package/dist/providers/claude-code/spawn.d.ts.map +1 -1
  19. package/dist/providers/claude-code/statusline.d.ts +44 -0
  20. package/dist/providers/claude-code/statusline.d.ts.map +1 -1
  21. package/dist/providers/claude-code/task-sync.d.ts +8 -0
  22. package/dist/providers/claude-code/task-sync.d.ts.map +1 -1
  23. package/dist/providers/claude-code/transport.d.ts +11 -0
  24. package/dist/providers/claude-code/transport.d.ts.map +1 -1
  25. package/dist/providers/codex/adapter.d.ts +14 -1
  26. package/dist/providers/codex/adapter.d.ts.map +1 -1
  27. package/dist/providers/codex/hooks.d.ts +6 -0
  28. package/dist/providers/codex/hooks.d.ts.map +1 -1
  29. package/dist/providers/codex/index.d.ts +16 -1
  30. package/dist/providers/codex/index.d.ts.map +1 -1
  31. package/dist/providers/codex/install.d.ts +8 -17
  32. package/dist/providers/codex/install.d.ts.map +1 -1
  33. package/dist/providers/cursor/adapter.d.ts +15 -1
  34. package/dist/providers/cursor/adapter.d.ts.map +1 -1
  35. package/dist/providers/cursor/hooks.d.ts +7 -0
  36. package/dist/providers/cursor/hooks.d.ts.map +1 -1
  37. package/dist/providers/cursor/index.d.ts +16 -1
  38. package/dist/providers/cursor/index.d.ts.map +1 -1
  39. package/dist/providers/cursor/install.d.ts +10 -17
  40. package/dist/providers/cursor/install.d.ts.map +1 -1
  41. package/dist/providers/gemini-cli/adapter.d.ts +15 -1
  42. package/dist/providers/gemini-cli/adapter.d.ts.map +1 -1
  43. package/dist/providers/gemini-cli/hooks.d.ts +7 -0
  44. package/dist/providers/gemini-cli/hooks.d.ts.map +1 -1
  45. package/dist/providers/gemini-cli/index.d.ts +16 -1
  46. package/dist/providers/gemini-cli/index.d.ts.map +1 -1
  47. package/dist/providers/gemini-cli/install.d.ts +8 -17
  48. package/dist/providers/gemini-cli/install.d.ts.map +1 -1
  49. package/dist/providers/kimi/adapter.d.ts +15 -2
  50. package/dist/providers/kimi/adapter.d.ts.map +1 -1
  51. package/dist/providers/kimi/hooks.d.ts +6 -0
  52. package/dist/providers/kimi/hooks.d.ts.map +1 -1
  53. package/dist/providers/kimi/index.d.ts +16 -1
  54. package/dist/providers/kimi/index.d.ts.map +1 -1
  55. package/dist/providers/kimi/install.d.ts +7 -22
  56. package/dist/providers/kimi/install.d.ts.map +1 -1
  57. package/dist/providers/opencode/adapter.d.ts +17 -1
  58. package/dist/providers/opencode/adapter.d.ts.map +1 -1
  59. package/dist/providers/opencode/hooks.d.ts +9 -0
  60. package/dist/providers/opencode/hooks.d.ts.map +1 -1
  61. package/dist/providers/opencode/index.d.ts +16 -1
  62. package/dist/providers/opencode/index.d.ts.map +1 -1
  63. package/dist/providers/opencode/install.d.ts +8 -17
  64. package/dist/providers/opencode/install.d.ts.map +1 -1
  65. package/dist/providers/opencode/spawn.d.ts +23 -1
  66. package/dist/providers/opencode/spawn.d.ts.map +1 -1
  67. package/dist/providers/shared/transcript-reader.d.ts +15 -0
  68. package/dist/providers/shared/transcript-reader.d.ts.map +1 -1
  69. package/dist/registry.d.ts +54 -2
  70. package/dist/registry.d.ts.map +1 -1
  71. package/package.json +3 -3
  72. package/src/__tests__/claude-code-adapter.test.js +21 -30
  73. package/src/__tests__/claude-code-adapter.test.js.map +1 -1
  74. package/src/__tests__/claude-code-adapter.test.ts +21 -32
  75. package/src/__tests__/cursor-adapter.test.js +25 -29
  76. package/src/__tests__/cursor-adapter.test.js.map +1 -1
  77. package/src/__tests__/cursor-adapter.test.ts +26 -33
  78. package/src/__tests__/opencode-adapter.test.js +47 -46
  79. package/src/__tests__/opencode-adapter.test.js.map +1 -1
  80. package/src/__tests__/opencode-adapter.test.ts +51 -49
  81. package/src/index.ts +9 -1
  82. package/src/providers/claude-code/__tests__/adapter.test.js +50 -23
  83. package/src/providers/claude-code/__tests__/adapter.test.js.map +1 -1
  84. package/src/providers/claude-code/__tests__/adapter.test.ts +52 -23
  85. package/src/providers/claude-code/adapter.ts +22 -2
  86. package/src/providers/claude-code/context-monitor.ts +11 -0
  87. package/src/providers/claude-code/hooks.ts +7 -0
  88. package/src/providers/claude-code/index.ts +16 -1
  89. package/src/providers/claude-code/install.ts +15 -96
  90. package/src/providers/claude-code/manifest.json +1 -1
  91. package/src/providers/claude-code/paths.ts +8 -0
  92. package/src/providers/claude-code/spawn.ts +7 -0
  93. package/src/providers/claude-code/statusline.ts +44 -0
  94. package/src/providers/claude-code/task-sync.ts +8 -0
  95. package/src/providers/claude-code/transport.ts +11 -0
  96. package/src/providers/codex/adapter.ts +15 -2
  97. package/src/providers/codex/hooks.ts +6 -0
  98. package/src/providers/codex/index.ts +16 -1
  99. package/src/providers/codex/install.ts +17 -81
  100. package/src/providers/codex/manifest.json +1 -1
  101. package/src/providers/cursor/__tests__/adapter.test.js +37 -12
  102. package/src/providers/cursor/__tests__/adapter.test.js.map +1 -1
  103. package/src/providers/cursor/__tests__/adapter.test.ts +43 -12
  104. package/src/providers/cursor/adapter.ts +16 -2
  105. package/src/providers/cursor/hooks.ts +7 -0
  106. package/src/providers/cursor/index.ts +16 -1
  107. package/src/providers/cursor/install.ts +23 -88
  108. package/src/providers/cursor/manifest.json +1 -1
  109. package/src/providers/gemini-cli/adapter.ts +16 -2
  110. package/src/providers/gemini-cli/hooks.ts +7 -0
  111. package/src/providers/gemini-cli/index.ts +16 -1
  112. package/src/providers/gemini-cli/install.ts +17 -81
  113. package/src/providers/gemini-cli/manifest.json +1 -1
  114. package/src/providers/kimi/adapter.ts +16 -3
  115. package/src/providers/kimi/hooks.ts +6 -0
  116. package/src/providers/kimi/index.ts +16 -1
  117. package/src/providers/kimi/install.ts +16 -86
  118. package/src/providers/kimi/manifest.json +1 -1
  119. package/src/providers/opencode/__tests__/adapter.test.js +48 -35
  120. package/src/providers/opencode/__tests__/adapter.test.js.map +1 -1
  121. package/src/providers/opencode/__tests__/adapter.test.ts +49 -34
  122. package/src/providers/opencode/adapter.ts +18 -2
  123. package/src/providers/opencode/hooks.ts +9 -0
  124. package/src/providers/opencode/index.ts +16 -1
  125. package/src/providers/opencode/install.ts +17 -90
  126. package/src/providers/opencode/manifest.json +1 -1
  127. package/src/providers/opencode/spawn.ts +23 -1
  128. package/src/providers/shared/transcript-reader.ts +15 -0
  129. package/src/registry.ts +54 -2
  130. package/dist/providers/claude-code/adapter.js +0 -165
  131. package/dist/providers/claude-code/adapter.js.map +0 -1
  132. package/dist/providers/claude-code/context-monitor.js +0 -148
  133. package/dist/providers/claude-code/context-monitor.js.map +0 -1
  134. package/dist/providers/claude-code/hooks.js +0 -279
  135. package/dist/providers/claude-code/hooks.js.map +0 -1
  136. package/dist/providers/claude-code/index.js +0 -26
  137. package/dist/providers/claude-code/index.js.map +0 -1
  138. package/dist/providers/claude-code/install.js +0 -234
  139. package/dist/providers/claude-code/install.js.map +0 -1
  140. package/dist/providers/claude-code/paths.js +0 -33
  141. package/dist/providers/claude-code/paths.js.map +0 -1
  142. package/dist/providers/claude-code/spawn.js +0 -164
  143. package/dist/providers/claude-code/spawn.js.map +0 -1
  144. package/dist/providers/claude-code/statusline.js +0 -86
  145. package/dist/providers/claude-code/statusline.js.map +0 -1
  146. package/dist/providers/claude-code/task-sync.js +0 -111
  147. package/dist/providers/claude-code/task-sync.js.map +0 -1
  148. package/dist/providers/claude-code/transport.js +0 -18
  149. package/dist/providers/claude-code/transport.js.map +0 -1
  150. package/dist/providers/codex/adapter.js +0 -134
  151. package/dist/providers/codex/adapter.js.map +0 -1
  152. package/dist/providers/codex/hooks.js +0 -107
  153. package/dist/providers/codex/hooks.js.map +0 -1
  154. package/dist/providers/codex/index.js +0 -24
  155. package/dist/providers/codex/index.js.map +0 -1
  156. package/dist/providers/codex/install.js +0 -183
  157. package/dist/providers/codex/install.js.map +0 -1
  158. package/dist/providers/cursor/adapter.js +0 -138
  159. package/dist/providers/cursor/adapter.js.map +0 -1
  160. package/dist/providers/cursor/hooks.js +0 -201
  161. package/dist/providers/cursor/hooks.js.map +0 -1
  162. package/dist/providers/cursor/index.js +0 -21
  163. package/dist/providers/cursor/index.js.map +0 -1
  164. package/dist/providers/cursor/install.js +0 -238
  165. package/dist/providers/cursor/install.js.map +0 -1
  166. package/dist/providers/cursor/spawn.js +0 -59
  167. package/dist/providers/cursor/spawn.js.map +0 -1
  168. package/dist/providers/gemini-cli/adapter.js +0 -145
  169. package/dist/providers/gemini-cli/adapter.js.map +0 -1
  170. package/dist/providers/gemini-cli/hooks.js +0 -121
  171. package/dist/providers/gemini-cli/hooks.js.map +0 -1
  172. package/dist/providers/gemini-cli/index.js +0 -24
  173. package/dist/providers/gemini-cli/index.js.map +0 -1
  174. package/dist/providers/gemini-cli/install.js +0 -183
  175. package/dist/providers/gemini-cli/install.js.map +0 -1
  176. package/dist/providers/kimi/adapter.js +0 -133
  177. package/dist/providers/kimi/adapter.js.map +0 -1
  178. package/dist/providers/kimi/hooks.js +0 -73
  179. package/dist/providers/kimi/hooks.js.map +0 -1
  180. package/dist/providers/kimi/index.js +0 -24
  181. package/dist/providers/kimi/index.js.map +0 -1
  182. package/dist/providers/kimi/install.js +0 -189
  183. package/dist/providers/kimi/install.js.map +0 -1
  184. package/dist/providers/opencode/adapter.js +0 -151
  185. package/dist/providers/opencode/adapter.js.map +0 -1
  186. package/dist/providers/opencode/hooks.js +0 -197
  187. package/dist/providers/opencode/hooks.js.map +0 -1
  188. package/dist/providers/opencode/index.js +0 -22
  189. package/dist/providers/opencode/index.js.map +0 -1
  190. package/dist/providers/opencode/install.js +0 -180
  191. package/dist/providers/opencode/install.js.map +0 -1
  192. package/dist/providers/opencode/spawn.js +0 -219
  193. package/dist/providers/opencode/spawn.js.map +0 -1
  194. package/dist/providers/shared/transcript-reader.js +0 -109
  195. package/dist/providers/shared/transcript-reader.js.map +0 -1
  196. package/dist/registry.js +0 -55
  197. package/dist/registry.js.map +0 -1
  198. package/src/__tests__/claude-code-adapter.test.d.ts +0 -10
  199. package/src/__tests__/cursor-adapter.test.d.ts +0 -10
  200. package/src/__tests__/opencode-adapter.test.d.ts +0 -10
  201. package/src/index.d.ts +0 -35
  202. package/src/index.d.ts.map +0 -1
  203. package/src/index.js +0 -13
  204. package/src/index.js.map +0 -1
  205. package/src/providers/claude-code/__tests__/adapter.test.d.ts +0 -7
  206. package/src/providers/claude-code/adapter.d.ts +0 -79
  207. package/src/providers/claude-code/adapter.d.ts.map +0 -1
  208. package/src/providers/claude-code/adapter.js +0 -154
  209. package/src/providers/claude-code/adapter.js.map +0 -1
  210. package/src/providers/claude-code/context-monitor.d.ts +0 -24
  211. package/src/providers/claude-code/context-monitor.d.ts.map +0 -1
  212. package/src/providers/claude-code/context-monitor.js +0 -148
  213. package/src/providers/claude-code/context-monitor.js.map +0 -1
  214. package/src/providers/claude-code/hooks.d.ts +0 -59
  215. package/src/providers/claude-code/hooks.d.ts.map +0 -1
  216. package/src/providers/claude-code/hooks.js +0 -77
  217. package/src/providers/claude-code/hooks.js.map +0 -1
  218. package/src/providers/claude-code/index.d.ts +0 -28
  219. package/src/providers/claude-code/index.d.ts.map +0 -1
  220. package/src/providers/claude-code/index.js +0 -26
  221. package/src/providers/claude-code/index.js.map +0 -1
  222. package/src/providers/claude-code/install.d.ts +0 -75
  223. package/src/providers/claude-code/install.d.ts.map +0 -1
  224. package/src/providers/claude-code/install.js +0 -234
  225. package/src/providers/claude-code/install.js.map +0 -1
  226. package/src/providers/claude-code/paths.d.ts +0 -24
  227. package/src/providers/claude-code/paths.d.ts.map +0 -1
  228. package/src/providers/claude-code/paths.js +0 -33
  229. package/src/providers/claude-code/paths.js.map +0 -1
  230. package/src/providers/claude-code/spawn.d.ts +0 -60
  231. package/src/providers/claude-code/spawn.d.ts.map +0 -1
  232. package/src/providers/claude-code/spawn.js +0 -164
  233. package/src/providers/claude-code/spawn.js.map +0 -1
  234. package/src/providers/claude-code/statusline.d.ts +0 -23
  235. package/src/providers/claude-code/statusline.d.ts.map +0 -1
  236. package/src/providers/claude-code/statusline.js +0 -86
  237. package/src/providers/claude-code/statusline.js.map +0 -1
  238. package/src/providers/claude-code/task-sync.js +0 -122
  239. package/src/providers/claude-code/task-sync.js.map +0 -1
  240. package/src/providers/claude-code/transport.d.ts +0 -14
  241. package/src/providers/claude-code/transport.d.ts.map +0 -1
  242. package/src/providers/claude-code/transport.js +0 -18
  243. package/src/providers/claude-code/transport.js.map +0 -1
  244. package/src/providers/cursor/__tests__/adapter.test.d.ts +0 -7
  245. package/src/providers/cursor/adapter.d.ts +0 -66
  246. package/src/providers/cursor/adapter.d.ts.map +0 -1
  247. package/src/providers/cursor/adapter.js +0 -124
  248. package/src/providers/cursor/adapter.js.map +0 -1
  249. package/src/providers/cursor/hooks.d.ts +0 -48
  250. package/src/providers/cursor/hooks.d.ts.map +0 -1
  251. package/src/providers/cursor/hooks.js +0 -55
  252. package/src/providers/cursor/hooks.js.map +0 -1
  253. package/src/providers/cursor/index.d.ts +0 -19
  254. package/src/providers/cursor/index.d.ts.map +0 -1
  255. package/src/providers/cursor/index.js +0 -21
  256. package/src/providers/cursor/index.js.map +0 -1
  257. package/src/providers/cursor/install.d.ts +0 -94
  258. package/src/providers/cursor/install.d.ts.map +0 -1
  259. package/src/providers/cursor/install.js +0 -238
  260. package/src/providers/cursor/install.js.map +0 -1
  261. package/src/providers/cursor/spawn.d.ts +0 -50
  262. package/src/providers/cursor/spawn.d.ts.map +0 -1
  263. package/src/providers/cursor/spawn.js +0 -59
  264. package/src/providers/cursor/spawn.js.map +0 -1
  265. package/src/providers/opencode/__tests__/adapter.test.d.ts +0 -7
  266. package/src/providers/opencode/adapter.d.ts +0 -71
  267. package/src/providers/opencode/adapter.d.ts.map +0 -1
  268. package/src/providers/opencode/adapter.js +0 -144
  269. package/src/providers/opencode/adapter.js.map +0 -1
  270. package/src/providers/opencode/hooks.d.ts +0 -66
  271. package/src/providers/opencode/hooks.d.ts.map +0 -1
  272. package/src/providers/opencode/hooks.js +0 -89
  273. package/src/providers/opencode/hooks.js.map +0 -1
  274. package/src/providers/opencode/index.d.ts +0 -20
  275. package/src/providers/opencode/index.d.ts.map +0 -1
  276. package/src/providers/opencode/index.js +0 -22
  277. package/src/providers/opencode/index.js.map +0 -1
  278. package/src/providers/opencode/install.d.ts +0 -65
  279. package/src/providers/opencode/install.d.ts.map +0 -1
  280. package/src/providers/opencode/install.js +0 -180
  281. package/src/providers/opencode/install.js.map +0 -1
  282. package/src/providers/opencode/spawn.d.ts +0 -75
  283. package/src/providers/opencode/spawn.d.ts.map +0 -1
  284. package/src/providers/opencode/spawn.js +0 -219
  285. package/src/providers/opencode/spawn.js.map +0 -1
  286. package/src/registry.d.ts +0 -36
  287. package/src/registry.d.ts.map +0 -1
  288. package/src/registry.js +0 -55
  289. package/src/registry.js.map +0 -1
@@ -2,7 +2,6 @@
2
2
  * Cursor Install Provider
3
3
  *
4
4
  * Handles CLEO installation into Cursor environments:
5
- * - Registers CLEO MCP server in .cursor/mcp.json
6
5
  * - Ensures .cursorrules has CLEO @-references (legacy format)
7
6
  * - Creates .cursor/rules/cleo.mdc with CLEO references (modern format)
8
7
  *
@@ -22,54 +21,43 @@ import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cle
22
21
  /** Lines that should appear in instruction files to reference CLEO. */
23
22
  const INSTRUCTION_REFERENCES = ['@~/.cleo/templates/CLEO-INJECTION.md', '@.cleo/memory-bridge.md'];
24
23
 
25
- /** MCP server registration key used in Cursor config. */
26
- const MCP_SERVER_KEY = 'cleo';
27
-
28
24
  /**
29
25
  * Install provider for Cursor.
30
26
  *
31
27
  * Manages CLEO's integration with Cursor by:
32
- * 1. Registering the CLEO MCP server in .cursor/mcp.json
33
- * 2. Creating/updating .cursorrules with @-references (legacy)
34
- * 3. Creating .cursor/rules/cleo.mdc with @-references (modern)
28
+ * 1. Creating/updating .cursorrules with @-references (legacy)
29
+ * 2. Creating .cursor/rules/cleo.mdc with @-references (modern)
30
+ *
31
+ * @remarks
32
+ * Installation is idempotent and writes to both instruction file formats
33
+ * for maximum compatibility. The legacy `.cursorrules` file is only modified
34
+ * if it already exists (never created from scratch). The modern MDC file
35
+ * is always created or updated to ensure Cursor's rule engine picks it up.
35
36
  */
36
37
  export class CursorInstallProvider implements AdapterInstallProvider {
37
- private installedProjectDir: string | null = null;
38
-
39
38
  /**
40
39
  * Install CLEO into a Cursor project.
41
40
  *
42
- * @param options - Installation options including project directory and MCP server path
41
+ * @param options - Installation options including project directory
43
42
  * @returns Result describing what was installed
44
43
  */
45
44
  async install(options: InstallOptions): Promise<InstallResult> {
46
- const { projectDir, mcpServerPath } = options;
45
+ const { projectDir } = options;
47
46
  const installedAt = new Date().toISOString();
48
47
  let instructionFileUpdated = false;
49
- let mcpRegistered = false;
50
48
  const details: Record<string, unknown> = {};
51
49
 
52
- // Step 1: Register MCP server in .cursor/mcp.json
53
- if (mcpServerPath) {
54
- mcpRegistered = this.registerMcpServer(projectDir, mcpServerPath);
55
- if (mcpRegistered) {
56
- details.mcpConfigPath = join(projectDir, '.cursor', 'mcp.json');
57
- }
58
- }
59
-
60
- // Step 2: Ensure instruction files have @-references
50
+ // Step 1: Ensure instruction files have @-references
61
51
  instructionFileUpdated = this.updateInstructionFiles(projectDir);
62
52
  if (instructionFileUpdated) {
63
53
  details.instructionFiles = this.getUpdatedFileList(projectDir);
64
54
  }
65
55
 
66
- this.installedProjectDir = projectDir;
67
-
68
56
  return {
69
57
  success: true,
70
58
  installedAt,
71
59
  instructionFileUpdated,
72
- mcpRegistered,
60
+ mcpRegistered: false,
73
61
  details,
74
62
  };
75
63
  }
@@ -77,42 +65,26 @@ export class CursorInstallProvider implements AdapterInstallProvider {
77
65
  /**
78
66
  * Uninstall CLEO from the current Cursor project.
79
67
  *
80
- * Removes the MCP server registration from .cursor/mcp.json.
81
68
  * Does not remove instruction file references (they are harmless if CLEO is not present).
82
69
  */
83
- async uninstall(): Promise<void> {
84
- if (!this.installedProjectDir) return;
85
-
86
- const mcpPath = join(this.installedProjectDir, '.cursor', 'mcp.json');
87
- if (existsSync(mcpPath)) {
88
- try {
89
- const raw = readFileSync(mcpPath, 'utf-8');
90
- const config = JSON.parse(raw) as Record<string, unknown>;
91
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
92
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
93
- delete mcpServers[MCP_SERVER_KEY];
94
- writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
95
- }
96
- } catch {
97
- // Ignore errors during uninstall
98
- }
99
- }
100
-
101
- this.installedProjectDir = null;
102
- }
70
+ async uninstall(): Promise<void> {}
103
71
 
104
72
  /**
105
73
  * Check whether CLEO is installed in the current environment.
106
74
  *
107
- * Checks for MCP server registered in .cursor/mcp.json.
75
+ * Checks for .cursor/rules/cleo.mdc or .cursorrules with CLEO references.
108
76
  */
109
77
  async isInstalled(): Promise<boolean> {
110
- const mcpPath = join(process.cwd(), '.cursor', 'mcp.json');
111
- if (existsSync(mcpPath)) {
78
+ const mdcPath = join(process.cwd(), '.cursor', 'rules', 'cleo.mdc');
79
+ if (existsSync(mdcPath)) {
80
+ return true;
81
+ }
82
+
83
+ const rulesPath = join(process.cwd(), '.cursorrules');
84
+ if (existsSync(rulesPath)) {
112
85
  try {
113
- const config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
114
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
115
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
86
+ const content = readFileSync(rulesPath, 'utf-8');
87
+ if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
116
88
  return true;
117
89
  }
118
90
  } catch {
@@ -134,43 +106,6 @@ export class CursorInstallProvider implements AdapterInstallProvider {
134
106
  this.updateInstructionFiles(projectDir);
135
107
  }
136
108
 
137
- /**
138
- * Register the CLEO MCP server in .cursor/mcp.json.
139
- *
140
- * Cursor stores MCP server configuration in .cursor/mcp.json
141
- * under the mcpServers key.
142
- *
143
- * @returns true if registration was performed or updated
144
- */
145
- private registerMcpServer(projectDir: string, mcpServerPath: string): boolean {
146
- const cursorDir = join(projectDir, '.cursor');
147
- const mcpPath = join(cursorDir, 'mcp.json');
148
- let config: Record<string, unknown> = {};
149
-
150
- mkdirSync(cursorDir, { recursive: true });
151
-
152
- if (existsSync(mcpPath)) {
153
- try {
154
- config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
155
- } catch {
156
- // Start fresh on parse error
157
- }
158
- }
159
-
160
- if (!config.mcpServers || typeof config.mcpServers !== 'object') {
161
- config.mcpServers = {};
162
- }
163
-
164
- const mcpServers = config.mcpServers as Record<string, unknown>;
165
- mcpServers[MCP_SERVER_KEY] = {
166
- command: 'node',
167
- args: [mcpServerPath],
168
- };
169
-
170
- writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
171
- return true;
172
- }
173
-
174
109
  /**
175
110
  * Update instruction files with CLEO @-references.
176
111
  *
@@ -10,7 +10,7 @@
10
10
  "supportedHookEvents": [],
11
11
  "supportsSpawn": false,
12
12
  "supportsInstall": true,
13
- "supportsMcp": true,
13
+ "supportsMcp": false,
14
14
  "supportsInstructionFiles": true,
15
15
  "instructionFilePattern": ".cursor/rules/*.mdc",
16
16
  "supportsContextMonitor": false,
@@ -28,16 +28,26 @@ const execAsync = promisify(exec);
28
28
  *
29
29
  * Bridges CLEO's adapter system with Gemini CLI's native capabilities:
30
30
  * - Hooks: Maps Gemini CLI events (SessionStart, PreToolUse, etc.) to CAAMP events
31
- * - Install: Registers MCP server in ~/.gemini/settings.json and ensures AGENTS.md references
31
+ * - Install: Ensures AGENTS.md references for CLEO instruction files
32
+ *
33
+ * @remarks
34
+ * Gemini CLI supports 10 canonical CAAMP events through its hook system,
35
+ * including PreModel and PostModel which most other providers lack. It has
36
+ * no spawn or transport capabilities. Integration is through AGENTS.md
37
+ * instruction files and the Gemini CLI's configuration at `~/.gemini/`.
32
38
  *
33
39
  * @task T161
34
40
  * @epic T134
35
41
  */
36
42
  export class GeminiCliAdapter implements CLEOProviderAdapter {
43
+ /** Unique provider identifier. */
37
44
  readonly id = 'gemini-cli';
45
+ /** Human-readable provider name. */
38
46
  readonly name = 'Gemini CLI';
47
+ /** Adapter version string. */
39
48
  readonly version = '1.0.0';
40
49
 
50
+ /** Declared capabilities for this provider. */
41
51
  capabilities: AdapterCapabilities = {
42
52
  supportsHooks: true,
43
53
  supportedHookEvents: [
@@ -54,7 +64,7 @@ export class GeminiCliAdapter implements CLEOProviderAdapter {
54
64
  ],
55
65
  supportsSpawn: false,
56
66
  supportsInstall: true,
57
- supportsMcp: true,
67
+ supportsMcp: false,
58
68
  supportsInstructionFiles: false,
59
69
  supportsContextMonitor: false,
60
70
  supportsStatusline: false,
@@ -63,10 +73,14 @@ export class GeminiCliAdapter implements CLEOProviderAdapter {
63
73
  supportsTaskSync: false,
64
74
  };
65
75
 
76
+ /** Hook provider for CAAMP event mapping. */
66
77
  hooks: GeminiCliHookProvider;
78
+ /** Install provider for managing instruction files. */
67
79
  install: GeminiCliInstallProvider;
68
80
 
81
+ /** Project directory this adapter was initialized with, or null. */
69
82
  private projectDir: string | null = null;
83
+ /** Whether {@link initialize} has been called. */
70
84
  private initialized = false;
71
85
 
72
86
  constructor() {
@@ -52,10 +52,17 @@ const GEMINI_CLI_EVENT_MAP: Record<string, string> = {
52
52
  * the install provider), registerNativeHooks and unregisterNativeHooks
53
53
  * track registration state without performing filesystem operations.
54
54
  *
55
+ * @remarks
56
+ * Gemini CLI uses its own event naming convention (e.g. BeforeAgent,
57
+ * AfterTool, PreCompress) which differs from both the PascalCase CAAMP
58
+ * canonical names and other providers' conventions. The static event map
59
+ * covers all 10 supported canonical events.
60
+ *
55
61
  * @task T161
56
62
  * @epic T134
57
63
  */
58
64
  export class GeminiCliHookProvider implements AdapterHookProvider {
65
+ /** Whether hooks have been registered for the current session. */
59
66
  private registered = false;
60
67
 
61
68
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Gemini CLI provider adapter.
2
+ * @packageDocumentation
3
3
  *
4
4
  * CLEO provider adapter for Google Gemini CLI.
5
5
  * Default export is the adapter class for dynamic loading by AdapterManager.
@@ -20,6 +20,21 @@ export default GeminiCliAdapter;
20
20
  * Factory function for creating adapter instances.
21
21
  * Used by AdapterManager's dynamic import fallback.
22
22
  *
23
+ * @remarks
24
+ * This is the primary entry point for dynamic adapter loading.
25
+ * AdapterManager calls this function when it resolves the gemini-cli
26
+ * provider via its import-based discovery mechanism.
27
+ *
28
+ * @returns A new {@link GeminiCliAdapter} instance ready for initialization
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * import { createAdapter } from '@cleocode/adapters/providers/gemini-cli';
33
+ *
34
+ * const adapter = createAdapter();
35
+ * await adapter.initialize('/path/to/project');
36
+ * ```
37
+ *
23
38
  * @task T161
24
39
  */
25
40
  export function createAdapter(): GeminiCliAdapter {
@@ -2,30 +2,29 @@
2
2
  * Gemini CLI Install Provider
3
3
  *
4
4
  * Handles CLEO installation into Gemini CLI environments:
5
- * - Registers CLEO MCP server in ~/.gemini/settings.json
6
5
  * - Ensures AGENTS.md has CLEO @-references
7
6
  *
8
7
  * @task T161
9
8
  * @epic T134
10
9
  */
11
10
 
12
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
13
- import { homedir } from 'node:os';
11
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
14
12
  import { join } from 'node:path';
15
13
  import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
16
14
 
17
15
  /** Lines that should appear in AGENTS.md to reference CLEO. */
18
16
  const INSTRUCTION_REFERENCES = ['@~/.cleo/templates/CLEO-INJECTION.md', '@.cleo/memory-bridge.md'];
19
17
 
20
- /** MCP server registration key used in Gemini CLI settings. */
21
- const MCP_SERVER_KEY = 'cleo';
22
-
23
18
  /**
24
19
  * Install provider for Gemini CLI.
25
20
  *
26
21
  * Manages CLEO's integration with Gemini CLI by:
27
- * 1. Registering the CLEO MCP server in ~/.gemini/settings.json
28
- * 2. Ensuring AGENTS.md contains @-references to CLEO instruction files
22
+ * 1. Ensuring AGENTS.md contains @-references to CLEO instruction files
23
+ *
24
+ * @remarks
25
+ * Installation is idempotent -- running install multiple times on the same
26
+ * project produces the same result. Only AGENTS.md is managed; Gemini CLI
27
+ * does not have an MCP or plugin registration mechanism.
29
28
  *
30
29
  * @task T161
31
30
  * @epic T134
@@ -34,26 +33,17 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
34
33
  /**
35
34
  * Install CLEO into a Gemini CLI environment.
36
35
  *
37
- * @param options - Installation options including project directory and MCP server path
36
+ * @param options - Installation options including project directory
38
37
  * @returns Result describing what was installed
39
38
  * @task T161
40
39
  */
41
40
  async install(options: InstallOptions): Promise<InstallResult> {
42
- const { projectDir, mcpServerPath } = options;
41
+ const { projectDir } = options;
43
42
  const installedAt = new Date().toISOString();
44
43
  let instructionFileUpdated = false;
45
- let mcpRegistered = false;
46
44
  const details: Record<string, unknown> = {};
47
45
 
48
- // Step 1: Register MCP server in ~/.gemini/settings.json
49
- if (mcpServerPath) {
50
- mcpRegistered = this.registerMcpServer(mcpServerPath);
51
- if (mcpRegistered) {
52
- details.mcpConfigPath = join(homedir(), '.gemini', 'settings.json');
53
- }
54
- }
55
-
56
- // Step 2: Ensure AGENTS.md has @-references
46
+ // Step 1: Ensure AGENTS.md has @-references
57
47
  instructionFileUpdated = this.updateInstructionFile(projectDir);
58
48
  if (instructionFileUpdated) {
59
49
  details.instructionFile = join(projectDir, 'AGENTS.md');
@@ -63,7 +53,7 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
63
53
  success: true,
64
54
  installedAt,
65
55
  instructionFileUpdated,
66
- mcpRegistered,
56
+ mcpRegistered: false,
67
57
  details,
68
58
  };
69
59
  }
@@ -71,41 +61,25 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
71
61
  /**
72
62
  * Uninstall CLEO from the Gemini CLI environment.
73
63
  *
74
- * Removes the MCP server registration from ~/.gemini/settings.json.
75
64
  * Does not remove AGENTS.md references (they are harmless if CLEO is not present).
76
65
  * @task T161
77
66
  */
78
67
  async uninstall(): Promise<void> {
79
- const settingsPath = join(homedir(), '.gemini', 'settings.json');
80
- if (existsSync(settingsPath)) {
81
- try {
82
- const raw = readFileSync(settingsPath, 'utf-8');
83
- const config = JSON.parse(raw) as Record<string, unknown>;
84
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
85
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
86
- delete mcpServers[MCP_SERVER_KEY];
87
- writeFileSync(settingsPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
88
- }
89
- } catch {
90
- // Ignore errors during uninstall
91
- }
92
- }
68
+ // No-op: no MCP registration to remove
93
69
  }
94
70
 
95
71
  /**
96
72
  * Check whether CLEO is installed in the Gemini CLI environment.
97
73
  *
98
- * Checks for MCP server registered in ~/.gemini/settings.json.
99
- * Returns true if the CLEO MCP server entry is found.
74
+ * Checks for CLEO references in AGENTS.md.
100
75
  * @task T161
101
76
  */
102
77
  async isInstalled(): Promise<boolean> {
103
- const settingsPath = join(homedir(), '.gemini', 'settings.json');
104
- if (existsSync(settingsPath)) {
78
+ const agentsMdPath = join(process.cwd(), 'AGENTS.md');
79
+ if (existsSync(agentsMdPath)) {
105
80
  try {
106
- const config = JSON.parse(readFileSync(settingsPath, 'utf-8'));
107
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
108
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
81
+ const content = readFileSync(agentsMdPath, 'utf-8');
82
+ if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
109
83
  return true;
110
84
  }
111
85
  } catch {
@@ -128,44 +102,6 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
128
102
  this.updateInstructionFile(projectDir);
129
103
  }
130
104
 
131
- /**
132
- * Register the CLEO MCP server in ~/.gemini/settings.json.
133
- *
134
- * Gemini CLI stores its MCP server configuration in ~/.gemini/settings.json
135
- * under the mcpServers key.
136
- *
137
- * @param mcpServerPath - Absolute path to the MCP server entry point
138
- * @returns true if registration was performed or updated
139
- */
140
- private registerMcpServer(mcpServerPath: string): boolean {
141
- const geminiDir = join(homedir(), '.gemini');
142
- const settingsPath = join(geminiDir, 'settings.json');
143
- let config: Record<string, unknown> = {};
144
-
145
- mkdirSync(geminiDir, { recursive: true });
146
-
147
- if (existsSync(settingsPath)) {
148
- try {
149
- config = JSON.parse(readFileSync(settingsPath, 'utf-8'));
150
- } catch {
151
- // Start fresh on parse error
152
- }
153
- }
154
-
155
- if (!config.mcpServers || typeof config.mcpServers !== 'object') {
156
- config.mcpServers = {};
157
- }
158
-
159
- const mcpServers = config.mcpServers as Record<string, unknown>;
160
- mcpServers[MCP_SERVER_KEY] = {
161
- command: 'node',
162
- args: [mcpServerPath],
163
- };
164
-
165
- writeFileSync(settingsPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
166
- return true;
167
- }
168
-
169
105
  /**
170
106
  * Update AGENTS.md with CLEO @-references.
171
107
  *
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "supportsSpawn": false,
23
23
  "supportsInstall": true,
24
- "supportsMcp": true,
24
+ "supportsMcp": false,
25
25
  "supportsInstructionFiles": false,
26
26
  "supportsContextMonitor": false,
27
27
  "supportsStatusline": false,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Main CLEOProviderAdapter implementation for Moonshot AI Kimi.
5
5
  * Provides install-only capabilities for CLEO integration.
6
- * Kimi has no native hook system, so integration is via MCP only.
6
+ * Kimi has no native hook system; integration is via instruction files.
7
7
  *
8
8
  * @task T163
9
9
  * @epic T134
@@ -29,22 +29,31 @@ const execAsync = promisify(exec);
29
29
  *
30
30
  * Bridges CLEO's adapter system with Kimi's integration surface:
31
31
  * - Hooks: No-op (Kimi has no native hook system)
32
- * - Install: Registers MCP server in ~/.kimi/mcp.json and ensures AGENTS.md references
32
+ * - Install: Ensures AGENTS.md references for CLEO instruction files
33
+ *
34
+ * @remarks
35
+ * Kimi has no native hook or event system, so all hook-related capabilities
36
+ * are disabled. The adapter is install-only, managing AGENTS.md references
37
+ * for CLEO instruction injection.
33
38
  *
34
39
  * @task T163
35
40
  * @epic T134
36
41
  */
37
42
  export class KimiAdapter implements CLEOProviderAdapter {
43
+ /** Unique provider identifier. */
38
44
  readonly id = 'kimi';
45
+ /** Human-readable provider name. */
39
46
  readonly name = 'Kimi';
47
+ /** Adapter version string. */
40
48
  readonly version = '1.0.0';
41
49
 
50
+ /** Declared capabilities for this provider. */
42
51
  capabilities: AdapterCapabilities = {
43
52
  supportsHooks: false,
44
53
  supportedHookEvents: [],
45
54
  supportsSpawn: false,
46
55
  supportsInstall: true,
47
- supportsMcp: true,
56
+ supportsMcp: false,
48
57
  supportsInstructionFiles: false,
49
58
  supportsContextMonitor: false,
50
59
  supportsStatusline: false,
@@ -53,10 +62,14 @@ export class KimiAdapter implements CLEOProviderAdapter {
53
62
  supportsTaskSync: false,
54
63
  };
55
64
 
65
+ /** Hook provider (no-op since Kimi has no event system). */
56
66
  hooks: KimiHookProvider;
67
+ /** Install provider for managing instruction files. */
57
68
  install: KimiInstallProvider;
58
69
 
70
+ /** Project directory this adapter was initialized with, or null. */
59
71
  private projectDir: string | null = null;
72
+ /** Whether {@link initialize} has been called. */
60
73
  private initialized = false;
61
74
 
62
75
  constructor() {
@@ -18,10 +18,16 @@ import type { AdapterHookProvider } from '@cleocode/contracts';
18
18
  * All hook-related methods are no-ops; mapProviderEvent always
19
19
  * returns null since there are no events to map.
20
20
  *
21
+ * @remarks
22
+ * Since Kimi has no hookable events, the event map is empty and
23
+ * `mapProviderEvent` always returns null. Registration state is tracked
24
+ * purely for interface compliance with {@link AdapterHookProvider}.
25
+ *
21
26
  * @task T163
22
27
  * @epic T134
23
28
  */
24
29
  export class KimiHookProvider implements AdapterHookProvider {
30
+ /** Whether hooks have been registered (always a no-op for Kimi). */
25
31
  private registered = false;
26
32
 
27
33
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Kimi provider adapter.
2
+ * @packageDocumentation
3
3
  *
4
4
  * CLEO provider adapter for Moonshot AI Kimi.
5
5
  * Default export is the adapter class for dynamic loading by AdapterManager.
@@ -20,6 +20,21 @@ export default KimiAdapter;
20
20
  * Factory function for creating adapter instances.
21
21
  * Used by AdapterManager's dynamic import fallback.
22
22
  *
23
+ * @remarks
24
+ * This is the primary entry point for dynamic adapter loading.
25
+ * AdapterManager calls this function when it resolves the kimi
26
+ * provider via its import-based discovery mechanism.
27
+ *
28
+ * @returns A new {@link KimiAdapter} instance ready for initialization
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * import { createAdapter } from '@cleocode/adapters/providers/kimi';
33
+ *
34
+ * const adapter = createAdapter();
35
+ * await adapter.initialize('/path/to/project');
36
+ * ```
37
+ *
23
38
  * @task T163
24
39
  */
25
40
  export function createAdapter(): KimiAdapter {