zelari-code 1.45.0 → 1.47.1
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/cli/app.js +4 -1
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/ast/engine.js +86 -23
- package/dist/cli/ast/engine.js.map +1 -1
- package/dist/cli/ast/engine.test.js +101 -0
- package/dist/cli/ast/engine.test.js.map +1 -0
- package/dist/cli/ast/tools.js +77 -15
- package/dist/cli/ast/tools.js.map +1 -1
- package/dist/cli/ast/tools.test.js +124 -0
- package/dist/cli/ast/tools.test.js.map +1 -0
- package/dist/cli/budget/tokenBudget.js +14 -12
- package/dist/cli/budget/tokenBudget.js.map +1 -1
- package/dist/cli/hooks/conversationContext.js +7 -4
- package/dist/cli/hooks/conversationContext.js.map +1 -1
- package/dist/cli/hooks/observationStore.js +219 -0
- package/dist/cli/hooks/observationStore.js.map +1 -0
- package/dist/cli/hooks/observationStore.test.js +135 -0
- package/dist/cli/hooks/observationStore.test.js.map +1 -0
- package/dist/cli/hooks/sessionSurface.js +171 -0
- package/dist/cli/hooks/sessionSurface.js.map +1 -0
- package/dist/cli/hooks/sessionSurface.test.js +112 -0
- package/dist/cli/hooks/sessionSurface.test.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +27 -0
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSession.js +5 -3
- package/dist/cli/hooks/useSession.js.map +1 -1
- package/dist/cli/lsp/manager.js +10 -0
- package/dist/cli/lsp/manager.js.map +1 -1
- package/dist/cli/lsp/tools.js +37 -2
- package/dist/cli/lsp/tools.js.map +1 -1
- package/dist/cli/lsp/tools.test.js +90 -0
- package/dist/cli/lsp/tools.test.js.map +1 -0
- package/dist/cli/main.bundled.js +2339 -952
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/metrics.js +4 -0
- package/dist/cli/metrics.js.map +1 -1
- package/dist/cli/provider/capabilities.js +53 -0
- package/dist/cli/provider/capabilities.js.map +1 -0
- package/dist/cli/provider/capabilities.test.js +46 -0
- package/dist/cli/provider/capabilities.test.js.map +1 -0
- package/dist/cli/provider/openai-compatible.js +2 -1
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/toolRegistry.js +50 -5
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/tools/inspectCommand.js +346 -0
- package/dist/cli/tools/inspectCommand.js.map +1 -0
- package/dist/cli/tools/inspectCommand.test.js +311 -0
- package/dist/cli/tools/inspectCommand.test.js.map +1 -0
- package/dist/cli/tools/inspectTypecheckSafety.js +104 -0
- package/dist/cli/tools/inspectTypecheckSafety.js.map +1 -0
- package/dist/cli/tools/observeBatch.js +254 -0
- package/dist/cli/tools/observeBatch.js.map +1 -0
- package/dist/cli/tools/observeBatch.test.js +329 -0
- package/dist/cli/tools/observeBatch.test.js.map +1 -0
- package/dist/cli/tools/retrieveObservation.js +82 -0
- package/dist/cli/tools/retrieveObservation.js.map +1 -0
- package/dist/cli/tools/taskTool.js +4 -0
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/dist/cli/utils/contextGrowthSummary.js +55 -0
- package/dist/cli/utils/contextGrowthSummary.js.map +1 -0
- package/dist/cli/utils/contextGrowthSummary.test.js +74 -0
- package/dist/cli/utils/contextGrowthSummary.test.js.map +1 -0
- package/dist/cli/utils/doctor.js +26 -0
- package/dist/cli/utils/doctor.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { mkdtemp, writeFile, readdir, rm, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { describe, it, expect, afterAll } from 'vitest';
|
|
6
|
+
import { createInspectCommandTool, buildInspectCommand, resolveNodeModuleBin, runSpawn, } from './inspectCommand.js';
|
|
7
|
+
import { scanTsbuildinfo, diffFingerprints, cleanupArtifacts, classifyTypecheckRefusal, } from './inspectTypecheckSafety.js';
|
|
8
|
+
import { createBuiltinToolRegistry } from '../toolRegistry.js';
|
|
9
|
+
import { AuditLogger } from '../safety/auditLogger.js';
|
|
10
|
+
import { defaultPermissionPolicy } from '../safety/toolPermissions.js';
|
|
11
|
+
/**
|
|
12
|
+
* WS3 — inspect_command (piano §3/§7/§9, t3).
|
|
13
|
+
*
|
|
14
|
+
* S3.4: pure argv-builder table, registry gating, spawn semantics.
|
|
15
|
+
* S3.5: typecheck artifact safety fixtures — plain, incremental-with-explicit-
|
|
16
|
+
* in-workspace tsBuildInfoFile (the CLI redirect must win), and composite
|
|
17
|
+
* (the real packages/core shape). Common assertion: the workspace stays
|
|
18
|
+
* byte-for-byte unchanged (zero new *.tsbuildinfo).
|
|
19
|
+
*/
|
|
20
|
+
// This file lives at <repo>/src/cli/tools/… — do NOT use path.resolve() (cwd
|
|
21
|
+
// is packages/core under `npm test --workspace=@zelari/core`, which is what
|
|
22
|
+
// the publish workflow runs).
|
|
23
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
24
|
+
const tscPath = resolveNodeModuleBin(repoRoot, path.join('typescript', 'bin', 'tsc'))
|
|
25
|
+
?? path.join(repoRoot, 'node_modules', 'typescript', 'bin', 'tsc');
|
|
26
|
+
const fixtures = [];
|
|
27
|
+
afterAll(async () => {
|
|
28
|
+
await Promise.all(fixtures.map((d) => rm(d, { recursive: true, force: true }).catch(() => { })));
|
|
29
|
+
});
|
|
30
|
+
async function newFixture() {
|
|
31
|
+
const dir = await mkdtemp(path.join(tmpdir(), 'zelari-inspect-'));
|
|
32
|
+
fixtures.push(dir);
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
function build(op, root = repoRoot) {
|
|
36
|
+
return buildInspectCommand(op, { root, cwd: root, tscPath });
|
|
37
|
+
}
|
|
38
|
+
function buildOk(op, root = repoRoot) {
|
|
39
|
+
const r = build(op, root);
|
|
40
|
+
if (!r.ok)
|
|
41
|
+
throw new Error(`expected ok, got: ${r.reason}`);
|
|
42
|
+
return r;
|
|
43
|
+
}
|
|
44
|
+
describe('resolveNodeModuleBin — hoisted monorepo walk-up', () => {
|
|
45
|
+
it('finds root-hoisted typescript from a nested package dir', () => {
|
|
46
|
+
const nested = path.join(repoRoot, 'packages', 'core');
|
|
47
|
+
const fromNested = resolveNodeModuleBin(nested, path.join('typescript', 'bin', 'tsc'));
|
|
48
|
+
const fromRoot = resolveNodeModuleBin(repoRoot, path.join('typescript', 'bin', 'tsc'));
|
|
49
|
+
expect(fromNested).toBe(fromRoot);
|
|
50
|
+
expect(fromNested).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
it('returns undefined when nothing is found', () => {
|
|
53
|
+
expect(resolveNodeModuleBin(tmpdir(), path.join('definitely-not-a-pkg', 'bin', 'x'))).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('buildInspectCommand — pure argv builder', () => {
|
|
57
|
+
it('git_status plain and --short', () => {
|
|
58
|
+
expect(build({ operation: 'git_status' })).toMatchObject({
|
|
59
|
+
ok: true,
|
|
60
|
+
command: 'git',
|
|
61
|
+
argv: ['status'],
|
|
62
|
+
inspectionClass: 'git-inspection',
|
|
63
|
+
});
|
|
64
|
+
expect(buildOk({ operation: 'git_status', short: true }).argv).toEqual(['status', '--short']);
|
|
65
|
+
});
|
|
66
|
+
it('git_log maps limit/oneline to safe flags only', () => {
|
|
67
|
+
const r = build({ operation: 'git_log', limit: 10, oneline: true });
|
|
68
|
+
if (!r.ok)
|
|
69
|
+
throw new Error('expected ok');
|
|
70
|
+
expect(r.command).toBe('git');
|
|
71
|
+
expect(r.argv).toEqual(['log', '--oneline', '-n', '10']);
|
|
72
|
+
});
|
|
73
|
+
it('git_diff forces --no-ext-diff --no-textconv (cannot be disabled by input)', () => {
|
|
74
|
+
const r = build({ operation: 'git_diff' });
|
|
75
|
+
if (!r.ok)
|
|
76
|
+
throw new Error('expected ok');
|
|
77
|
+
expect(r.argv.slice(0, 3)).toEqual(['diff', '--no-ext-diff', '--no-textconv']);
|
|
78
|
+
const staged = build({ operation: 'git_diff', staged: true, path: 'src/a.ts' });
|
|
79
|
+
if (!staged.ok)
|
|
80
|
+
throw new Error('expected ok');
|
|
81
|
+
expect(staged.argv).toEqual(['diff', '--no-ext-diff', '--no-textconv', '--staged', '--', 'src/a.ts']);
|
|
82
|
+
});
|
|
83
|
+
it('rejects flag-like free strings (git_diff path, git_show ref, npm_view package)', () => {
|
|
84
|
+
expect(build({ operation: 'git_diff', path: '--evil' })).toMatchObject({ ok: false });
|
|
85
|
+
expect(build({ operation: 'git_show', ref: '-x' })).toMatchObject({ ok: false });
|
|
86
|
+
expect(build({ operation: 'npm_view', package: '--json' })).toMatchObject({ ok: false });
|
|
87
|
+
});
|
|
88
|
+
it('git_show carries safety flags; branch_current/ls_files are fixed argv', () => {
|
|
89
|
+
expect(buildOk({ operation: 'git_show', ref: 'HEAD~2' }).argv).toEqual([
|
|
90
|
+
'show',
|
|
91
|
+
'--no-ext-diff',
|
|
92
|
+
'--no-textconv',
|
|
93
|
+
'HEAD~2',
|
|
94
|
+
]);
|
|
95
|
+
expect(buildOk({ operation: 'git_branch_current' }).argv).toEqual(['branch', '--show-current']);
|
|
96
|
+
expect(buildOk({ operation: 'git_ls_files' }).argv).toEqual(['ls-files']);
|
|
97
|
+
});
|
|
98
|
+
it('node_version and npm_* run via node (no .cmd shim, no shell)', () => {
|
|
99
|
+
const nv = build({ operation: 'node_version' });
|
|
100
|
+
if (!nv.ok)
|
|
101
|
+
throw new Error('expected ok');
|
|
102
|
+
expect(nv.command).toBe(process.execPath);
|
|
103
|
+
expect(nv.inspectionClass).toBe('env-info');
|
|
104
|
+
const ls = build({ operation: 'npm_ls' });
|
|
105
|
+
if (!ls.ok)
|
|
106
|
+
throw new Error('expected ok');
|
|
107
|
+
expect(ls.command).toBe(process.execPath);
|
|
108
|
+
expect(ls.argv[0].endsWith('npm-cli.js')).toBe(true);
|
|
109
|
+
expect(ls.argv[1]).toBe('ls');
|
|
110
|
+
const view = build({ operation: 'npm_view', package: 'typescript' });
|
|
111
|
+
if (!view.ok)
|
|
112
|
+
throw new Error('expected ok');
|
|
113
|
+
expect(view.argv.slice(1)).toEqual(['view', 'typescript']);
|
|
114
|
+
});
|
|
115
|
+
it('typecheck: --noEmit + temp-dir tsBuildInfoFile redirect + resolved project', () => {
|
|
116
|
+
const r = build({ operation: 'typecheck' });
|
|
117
|
+
if (!r.ok)
|
|
118
|
+
throw new Error('expected ok');
|
|
119
|
+
expect(r.inspectionClass).toBe('project-code-execution');
|
|
120
|
+
expect(r.argv[0]).toBe(tscPath);
|
|
121
|
+
expect(r.argv).toContain('--noEmit');
|
|
122
|
+
expect(r.argv).toContain('--incremental');
|
|
123
|
+
const i = r.argv.indexOf('--tsBuildInfoFile');
|
|
124
|
+
expect(i).toBeGreaterThan(-1);
|
|
125
|
+
expect(r.argv[i + 1]).toContain(path.join('zelari-inspect'));
|
|
126
|
+
expect(r.argv[i + 1].endsWith('.tsbuildinfo')).toBe(true);
|
|
127
|
+
expect(r.argv[r.argv.length - 1].endsWith('tsconfig.json')).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it('typecheck: different projects hash to different redirect targets', () => {
|
|
130
|
+
const a = build({ operation: 'typecheck', project: 'tsconfig.json' });
|
|
131
|
+
const b = build({ operation: 'typecheck', project: 'packages/core/tsconfig.json' });
|
|
132
|
+
if (!a.ok || !b.ok)
|
|
133
|
+
throw new Error('expected ok');
|
|
134
|
+
const ai = a.argv.indexOf('--tsBuildInfoFile');
|
|
135
|
+
const bi = b.argv.indexOf('--tsBuildInfoFile');
|
|
136
|
+
expect(a.argv[ai + 1]).not.toBe(b.argv[bi + 1]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('runSpawn — no-shell semantics', () => {
|
|
140
|
+
it('kills the process on timeout and reports it', async () => {
|
|
141
|
+
const r = await runSpawn(process.execPath, ['-e', 'setTimeout(() => {}, 60000)'], {
|
|
142
|
+
cwd: repoRoot,
|
|
143
|
+
timeoutMs: 250,
|
|
144
|
+
});
|
|
145
|
+
expect(r.timedOut).toBe(true);
|
|
146
|
+
expect(r.code).not.toBe(0);
|
|
147
|
+
});
|
|
148
|
+
it('spawn error (missing binary) resolves with spawnError, never rejects', async () => {
|
|
149
|
+
const r = await runSpawn('definitely-not-a-real-binary-xyz', [], {
|
|
150
|
+
cwd: repoRoot,
|
|
151
|
+
timeoutMs: 1000,
|
|
152
|
+
});
|
|
153
|
+
expect(r.spawnError).toBeTruthy();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('S3.5 artifact-safety guard units', () => {
|
|
157
|
+
it('diffFingerprints detects new tsbuildinfo files and git changes', () => {
|
|
158
|
+
const pre = { gitStatus: '', tsbuildinfoFiles: ['a.tsbuildinfo'] };
|
|
159
|
+
const post = { gitStatus: ' M x.ts', tsbuildinfoFiles: ['a.tsbuildinfo', 'b.tsbuildinfo'] };
|
|
160
|
+
const d = diffFingerprints(pre, post);
|
|
161
|
+
expect(d.newTsbuildinfo).toEqual(['b.tsbuildinfo']);
|
|
162
|
+
expect(d.gitStatusChanged).toBe(true);
|
|
163
|
+
expect(diffFingerprints(pre, pre)).toEqual({ newTsbuildinfo: [], gitStatusChanged: false });
|
|
164
|
+
});
|
|
165
|
+
it('cleanupArtifacts removes what it can and reports failures', async () => {
|
|
166
|
+
const dir = await newFixture();
|
|
167
|
+
const keep = path.join(dir, 'real.tsbuildinfo');
|
|
168
|
+
await writeFile(keep, 'x');
|
|
169
|
+
const { cleaned, failed } = await cleanupArtifacts(dir, ['real.tsbuildinfo', 'ghost.tsbuildinfo']);
|
|
170
|
+
expect(cleaned).toEqual(['real.tsbuildinfo']);
|
|
171
|
+
expect(failed).toEqual(['ghost.tsbuildinfo']);
|
|
172
|
+
});
|
|
173
|
+
it('classifyTypecheckRefusal: composite refusal is loud, type errors are not', () => {
|
|
174
|
+
expect(classifyTypecheckRefusal('error TS6379: Composite projects may not disable incremental emit.')).toMatch(/composite/i);
|
|
175
|
+
expect(classifyTypecheckRefusal('index.ts(1,1): error TS2322: Type \'string\' is not assignable')).toBeNull();
|
|
176
|
+
});
|
|
177
|
+
it('scanTsbuildinfo skips node_modules and finds nested files', async () => {
|
|
178
|
+
const dir = await newFixture();
|
|
179
|
+
await mkdir(path.join(dir, 'node_modules', 'x'), { recursive: true });
|
|
180
|
+
await mkdir(path.join(dir, 'sub'), { recursive: true });
|
|
181
|
+
await writeFile(path.join(dir, 'node_modules', 'x', 'junk.tsbuildinfo'), 'x');
|
|
182
|
+
await writeFile(path.join(dir, 'sub', 'real.tsbuildinfo'), 'x');
|
|
183
|
+
expect(await scanTsbuildinfo(dir)).toEqual(['sub/real.tsbuildinfo']);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('S3.5 typecheck fixtures — the workspace must stay untouched', () => {
|
|
187
|
+
async function writeProject(dir, tsconfig) {
|
|
188
|
+
await mkdir(path.join(dir, 'src'), { recursive: true });
|
|
189
|
+
await writeFile(path.join(dir, 'src', 'main.ts'), 'export const answer: number = 42;\n');
|
|
190
|
+
await writeFile(path.join(dir, 'tsconfig.json'), tsconfig);
|
|
191
|
+
}
|
|
192
|
+
async function runTypecheck(dir) {
|
|
193
|
+
const tool = createInspectCommandTool({ root: dir, tscPath });
|
|
194
|
+
const res = await tool.execute({ operation: 'typecheck' }, { cwd: dir });
|
|
195
|
+
if (!res.ok)
|
|
196
|
+
throw new Error(`typecheck failed hard: ${res.error}`);
|
|
197
|
+
return res.value;
|
|
198
|
+
}
|
|
199
|
+
it('(a) plain tsconfig: status ok, zero artifacts, tmp redirect used', async () => {
|
|
200
|
+
const dir = await newFixture();
|
|
201
|
+
await writeProject(dir, JSON.stringify({ compilerOptions: { strict: true } }));
|
|
202
|
+
const v = await runTypecheck(dir);
|
|
203
|
+
expect(v['status']).toBe('ok');
|
|
204
|
+
expect(v['exitCode']).toBe(0);
|
|
205
|
+
expect(v['inspectionClass']).toBe('project-code-execution');
|
|
206
|
+
expect(await scanTsbuildinfo(dir)).toEqual([]);
|
|
207
|
+
});
|
|
208
|
+
it('(b) incremental + tsBuildInfoFile explicitly in the workspace: the CLI redirect WINS', async () => {
|
|
209
|
+
const dir = await newFixture();
|
|
210
|
+
await writeProject(dir, JSON.stringify({
|
|
211
|
+
compilerOptions: { incremental: true, tsBuildInfoFile: './in-workspace.tsbuildinfo' },
|
|
212
|
+
}));
|
|
213
|
+
const v = await runTypecheck(dir);
|
|
214
|
+
expect(v['status']).toBe('ok');
|
|
215
|
+
expect(v['exitCode']).toBe(0);
|
|
216
|
+
// The in-workspace target must NOT exist; only the tmp redirect was used.
|
|
217
|
+
const entries = await readdir(dir);
|
|
218
|
+
expect(entries).not.toContain('in-workspace.tsbuildinfo');
|
|
219
|
+
expect(await scanTsbuildinfo(dir)).toEqual([]);
|
|
220
|
+
});
|
|
221
|
+
it('(c) composite: true (the real packages/core shape): workspace unchanged', async () => {
|
|
222
|
+
const dir = await newFixture();
|
|
223
|
+
await writeProject(dir, JSON.stringify({ compilerOptions: { composite: true, rootDir: 'src', outDir: 'dist' } }));
|
|
224
|
+
const v = await runTypecheck(dir);
|
|
225
|
+
expect(v['status']).toBe('ok');
|
|
226
|
+
expect(v['exitCode']).toBe(0);
|
|
227
|
+
expect(await scanTsbuildinfo(dir)).toEqual([]);
|
|
228
|
+
const entries = await readdir(dir);
|
|
229
|
+
expect(entries).not.toContain('tsconfig.tsbuildinfo');
|
|
230
|
+
expect(entries).not.toContain('dist');
|
|
231
|
+
});
|
|
232
|
+
it('typecheck reports real type errors as a successful observation (exit != 0, status ok)', async () => {
|
|
233
|
+
const dir = await newFixture();
|
|
234
|
+
await mkdir(path.join(dir, 'src'), { recursive: true });
|
|
235
|
+
await writeFile(path.join(dir, 'src', 'bad.ts'), 'export const x: number = "not a number";\n');
|
|
236
|
+
await writeFile(path.join(dir, 'tsconfig.json'), JSON.stringify({ compilerOptions: { strict: true } }));
|
|
237
|
+
const v = await runTypecheck(dir);
|
|
238
|
+
// The RUN succeeded (a scoped observation); the compiler verdict is the exit code.
|
|
239
|
+
expect(v['status']).toBe('ok');
|
|
240
|
+
expect(v['exitCode']).toBe(2);
|
|
241
|
+
expect(String(v['output'])).toContain('TS2322');
|
|
242
|
+
expect(await scanTsbuildinfo(dir)).toEqual([]);
|
|
243
|
+
});
|
|
244
|
+
it('TYPESCRIPT_UNAVAILABLE when tsc is missing (loud, no fake empty)', async () => {
|
|
245
|
+
const dir = await newFixture();
|
|
246
|
+
await writeProject(dir, JSON.stringify({ compilerOptions: {} }));
|
|
247
|
+
const tool = createInspectCommandTool({ root: dir, tscPath: path.join(dir, 'nope', 'tsc') });
|
|
248
|
+
const res = await tool.execute({ operation: 'typecheck' }, { cwd: dir });
|
|
249
|
+
expect(res.ok).toBe(false);
|
|
250
|
+
if (!res.ok)
|
|
251
|
+
expect(res.error).toContain('TYPESCRIPT_UNAVAILABLE');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('registry gating (S3.2)', () => {
|
|
255
|
+
it('readOnly registry registers inspect_command INSTEAD of bash', () => {
|
|
256
|
+
const dir = repoRoot;
|
|
257
|
+
const { tools } = createBuiltinToolRegistry({
|
|
258
|
+
root: dir,
|
|
259
|
+
readOnly: true,
|
|
260
|
+
lspProvider: null,
|
|
261
|
+
audit: new AuditLogger(path.join(tmpdir(), `zelari-inspect-audit-${Date.now()}.log`)),
|
|
262
|
+
permissionPolicy: defaultPermissionPolicy({ auto: true }),
|
|
263
|
+
});
|
|
264
|
+
const names = tools.map((t) => t.name);
|
|
265
|
+
expect(names).toContain('inspect_command');
|
|
266
|
+
expect(names).not.toContain('bash');
|
|
267
|
+
expect(names).not.toContain('write_file');
|
|
268
|
+
});
|
|
269
|
+
it('planMode registry gets inspect_command too', () => {
|
|
270
|
+
const { tools } = createBuiltinToolRegistry({
|
|
271
|
+
root: repoRoot,
|
|
272
|
+
planMode: true,
|
|
273
|
+
lspProvider: null,
|
|
274
|
+
audit: new AuditLogger(path.join(tmpdir(), `zelari-inspect-audit-${Date.now()}.log`)),
|
|
275
|
+
permissionPolicy: defaultPermissionPolicy({ auto: true }),
|
|
276
|
+
});
|
|
277
|
+
expect(tools.map((t) => t.name)).toContain('inspect_command');
|
|
278
|
+
});
|
|
279
|
+
it('full registry keeps bash and does NOT register inspect_command', () => {
|
|
280
|
+
const { tools } = createBuiltinToolRegistry({
|
|
281
|
+
root: repoRoot,
|
|
282
|
+
lspProvider: null,
|
|
283
|
+
audit: new AuditLogger(path.join(tmpdir(), `zelari-inspect-audit-${Date.now()}.log`)),
|
|
284
|
+
permissionPolicy: defaultPermissionPolicy({ auto: true }),
|
|
285
|
+
});
|
|
286
|
+
const names = tools.map((t) => t.name);
|
|
287
|
+
expect(names).toContain('bash');
|
|
288
|
+
expect(names).not.toContain('inspect_command');
|
|
289
|
+
});
|
|
290
|
+
it('kill-switch ZELARI_INSPECT_COMMAND=0 removes it', () => {
|
|
291
|
+
const prev = process.env.ZELARI_INSPECT_COMMAND;
|
|
292
|
+
process.env.ZELARI_INSPECT_COMMAND = '0';
|
|
293
|
+
try {
|
|
294
|
+
const { tools } = createBuiltinToolRegistry({
|
|
295
|
+
root: repoRoot,
|
|
296
|
+
readOnly: true,
|
|
297
|
+
lspProvider: null,
|
|
298
|
+
audit: new AuditLogger(path.join(tmpdir(), `zelari-inspect-audit-${Date.now()}.log`)),
|
|
299
|
+
permissionPolicy: defaultPermissionPolicy({ auto: true }),
|
|
300
|
+
});
|
|
301
|
+
expect(tools.map((t) => t.name)).not.toContain('inspect_command');
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
if (prev === undefined)
|
|
305
|
+
delete process.env.ZELARI_INSPECT_COMMAND;
|
|
306
|
+
else
|
|
307
|
+
process.env.ZELARI_INSPECT_COMMAND = prev;
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=inspectCommand.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectCommand.test.js","sourceRoot":"","sources":["../../../src/cli/tools/inspectCommand.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inspectTypecheckSafety — S3.5 "typecheck artifact safety" guard.
|
|
3
|
+
*
|
|
4
|
+
* `inspect_command(typecheck)` must never leave build artifacts in the
|
|
5
|
+
* workspace. `tsc --noEmit` on `incremental`/`composite` projects writes a
|
|
6
|
+
* `.tsbuildinfo` file (TypeScript issue #30661: "incremental is on by default
|
|
7
|
+
* if composite is on... new build artifacts in unexpected places for people
|
|
8
|
+
* using --noEmit today"), so the caller redirects it to the OS temp dir AND
|
|
9
|
+
* this module fingerprints the workspace before/after to catch ANY artifact
|
|
10
|
+
* class — including ones we did not predict.
|
|
11
|
+
*
|
|
12
|
+
* Fingerprint = `git status --porcelain` + sorted list of every `*.tsbuildinfo`
|
|
13
|
+
* under the root (node_modules/.git excluded). Any delta ⇒ the caller reports
|
|
14
|
+
* `status: 'degraded'` + `artifactsWritten` and triggers cleanup.
|
|
15
|
+
*/
|
|
16
|
+
import { promises as fs } from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { spawn } from 'node:child_process';
|
|
19
|
+
/** Directories never scanned for tsbuildinfo artifacts. */
|
|
20
|
+
const SCAN_SKIP = new Set(['node_modules', '.git']);
|
|
21
|
+
/** Recursively list `*.tsbuildinfo` under `root` (node_modules/.git skipped). */
|
|
22
|
+
export async function scanTsbuildinfo(root) {
|
|
23
|
+
const found = [];
|
|
24
|
+
const stack = [root];
|
|
25
|
+
while (stack.length > 0) {
|
|
26
|
+
const dir = stack.pop();
|
|
27
|
+
let entries;
|
|
28
|
+
try {
|
|
29
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
continue; // unreadable dir (permissions, races) — not our artifact class
|
|
33
|
+
}
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
const p = path.join(dir, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
if (!SCAN_SKIP.has(entry.name))
|
|
38
|
+
stack.push(p);
|
|
39
|
+
}
|
|
40
|
+
else if (entry.name.endsWith('.tsbuildinfo')) {
|
|
41
|
+
found.push(path.relative(root, p).split(path.sep).join('/'));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
found.sort();
|
|
46
|
+
return found;
|
|
47
|
+
}
|
|
48
|
+
/** `git status --porcelain` in `root`; marker strings when git is unusable. */
|
|
49
|
+
async function gitStatusPorcelain(root) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const child = spawn('git', ['status', '--porcelain'], { cwd: root, shell: false });
|
|
52
|
+
let out = '';
|
|
53
|
+
child.stdout.on('data', (d) => (out += d.toString()));
|
|
54
|
+
child.stderr.on('data', (d) => (out += d.toString()));
|
|
55
|
+
child.on('error', () => resolve('<git-unavailable>'));
|
|
56
|
+
child.on('close', (code) => resolve(code === 0 ? out : `<git-exit-${code ?? 'none'}>`));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** Snapshot the workspace state before/after a typecheck run. */
|
|
60
|
+
export async function fingerprintWorkspace(root) {
|
|
61
|
+
const [gitStatus, tsbuildinfoFiles] = await Promise.all([
|
|
62
|
+
gitStatusPorcelain(root),
|
|
63
|
+
scanTsbuildinfo(root),
|
|
64
|
+
]);
|
|
65
|
+
return { gitStatus, tsbuildinfoFiles };
|
|
66
|
+
}
|
|
67
|
+
/** Compare pre/post fingerprints; empty delta = workspace untouched. */
|
|
68
|
+
export function diffFingerprints(pre, post) {
|
|
69
|
+
const preSet = new Set(pre.tsbuildinfoFiles);
|
|
70
|
+
return {
|
|
71
|
+
newTsbuildinfo: post.tsbuildinfoFiles.filter((f) => !preSet.has(f)),
|
|
72
|
+
gitStatusChanged: post.gitStatus !== pre.gitStatus,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Best-effort removal of artifacts written during the run. */
|
|
76
|
+
export async function cleanupArtifacts(root, relPaths) {
|
|
77
|
+
const cleaned = [];
|
|
78
|
+
const failed = [];
|
|
79
|
+
for (const rel of relPaths) {
|
|
80
|
+
try {
|
|
81
|
+
await fs.unlink(path.join(root, rel));
|
|
82
|
+
cleaned.push(rel);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
failed.push(rel);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { cleaned, failed };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Classify a tsc failure as a project-shape refusal (composite/incremental
|
|
92
|
+
* incompatibility at the compiler level — an error about HOW the project is
|
|
93
|
+
* built, not a type error). Returns the loud reason, or null when the output
|
|
94
|
+
* looks like ordinary diagnostics.
|
|
95
|
+
*/
|
|
96
|
+
export function classifyTypecheckRefusal(output) {
|
|
97
|
+
if (/composite/i.test(output) && /(may not|cannot|disallow|disable)/i.test(output)) {
|
|
98
|
+
return ('the TypeScript compiler refused to run on this composite/incremental project shape ' +
|
|
99
|
+
'(tsc-level error about the build setup, not a type error) — inspect_command will not ' +
|
|
100
|
+
'fake an empty result; run the project typecheck script directly if you need it');
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=inspectTypecheckSafety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectTypecheckSafety.js","sourceRoot":"","sources":["../../../src/cli/tools/inspectTypecheckSafety.ts"],"names":[],"mappings":"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"}
|