@cleocode/adapters 2026.4.6 → 2026.4.9

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.
@@ -1,276 +0,0 @@
1
- /**
2
- * Tests for the OpenCode adapter package.
3
- *
4
- * @task T5240
5
- */
6
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
- import { OpenCodeAdapter } from '../adapter.js';
8
- import { OpenCodeHookProvider } from '../hooks.js';
9
- import { OpenCodeInstallProvider } from '../install.js';
10
- import { OpenCodeSpawnProvider } from '../spawn.js';
11
- // Mock child_process for health check and spawn tests
12
- vi.mock('node:child_process', () => ({
13
- exec: vi.fn(),
14
- execFile: vi.fn(),
15
- spawn: vi.fn(() => ({
16
- pid: 12345,
17
- unref: vi.fn(),
18
- on: vi.fn(),
19
- })),
20
- }));
21
- vi.mock('node:util', async (importOriginal) => {
22
- const actual = await importOriginal();
23
- return {
24
- ...actual,
25
- promisify: () => {
26
- // Return a mock for exec that simulates 'which opencode' succeeding
27
- return vi.fn().mockResolvedValue({ stdout: '/usr/local/bin/opencode', stderr: '' });
28
- },
29
- };
30
- });
31
- vi.mock('node:fs', async (importOriginal) => {
32
- const actual = await importOriginal();
33
- return {
34
- ...actual,
35
- existsSync: vi.fn((path) => {
36
- if (typeof path === 'string' && path.includes('.opencode'))
37
- return true;
38
- if (typeof path === 'string' && path.includes('AGENTS.md'))
39
- return false;
40
- return false;
41
- }),
42
- readFileSync: vi.fn(() => '{}'),
43
- writeFileSync: vi.fn(),
44
- mkdirSync: vi.fn(),
45
- };
46
- });
47
- vi.mock('node:fs/promises', () => ({
48
- writeFile: vi.fn().mockResolvedValue(undefined),
49
- readFile: vi.fn().mockRejectedValue(new Error('ENOENT')),
50
- mkdir: vi.fn().mockResolvedValue(undefined),
51
- unlink: vi.fn().mockResolvedValue(undefined),
52
- }));
53
- describe('OpenCodeAdapter', () => {
54
- let adapter;
55
- beforeEach(() => {
56
- adapter = new OpenCodeAdapter();
57
- });
58
- afterEach(async () => {
59
- if (adapter.isInitialized()) {
60
- await adapter.dispose();
61
- }
62
- vi.restoreAllMocks();
63
- });
64
- describe('identity', () => {
65
- it('has correct id', () => {
66
- expect(adapter.id).toBe('opencode');
67
- });
68
- it('has correct name', () => {
69
- expect(adapter.name).toBe('OpenCode');
70
- });
71
- it('has correct version', () => {
72
- expect(adapter.version).toBe('1.0.0');
73
- });
74
- });
75
- describe('capabilities', () => {
76
- it('supports hooks', () => {
77
- expect(adapter.capabilities.supportsHooks).toBe(true);
78
- });
79
- it('supports spawn', () => {
80
- expect(adapter.capabilities.supportsSpawn).toBe(true);
81
- });
82
- it('supports install', () => {
83
- expect(adapter.capabilities.supportsInstall).toBe(true);
84
- });
85
- it('does not support MCP (removed)', () => {
86
- expect(adapter.capabilities.supportsMcp).toBe(false);
87
- });
88
- it('supports instruction files with AGENTS.md pattern', () => {
89
- expect(adapter.capabilities.supportsInstructionFiles).toBe(true);
90
- expect(adapter.capabilities.instructionFilePattern).toBe('AGENTS.md');
91
- });
92
- it('declares expected hook events (10 CAAMP canonical events)', () => {
93
- expect(adapter.capabilities.supportedHookEvents).toContain('SessionStart');
94
- expect(adapter.capabilities.supportedHookEvents).toContain('SessionEnd');
95
- expect(adapter.capabilities.supportedHookEvents).toContain('PromptSubmit');
96
- expect(adapter.capabilities.supportedHookEvents).toContain('ResponseComplete');
97
- expect(adapter.capabilities.supportedHookEvents).toContain('PreToolUse');
98
- expect(adapter.capabilities.supportedHookEvents).toContain('PostToolUse');
99
- expect(adapter.capabilities.supportedHookEvents).toContain('PermissionRequest');
100
- expect(adapter.capabilities.supportedHookEvents).toContain('PreModel');
101
- expect(adapter.capabilities.supportedHookEvents).toContain('PreCompact');
102
- expect(adapter.capabilities.supportedHookEvents).toContain('PostCompact');
103
- });
104
- it('supports 10 hook events', () => {
105
- expect(adapter.capabilities.supportedHookEvents).toHaveLength(10);
106
- });
107
- });
108
- describe('sub-providers', () => {
109
- it('provides a hook provider', () => {
110
- expect(adapter.hooks).toBeInstanceOf(OpenCodeHookProvider);
111
- });
112
- it('provides a spawn provider', () => {
113
- expect(adapter.spawn).toBeInstanceOf(OpenCodeSpawnProvider);
114
- });
115
- it('provides an install provider', () => {
116
- expect(adapter.install).toBeInstanceOf(OpenCodeInstallProvider);
117
- });
118
- });
119
- describe('initialize', () => {
120
- it('sets initialized state', async () => {
121
- expect(adapter.isInitialized()).toBe(false);
122
- await adapter.initialize('/tmp/test-project');
123
- expect(adapter.isInitialized()).toBe(true);
124
- });
125
- it('stores project directory', async () => {
126
- await adapter.initialize('/tmp/test-project');
127
- expect(adapter.getProjectDir()).toBe('/tmp/test-project');
128
- });
129
- });
130
- describe('dispose', () => {
131
- it('resets initialized state', async () => {
132
- await adapter.initialize('/tmp/test-project');
133
- await adapter.dispose();
134
- expect(adapter.isInitialized()).toBe(false);
135
- expect(adapter.getProjectDir()).toBeNull();
136
- });
137
- });
138
- describe('healthCheck', () => {
139
- it('returns unhealthy when not initialized', async () => {
140
- const status = await adapter.healthCheck();
141
- expect(status.healthy).toBe(false);
142
- expect(status.provider).toBe('opencode');
143
- expect(status.details?.error).toBe('Adapter not initialized');
144
- });
145
- it('returns health status with provider id', async () => {
146
- await adapter.initialize('/tmp/test-project');
147
- const status = await adapter.healthCheck();
148
- expect(status.provider).toBe('opencode');
149
- expect(typeof status.healthy).toBe('boolean');
150
- });
151
- });
152
- });
153
- describe('OpenCodeHookProvider', () => {
154
- let hooks;
155
- beforeEach(() => {
156
- hooks = new OpenCodeHookProvider();
157
- });
158
- describe('mapProviderEvent', () => {
159
- it('maps event:session.created to SessionStart', () => {
160
- expect(hooks.mapProviderEvent('event:session.created')).toBe('SessionStart');
161
- });
162
- it('maps event:session.deleted to SessionEnd', () => {
163
- expect(hooks.mapProviderEvent('event:session.deleted')).toBe('SessionEnd');
164
- });
165
- it('maps chat.message to PromptSubmit', () => {
166
- expect(hooks.mapProviderEvent('chat.message')).toBe('PromptSubmit');
167
- });
168
- it('maps event:session.idle to ResponseComplete', () => {
169
- expect(hooks.mapProviderEvent('event:session.idle')).toBe('ResponseComplete');
170
- });
171
- it('maps tool.execute.before to PreToolUse', () => {
172
- expect(hooks.mapProviderEvent('tool.execute.before')).toBe('PreToolUse');
173
- });
174
- it('maps tool.execute.after to PostToolUse', () => {
175
- expect(hooks.mapProviderEvent('tool.execute.after')).toBe('PostToolUse');
176
- });
177
- it('maps permission.ask to PermissionRequest', () => {
178
- expect(hooks.mapProviderEvent('permission.ask')).toBe('PermissionRequest');
179
- });
180
- it('maps chat.params to PreModel', () => {
181
- expect(hooks.mapProviderEvent('chat.params')).toBe('PreModel');
182
- });
183
- it('returns null for unknown events', () => {
184
- expect(hooks.mapProviderEvent('UnknownEvent')).toBeNull();
185
- expect(hooks.mapProviderEvent('')).toBeNull();
186
- });
187
- });
188
- describe('registerNativeHooks', () => {
189
- it('marks hooks as registered', async () => {
190
- expect(hooks.isRegistered()).toBe(false);
191
- await hooks.registerNativeHooks('/tmp/project');
192
- expect(hooks.isRegistered()).toBe(true);
193
- });
194
- });
195
- describe('unregisterNativeHooks', () => {
196
- it('marks hooks as unregistered', async () => {
197
- await hooks.registerNativeHooks('/tmp/project');
198
- await hooks.unregisterNativeHooks();
199
- expect(hooks.isRegistered()).toBe(false);
200
- });
201
- });
202
- describe('getEventMap', () => {
203
- it('returns all 10 mapped events', () => {
204
- const map = hooks.getEventMap();
205
- expect(Object.keys(map)).toHaveLength(10);
206
- expect(map['event:session.created']).toBe('SessionStart');
207
- expect(map['event:session.deleted']).toBe('SessionEnd');
208
- expect(map['chat.message']).toBe('PromptSubmit');
209
- expect(map['event:session.idle']).toBe('ResponseComplete');
210
- expect(map['tool.execute.before']).toBe('PreToolUse');
211
- expect(map['tool.execute.after']).toBe('PostToolUse');
212
- expect(map['permission.ask']).toBe('PermissionRequest');
213
- expect(map['chat.params']).toBe('PreModel');
214
- expect(map['experimental.session.compacting']).toBe('PreCompact');
215
- expect(map['event:session.compacted']).toBe('PostCompact');
216
- });
217
- });
218
- });
219
- describe('OpenCodeSpawnProvider', () => {
220
- let spawn;
221
- beforeEach(() => {
222
- spawn = new OpenCodeSpawnProvider();
223
- });
224
- describe('canSpawn', () => {
225
- it('returns a boolean', async () => {
226
- const result = await spawn.canSpawn();
227
- expect(typeof result).toBe('boolean');
228
- });
229
- });
230
- describe('listRunning', () => {
231
- it('returns empty array when no processes spawned', async () => {
232
- const running = await spawn.listRunning();
233
- expect(running).toEqual([]);
234
- });
235
- });
236
- describe('terminate', () => {
237
- it('handles non-existent instance gracefully', async () => {
238
- await expect(spawn.terminate('non-existent')).resolves.toBeUndefined();
239
- });
240
- });
241
- });
242
- describe('OpenCodeInstallProvider', () => {
243
- let installProvider;
244
- beforeEach(() => {
245
- installProvider = new OpenCodeInstallProvider();
246
- });
247
- describe('isInstalled', () => {
248
- it('returns a boolean', async () => {
249
- const result = await installProvider.isInstalled();
250
- expect(typeof result).toBe('boolean');
251
- });
252
- });
253
- describe('install', () => {
254
- it('returns a success result', async () => {
255
- const result = await installProvider.install({
256
- projectDir: '/tmp/test-project',
257
- });
258
- expect(result.success).toBe(true);
259
- expect(result.installedAt).toBeTruthy();
260
- expect(typeof result.instructionFileUpdated).toBe('boolean');
261
- expect(typeof result.mcpRegistered).toBe('boolean');
262
- });
263
- it('does not register MCP when only projectDir is provided', async () => {
264
- const result = await installProvider.install({
265
- projectDir: '/tmp/test-project',
266
- });
267
- expect(result.mcpRegistered).toBe(false);
268
- });
269
- });
270
- describe('uninstall', () => {
271
- it('handles uninstall when not installed', async () => {
272
- await expect(installProvider.uninstall()).resolves.toBeUndefined();
273
- });
274
- });
275
- });
276
- //# sourceMappingURL=adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["adapter.test.ts"],"names":[],"mappings":"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"}