@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
@@ -94,8 +94,8 @@ describe('ClaudeCodeAdapter', () => {
94
94
  expect(adapter.capabilities.supportsInstall).toBe(true);
95
95
  });
96
96
 
97
- it('supports MCP', () => {
98
- expect(adapter.capabilities.supportsMcp).toBe(true);
97
+ it('does not support MCP (removed)', () => {
98
+ expect(adapter.capabilities.supportsMcp).toBe(false);
99
99
  });
100
100
 
101
101
  it('supports instruction files with CLAUDE.md pattern', () => {
@@ -103,10 +103,22 @@ describe('ClaudeCodeAdapter', () => {
103
103
  expect(adapter.capabilities.instructionFilePattern).toBe('CLAUDE.md');
104
104
  });
105
105
 
106
- it('declares expected hook events', () => {
107
- expect(adapter.capabilities.supportedHookEvents).toContain('onSessionStart');
108
- expect(adapter.capabilities.supportedHookEvents).toContain('onSessionEnd');
109
- expect(adapter.capabilities.supportedHookEvents).toContain('onToolComplete');
106
+ it('declares expected hook events (14 CAAMP canonical events)', () => {
107
+ expect(adapter.capabilities.supportedHookEvents).toContain('SessionStart');
108
+ expect(adapter.capabilities.supportedHookEvents).toContain('SessionEnd');
109
+ expect(adapter.capabilities.supportedHookEvents).toContain('PromptSubmit');
110
+ expect(adapter.capabilities.supportedHookEvents).toContain('ResponseComplete');
111
+ expect(adapter.capabilities.supportedHookEvents).toContain('PreToolUse');
112
+ expect(adapter.capabilities.supportedHookEvents).toContain('PostToolUse');
113
+ expect(adapter.capabilities.supportedHookEvents).toContain('PostToolUseFailure');
114
+ expect(adapter.capabilities.supportedHookEvents).toContain('PermissionRequest');
115
+ expect(adapter.capabilities.supportedHookEvents).toContain('SubagentStart');
116
+ expect(adapter.capabilities.supportedHookEvents).toContain('SubagentStop');
117
+ expect(adapter.capabilities.supportedHookEvents).toContain('PreCompact');
118
+ expect(adapter.capabilities.supportedHookEvents).toContain('PostCompact');
119
+ expect(adapter.capabilities.supportedHookEvents).toContain('Notification');
120
+ expect(adapter.capabilities.supportedHookEvents).toContain('ConfigChange');
121
+ expect(adapter.capabilities.supportedHookEvents).toHaveLength(14);
110
122
  });
111
123
  });
112
124
 
@@ -171,20 +183,28 @@ describe('ClaudeCodeHookProvider', () => {
171
183
  });
172
184
 
173
185
  describe('mapProviderEvent', () => {
174
- it('maps SessionStart to onSessionStart', () => {
175
- expect(hooks.mapProviderEvent('SessionStart')).toBe('onSessionStart');
186
+ it('maps SessionStart to SessionStart (identity)', () => {
187
+ expect(hooks.mapProviderEvent('SessionStart')).toBe('SessionStart');
176
188
  });
177
189
 
178
- it('maps PostToolUse to onToolComplete', () => {
179
- expect(hooks.mapProviderEvent('PostToolUse')).toBe('onToolComplete');
190
+ it('maps PostToolUse to PostToolUse (identity)', () => {
191
+ expect(hooks.mapProviderEvent('PostToolUse')).toBe('PostToolUse');
180
192
  });
181
193
 
182
- it('maps UserPromptSubmit to onPromptSubmit', () => {
183
- expect(hooks.mapProviderEvent('UserPromptSubmit')).toBe('onPromptSubmit');
194
+ it('maps UserPromptSubmit to PromptSubmit', () => {
195
+ expect(hooks.mapProviderEvent('UserPromptSubmit')).toBe('PromptSubmit');
184
196
  });
185
197
 
186
- it('maps Stop to onSessionEnd', () => {
187
- expect(hooks.mapProviderEvent('Stop')).toBe('onSessionEnd');
198
+ it('maps Stop to ResponseComplete', () => {
199
+ expect(hooks.mapProviderEvent('Stop')).toBe('ResponseComplete');
200
+ });
201
+
202
+ it('maps PreToolUse to PreToolUse (identity)', () => {
203
+ expect(hooks.mapProviderEvent('PreToolUse')).toBe('PreToolUse');
204
+ });
205
+
206
+ it('maps PermissionRequest to PermissionRequest (identity)', () => {
207
+ expect(hooks.mapProviderEvent('PermissionRequest')).toBe('PermissionRequest');
188
208
  });
189
209
 
190
210
  it('returns null for unknown events', () => {
@@ -210,13 +230,23 @@ describe('ClaudeCodeHookProvider', () => {
210
230
  });
211
231
 
212
232
  describe('getEventMap', () => {
213
- it('returns all mapped events', () => {
233
+ it('returns all 14 mapped events', () => {
214
234
  const map = hooks.getEventMap();
215
- expect(Object.keys(map)).toHaveLength(4);
216
- expect(map.SessionStart).toBe('onSessionStart');
217
- expect(map.PostToolUse).toBe('onToolComplete');
218
- expect(map.UserPromptSubmit).toBe('onPromptSubmit');
219
- expect(map.Stop).toBe('onSessionEnd');
235
+ expect(Object.keys(map)).toHaveLength(14);
236
+ expect(map.SessionStart).toBe('SessionStart');
237
+ expect(map.SessionEnd).toBe('SessionEnd');
238
+ expect(map.UserPromptSubmit).toBe('PromptSubmit');
239
+ expect(map.Stop).toBe('ResponseComplete');
240
+ expect(map.PreToolUse).toBe('PreToolUse');
241
+ expect(map.PostToolUse).toBe('PostToolUse');
242
+ expect(map.PostToolUseFailure).toBe('PostToolUseFailure');
243
+ expect(map.PermissionRequest).toBe('PermissionRequest');
244
+ expect(map.SubagentStart).toBe('SubagentStart');
245
+ expect(map.SubagentStop).toBe('SubagentStop');
246
+ expect(map.PreCompact).toBe('PreCompact');
247
+ expect(map.PostCompact).toBe('PostCompact');
248
+ expect(map.Notification).toBe('Notification');
249
+ expect(map.ConfigChange).toBe('ConfigChange');
220
250
  });
221
251
  });
222
252
  });
@@ -274,12 +304,11 @@ describe('ClaudeCodeInstallProvider', () => {
274
304
  expect(typeof result.mcpRegistered).toBe('boolean');
275
305
  });
276
306
 
277
- it('registers MCP when mcpServerPath provided', async () => {
307
+ it('does not register MCP when only projectDir is provided', async () => {
278
308
  const result = await installProvider.install({
279
309
  projectDir: '/tmp/test-project',
280
- mcpServerPath: '/path/to/mcp-server.js',
281
310
  });
282
- expect(result.mcpRegistered).toBe(true);
311
+ expect(result.mcpRegistered).toBe(false);
283
312
  });
284
313
  });
285
314
 
@@ -33,13 +33,24 @@ const execAsync = promisify(exec);
33
33
  * Bridges CLEO's adapter system with Claude Code's native capabilities:
34
34
  * - Hooks: Maps Claude Code events (SessionStart, PostToolUse, etc.) to CAAMP events
35
35
  * - Spawn: Launches subagent processes via the `claude` CLI
36
- * - Install: Registers MCP server, instruction files, and brain observation plugin
36
+ * - Install: Manages instruction files and brain observation plugin registration
37
+ *
38
+ * @remarks
39
+ * This is the most feature-complete adapter in the CLEO system, supporting
40
+ * 14 of 16 CAAMP canonical events, subagent spawning via the `claude` CLI,
41
+ * context monitoring with statusline integration, task sync via TodoWrite,
42
+ * and inter-agent transport. It serves as the reference implementation for
43
+ * other provider adapters.
37
44
  */
38
45
  export class ClaudeCodeAdapter implements CLEOProviderAdapter {
46
+ /** Unique provider identifier. */
39
47
  readonly id = 'claude-code';
48
+ /** Human-readable provider name. */
40
49
  readonly name = 'Claude Code';
50
+ /** Adapter version string. */
41
51
  readonly version = '1.0.0';
42
52
 
53
+ /** Declared capabilities for this provider. */
43
54
  capabilities: AdapterCapabilities = {
44
55
  supportsHooks: true,
45
56
  // 14/16 canonical events — derived from getProviderHookProfile('claude-code') in CAAMP 1.9.1.
@@ -62,7 +73,7 @@ export class ClaudeCodeAdapter implements CLEOProviderAdapter {
62
73
  ],
63
74
  supportsSpawn: true,
64
75
  supportsInstall: true,
65
- supportsMcp: true,
76
+ supportsMcp: false,
66
77
  supportsInstructionFiles: true,
67
78
  instructionFilePattern: 'CLAUDE.md',
68
79
  supportsContextMonitor: true,
@@ -72,15 +83,24 @@ export class ClaudeCodeAdapter implements CLEOProviderAdapter {
72
83
  supportsTaskSync: true,
73
84
  };
74
85
 
86
+ /** Hook provider for CAAMP event mapping and registration. */
75
87
  hooks: ClaudeCodeHookProvider;
88
+ /** Spawn provider for launching subagent processes via `claude` CLI. */
76
89
  spawn: ClaudeCodeSpawnProvider;
90
+ /** Install provider for managing instruction files and plugin registration. */
77
91
  install: ClaudeCodeInstallProvider;
92
+ /** Path provider for resolving Claude Code directory locations. */
78
93
  paths: ClaudeCodePathProvider;
94
+ /** Context monitor for tracking context window usage and statusline output. */
79
95
  contextMonitor: ClaudeCodeContextMonitorProvider;
96
+ /** Transport provider for inter-agent communication. */
80
97
  transport: ClaudeCodeTransportProvider;
98
+ /** Task sync provider bridging Claude's TodoWrite format to CLEO tasks. */
81
99
  taskSync: ClaudeCodeTaskSyncProvider;
82
100
 
101
+ /** Project directory this adapter was initialized with, or null. */
83
102
  private projectDir: string | null = null;
103
+ /** Whether {@link initialize} has been called. */
84
104
  private initialized = false;
85
105
 
86
106
  constructor() {
@@ -51,10 +51,18 @@ function getContextStatusFromPercentage(percentage: number): ContextStatus {
51
51
  * Processes context window JSON from Claude Code and writes state files
52
52
  * for statusline display. Also provides statusline configuration
53
53
  * and setup instructions specific to Claude Code's settings.json.
54
+ *
55
+ * @remarks
56
+ * The provider writes a JSON state file to `.cleo/context-states/.context-state.json`
57
+ * which can be read by external statusline scripts (e.g. tmux, starship).
58
+ * Context thresholds at 50%, 70%, 85%, and 95% map to warning, caution,
59
+ * critical, and emergency status levels respectively.
54
60
  */
55
61
  export class ClaudeCodeContextMonitorProvider implements AdapterContextMonitorProvider {
62
+ /** Path provider for resolving Claude Code directory locations. */
56
63
  private pathProvider = new ClaudeCodePathProvider();
57
64
 
65
+ /** Process raw context window JSON and return a formatted summary string. */
58
66
  async processContextInput(input: unknown, cwd?: string): Promise<string> {
59
67
  const typed = input as ContextWindowInput;
60
68
  const contextSize = typed.context_window?.context_window_size ?? 200000;
@@ -113,6 +121,7 @@ export class ClaudeCodeContextMonitorProvider implements AdapterContextMonitorPr
113
121
  return `${percentage}% | ${totalTokens}/${contextSize}`;
114
122
  }
115
123
 
124
+ /** Check the current statusline integration status in Claude Code settings. */
116
125
  checkStatuslineIntegration(): 'configured' | 'not_configured' | 'custom_no_cleo' | 'no_settings' {
117
126
  const settingsPath = this.pathProvider.getSettingsPath();
118
127
  if (!settingsPath || !existsSync(settingsPath)) return 'no_settings';
@@ -151,6 +160,7 @@ export class ClaudeCodeContextMonitorProvider implements AdapterContextMonitorPr
151
160
  }
152
161
  }
153
162
 
163
+ /** Get the recommended statusline configuration object for Claude Code settings. */
154
164
  getStatuslineConfig(): Record<string, unknown> {
155
165
  return {
156
166
  statusLine: {
@@ -160,6 +170,7 @@ export class ClaudeCodeContextMonitorProvider implements AdapterContextMonitorPr
160
170
  };
161
171
  }
162
172
 
173
+ /** Get human-readable setup instructions for enabling context monitoring. */
163
174
  getSetupInstructions(): string {
164
175
  const settingsPath = this.pathProvider.getSettingsPath() ?? '~/.claude/settings.json';
165
176
 
@@ -78,10 +78,17 @@ const CLAUDE_CODE_EVENT_MAP: Record<string, string> = {
78
78
  * provider), `registerNativeHooks` and `unregisterNativeHooks` track registration
79
79
  * state without performing filesystem operations.
80
80
  *
81
+ * @remarks
82
+ * Claude Code is the only provider that supports all 14 of its declared
83
+ * canonical events at runtime. The static event map is maintained as a
84
+ * synchronous fallback; async methods like {@link getSupportedCanonicalEvents}
85
+ * and {@link getProviderProfile} call CAAMP directly when available.
86
+ *
81
87
  * @task T164
82
88
  * @epic T134
83
89
  */
84
90
  export class ClaudeCodeHookProvider implements AdapterHookProvider {
91
+ /** Whether hooks have been registered for the current session. */
85
92
  private registered = false;
86
93
 
87
94
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Claude Code provider adapter.
2
+ * @packageDocumentation
3
3
  *
4
4
  * CLEO provider adapter for Anthropic Claude Code CLI.
5
5
  * Default export is the adapter class for dynamic loading by AdapterManager.
@@ -27,6 +27,21 @@ export default ClaudeCodeAdapter;
27
27
  /**
28
28
  * Factory function for creating adapter instances.
29
29
  * Used by AdapterManager's dynamic import fallback.
30
+ *
31
+ * @remarks
32
+ * This is the primary entry point for dynamic adapter loading.
33
+ * AdapterManager calls this function when it resolves the claude-code
34
+ * provider via its import-based discovery mechanism.
35
+ *
36
+ * @returns A new {@link ClaudeCodeAdapter} instance ready for initialization
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { createAdapter } from '@cleocode/adapters/providers/claude-code';
41
+ *
42
+ * const adapter = createAdapter();
43
+ * await adapter.initialize('/path/to/project');
44
+ * ```
30
45
  */
31
46
  export function createAdapter(): ClaudeCodeAdapter {
32
47
  return new ClaudeCodeAdapter();
@@ -2,7 +2,6 @@
2
2
  * Claude Code Install Provider
3
3
  *
4
4
  * Handles CLEO installation into Claude Code environments:
5
- * - Registers CLEO MCP server in .mcp.json
6
5
  * - Ensures CLAUDE.md has CLEO @-references
7
6
  * - Manages plugin registration in ~/.claude/settings.json
8
7
  *
@@ -19,60 +18,49 @@ import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cle
19
18
  /** Lines that should appear in CLAUDE.md to reference CLEO. */
20
19
  const INSTRUCTION_REFERENCES = ['@~/.cleo/templates/CLEO-INJECTION.md', '@.cleo/memory-bridge.md'];
21
20
 
22
- /** MCP server registration key used in .mcp.json. */
23
- const MCP_SERVER_KEY = 'cleo';
24
-
25
21
  /**
26
22
  * Install provider for Claude Code.
27
23
  *
28
24
  * Manages CLEO's integration with Claude Code by:
29
- * 1. Registering the CLEO MCP server in the project's .mcp.json
30
- * 2. Ensuring CLAUDE.md contains @-references to CLEO instruction files
31
- * 3. Registering the brain observation plugin in ~/.claude/settings.json
25
+ * 1. Ensuring CLAUDE.md contains @-references to CLEO instruction files
26
+ * 2. Registering the brain observation plugin in ~/.claude/settings.json
27
+ *
28
+ * @remarks
29
+ * Installation is idempotent -- running install multiple times on the same
30
+ * project produces the same result. The provider disables the legacy
31
+ * `claude-mem\@thedotmack` plugin if present and enables the unified
32
+ * `cleo\@cleocode` plugin instead.
32
33
  */
33
34
  export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
34
- private installedProjectDir: string | null = null;
35
-
36
35
  /**
37
36
  * Install CLEO into a Claude Code project.
38
37
  *
39
- * @param options - Installation options including project directory and MCP server path
38
+ * @param options - Installation options including project directory
40
39
  * @returns Result describing what was installed
41
40
  */
42
41
  async install(options: InstallOptions): Promise<InstallResult> {
43
- const { projectDir, mcpServerPath } = options;
42
+ const { projectDir } = options;
44
43
  const installedAt = new Date().toISOString();
45
44
  let instructionFileUpdated = false;
46
- let mcpRegistered = false;
47
45
  const details: Record<string, unknown> = {};
48
46
 
49
- // Step 1: Register MCP server in .mcp.json
50
- if (mcpServerPath) {
51
- mcpRegistered = this.registerMcpServer(projectDir, mcpServerPath);
52
- if (mcpRegistered) {
53
- details.mcpConfigPath = join(projectDir, '.mcp.json');
54
- }
55
- }
56
-
57
- // Step 2: Ensure CLAUDE.md has @-references
47
+ // Step 1: Ensure CLAUDE.md has @-references
58
48
  instructionFileUpdated = this.updateInstructionFile(projectDir);
59
49
  if (instructionFileUpdated) {
60
50
  details.instructionFile = join(projectDir, 'CLAUDE.md');
61
51
  }
62
52
 
63
- // Step 3: Register plugin in ~/.claude/settings.json
53
+ // Step 2: Register plugin in ~/.claude/settings.json
64
54
  const pluginResult = this.registerPlugin();
65
55
  if (pluginResult) {
66
56
  details.plugin = pluginResult;
67
57
  }
68
58
 
69
- this.installedProjectDir = projectDir;
70
-
71
59
  return {
72
60
  success: true,
73
61
  installedAt,
74
62
  instructionFileUpdated,
75
- mcpRegistered,
63
+ mcpRegistered: false,
76
64
  details,
77
65
  };
78
66
  }
@@ -80,38 +68,14 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
80
68
  /**
81
69
  * Uninstall CLEO from the current Claude Code project.
82
70
  *
83
- * Removes the MCP server registration from .mcp.json.
84
71
  * Does not remove CLAUDE.md references (they are harmless if CLEO is not present).
85
72
  */
86
- async uninstall(): Promise<void> {
87
- if (!this.installedProjectDir) return;
88
-
89
- const mcpPath = join(this.installedProjectDir, '.mcp.json');
90
- if (existsSync(mcpPath)) {
91
- try {
92
- const raw = readFileSync(mcpPath, 'utf-8');
93
- const config = JSON.parse(raw) as Record<string, unknown>;
94
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
95
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
96
- delete mcpServers[MCP_SERVER_KEY];
97
- writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
98
- }
99
- } catch {
100
- // Ignore errors during uninstall
101
- }
102
- }
103
-
104
- this.installedProjectDir = null;
105
- }
73
+ async uninstall(): Promise<void> {}
106
74
 
107
75
  /**
108
76
  * Check whether CLEO is installed in the current environment.
109
77
  *
110
- * Checks for:
111
- * 1. MCP server registered in .mcp.json
112
- * 2. Plugin enabled in ~/.claude/settings.json
113
- *
114
- * Returns true if either condition is met (partial install counts).
78
+ * Checks for plugin enabled in ~/.claude/settings.json.
115
79
  */
116
80
  async isInstalled(): Promise<boolean> {
117
81
  // Check ~/.claude/settings.json for plugin registration
@@ -128,20 +92,6 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
128
92
  }
129
93
  }
130
94
 
131
- // Check current directory for .mcp.json with cleo server
132
- const mcpPath = join(process.cwd(), '.mcp.json');
133
- if (existsSync(mcpPath)) {
134
- try {
135
- const config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
136
- const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
137
- if (mcpServers && MCP_SERVER_KEY in mcpServers) {
138
- return true;
139
- }
140
- } catch {
141
- // Fall through
142
- }
143
- }
144
-
145
95
  return false;
146
96
  }
147
97
 
@@ -156,37 +106,6 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
156
106
  this.updateInstructionFile(projectDir);
157
107
  }
158
108
 
159
- /**
160
- * Register the CLEO MCP server in .mcp.json.
161
- *
162
- * @returns true if registration was performed or updated
163
- */
164
- private registerMcpServer(projectDir: string, mcpServerPath: string): boolean {
165
- const mcpPath = join(projectDir, '.mcp.json');
166
- let config: Record<string, unknown> = {};
167
-
168
- if (existsSync(mcpPath)) {
169
- try {
170
- config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
171
- } catch {
172
- // Start fresh on parse error
173
- }
174
- }
175
-
176
- if (!config.mcpServers || typeof config.mcpServers !== 'object') {
177
- config.mcpServers = {};
178
- }
179
-
180
- const mcpServers = config.mcpServers as Record<string, unknown>;
181
- mcpServers[MCP_SERVER_KEY] = {
182
- command: 'node',
183
- args: [mcpServerPath],
184
- };
185
-
186
- writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
187
- return true;
188
- }
189
-
190
109
  /**
191
110
  * Update CLAUDE.md with CLEO @-references.
192
111
  *
@@ -10,7 +10,7 @@
10
10
  "supportedHookEvents": ["onSessionStart", "onSessionEnd", "onToolStart", "onToolComplete", "onError"],
11
11
  "supportsSpawn": true,
12
12
  "supportsInstall": true,
13
- "supportsMcp": true,
13
+ "supportsMcp": false,
14
14
  "supportsInstructionFiles": true,
15
15
  "instructionFilePattern": "CLAUDE.md",
16
16
  "supportsContextMonitor": true,
@@ -18,20 +18,28 @@ import type { AdapterPathProvider } from '@cleocode/contracts';
18
18
  * - Settings: ~/.claude/settings.json (or CLAUDE_SETTINGS)
19
19
  * - Agents: ~/.claude/agents
20
20
  * - Memory DB: ~/.claude-mem/claude-mem.db (or CLAUDE_MEM_DB)
21
+ *
22
+ * @remarks
23
+ * All paths respect environment variable overrides for CI and non-standard
24
+ * installations. When env vars are unset, the canonical default paths are used.
21
25
  */
22
26
  export class ClaudeCodePathProvider implements AdapterPathProvider {
27
+ /** Get the provider's root configuration directory. */
23
28
  getProviderDir(): string {
24
29
  return process.env['CLAUDE_HOME'] ?? join(homedir(), '.claude');
25
30
  }
26
31
 
32
+ /** Get the path to the provider's settings file, or null if unavailable. */
27
33
  getSettingsPath(): string | null {
28
34
  return process.env['CLAUDE_SETTINGS'] ?? join(this.getProviderDir(), 'settings.json');
29
35
  }
30
36
 
37
+ /** Get the directory where agents are installed, or null if unsupported. */
31
38
  getAgentInstallDir(): string | null {
32
39
  return join(this.getProviderDir(), 'agents');
33
40
  }
34
41
 
42
+ /** Get the path to the provider's memory database, or null if unsupported. */
35
43
  getMemoryDbPath(): string | null {
36
44
  return process.env['CLAUDE_MEM_DB'] ?? join(homedir(), '.claude-mem', 'claude-mem.db');
37
45
  }
@@ -33,6 +33,13 @@ interface TrackedProcess {
33
33
  * Each spawn writes its prompt to a temporary file, then runs
34
34
  * `claude --allow-insecure --no-upgrade-check <tmpFile>` as a
35
35
  * detached, unref'd child process.
36
+ *
37
+ * @remarks
38
+ * The provider uses `--allow-insecure --no-upgrade-check` flags to
39
+ * ensure the Claude CLI starts without interactive prompts. Prompts are
40
+ * written to temporary files under `/tmp/` and cleaned up after the
41
+ * child process exits. Processes are tracked by instance ID in an
42
+ * in-memory map and verified via `kill(pid, 0)` liveness checks.
36
43
  */
37
44
  export class ClaudeCodeSpawnProvider implements AdapterSpawnProvider {
38
45
  /** Map of instance IDs to tracked process info. */
@@ -27,6 +27,22 @@ function getClaudeSettingsPath(): string {
27
27
  /**
28
28
  * Check if statusline integration is configured.
29
29
  * Returns the current integration status.
30
+ *
31
+ * @remarks
32
+ * Reads Claude Code's settings.json and inspects the `statusLine` field
33
+ * to determine whether CLEO context monitoring is active.
34
+ *
35
+ * @returns One of: 'configured', 'not_configured', 'custom_no_cleo', 'no_settings'
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * import { checkStatuslineIntegration } from './statusline.js';
40
+ *
41
+ * const status = checkStatuslineIntegration();
42
+ * if (status === 'not_configured') {
43
+ * console.log('Run cleo install to set up context monitoring');
44
+ * }
45
+ * ```
30
46
  */
31
47
  export function checkStatuslineIntegration(): StatuslineStatus {
32
48
  const settingsPath = getClaudeSettingsPath();
@@ -72,6 +88,20 @@ export function checkStatuslineIntegration(): StatuslineStatus {
72
88
 
73
89
  /**
74
90
  * Get the statusline setup command for Claude Code settings.
91
+ *
92
+ * @remarks
93
+ * Returns a JSON-serializable object that can be merged into
94
+ * Claude Code's settings.json to enable context monitoring.
95
+ *
96
+ * @param cleoHome - Absolute path to the CLEO home directory
97
+ * @returns Settings object containing the statusLine configuration
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { getStatuslineConfig } from './statusline.js';
102
+ *
103
+ * const config = getStatuslineConfig('/home/user/.cleo');
104
+ * ```
75
105
  */
76
106
  export function getStatuslineConfig(cleoHome: string): Record<string, unknown> {
77
107
  return {
@@ -84,6 +114,20 @@ export function getStatuslineConfig(cleoHome: string): Record<string, unknown> {
84
114
 
85
115
  /**
86
116
  * Get human-readable setup instructions.
117
+ *
118
+ * @remarks
119
+ * Returns a multi-line string with file path, JSON config, and explanation
120
+ * suitable for display to the user.
121
+ *
122
+ * @param cleoHome - Absolute path to the CLEO home directory
123
+ * @returns Formatted setup instructions string
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * import { getSetupInstructions } from './statusline.js';
128
+ *
129
+ * console.log(getSetupInstructions('/home/user/.cleo'));
130
+ * ```
87
131
  */
88
132
  export function getSetupInstructions(cleoHome: string): string {
89
133
  const settingsPath = getClaudeSettingsPath();
@@ -82,14 +82,22 @@ function getTodoWriteFilePath(projectDir: string): string {
82
82
  * and status, and returns normalized ExternalTask[].
83
83
  *
84
84
  * Optional: accepts a custom file path for testing.
85
+ *
86
+ * @remarks
87
+ * TodoWrite items with `[T001]`-style prefixes are mapped to their CLEO
88
+ * task IDs. Items without a prefix receive a synthetic `tw-new-N` ID
89
+ * for reconciliation. The provider reads from
90
+ * `.cleo/sync/todowrite-state.json` by default.
85
91
  */
86
92
  export class ClaudeCodeTaskSyncProvider implements ExternalTaskProvider {
93
+ /** Optional override path for the TodoWrite state file (used in tests). */
87
94
  private readonly customFilePath?: string;
88
95
 
89
96
  constructor(options?: { filePath?: string }) {
90
97
  this.customFilePath = options?.filePath;
91
98
  }
92
99
 
100
+ /** Retrieve external tasks from Claude's TodoWrite state file. */
93
101
  async getExternalTasks(projectDir: string): Promise<ExternalTask[]> {
94
102
  const filePath = this.customFilePath ?? getTodoWriteFilePath(projectDir);
95
103
 
@@ -9,9 +9,20 @@
9
9
 
10
10
  import type { AdapterTransportProvider } from '@cleocode/contracts';
11
11
 
12
+ /**
13
+ * Transport provider for Claude Code inter-agent communication.
14
+ *
15
+ * @remarks
16
+ * Currently returns null from {@link createTransport} because actual transport
17
+ * creation is handled by the signaldock factory which checks for this adapter's
18
+ * transport capability flag. Full wiring will be completed in Phase 5 of the
19
+ * adapter system rollout.
20
+ */
12
21
  export class ClaudeCodeTransportProvider implements AdapterTransportProvider {
22
+ /** Provider-specific transport name used for capability negotiation. */
13
23
  readonly transportName = 'claude-code';
14
24
 
25
+ /** Create a transport instance for inter-agent messaging. */
15
26
  createTransport(): unknown {
16
27
  // Returns null — actual transport creation is handled by the signaldock factory
17
28
  // which checks for this adapter's transport capability.
@@ -28,22 +28,31 @@ const execAsync = promisify(exec);
28
28
  *
29
29
  * Bridges CLEO's adapter system with Codex CLI's native capabilities:
30
30
  * - Hooks: Maps Codex events (SessionStart, PromptSubmit, ResponseComplete) to CAAMP events
31
- * - Install: Registers MCP server in ~/.codex/config.json and ensures AGENTS.md references
31
+ * - Install: Ensures AGENTS.md references for CLEO instruction files
32
+ *
33
+ * @remarks
34
+ * Codex CLI supports only 3 canonical events (SessionStart, PromptSubmit,
35
+ * ResponseComplete) and has no spawn or transport capabilities. Integration
36
+ * is primarily through instruction files (AGENTS.md).
32
37
  *
33
38
  * @task T162
34
39
  * @epic T134
35
40
  */
36
41
  export class CodexAdapter implements CLEOProviderAdapter {
42
+ /** Unique provider identifier. */
37
43
  readonly id = 'codex';
44
+ /** Human-readable provider name. */
38
45
  readonly name = 'Codex';
46
+ /** Adapter version string. */
39
47
  readonly version = '1.0.0';
40
48
 
49
+ /** Declared capabilities for this provider. */
41
50
  capabilities: AdapterCapabilities = {
42
51
  supportsHooks: true,
43
52
  supportedHookEvents: ['SessionStart', 'UserPromptSubmit', 'Stop'],
44
53
  supportsSpawn: false,
45
54
  supportsInstall: true,
46
- supportsMcp: true,
55
+ supportsMcp: false,
47
56
  supportsInstructionFiles: false,
48
57
  supportsContextMonitor: false,
49
58
  supportsStatusline: false,
@@ -52,10 +61,14 @@ export class CodexAdapter implements CLEOProviderAdapter {
52
61
  supportsTaskSync: false,
53
62
  };
54
63
 
64
+ /** Hook provider for CAAMP event mapping. */
55
65
  hooks: CodexHookProvider;
66
+ /** Install provider for managing instruction files. */
56
67
  install: CodexInstallProvider;
57
68
 
69
+ /** Project directory this adapter was initialized with, or null. */
58
70
  private projectDir: string | null = null;
71
+ /** Whether {@link initialize} has been called. */
59
72
  private initialized = false;
60
73
 
61
74
  constructor() {