@cleocode/cleo-os 2026.4.139 → 2026.4.141
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/commands/__tests__/doctor.test.d.ts +11 -0
- package/dist/commands/__tests__/doctor.test.d.ts.map +1 -0
- package/dist/commands/__tests__/doctor.test.js +95 -0
- package/dist/commands/__tests__/doctor.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +27 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +59 -1
- package/dist/commands/doctor.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for CleoOS doctor subprocess root handling.
|
|
3
|
+
*
|
|
4
|
+
* The doctor command shells out to `cleo admin smoke --provider <id>`. When run
|
|
5
|
+
* via `pnpm --filter @cleocode/cleo-os exec`, Node starts inside
|
|
6
|
+
* `packages/cleo-os`, but `INIT_CWD` still points at the caller's project root.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=doctor.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/doctor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for CleoOS doctor subprocess root handling.
|
|
3
|
+
*
|
|
4
|
+
* The doctor command shells out to `cleo admin smoke --provider <id>`. When run
|
|
5
|
+
* via `pnpm --filter @cleocode/cleo-os exec`, Node starts inside
|
|
6
|
+
* `packages/cleo-os`, but `INIT_CWD` still points at the caller's project root.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
14
|
+
import { resolveSmokeExecOptions, resolveSmokeProjectRoot } from '../doctor.js';
|
|
15
|
+
const ORIGINAL_CLEO_ROOT = process.env['CLEO_ROOT'];
|
|
16
|
+
const ORIGINAL_INIT_CWD = process.env['INIT_CWD'];
|
|
17
|
+
describe('resolveSmokeExecOptions', () => {
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
if (ORIGINAL_CLEO_ROOT === undefined) {
|
|
20
|
+
delete process.env['CLEO_ROOT'];
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
process.env['CLEO_ROOT'] = ORIGINAL_CLEO_ROOT;
|
|
24
|
+
}
|
|
25
|
+
if (ORIGINAL_INIT_CWD === undefined) {
|
|
26
|
+
delete process.env['INIT_CWD'];
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
process.env['INIT_CWD'] = ORIGINAL_INIT_CWD;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
it('prefers explicit CLEO_ROOT over INIT_CWD', async () => {
|
|
33
|
+
const explicitRoot = await mkdtemp(join(tmpdir(), 'cleo-os-explicit-root-'));
|
|
34
|
+
const initRoot = await mkdtemp(join(tmpdir(), 'cleo-os-init-root-'));
|
|
35
|
+
await mkdir(join(explicitRoot, '.cleo'), { recursive: true });
|
|
36
|
+
await mkdir(join(initRoot, '.cleo'), { recursive: true });
|
|
37
|
+
await writeFile(join(explicitRoot, 'AGENTS.md'), '', 'utf-8');
|
|
38
|
+
await writeFile(join(initRoot, 'AGENTS.md'), '', 'utf-8');
|
|
39
|
+
process.env['CLEO_ROOT'] = explicitRoot;
|
|
40
|
+
process.env['INIT_CWD'] = initRoot;
|
|
41
|
+
try {
|
|
42
|
+
const options = resolveSmokeExecOptions();
|
|
43
|
+
expect(options.cwd).toBe(explicitRoot);
|
|
44
|
+
expect(options.env['CLEO_ROOT']).toBe(explicitRoot);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await rm(explicitRoot, { recursive: true, force: true });
|
|
48
|
+
await rm(initRoot, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it('uses INIT_CWD when package execution changes process.cwd()', async () => {
|
|
52
|
+
const callerRoot = await mkdtemp(join(tmpdir(), 'cleo-os-caller-root-'));
|
|
53
|
+
await mkdir(join(callerRoot, '.cleo'), { recursive: true });
|
|
54
|
+
await writeFile(join(callerRoot, 'AGENTS.md'), '', 'utf-8');
|
|
55
|
+
delete process.env['CLEO_ROOT'];
|
|
56
|
+
process.env['INIT_CWD'] = callerRoot;
|
|
57
|
+
try {
|
|
58
|
+
const options = resolveSmokeExecOptions();
|
|
59
|
+
expect(options.cwd).toBe(callerRoot);
|
|
60
|
+
expect(options.env['CLEO_ROOT']).toBe(callerRoot);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await rm(callerRoot, { recursive: true, force: true });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('resolveSmokeProjectRoot', () => {
|
|
68
|
+
it('walks up from a package directory to the nearest CLEO project root', async () => {
|
|
69
|
+
const root = await mkdtemp(join(tmpdir(), 'cleo-os-doctor-root-'));
|
|
70
|
+
const nested = join(root, 'packages', 'cleo-os');
|
|
71
|
+
await mkdir(join(root, '.cleo'), { recursive: true });
|
|
72
|
+
await writeFile(join(root, 'AGENTS.md'), '', 'utf-8');
|
|
73
|
+
await mkdir(nested, { recursive: true });
|
|
74
|
+
try {
|
|
75
|
+
expect(resolveSmokeProjectRoot(nested)).toBe(root);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await rm(root, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('skips nested package runtime state when a marked project root exists above it', async () => {
|
|
82
|
+
const root = await mkdtemp(join(tmpdir(), 'cleo-os-doctor-nested-'));
|
|
83
|
+
const nested = join(root, 'packages', 'cleo-os');
|
|
84
|
+
await mkdir(join(root, '.cleo'), { recursive: true });
|
|
85
|
+
await mkdir(join(nested, '.cleo'), { recursive: true });
|
|
86
|
+
await writeFile(join(root, 'AGENTS.md'), '', 'utf-8');
|
|
87
|
+
try {
|
|
88
|
+
expect(resolveSmokeProjectRoot(nested)).toBe(root);
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await rm(root, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=doctor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/doctor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,15 @@
|
|
|
16
16
|
import type { MemoryItemType } from '../policies/memory-policy.js';
|
|
17
17
|
import type { AgentDefinition } from '../registry/agent-registry.js';
|
|
18
18
|
import type { ProviderMatrixRow } from '../registry/provider-matrix.js';
|
|
19
|
+
/**
|
|
20
|
+
* Options used when CleoOS shells out to the `cleo` CLI for smoke checks.
|
|
21
|
+
*/
|
|
22
|
+
export interface SmokeExecOptions {
|
|
23
|
+
/** Working directory used for the child `cleo` process. */
|
|
24
|
+
cwd: string;
|
|
25
|
+
/** Environment passed to the child `cleo` process. */
|
|
26
|
+
env: NodeJS.ProcessEnv;
|
|
27
|
+
}
|
|
19
28
|
/**
|
|
20
29
|
* Result for a single per-provider sovereignty smoke check.
|
|
21
30
|
*/
|
|
@@ -50,6 +59,24 @@ export interface DoctorReport {
|
|
|
50
59
|
/** Total number of issues found across all sections. */
|
|
51
60
|
issueCount: number;
|
|
52
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Walk upward from a start directory to find the nearest CLEO project root.
|
|
64
|
+
*
|
|
65
|
+
* @param startDir - Directory to begin searching from.
|
|
66
|
+
* @returns The nearest marked `.cleo` ancestor, nearest `.cleo` fallback, or `startDir`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveSmokeProjectRoot(startDir?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Resolve child-process options for provider smoke checks.
|
|
71
|
+
*
|
|
72
|
+
* `pnpm --filter <pkg> exec ...` can change `process.cwd()` and even
|
|
73
|
+
* `CLEO_ROOT` to the package directory. Prefer the best explicit candidate,
|
|
74
|
+
* then normalize it through a `.cleo` ancestor walk so doctor checks run
|
|
75
|
+
* against the user/project root instead of the cleo-os package root.
|
|
76
|
+
*
|
|
77
|
+
* @returns Child-process options for `cleo admin smoke`.
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveSmokeExecOptions(): SmokeExecOptions;
|
|
53
80
|
/**
|
|
54
81
|
* Run all CleoOS sovereignty diagnostic probes and return the aggregated report.
|
|
55
82
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAKxE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAMD;;GAEG;AACH,UAAU,WAAW;IACnB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,6CAA6C;IAC7C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,8EAA8E;IAC9E,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACnC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB;AAwED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAgBxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,CAU1D;AAiDD;;;;;;;GAOG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CA0CvD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA2D/D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* @packageDocumentation
|
|
15
15
|
*/
|
|
16
16
|
import { execFile } from 'node:child_process';
|
|
17
|
+
import { existsSync } from 'node:fs';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
17
19
|
import { promisify } from 'node:util';
|
|
18
20
|
import { MemoryPolicy } from '../policies/memory-policy.js';
|
|
19
21
|
import { AgentRegistry } from '../registry/agent-registry.js';
|
|
@@ -56,6 +58,18 @@ function probeMemoryPolicy() {
|
|
|
56
58
|
return { type, store, reason };
|
|
57
59
|
});
|
|
58
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Return true when a directory looks like the owner project root, not just a
|
|
63
|
+
* stale nested runtime directory.
|
|
64
|
+
*
|
|
65
|
+
* @param dir - Directory to inspect.
|
|
66
|
+
* @returns Whether the directory has a project-root marker.
|
|
67
|
+
*/
|
|
68
|
+
function hasProjectRootMarker(dir) {
|
|
69
|
+
return (existsSync(join(dir, '.git')) ||
|
|
70
|
+
existsSync(join(dir, 'AGENTS.md')) ||
|
|
71
|
+
existsSync(join(dir, 'pnpm-workspace.yaml')));
|
|
72
|
+
}
|
|
59
73
|
/**
|
|
60
74
|
* Detect whether the `cleo` binary is available on `PATH`.
|
|
61
75
|
*
|
|
@@ -70,6 +84,50 @@ async function isCleoAvailable() {
|
|
|
70
84
|
return false;
|
|
71
85
|
}
|
|
72
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Walk upward from a start directory to find the nearest CLEO project root.
|
|
89
|
+
*
|
|
90
|
+
* @param startDir - Directory to begin searching from.
|
|
91
|
+
* @returns The nearest marked `.cleo` ancestor, nearest `.cleo` fallback, or `startDir`.
|
|
92
|
+
*/
|
|
93
|
+
export function resolveSmokeProjectRoot(startDir = process.cwd()) {
|
|
94
|
+
let current = startDir;
|
|
95
|
+
let fallback = null;
|
|
96
|
+
while (true) {
|
|
97
|
+
if (existsSync(join(current, '.cleo'))) {
|
|
98
|
+
fallback ??= current;
|
|
99
|
+
if (hasProjectRootMarker(current)) {
|
|
100
|
+
return current;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const parent = dirname(current);
|
|
104
|
+
if (parent === current) {
|
|
105
|
+
return fallback ?? startDir;
|
|
106
|
+
}
|
|
107
|
+
current = parent;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve child-process options for provider smoke checks.
|
|
112
|
+
*
|
|
113
|
+
* `pnpm --filter <pkg> exec ...` can change `process.cwd()` and even
|
|
114
|
+
* `CLEO_ROOT` to the package directory. Prefer the best explicit candidate,
|
|
115
|
+
* then normalize it through a `.cleo` ancestor walk so doctor checks run
|
|
116
|
+
* against the user/project root instead of the cleo-os package root.
|
|
117
|
+
*
|
|
118
|
+
* @returns Child-process options for `cleo admin smoke`.
|
|
119
|
+
*/
|
|
120
|
+
export function resolveSmokeExecOptions() {
|
|
121
|
+
const rootCandidate = process.env['CLEO_ROOT'] ?? process.env['INIT_CWD'] ?? process.cwd();
|
|
122
|
+
const cwd = resolveSmokeProjectRoot(rootCandidate);
|
|
123
|
+
return {
|
|
124
|
+
cwd,
|
|
125
|
+
env: {
|
|
126
|
+
...process.env,
|
|
127
|
+
CLEO_ROOT: cwd,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
73
131
|
/**
|
|
74
132
|
* Run `cleo admin smoke --provider <id>` for a single installed provider.
|
|
75
133
|
*
|
|
@@ -78,7 +136,7 @@ async function isCleoAvailable() {
|
|
|
78
136
|
*/
|
|
79
137
|
async function runProviderSmoke(providerId) {
|
|
80
138
|
try {
|
|
81
|
-
await execFileAsync('cleo', ['admin', 'smoke', '--provider', providerId]);
|
|
139
|
+
await execFileAsync('cleo', ['admin', 'smoke', '--provider', providerId], resolveSmokeExecOptions());
|
|
82
140
|
return { providerId, passed: true, message: 'PASS' };
|
|
83
141
|
}
|
|
84
142
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/cleo-os",
|
|
3
|
-
"version": "2026.4.
|
|
3
|
+
"version": "2026.4.141",
|
|
4
4
|
"description": "CleoOS — the batteries-included agentic development environment wrapping Pi",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli.js",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"@mariozechner/pi-coding-agent": ">=0.60.0",
|
|
14
14
|
"@sinclair/typebox": "^0.34.49",
|
|
15
15
|
"env-paths": "^4.0.0",
|
|
16
|
-
"@cleocode/agents": "2026.4.
|
|
17
|
-
"@cleocode/
|
|
18
|
-
"@cleocode/
|
|
19
|
-
"@cleocode/
|
|
16
|
+
"@cleocode/agents": "2026.4.141",
|
|
17
|
+
"@cleocode/cleo": "2026.4.141",
|
|
18
|
+
"@cleocode/core": "2026.4.141",
|
|
19
|
+
"@cleocode/cant": "2026.4.141"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"typescript": "^6.0.2",
|