@cleocode/cleo-os 2026.9.8 → 2026.9.10

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 (32) hide show
  1. package/dist/cli.js +3 -10
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/__tests__/doctor.test.js +111 -2
  4. package/dist/commands/__tests__/doctor.test.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +11 -0
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +55 -23
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/harnesses/__tests__/provider-verification.test.d.ts +2 -0
  10. package/dist/harnesses/__tests__/provider-verification.test.d.ts.map +1 -0
  11. package/dist/harnesses/__tests__/provider-verification.test.js +350 -0
  12. package/dist/harnesses/__tests__/provider-verification.test.js.map +1 -0
  13. package/dist/harnesses/pi-coding-agent/__tests__/harness-knowledge.test.d.ts +2 -0
  14. package/dist/harnesses/pi-coding-agent/__tests__/harness-knowledge.test.d.ts.map +1 -0
  15. package/dist/harnesses/pi-coding-agent/__tests__/harness-knowledge.test.js +66 -0
  16. package/dist/harnesses/pi-coding-agent/__tests__/harness-knowledge.test.js.map +1 -0
  17. package/dist/harnesses/pi-coding-agent/adapter.d.ts.map +1 -1
  18. package/dist/harnesses/pi-coding-agent/adapter.js +26 -2
  19. package/dist/harnesses/pi-coding-agent/adapter.js.map +1 -1
  20. package/dist/harnesses/provider-verification.d.ts +26 -0
  21. package/dist/harnesses/provider-verification.d.ts.map +1 -0
  22. package/dist/harnesses/provider-verification.js +442 -0
  23. package/dist/harnesses/provider-verification.js.map +1 -0
  24. package/dist/registry/__tests__/provider-matrix.test.d.ts +2 -0
  25. package/dist/registry/__tests__/provider-matrix.test.d.ts.map +1 -0
  26. package/dist/registry/__tests__/provider-matrix.test.js +111 -0
  27. package/dist/registry/__tests__/provider-matrix.test.js.map +1 -0
  28. package/dist/registry/provider-matrix.d.ts +25 -52
  29. package/dist/registry/provider-matrix.d.ts.map +1 -1
  30. package/dist/registry/provider-matrix.js +84 -88
  31. package/dist/registry/provider-matrix.js.map +1 -1
  32. package/package.json +6 -6
