@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.
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +724 -630
- package/dist/index.js.map +3 -3
- package/dist/providers/claude-code/adapter.d.ts +21 -1
- package/dist/providers/claude-code/adapter.d.ts.map +1 -1
- package/dist/providers/claude-code/context-monitor.d.ts +11 -0
- package/dist/providers/claude-code/context-monitor.d.ts.map +1 -1
- package/dist/providers/claude-code/hooks.d.ts +7 -0
- package/dist/providers/claude-code/hooks.d.ts.map +1 -1
- package/dist/providers/claude-code/index.d.ts +16 -1
- package/dist/providers/claude-code/index.d.ts.map +1 -1
- package/dist/providers/claude-code/install.d.ts +10 -18
- package/dist/providers/claude-code/install.d.ts.map +1 -1
- package/dist/providers/claude-code/paths.d.ts +8 -0
- package/dist/providers/claude-code/paths.d.ts.map +1 -1
- package/dist/providers/claude-code/spawn.d.ts +7 -0
- package/dist/providers/claude-code/spawn.d.ts.map +1 -1
- package/dist/providers/claude-code/statusline.d.ts +44 -0
- package/dist/providers/claude-code/statusline.d.ts.map +1 -1
- package/dist/providers/claude-code/task-sync.d.ts +8 -0
- package/dist/providers/claude-code/task-sync.d.ts.map +1 -1
- package/dist/providers/claude-code/transport.d.ts +11 -0
- package/dist/providers/claude-code/transport.d.ts.map +1 -1
- package/dist/providers/codex/adapter.d.ts +14 -1
- package/dist/providers/codex/adapter.d.ts.map +1 -1
- package/dist/providers/codex/hooks.d.ts +6 -0
- package/dist/providers/codex/hooks.d.ts.map +1 -1
- package/dist/providers/codex/index.d.ts +16 -1
- package/dist/providers/codex/index.d.ts.map +1 -1
- package/dist/providers/codex/install.d.ts +8 -17
- package/dist/providers/codex/install.d.ts.map +1 -1
- package/dist/providers/cursor/adapter.d.ts +15 -1
- package/dist/providers/cursor/adapter.d.ts.map +1 -1
- package/dist/providers/cursor/hooks.d.ts +7 -0
- package/dist/providers/cursor/hooks.d.ts.map +1 -1
- package/dist/providers/cursor/index.d.ts +16 -1
- package/dist/providers/cursor/index.d.ts.map +1 -1
- package/dist/providers/cursor/install.d.ts +10 -17
- package/dist/providers/cursor/install.d.ts.map +1 -1
- package/dist/providers/gemini-cli/adapter.d.ts +15 -1
- package/dist/providers/gemini-cli/adapter.d.ts.map +1 -1
- package/dist/providers/gemini-cli/hooks.d.ts +7 -0
- package/dist/providers/gemini-cli/hooks.d.ts.map +1 -1
- package/dist/providers/gemini-cli/index.d.ts +16 -1
- package/dist/providers/gemini-cli/index.d.ts.map +1 -1
- package/dist/providers/gemini-cli/install.d.ts +8 -17
- package/dist/providers/gemini-cli/install.d.ts.map +1 -1
- package/dist/providers/kimi/adapter.d.ts +15 -2
- package/dist/providers/kimi/adapter.d.ts.map +1 -1
- package/dist/providers/kimi/hooks.d.ts +6 -0
- package/dist/providers/kimi/hooks.d.ts.map +1 -1
- package/dist/providers/kimi/index.d.ts +16 -1
- package/dist/providers/kimi/index.d.ts.map +1 -1
- package/dist/providers/kimi/install.d.ts +7 -22
- package/dist/providers/kimi/install.d.ts.map +1 -1
- package/dist/providers/opencode/adapter.d.ts +17 -1
- package/dist/providers/opencode/adapter.d.ts.map +1 -1
- package/dist/providers/opencode/hooks.d.ts +9 -0
- package/dist/providers/opencode/hooks.d.ts.map +1 -1
- package/dist/providers/opencode/index.d.ts +16 -1
- package/dist/providers/opencode/index.d.ts.map +1 -1
- package/dist/providers/opencode/install.d.ts +8 -17
- package/dist/providers/opencode/install.d.ts.map +1 -1
- package/dist/providers/opencode/spawn.d.ts +23 -1
- package/dist/providers/opencode/spawn.d.ts.map +1 -1
- package/dist/providers/shared/transcript-reader.d.ts +15 -0
- package/dist/providers/shared/transcript-reader.d.ts.map +1 -1
- package/dist/registry.d.ts +54 -2
- package/dist/registry.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/claude-code-adapter.test.js +21 -30
- package/src/__tests__/claude-code-adapter.test.js.map +1 -1
- package/src/__tests__/claude-code-adapter.test.ts +21 -32
- package/src/__tests__/cursor-adapter.test.js +25 -29
- package/src/__tests__/cursor-adapter.test.js.map +1 -1
- package/src/__tests__/cursor-adapter.test.ts +26 -33
- package/src/__tests__/opencode-adapter.test.js +47 -46
- package/src/__tests__/opencode-adapter.test.js.map +1 -1
- package/src/__tests__/opencode-adapter.test.ts +51 -49
- package/src/index.ts +9 -1
- package/src/providers/claude-code/__tests__/adapter.test.js +50 -23
- package/src/providers/claude-code/__tests__/adapter.test.js.map +1 -1
- package/src/providers/claude-code/__tests__/adapter.test.ts +52 -23
- package/src/providers/claude-code/adapter.ts +22 -2
- package/src/providers/claude-code/context-monitor.ts +11 -0
- package/src/providers/claude-code/hooks.ts +7 -0
- package/src/providers/claude-code/index.ts +16 -1
- package/src/providers/claude-code/install.ts +15 -96
- package/src/providers/claude-code/manifest.json +1 -1
- package/src/providers/claude-code/paths.ts +8 -0
- package/src/providers/claude-code/spawn.ts +7 -0
- package/src/providers/claude-code/statusline.ts +44 -0
- package/src/providers/claude-code/task-sync.ts +8 -0
- package/src/providers/claude-code/transport.ts +11 -0
- package/src/providers/codex/adapter.ts +15 -2
- package/src/providers/codex/hooks.ts +6 -0
- package/src/providers/codex/index.ts +16 -1
- package/src/providers/codex/install.ts +17 -81
- package/src/providers/codex/manifest.json +1 -1
- package/src/providers/cursor/__tests__/adapter.test.js +37 -12
- package/src/providers/cursor/__tests__/adapter.test.js.map +1 -1
- package/src/providers/cursor/__tests__/adapter.test.ts +43 -12
- package/src/providers/cursor/adapter.ts +16 -2
- package/src/providers/cursor/hooks.ts +7 -0
- package/src/providers/cursor/index.ts +16 -1
- package/src/providers/cursor/install.ts +23 -88
- package/src/providers/cursor/manifest.json +1 -1
- package/src/providers/gemini-cli/adapter.ts +16 -2
- package/src/providers/gemini-cli/hooks.ts +7 -0
- package/src/providers/gemini-cli/index.ts +16 -1
- package/src/providers/gemini-cli/install.ts +17 -81
- package/src/providers/gemini-cli/manifest.json +1 -1
- package/src/providers/kimi/adapter.ts +16 -3
- package/src/providers/kimi/hooks.ts +6 -0
- package/src/providers/kimi/index.ts +16 -1
- package/src/providers/kimi/install.ts +16 -86
- package/src/providers/kimi/manifest.json +1 -1
- package/src/providers/opencode/__tests__/adapter.test.js +48 -35
- package/src/providers/opencode/__tests__/adapter.test.js.map +1 -1
- package/src/providers/opencode/__tests__/adapter.test.ts +49 -34
- package/src/providers/opencode/adapter.ts +18 -2
- package/src/providers/opencode/hooks.ts +9 -0
- package/src/providers/opencode/index.ts +16 -1
- package/src/providers/opencode/install.ts +17 -90
- package/src/providers/opencode/manifest.json +1 -1
- package/src/providers/opencode/spawn.ts +23 -1
- package/src/providers/shared/transcript-reader.ts +15 -0
- package/src/registry.ts +54 -2
- package/dist/providers/claude-code/adapter.js +0 -165
- package/dist/providers/claude-code/adapter.js.map +0 -1
- package/dist/providers/claude-code/context-monitor.js +0 -148
- package/dist/providers/claude-code/context-monitor.js.map +0 -1
- package/dist/providers/claude-code/hooks.js +0 -279
- package/dist/providers/claude-code/hooks.js.map +0 -1
- package/dist/providers/claude-code/index.js +0 -26
- package/dist/providers/claude-code/index.js.map +0 -1
- package/dist/providers/claude-code/install.js +0 -234
- package/dist/providers/claude-code/install.js.map +0 -1
- package/dist/providers/claude-code/paths.js +0 -33
- package/dist/providers/claude-code/paths.js.map +0 -1
- package/dist/providers/claude-code/spawn.js +0 -164
- package/dist/providers/claude-code/spawn.js.map +0 -1
- package/dist/providers/claude-code/statusline.js +0 -86
- package/dist/providers/claude-code/statusline.js.map +0 -1
- package/dist/providers/claude-code/task-sync.js +0 -111
- package/dist/providers/claude-code/task-sync.js.map +0 -1
- package/dist/providers/claude-code/transport.js +0 -18
- package/dist/providers/claude-code/transport.js.map +0 -1
- package/dist/providers/codex/adapter.js +0 -134
- package/dist/providers/codex/adapter.js.map +0 -1
- package/dist/providers/codex/hooks.js +0 -107
- package/dist/providers/codex/hooks.js.map +0 -1
- package/dist/providers/codex/index.js +0 -24
- package/dist/providers/codex/index.js.map +0 -1
- package/dist/providers/codex/install.js +0 -183
- package/dist/providers/codex/install.js.map +0 -1
- package/dist/providers/cursor/adapter.js +0 -138
- package/dist/providers/cursor/adapter.js.map +0 -1
- package/dist/providers/cursor/hooks.js +0 -201
- package/dist/providers/cursor/hooks.js.map +0 -1
- package/dist/providers/cursor/index.js +0 -21
- package/dist/providers/cursor/index.js.map +0 -1
- package/dist/providers/cursor/install.js +0 -238
- package/dist/providers/cursor/install.js.map +0 -1
- package/dist/providers/cursor/spawn.js +0 -59
- package/dist/providers/cursor/spawn.js.map +0 -1
- package/dist/providers/gemini-cli/adapter.js +0 -145
- package/dist/providers/gemini-cli/adapter.js.map +0 -1
- package/dist/providers/gemini-cli/hooks.js +0 -121
- package/dist/providers/gemini-cli/hooks.js.map +0 -1
- package/dist/providers/gemini-cli/index.js +0 -24
- package/dist/providers/gemini-cli/index.js.map +0 -1
- package/dist/providers/gemini-cli/install.js +0 -183
- package/dist/providers/gemini-cli/install.js.map +0 -1
- package/dist/providers/kimi/adapter.js +0 -133
- package/dist/providers/kimi/adapter.js.map +0 -1
- package/dist/providers/kimi/hooks.js +0 -73
- package/dist/providers/kimi/hooks.js.map +0 -1
- package/dist/providers/kimi/index.js +0 -24
- package/dist/providers/kimi/index.js.map +0 -1
- package/dist/providers/kimi/install.js +0 -189
- package/dist/providers/kimi/install.js.map +0 -1
- package/dist/providers/opencode/adapter.js +0 -151
- package/dist/providers/opencode/adapter.js.map +0 -1
- package/dist/providers/opencode/hooks.js +0 -197
- package/dist/providers/opencode/hooks.js.map +0 -1
- package/dist/providers/opencode/index.js +0 -22
- package/dist/providers/opencode/index.js.map +0 -1
- package/dist/providers/opencode/install.js +0 -180
- package/dist/providers/opencode/install.js.map +0 -1
- package/dist/providers/opencode/spawn.js +0 -219
- package/dist/providers/opencode/spawn.js.map +0 -1
- package/dist/providers/shared/transcript-reader.js +0 -109
- package/dist/providers/shared/transcript-reader.js.map +0 -1
- package/dist/registry.js +0 -55
- package/dist/registry.js.map +0 -1
- package/src/__tests__/claude-code-adapter.test.d.ts +0 -10
- package/src/__tests__/cursor-adapter.test.d.ts +0 -10
- package/src/__tests__/opencode-adapter.test.d.ts +0 -10
- package/src/index.d.ts +0 -35
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -13
- package/src/index.js.map +0 -1
- package/src/providers/claude-code/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/claude-code/adapter.d.ts +0 -79
- package/src/providers/claude-code/adapter.d.ts.map +0 -1
- package/src/providers/claude-code/adapter.js +0 -154
- package/src/providers/claude-code/adapter.js.map +0 -1
- package/src/providers/claude-code/context-monitor.d.ts +0 -24
- package/src/providers/claude-code/context-monitor.d.ts.map +0 -1
- package/src/providers/claude-code/context-monitor.js +0 -148
- package/src/providers/claude-code/context-monitor.js.map +0 -1
- package/src/providers/claude-code/hooks.d.ts +0 -59
- package/src/providers/claude-code/hooks.d.ts.map +0 -1
- package/src/providers/claude-code/hooks.js +0 -77
- package/src/providers/claude-code/hooks.js.map +0 -1
- package/src/providers/claude-code/index.d.ts +0 -28
- package/src/providers/claude-code/index.d.ts.map +0 -1
- package/src/providers/claude-code/index.js +0 -26
- package/src/providers/claude-code/index.js.map +0 -1
- package/src/providers/claude-code/install.d.ts +0 -75
- package/src/providers/claude-code/install.d.ts.map +0 -1
- package/src/providers/claude-code/install.js +0 -234
- package/src/providers/claude-code/install.js.map +0 -1
- package/src/providers/claude-code/paths.d.ts +0 -24
- package/src/providers/claude-code/paths.d.ts.map +0 -1
- package/src/providers/claude-code/paths.js +0 -33
- package/src/providers/claude-code/paths.js.map +0 -1
- package/src/providers/claude-code/spawn.d.ts +0 -60
- package/src/providers/claude-code/spawn.d.ts.map +0 -1
- package/src/providers/claude-code/spawn.js +0 -164
- package/src/providers/claude-code/spawn.js.map +0 -1
- package/src/providers/claude-code/statusline.d.ts +0 -23
- package/src/providers/claude-code/statusline.d.ts.map +0 -1
- package/src/providers/claude-code/statusline.js +0 -86
- package/src/providers/claude-code/statusline.js.map +0 -1
- package/src/providers/claude-code/task-sync.js +0 -122
- package/src/providers/claude-code/task-sync.js.map +0 -1
- package/src/providers/claude-code/transport.d.ts +0 -14
- package/src/providers/claude-code/transport.d.ts.map +0 -1
- package/src/providers/claude-code/transport.js +0 -18
- package/src/providers/claude-code/transport.js.map +0 -1
- package/src/providers/cursor/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/cursor/adapter.d.ts +0 -66
- package/src/providers/cursor/adapter.d.ts.map +0 -1
- package/src/providers/cursor/adapter.js +0 -124
- package/src/providers/cursor/adapter.js.map +0 -1
- package/src/providers/cursor/hooks.d.ts +0 -48
- package/src/providers/cursor/hooks.d.ts.map +0 -1
- package/src/providers/cursor/hooks.js +0 -55
- package/src/providers/cursor/hooks.js.map +0 -1
- package/src/providers/cursor/index.d.ts +0 -19
- package/src/providers/cursor/index.d.ts.map +0 -1
- package/src/providers/cursor/index.js +0 -21
- package/src/providers/cursor/index.js.map +0 -1
- package/src/providers/cursor/install.d.ts +0 -94
- package/src/providers/cursor/install.d.ts.map +0 -1
- package/src/providers/cursor/install.js +0 -238
- package/src/providers/cursor/install.js.map +0 -1
- package/src/providers/cursor/spawn.d.ts +0 -50
- package/src/providers/cursor/spawn.d.ts.map +0 -1
- package/src/providers/cursor/spawn.js +0 -59
- package/src/providers/cursor/spawn.js.map +0 -1
- package/src/providers/opencode/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/opencode/adapter.d.ts +0 -71
- package/src/providers/opencode/adapter.d.ts.map +0 -1
- package/src/providers/opencode/adapter.js +0 -144
- package/src/providers/opencode/adapter.js.map +0 -1
- package/src/providers/opencode/hooks.d.ts +0 -66
- package/src/providers/opencode/hooks.d.ts.map +0 -1
- package/src/providers/opencode/hooks.js +0 -89
- package/src/providers/opencode/hooks.js.map +0 -1
- package/src/providers/opencode/index.d.ts +0 -20
- package/src/providers/opencode/index.d.ts.map +0 -1
- package/src/providers/opencode/index.js +0 -22
- package/src/providers/opencode/index.js.map +0 -1
- package/src/providers/opencode/install.d.ts +0 -65
- package/src/providers/opencode/install.d.ts.map +0 -1
- package/src/providers/opencode/install.js +0 -180
- package/src/providers/opencode/install.js.map +0 -1
- package/src/providers/opencode/spawn.d.ts +0 -75
- package/src/providers/opencode/spawn.d.ts.map +0 -1
- package/src/providers/opencode/spawn.js +0 -219
- package/src/providers/opencode/spawn.js.map +0 -1
- package/src/registry.d.ts +0 -36
- package/src/registry.d.ts.map +0 -1
- package/src/registry.js +0 -55
- 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('
|
|
98
|
-
expect(adapter.capabilities.supportsMcp).toBe(
|
|
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('
|
|
108
|
-
expect(adapter.capabilities.supportedHookEvents).toContain('
|
|
109
|
-
expect(adapter.capabilities.supportedHookEvents).toContain('
|
|
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
|
|
175
|
-
expect(hooks.mapProviderEvent('SessionStart')).toBe('
|
|
186
|
+
it('maps SessionStart to SessionStart (identity)', () => {
|
|
187
|
+
expect(hooks.mapProviderEvent('SessionStart')).toBe('SessionStart');
|
|
176
188
|
});
|
|
177
189
|
|
|
178
|
-
it('maps PostToolUse to
|
|
179
|
-
expect(hooks.mapProviderEvent('PostToolUse')).toBe('
|
|
190
|
+
it('maps PostToolUse to PostToolUse (identity)', () => {
|
|
191
|
+
expect(hooks.mapProviderEvent('PostToolUse')).toBe('PostToolUse');
|
|
180
192
|
});
|
|
181
193
|
|
|
182
|
-
it('maps UserPromptSubmit to
|
|
183
|
-
expect(hooks.mapProviderEvent('UserPromptSubmit')).toBe('
|
|
194
|
+
it('maps UserPromptSubmit to PromptSubmit', () => {
|
|
195
|
+
expect(hooks.mapProviderEvent('UserPromptSubmit')).toBe('PromptSubmit');
|
|
184
196
|
});
|
|
185
197
|
|
|
186
|
-
it('maps Stop to
|
|
187
|
-
expect(hooks.mapProviderEvent('Stop')).toBe('
|
|
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(
|
|
216
|
-
expect(map.SessionStart).toBe('
|
|
217
|
-
expect(map.
|
|
218
|
-
expect(map.UserPromptSubmit).toBe('
|
|
219
|
-
expect(map.Stop).toBe('
|
|
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('
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
-
*
|
|
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.
|
|
30
|
-
* 2.
|
|
31
|
-
*
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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":
|
|
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:
|
|
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:
|
|
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() {
|