@@ -0,0 +1,442 @@
1
+ /** Bounded external CLI observation for the existing installed-artifact verifier. @packageDocumentation */
2
+ import { spawnSync } from 'node:child_process';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { createReadStream, readFileSync } from 'node:fs';
5
+ import { realpath, stat } from 'node:fs/promises';
6
+ import { isAbsolute, join, relative, resolve, sep } from 'node:path';
7
+ import { spawnWrapped } from '@cleocode/core/resources/spawn-wrapper';
8
+ const WRITABLE_ROOTS = [
9
+ 'HOME',
10
+ 'USERPROFILE',
11
+ 'XDG_DATA_HOME',
12
+ 'XDG_CONFIG_HOME',
13
+ 'XDG_CACHE_HOME',
14
+ 'XDG_STATE_HOME',
15
+ 'XDG_RUNTIME_DIR',
16
+ 'TMPDIR',
17
+ 'TMP',
18
+ 'TEMP',
19
+ 'CLEO_HOME',
20
+ 'CLEO_CONFIG_HOME',
21
+ 'CLEO_ROOT',
22
+ 'CLEO_PROJECT_ROOT',
23
+ 'CLEO_DIR',
24
+ 'NEXUS_HOME',
25
+ 'NEXUS_CACHE_DIR',
26
+ 'AGENTS_HOME',
27
+ 'CLAUDE_CONFIG_DIR',
28
+ 'CODEX_HOME',
29
+ 'KIMI_CODE_HOME',
30
+ 'KIMI_HOME',
31
+ 'KIMI_CONFIG_DIR',
32
+ ];
33
+ /** Whether an already-canonical path stays within the synthetic isolation root. */
34
+ function within(root, path) {
35
+ const suffix = relative(root, path);
36
+ return (suffix === '' || (!suffix.startsWith(`..${sep}`) && suffix !== '..' && !isAbsolute(suffix)));
37
+ }
38
+ /**
39
+ * Return normal noninteractive CLI flags without adapter bypass defaults.
40
+ * @param provider - External CLI, distinct from its programmatic adapter.
41
+ * @returns Fixed argument prefix; the scenario prompt is appended separately.
42
+ * @example
43
+ * ```ts
44
+ * const args = providerVerificationArguments('codex');
45
+ * ```
46
+ */
47
+ export function providerVerificationArguments(provider) {
48
+ switch (provider) {
49
+ case 'claude-code':
50
+ return ['--print', '--output-format', 'stream-json', '--verbose'];
51
+ case 'codex':
52
+ return ['exec', '--json', '--sandbox', 'workspace-write'];
53
+ case 'kimi':
54
+ return ['--output-format', 'stream-json', '--prompt'];
55
+ default:
56
+ throw new Error('Unsupported external provider CLI');
57
+ }
58
+ }
59
+ /** Verify explicit roots before any child launch; never copy ambient credentials. */
60
+ async function validateInvocation(input) {
61
+ if (!input.invocationId.trim() || !input.prompt.trim())
62
+ throw new Error('Invocation identity and prompt are required');
63
+ if (input.prompt.startsWith('-'))
64
+ throw new Error('Scenario prompt must not be interpreted as CLI options');
65
+ if (!Number.isSafeInteger(input.deadlineAt) ||
66
+ input.deadlineAt <= Date.now() ||
67
+ input.deadlineAt - Date.now() > 600_000)
68
+ throw new Error('Original provider deadline must be future and within ten minutes');
69
+ if (!Number.isSafeInteger(input.transcriptByteLimit) ||
70
+ input.transcriptByteLimit < 1024 ||
71
+ input.transcriptByteLimit > 16 * 1024 * 1024)
72
+ throw new Error('Transcript byte ceiling must be between 1024 and 16777216');
73
+ if (!Number.isSafeInteger(input.memoryMaxMb) ||
74
+ input.memoryMaxMb < 128 ||
75
+ input.memoryMaxMb > 4096)
76
+ throw new Error('Provider memory ceiling must be between 128 and 4096 MiB');
77
+ if (!isAbsolute(input.isolationRoot) ||
78
+ !isAbsolute(input.projectRoot) ||
79
+ !isAbsolute(input.executable))
80
+ throw new Error('Provider paths must be absolute');
81
+ const root = await realpath(input.isolationRoot);
82
+ if (!(await stat(root)).isDirectory())
83
+ throw new Error('Isolation root must be a directory');
84
+ const projectRoot = await realpath(input.projectRoot);
85
+ const environment = { ...input.environment };
86
+ if (!within(root, projectRoot))
87
+ throw new Error('Provider project escapes isolation root');
88
+ for (const key of WRITABLE_ROOTS) {
89
+ const path = input.environment[key];
90
+ if (!path || !isAbsolute(path))
91
+ throw new Error(`Writable root ${key} must exist inside isolation root`);
92
+ const capturedPath = await realpath(path);
93
+ if (!within(root, capturedPath) || !(await stat(capturedPath)).isDirectory())
94
+ throw new Error(`Writable root ${key} must exist inside isolation root`);
95
+ environment[key] = capturedPath;
96
+ }
97
+ if (environment['CLEO_ROOT'] !== projectRoot || environment['CLEO_PROJECT_ROOT'] !== projectRoot)
98
+ throw new Error('CLEO project pins must match the captured provider project');
99
+ if (environment['CLEO_DIR'] !== join(projectRoot, '.cleo'))
100
+ throw new Error('CLEO_DIR must identify the captured project store');
101
+ input.signal?.throwIfAborted();
102
+ if (Date.now() >= input.deadlineAt)
103
+ throw new Error('Original provider deadline expired during preparation');
104
+ return { ...input, isolationRoot: root, projectRoot, environment };
105
+ }
106
+ /**
107
+ * Observe a real external provider using canonical spawning and bounded cleanup.
108
+ * @param input - Captured isolated invocation; no ambient environment is inherited.
109
+ * @returns Process evidence only; repair, instruction delivery and lifecycle remain unverified.
110
+ * @remarks Process groups cannot prove that descendants did not escape. A successful
111
+ * systemd launch or kill request is not an independently verified empty cgroup.
112
+ * @example
113
+ * ```ts
114
+ * const processEvidence = await runProviderVerification(invocation);
115
+ * // Independently inspect actual installed repair receipts before assessing capabilities.
116
+ * ```
117
+ */
118
+ export async function runProviderVerification(input) {
119
+ const started = Date.now();
120
+ // Copy mutable caller inputs synchronously before filesystem awaits.
121
+ const captured = {
122
+ ...input,
123
+ environment: { ...input.environment },
124
+ systemdControl: input.systemdControl ? { ...input.systemdControl } : undefined,
125
+ };
126
+ const invocation = await validateInvocation(captured);
127
+ const executablePath = await realpath(invocation.executable);
128
+ const digest = createHash('sha256');
129
+ for await (const bytes of createReadStream(executablePath, { signal: invocation.signal })) {
130
+ if (Date.now() >= invocation.deadlineAt)
131
+ throw new Error('Original provider deadline expired while hashing executable');
132
+ digest.update(bytes);
133
+ }
134
+ const executableHash = digest.digest('hex');
135
+ invocation.signal?.throwIfAborted();
136
+ if (Date.now() >= invocation.deadlineAt)
137
+ throw new Error('Original provider deadline expired before launch');
138
+ const args = providerVerificationArguments(invocation.provider);
139
+ const diagnostics = [
140
+ 'This process observation does not verify instruction delivery, repair receipts, or full lifecycle containment.',
141
+ 'Executable hash records prelaunch bytes; executable immutability during execution was not established.',
142
+ 'No permission bypass flags were supplied; provider policy may refuse unattended actions.',
143
+ 'Cancellation cannot establish whether an in-flight CLEO mutation committed; inspect its canonical receipt.',
144
+ ];
145
+ const result = {
146
+ invocationId: invocation.invocationId,
147
+ provider: invocation.provider,
148
+ executable: { locator: executablePath, sha256: executableHash },
149
+ arguments: args,
150
+ outcome: 'exited',
151
+ exitCode: null,
152
+ exitSignal: null,
153
+ startedAt: new Date(started).toISOString(),
154
+ endedAt: '',
155
+ deadlineAt: invocation.deadlineAt,
156
+ elapsedMs: 0,
157
+ stdout: '',
158
+ stderr: '',
159
+ transcriptTruncated: false,
160
+ childClosed: false,
161
+ processGroupGone: null,
162
+ containment: 'pgid',
163
+ scope: null,
164
+ certification: 'unverified',
165
+ diagnostics,
166
+ };
167
+ const owned = spawnWrapped(executablePath, [...args, invocation.prompt], {
168
+ cwd: resolve(invocation.projectRoot),
169
+ env: invocation.environment,
170
+ detached: process.platform !== 'win32',
171
+ stdio: ['ignore', 'pipe', 'pipe'],
172
+ }, {
173
+ scopeClass: 'tool',
174
+ scopeId: `${invocation.invocationId}-${randomUUID()}`,
175
+ systemdControl: invocation.systemdControl,
176
+ execution: { deadlineAt: invocation.deadlineAt, signal: invocation.signal },
177
+ resources: { memoryMax: `${invocation.memoryMaxMb}M` },
178
+ });
179
+ result.containment = owned.mode;
180
+ const { child } = owned;
181
+ const managerEnv = invocation.systemdControl
182
+ ? {
183
+ ...invocation.environment,
184
+ XDG_RUNTIME_DIR: invocation.systemdControl.runtimeDirectory,
185
+ DBUS_SESSION_BUS_ADDRESS: invocation.systemdControl.busAddress ??
186
+ `unix:path=${join(invocation.systemdControl.runtimeDirectory, 'bus')}`,
187
+ }
188
+ : { ...invocation.environment };
189
+ const scope = owned.mode === 'systemd' && owned.unitName
190
+ ? {
191
+ unitName: owned.unitName,
192
+ cgroupPath: null,
193
+ memoryMaxBytes: null,
194
+ memorySwapMaxBytes: null,
195
+ observedMemberPids: [],
196
+ populatedBefore: null,
197
+ populatedAfter: null,
198
+ removedAfter: false,
199
+ verified: false,
200
+ }
201
+ : null;
202
+ result.scope = scope;
203
+ const scopeDiagnostics = new Set();
204
+ const scopeDiagnostic = (message) => {
205
+ if (scopeDiagnostics.has(message))
206
+ return;
207
+ scopeDiagnostics.add(message);
208
+ diagnostics.push(message);
209
+ };
210
+ let cleanupDeadline;
211
+ const beginCleanup = () => (cleanupDeadline ??= Date.now() + 1000);
212
+ const observeScope = (after) => {
213
+ if (!scope ||
214
+ process.platform !== 'linux' ||
215
+ Date.now() >= (after ? beginCleanup() : invocation.deadlineAt))
216
+ return;
217
+ try {
218
+ if (!scope.cgroupPath) {
219
+ const remaining = (after ? beginCleanup() : invocation.deadlineAt) - Date.now();
220
+ if (remaining <= 0)
221
+ return;
222
+ const query = spawnSync('systemctl', ['--user', 'show', scope.unitName, '--property=ControlGroup', '--value'], {
223
+ env: managerEnv,
224
+ encoding: 'utf8',
225
+ timeout: Math.min(100, remaining),
226
+ maxBuffer: 4096,
227
+ stdio: ['ignore', 'pipe', 'ignore'],
228
+ });
229
+ if (query.status !== 0 || query.error) {
230
+ scopeDiagnostic('An owned scope query failed or exceeded its bounded observation time.');
231
+ return;
232
+ }
233
+ const group = query.stdout.trim();
234
+ // Observe only the exact randomly named scope, never a parent/global slice.
235
+ if (!group.startsWith('/') ||
236
+ group.split('/').includes('..') ||
237
+ !group.endsWith(`/${scope.unitName}`))
238
+ return;
239
+ scope.cgroupPath = group;
240
+ }
241
+ const directory = join('/sys/fs/cgroup', scope.cgroupPath);
242
+ const events = readFileSync(join(directory, 'cgroup.events'), 'utf8');
243
+ const populated = /^populated ([01])$/m.exec(events)?.[1];
244
+ if (after)
245
+ scope.populatedAfter = populated === undefined ? null : populated === '1';
246
+ else {
247
+ scope.populatedBefore =
248
+ scope.populatedBefore === true
249
+ ? true
250
+ : populated === undefined
251
+ ? null
252
+ : populated === '1';
253
+ const memory = readFileSync(join(directory, 'memory.max'), 'utf8').trim();
254
+ const swap = readFileSync(join(directory, 'memory.swap.max'), 'utf8').trim();
255
+ scope.memoryMaxBytes = /^\d+$/.test(memory) ? Number(memory) : null;
256
+ scope.memorySwapMaxBytes = /^\d+$/.test(swap) ? Number(swap) : null;
257
+ const members = readFileSync(join(directory, 'cgroup.procs'), 'utf8').trim().split(/\s+/);
258
+ if (members.length > 1024)
259
+ return;
260
+ const matched = [];
261
+ for (const member of members) {
262
+ if (Date.now() >= invocation.deadlineAt)
263
+ return;
264
+ if (!/^\d+$/.test(member))
265
+ continue;
266
+ const membership = readFileSync(`/proc/${member}/cgroup`, 'utf8');
267
+ if (membership.split('\n').includes(`0::${scope.cgroupPath}`))
268
+ matched.push(Number(member));
269
+ }
270
+ scope.observedMemberPids = [...new Set([...scope.observedMemberPids, ...matched])];
271
+ }
272
+ }
273
+ catch (error) {
274
+ if (after &&
275
+ scope.populatedBefore === true &&
276
+ scope.observedMemberPids.length > 0 &&
277
+ error instanceof Error &&
278
+ 'code' in error &&
279
+ error.code === 'ENOENT') {
280
+ scope.removedAfter = true;
281
+ scope.populatedAfter = null;
282
+ }
283
+ else
284
+ scopeDiagnostic('An owned scope filesystem observation failed; unavailable evidence remains unverified.');
285
+ // Races during startup or process exit leave the corresponding evidence unverified.
286
+ }
287
+ };
288
+ let bytesLeft = invocation.transcriptByteLimit;
289
+ const stdout = [];
290
+ const stderr = [];
291
+ let stopRequested = false;
292
+ let finalized = false;
293
+ let scopeStopRequested = false;
294
+ let cleanupTimer;
295
+ let settle = () => undefined;
296
+ const settled = new Promise((done) => {
297
+ settle = done;
298
+ });
299
+ const killGroup = () => {
300
+ if (owned.mode === 'systemd' && owned.unitName && !scopeStopRequested) {
301
+ scopeStopRequested = true;
302
+ const remaining = beginCleanup() - Date.now();
303
+ const cleanup = remaining > 0
304
+ ? spawnSync('systemctl', ['--user', 'kill', '--kill-whom=all', '--signal=SIGKILL', owned.unitName], { env: managerEnv, stdio: 'ignore', timeout: Math.max(1, remaining) })
305
+ : null;
306
+ if (!cleanup || cleanup.error || cleanup.status !== 0)
307
+ diagnostics.push('Owned systemd scope kill was unsuccessful or unverified.');
308
+ }
309
+ if (!child.pid)
310
+ return;
311
+ try {
312
+ if (process.platform === 'win32')
313
+ child.kill('SIGKILL');
314
+ else
315
+ process.kill(-child.pid, 'SIGKILL');
316
+ }
317
+ catch (error) {
318
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'ESRCH')
319
+ diagnostics.push(`Cleanup signal failed: ${String(error)}`);
320
+ }
321
+ };
322
+ const stop = (outcome) => {
323
+ if (stopRequested || finalized)
324
+ return;
325
+ stopRequested = true;
326
+ beginCleanup();
327
+ result.outcome = outcome;
328
+ killGroup();
329
+ // This is a bounded cleanup observation window, not extra scenario execution time.
330
+ cleanupTimer = setTimeout(() => {
331
+ child.stdout?.destroy();
332
+ child.stderr?.destroy();
333
+ settle();
334
+ }, Math.max(0, beginCleanup() - Date.now()));
335
+ };
336
+ const collect = (chunks, value) => {
337
+ if (finalized)
338
+ return;
339
+ const retained = Math.min(bytesLeft, value.byteLength);
340
+ if (retained)
341
+ chunks.push(Buffer.from(value.subarray(0, retained)));
342
+ bytesLeft -= retained;
343
+ if (retained < value.byteLength) {
344
+ result.transcriptTruncated = true;
345
+ stop('transcript-limit');
346
+ }
347
+ };
348
+ child.stdout?.on('data', (value) => collect(stdout, value));
349
+ child.stderr?.on('data', (value) => collect(stderr, value));
350
+ child.once('error', (error) => {
351
+ if (finalized)
352
+ return;
353
+ diagnostics.push(error.message);
354
+ stop('spawn-failed');
355
+ });
356
+ child.once('close', (code, signal) => {
357
+ if (finalized)
358
+ return;
359
+ result.exitCode = code;
360
+ result.exitSignal = signal;
361
+ result.childClosed = true;
362
+ settle();
363
+ });
364
+ const abort = () => stop('cancelled');
365
+ invocation.signal?.addEventListener('abort', abort, { once: true });
366
+ const deadline = setTimeout(() => stop('deadline'), Math.max(0, invocation.deadlineAt - Date.now()));
367
+ if (invocation.signal?.aborted)
368
+ abort();
369
+ else if (Date.now() >= invocation.deadlineAt)
370
+ stop('deadline');
371
+ const scopePoll = setInterval(() => {
372
+ if (!stopRequested && !result.childClosed)
373
+ observeScope(false);
374
+ }, 25);
375
+ if (!stopRequested)
376
+ observeScope(false);
377
+ try {
378
+ await settled;
379
+ }
380
+ finally {
381
+ clearTimeout(deadline);
382
+ clearInterval(scopePoll);
383
+ if (cleanupTimer)
384
+ clearTimeout(cleanupTimer);
385
+ invocation.signal?.removeEventListener('abort', abort);
386
+ beginCleanup();
387
+ killGroup();
388
+ if (scope) {
389
+ do {
390
+ observeScope(true);
391
+ if (scope.removedAfter || scope.populatedAfter === false)
392
+ break;
393
+ await new Promise((done) => setTimeout(done, Math.min(25, Math.max(0, beginCleanup() - Date.now()))));
394
+ } while (Date.now() < beginCleanup());
395
+ scope.verified =
396
+ result.childClosed &&
397
+ scope.populatedBefore === true &&
398
+ scope.observedMemberPids.length > 0 &&
399
+ scope.memoryMaxBytes === invocation.memoryMaxMb * 1024 * 1024 &&
400
+ scope.memorySwapMaxBytes === 0 &&
401
+ (scope.removedAfter || scope.populatedAfter === false);
402
+ }
403
+ if (process.platform !== 'win32' && child.pid) {
404
+ try {
405
+ process.kill(-child.pid, 0);
406
+ result.processGroupGone = false;
407
+ }
408
+ catch (error) {
409
+ result.processGroupGone =
410
+ error instanceof Error && 'code' in error && error.code === 'ESRCH' ? true : null;
411
+ }
412
+ }
413
+ }
414
+ finalized = true;
415
+ if (owned.mode === 'pgid')
416
+ diagnostics.push('Process-group fallback has no observed cgroup memory bound and cannot exclude escaped descendants.');
417
+ else if (!scope?.verified)
418
+ diagnostics.push('Owned scope membership, resource bounds or cleanup could not all be verified.');
419
+ else
420
+ diagnostics.push('Owned scope membership, memory/swap limits and empty cleanup were observed; this is not a complete provider lifecycle certificate.');
421
+ diagnostics.push('Synchronous manager probes and kernel reads are bounded cooperatively; timers do not preempt them. Cleanup gets at most one separate one-second observation window; elapsed time includes overruns.');
422
+ if (!result.childClosed || result.processGroupGone !== true)
423
+ diagnostics.push('Owned process cleanup is incomplete or unverified.');
424
+ const decode = (chunks) => {
425
+ try {
426
+ return new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks), {
427
+ stream: result.transcriptTruncated,
428
+ });
429
+ }
430
+ catch {
431
+ result.transcriptTruncated = true;
432
+ diagnostics.push('Invalid UTF-8 transcript could not be rendered; evidence is incomplete.');
433
+ return '';
434
+ }
435
+ };
436
+ result.stdout = decode(stdout);
437
+ result.stderr = decode(stderr);
438
+ result.endedAt = new Date().toISOString();
439
+ result.elapsedMs = Date.now() - started;
440
+ return result;
441
+ }
442
+ //# sourceMappingURL=provider-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-verification.js","sourceRoot":"","sources":["../../src/harnesses/provider-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-matrix.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-matrix.test.d.ts","sourceRoot":"","sources":["../../../src/registry/__tests__/provider-matrix.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { ProviderMatrix } from '../provider-matrix.js';
6
+ vi.mock('node:fs/promises', { spy: true });
7
+ let root;
8
+ beforeEach(async () => {
9
+ root = await fs.mkdtemp(join(tmpdir(), 'provider-source-inspection-'));
10
+ });
11
+ afterEach(async () => {
12
+ vi.restoreAllMocks();
13
+ await fs.rm(root, { recursive: true, force: true });
14
+ });
15
+ describe('ProviderMatrix evidence boundaries', () => {
16
+ it('reports absent source separately from diagnostic failure and live capability', async () => {
17
+ const rows = await new ProviderMatrix(join(root, 'absent')).getMatrix();
18
+ expect(rows).toHaveLength(9);
19
+ for (const row of rows) {
20
+ expect(row.source).toMatchObject({ status: 'missing', diagnostics: [] });
21
+ expect(row.installed).toBe(false);
22
+ for (const report of [row.externalCli, row.programmaticSpawn]) {
23
+ expect(report.identity).toBeNull();
24
+ for (const assessment of Object.values(report.levels)) {
25
+ expect(assessment.status).toBe('unverified');
26
+ expect(assessment.evidence).toEqual([]);
27
+ }
28
+ }
29
+ }
30
+ expect(await new ProviderMatrix(join(root, 'absent')).listInstalledProviderIds()).toEqual([]);
31
+ });
32
+ it('does not certify source stubs, comment-only hooks, versions, or self-authored certificates', async () => {
33
+ const provider = join(root, 'claude-code');
34
+ await fs.mkdir(provider);
35
+ await fs.writeFile(join(provider, 'spawn.ts'), '// Not an implementation; version 2.1.274\n');
36
+ await fs.writeFile(join(provider, 'hooks.ts'), '// PreToolUse Stop StopEvent\n');
37
+ await fs.writeFile(join(provider, 'certification.json'), JSON.stringify({
38
+ installed: true,
39
+ workflow: 'passed',
40
+ lifecycle: 'passed',
41
+ receipts: ['invented'],
42
+ }));
43
+ const row = (await new ProviderMatrix(root).getMatrix()).find((r) => r.providerId === 'claude-code');
44
+ expect(row).toMatchObject({
45
+ installed: true,
46
+ spawnImplemented: true,
47
+ hookSupport: 2,
48
+ source: { status: 'present', directory: provider, hookNameMentions: 2, diagnostics: [] },
49
+ });
50
+ expect(row?.externalCli.channel).toBe('external-cli');
51
+ expect(row?.programmaticSpawn.channel).toBe('programmatic-spawn');
52
+ for (const report of [row?.externalCli, row?.programmaticSpawn]) {
53
+ expect(report?.identity).toBeNull();
54
+ expect(Object.values(report?.levels ?? {}).map((level) => level.status)).toEqual(Array(5).fill('unverified'));
55
+ expect(report?.limitations.join(' ')).toContain('Permission policy');
56
+ }
57
+ });
58
+ it('does not confuse Kimi API adapter source with external Kimi CLI installation', async () => {
59
+ await fs.mkdir(join(root, 'kimi'));
60
+ await fs.writeFile(join(root, 'kimi', 'spawn.ts'), '// Moonshot API adapter\n');
61
+ const row = (await new ProviderMatrix(root).getMatrix()).find((r) => r.providerId === 'kimi');
62
+ expect(row?.source.spawnFilePresent).toBe(true);
63
+ expect(row?.externalCli.levels.installed.status).toBe('unverified');
64
+ expect(row?.externalCli.identity).toBeNull();
65
+ expect(row?.programmaticSpawn.levels.workflow.status).toBe('unverified');
66
+ });
67
+ it('reports wrong provider path type as a failed diagnostic', async () => {
68
+ await fs.writeFile(join(root, 'codex'), 'not a directory');
69
+ const row = (await new ProviderMatrix(root).getMatrix()).find((r) => r.providerId === 'codex');
70
+ expect(row?.source.status).toBe('failed');
71
+ expect(row?.source.diagnostics[0]).toContain('Expected directory');
72
+ expect(row?.externalCli.levels.workflow.status).toBe('unverified');
73
+ });
74
+ it('does not treat a directory called spawn.ts as executable source', async () => {
75
+ await fs.mkdir(join(root, 'codex', 'spawn.ts'), { recursive: true });
76
+ const row = (await new ProviderMatrix(root).getMatrix()).find((r) => r.providerId === 'codex');
77
+ expect(row?.source).toMatchObject({
78
+ status: 'failed',
79
+ directoryPresent: true,
80
+ spawnFilePresent: false,
81
+ });
82
+ expect(row?.source.diagnostics[0]).toContain('Expected file');
83
+ });
84
+ it('retains hook read failure explicitly rather than claiming zero supported hooks', async () => {
85
+ await fs.mkdir(join(root, 'codex'));
86
+ await fs.writeFile(join(root, 'codex', 'hooks.ts'), 'PreToolUse');
87
+ vi.mocked(fs.readFile).mockRejectedValueOnce(new Error('injected hook read failure'));
88
+ const row = (await new ProviderMatrix(root).getMatrix()).find((r) => r.providerId === 'codex');
89
+ expect(row?.source).toMatchObject({
90
+ status: 'failed',
91
+ diagnostics: ['injected hook read failure'],
92
+ });
93
+ expect(row?.programmaticSpawn.levels.lifecycle.status).toBe('unverified');
94
+ });
95
+ it('does not convert a broken inventory root into an empty healthy list', async () => {
96
+ const badRoot = join(root, 'file');
97
+ await fs.writeFile(badRoot, 'not a directory');
98
+ const matrix = new ProviderMatrix(badRoot);
99
+ await expect(matrix.listInstalledProviderIds()).rejects.toMatchObject({ code: 'ENOTDIR' });
100
+ const rows = await matrix.getMatrix();
101
+ expect(rows.every((row) => row.source.status === 'failed')).toBe(true);
102
+ expect(rows.every((row) => row.source.diagnostics.length === 1)).toBe(true);
103
+ });
104
+ it('preserves discovery of unknown source directories without claiming live support', async () => {
105
+ await fs.mkdir(join(root, 'experimental'));
106
+ await fs.writeFile(join(root, 'README'), 'source inventory');
107
+ expect(await new ProviderMatrix(root).listInstalledProviderIds()).toEqual(['experimental']);
108
+ expect((await new ProviderMatrix(root).getMatrix()).some((row) => row.providerId === 'experimental')).toBe(false);
109
+ });
110
+ });
111
+ //# sourceMappingURL=provider-matrix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-matrix.test.js","sourceRoot":"","sources":["../../../src/registry/__tests__/provider-matrix.test.ts"],"names":[],"mappings":"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"}