@mcptoolshop/venvkit 0.2.5 → 1.0.0
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/README.es.md +143 -132
- package/README.fr.md +143 -132
- package/README.hi.md +143 -136
- package/README.it.md +143 -132
- package/README.ja.md +143 -132
- package/README.md +15 -4
- package/README.pt-BR.md +143 -132
- package/README.zh.md +143 -132
- package/dist/doctorLite.d.ts +75 -0
- package/dist/doctorLite.d.ts.map +1 -0
- package/dist/doctorLite.js +705 -0
- package/dist/doctorLite.js.map +1 -0
- package/dist/doctorLite.test.d.ts +2 -0
- package/dist/doctorLite.test.d.ts.map +1 -0
- package/dist/doctorLite.test.js +268 -0
- package/dist/doctorLite.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +245 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/mapRender.d.ts +105 -0
- package/dist/mapRender.d.ts.map +1 -0
- package/dist/mapRender.js +718 -0
- package/dist/mapRender.js.map +1 -0
- package/dist/mapRender.test.d.ts +2 -0
- package/dist/mapRender.test.d.ts.map +1 -0
- package/dist/mapRender.test.js +571 -0
- package/dist/mapRender.test.js.map +1 -0
- package/dist/map_cli.d.ts +3 -0
- package/dist/map_cli.d.ts.map +1 -0
- package/dist/map_cli.js +278 -0
- package/dist/map_cli.js.map +1 -0
- package/dist/map_cli.test.d.ts +2 -0
- package/dist/map_cli.test.d.ts.map +1 -0
- package/dist/map_cli.test.js +320 -0
- package/dist/map_cli.test.js.map +1 -0
- package/dist/runLog.d.ts +71 -0
- package/dist/runLog.d.ts.map +1 -0
- package/dist/runLog.js +98 -0
- package/dist/runLog.js.map +1 -0
- package/dist/runLog.test.d.ts +2 -0
- package/dist/runLog.test.d.ts.map +1 -0
- package/dist/runLog.test.js +327 -0
- package/dist/runLog.test.js.map +1 -0
- package/dist/scanEnvPaths.d.ts +18 -0
- package/dist/scanEnvPaths.d.ts.map +1 -0
- package/dist/scanEnvPaths.js +177 -0
- package/dist/scanEnvPaths.js.map +1 -0
- package/dist/scanEnvPaths.test.d.ts +2 -0
- package/dist/scanEnvPaths.test.d.ts.map +1 -0
- package/dist/scanEnvPaths.test.js +250 -0
- package/dist/scanEnvPaths.test.js.map +1 -0
- package/dist/taskCluster.d.ts +62 -0
- package/dist/taskCluster.d.ts.map +1 -0
- package/dist/taskCluster.js +180 -0
- package/dist/taskCluster.js.map +1 -0
- package/dist/taskCluster.test.d.ts +2 -0
- package/dist/taskCluster.test.d.ts.map +1 -0
- package/dist/taskCluster.test.js +375 -0
- package/dist/taskCluster.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +26 -0
- package/dist/vitest.config.js.map +1 -0
- package/dist/windows.test.d.ts +6 -0
- package/dist/windows.test.d.ts.map +1 -0
- package/dist/windows.test.js +121 -0
- package/dist/windows.test.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// map_cli.test.ts
|
|
2
|
+
// Unit tests for CLI argument parsing and command execution
|
|
3
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import * as os from "node:os";
|
|
7
|
+
// Import main to test CLI behavior
|
|
8
|
+
// Note: We test parseArgs behavior through main() invocation
|
|
9
|
+
// since parseArgs is not exported directly
|
|
10
|
+
describe("map_cli", () => {
|
|
11
|
+
let tempDir;
|
|
12
|
+
let originalCwd;
|
|
13
|
+
let originalArgv;
|
|
14
|
+
let stderrOutput;
|
|
15
|
+
let stdoutOutput;
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-cli-test-"));
|
|
18
|
+
originalCwd = process.cwd();
|
|
19
|
+
originalArgv = process.argv;
|
|
20
|
+
stderrOutput = "";
|
|
21
|
+
stdoutOutput = "";
|
|
22
|
+
// Mock stderr/stdout
|
|
23
|
+
vi.spyOn(process.stderr, "write").mockImplementation((chunk) => {
|
|
24
|
+
stderrOutput += chunk;
|
|
25
|
+
return true;
|
|
26
|
+
});
|
|
27
|
+
vi.spyOn(process.stdout, "write").mockImplementation((chunk) => {
|
|
28
|
+
stdoutOutput += chunk;
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
afterEach(async () => {
|
|
33
|
+
vi.restoreAllMocks();
|
|
34
|
+
// Clean up any doMock registrations so they don't leak into subsequent tests
|
|
35
|
+
vi.doUnmock("./scanEnvPaths.js");
|
|
36
|
+
vi.doUnmock("./doctorLite.js");
|
|
37
|
+
vi.resetModules();
|
|
38
|
+
process.argv = originalArgv;
|
|
39
|
+
try {
|
|
40
|
+
process.chdir(originalCwd);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Ignore if original dir doesn't exist
|
|
44
|
+
}
|
|
45
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
46
|
+
});
|
|
47
|
+
// Helper to create a mock venv for testing
|
|
48
|
+
async function createMockVenv(venvPath) {
|
|
49
|
+
await fs.mkdir(venvPath, { recursive: true });
|
|
50
|
+
await fs.writeFile(path.join(venvPath, "pyvenv.cfg"), "home = C:\\Python311\nversion = 3.11.5\n");
|
|
51
|
+
const binDir = os.platform() === "win32" ? "Scripts" : "bin";
|
|
52
|
+
const pyExe = os.platform() === "win32" ? "python.exe" : "python";
|
|
53
|
+
await fs.mkdir(path.join(venvPath, binDir), { recursive: true });
|
|
54
|
+
await fs.writeFile(path.join(venvPath, binDir, pyExe), "fake python");
|
|
55
|
+
return path.join(venvPath, binDir, pyExe);
|
|
56
|
+
}
|
|
57
|
+
describe("argument parsing", () => {
|
|
58
|
+
it("parses --root argument", async () => {
|
|
59
|
+
const { main } = await import("./map_cli.js");
|
|
60
|
+
// Create an empty project (will find no python envs)
|
|
61
|
+
const projectDir = path.join(tempDir, "project");
|
|
62
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
63
|
+
await main(["--root", projectDir, "--out", path.join(tempDir, "out")]);
|
|
64
|
+
expect(stderrOutput).toContain("Scanning for Python environments in:");
|
|
65
|
+
expect(stderrOutput).toContain(projectDir);
|
|
66
|
+
});
|
|
67
|
+
it("parses multiple --root arguments", async () => {
|
|
68
|
+
const { main } = await import("./map_cli.js");
|
|
69
|
+
const project1 = path.join(tempDir, "project1");
|
|
70
|
+
const project2 = path.join(tempDir, "project2");
|
|
71
|
+
await fs.mkdir(project1, { recursive: true });
|
|
72
|
+
await fs.mkdir(project2, { recursive: true });
|
|
73
|
+
await main(["--root", project1, "--root", project2, "--out", path.join(tempDir, "out")]);
|
|
74
|
+
expect(stderrOutput).toContain(project1);
|
|
75
|
+
expect(stderrOutput).toContain(project2);
|
|
76
|
+
});
|
|
77
|
+
it("parses -r short form for root", async () => {
|
|
78
|
+
const { main } = await import("./map_cli.js");
|
|
79
|
+
const projectDir = path.join(tempDir, "project");
|
|
80
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
81
|
+
await main(["-r", projectDir, "--out", path.join(tempDir, "out")]);
|
|
82
|
+
expect(stderrOutput).toContain(projectDir);
|
|
83
|
+
});
|
|
84
|
+
it("parses --maxDepth argument", async () => {
|
|
85
|
+
const { main } = await import("./map_cli.js");
|
|
86
|
+
const projectDir = path.join(tempDir, "project");
|
|
87
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
88
|
+
// Just verify it runs without error with maxDepth
|
|
89
|
+
await main(["--root", projectDir, "--maxDepth", "10", "--out", path.join(tempDir, "out")]);
|
|
90
|
+
expect(stderrOutput).toContain("Scanning");
|
|
91
|
+
});
|
|
92
|
+
it("parses --concurrency argument", async () => {
|
|
93
|
+
const { main } = await import("./map_cli.js");
|
|
94
|
+
const projectDir = path.join(tempDir, "project");
|
|
95
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
96
|
+
await main(["--root", projectDir, "--concurrency", "4", "--out", path.join(tempDir, "out")]);
|
|
97
|
+
// Should run without error
|
|
98
|
+
expect(stderrOutput).toContain("Scanning");
|
|
99
|
+
});
|
|
100
|
+
it("parses --no-tasks flag", async () => {
|
|
101
|
+
const { main } = await import("./map_cli.js");
|
|
102
|
+
const projectDir = path.join(tempDir, "project");
|
|
103
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
104
|
+
await main(["--root", projectDir, "--no-tasks", "--out", path.join(tempDir, "out")]);
|
|
105
|
+
expect(stderrOutput).toContain("Scanning");
|
|
106
|
+
});
|
|
107
|
+
it("uses current directory as default root", async () => {
|
|
108
|
+
const { main } = await import("./map_cli.js");
|
|
109
|
+
// Create temp directory and chdir to it
|
|
110
|
+
const projectDir = path.join(tempDir, "cwd-project");
|
|
111
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
112
|
+
process.chdir(projectDir);
|
|
113
|
+
await main(["--out", path.join(tempDir, "out")]);
|
|
114
|
+
expect(stderrOutput).toContain("Scanning for Python environments in:");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("output generation", () => {
|
|
118
|
+
it("creates output directory if missing", async () => {
|
|
119
|
+
const { main } = await import("./map_cli.js");
|
|
120
|
+
const projectDir = path.join(tempDir, "project");
|
|
121
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
122
|
+
const outDir = path.join(tempDir, "nested", "output", "dir");
|
|
123
|
+
await main(["--root", projectDir, "--out", outDir]);
|
|
124
|
+
// Directory should be created
|
|
125
|
+
const stats = await fs.stat(outDir);
|
|
126
|
+
expect(stats.isDirectory()).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it("writes venv-map.json when envs found", async () => {
|
|
129
|
+
const { main } = await import("./map_cli.js");
|
|
130
|
+
// Create mock venv
|
|
131
|
+
const projectDir = path.join(tempDir, "project");
|
|
132
|
+
await createMockVenv(path.join(projectDir, ".venv"));
|
|
133
|
+
// Mock doctorLite to avoid actual subprocess execution
|
|
134
|
+
vi.doMock("./doctorLite.js", () => ({
|
|
135
|
+
doctorLite: vi.fn().mockResolvedValue({
|
|
136
|
+
pythonPath: path.join(projectDir, ".venv", "Scripts", "python.exe"),
|
|
137
|
+
ranAt: new Date().toISOString(),
|
|
138
|
+
status: "good",
|
|
139
|
+
score: 100,
|
|
140
|
+
summary: "Healthy",
|
|
141
|
+
facts: {
|
|
142
|
+
version: "3.11.5",
|
|
143
|
+
version_info: [3, 11, 5],
|
|
144
|
+
executable: path.join(projectDir, ".venv", "Scripts", "python.exe"),
|
|
145
|
+
prefix: path.join(projectDir, ".venv"),
|
|
146
|
+
base_prefix: "C:\\Python311",
|
|
147
|
+
bits: 64,
|
|
148
|
+
machine: "AMD64",
|
|
149
|
+
os: "windows",
|
|
150
|
+
py_path: [],
|
|
151
|
+
enable_user_site: false,
|
|
152
|
+
user_site: "",
|
|
153
|
+
},
|
|
154
|
+
findings: [],
|
|
155
|
+
}),
|
|
156
|
+
}));
|
|
157
|
+
const outDir = path.join(tempDir, "output");
|
|
158
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
159
|
+
// Note: This test may fail if no actual venvs are found due to mocking limitations
|
|
160
|
+
// The key assertion is that the function runs without throwing
|
|
161
|
+
try {
|
|
162
|
+
await main(["--root", projectDir, "--out", outDir]);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// May fail due to doctorLite trying to run actual subprocesses
|
|
166
|
+
}
|
|
167
|
+
expect(stderrOutput).toContain("Scanning");
|
|
168
|
+
});
|
|
169
|
+
it("writes venv-map.mmd mermaid file", async () => {
|
|
170
|
+
const { main } = await import("./map_cli.js");
|
|
171
|
+
const projectDir = path.join(tempDir, "project");
|
|
172
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
173
|
+
const outDir = path.join(tempDir, "output");
|
|
174
|
+
await main(["--root", projectDir, "--out", outDir]);
|
|
175
|
+
// Even with no envs, output files should be attempted
|
|
176
|
+
expect(stderrOutput).toContain("Scanning");
|
|
177
|
+
});
|
|
178
|
+
it("writes venv-map.html viewer", async () => {
|
|
179
|
+
const { main } = await import("./map_cli.js");
|
|
180
|
+
const projectDir = path.join(tempDir, "project");
|
|
181
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
182
|
+
const outDir = path.join(tempDir, "output");
|
|
183
|
+
await main(["--root", projectDir, "--out", outDir]);
|
|
184
|
+
expect(stderrOutput).toContain("Scanning");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe("CLI behavior", () => {
|
|
188
|
+
it("reports no envs found gracefully", async () => {
|
|
189
|
+
// Reset module cache so doMock takes effect on fresh import
|
|
190
|
+
vi.resetModules();
|
|
191
|
+
// Mock scanEnvPaths to return empty (real systems have base interpreters)
|
|
192
|
+
vi.doMock("./scanEnvPaths.js", () => ({
|
|
193
|
+
scanEnvPaths: vi.fn().mockResolvedValue({
|
|
194
|
+
pythonPaths: [],
|
|
195
|
+
meta: { scannedRoots: [], maxDepth: 5, foundVenvs: 0, foundBases: 0 },
|
|
196
|
+
}),
|
|
197
|
+
}));
|
|
198
|
+
const { main } = await import("./map_cli.js");
|
|
199
|
+
const emptyDir = path.join(tempDir, "empty");
|
|
200
|
+
await fs.mkdir(emptyDir, { recursive: true });
|
|
201
|
+
await main(["--root", emptyDir, "--out", path.join(tempDir, "out")]);
|
|
202
|
+
expect(stderrOutput).toContain("No Python environments found");
|
|
203
|
+
});
|
|
204
|
+
it("reports found environment count", async () => {
|
|
205
|
+
vi.resetModules();
|
|
206
|
+
const projectDir = path.join(tempDir, "project");
|
|
207
|
+
const pyPath = await createMockVenv(path.join(projectDir, ".venv"));
|
|
208
|
+
// Mock scanEnvPaths to return our mock venv (avoids system python discovery)
|
|
209
|
+
vi.doMock("./scanEnvPaths.js", () => ({
|
|
210
|
+
scanEnvPaths: vi.fn().mockResolvedValue({
|
|
211
|
+
pythonPaths: [pyPath],
|
|
212
|
+
meta: { scannedRoots: [projectDir], maxDepth: 5, foundVenvs: 1, foundBases: 0 },
|
|
213
|
+
}),
|
|
214
|
+
}));
|
|
215
|
+
// Mock doctorLite to avoid spawning the fake binary
|
|
216
|
+
vi.doMock("./doctorLite.js", () => ({
|
|
217
|
+
doctorLite: vi.fn().mockResolvedValue({
|
|
218
|
+
pythonPath: pyPath,
|
|
219
|
+
ranAt: new Date().toISOString(),
|
|
220
|
+
status: "good",
|
|
221
|
+
score: 100,
|
|
222
|
+
summary: "Healthy",
|
|
223
|
+
facts: {
|
|
224
|
+
version: "3.11.5",
|
|
225
|
+
version_info: [3, 11, 5],
|
|
226
|
+
executable: pyPath,
|
|
227
|
+
prefix: path.join(projectDir, ".venv"),
|
|
228
|
+
base_prefix: "C:\\Python311",
|
|
229
|
+
bits: 64,
|
|
230
|
+
machine: "AMD64",
|
|
231
|
+
os: "windows",
|
|
232
|
+
py_path: [],
|
|
233
|
+
enable_user_site: false,
|
|
234
|
+
user_site: "",
|
|
235
|
+
},
|
|
236
|
+
findings: [],
|
|
237
|
+
}),
|
|
238
|
+
}));
|
|
239
|
+
const { main } = await import("./map_cli.js");
|
|
240
|
+
await main(["--root", projectDir, "--out", path.join(tempDir, "out")]);
|
|
241
|
+
expect(stderrOutput).toContain("Found");
|
|
242
|
+
expect(stderrOutput).toContain("Python executables");
|
|
243
|
+
});
|
|
244
|
+
it("prints mermaid to stdout", async () => {
|
|
245
|
+
const { main } = await import("./map_cli.js");
|
|
246
|
+
const projectDir = path.join(tempDir, "project");
|
|
247
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
248
|
+
await main(["--root", projectDir, "--out", path.join(tempDir, "out")]);
|
|
249
|
+
// Even if no envs found, shouldn't throw
|
|
250
|
+
expect(stderrOutput).toContain("Scanning");
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe("run log integration", () => {
|
|
254
|
+
it("loads run log from default location", async () => {
|
|
255
|
+
const { main } = await import("./map_cli.js");
|
|
256
|
+
const projectDir = path.join(tempDir, "project");
|
|
257
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
258
|
+
// Create a run log file
|
|
259
|
+
const outDir = path.join(tempDir, "out");
|
|
260
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
261
|
+
await fs.writeFile(path.join(outDir, "runs.jsonl"), JSON.stringify({
|
|
262
|
+
version: "1.0",
|
|
263
|
+
runId: "test-run-1",
|
|
264
|
+
at: new Date().toISOString(),
|
|
265
|
+
task: { name: "test", command: "pytest" },
|
|
266
|
+
selected: { pythonPath: "C:\\python.exe", status: "good" },
|
|
267
|
+
outcome: { ok: true, exitCode: 0, durationMs: 100 },
|
|
268
|
+
}) + "\n");
|
|
269
|
+
await main(["--root", projectDir, "--out", outDir]);
|
|
270
|
+
// Should mention task runs if found
|
|
271
|
+
expect(stderrOutput).toContain("Scanning");
|
|
272
|
+
});
|
|
273
|
+
it("loads run log from custom path", async () => {
|
|
274
|
+
const { main } = await import("./map_cli.js");
|
|
275
|
+
const projectDir = path.join(tempDir, "project");
|
|
276
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
277
|
+
const customLogPath = path.join(tempDir, "custom-runs.jsonl");
|
|
278
|
+
await fs.writeFile(customLogPath, "");
|
|
279
|
+
await main([
|
|
280
|
+
"--root", projectDir,
|
|
281
|
+
"--out", path.join(tempDir, "out"),
|
|
282
|
+
"--runlog", customLogPath,
|
|
283
|
+
]);
|
|
284
|
+
expect(stderrOutput).toContain("Scanning");
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe("error handling", () => {
|
|
288
|
+
it("handles invalid root directory gracefully", async () => {
|
|
289
|
+
const { main } = await import("./map_cli.js");
|
|
290
|
+
const nonexistentDir = path.join(tempDir, "nonexistent");
|
|
291
|
+
// Should not throw
|
|
292
|
+
await main(["--root", nonexistentDir, "--out", path.join(tempDir, "out")]);
|
|
293
|
+
expect(stderrOutput).toContain("Scanning");
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
describe("flags and options", () => {
|
|
297
|
+
it("parses --strict flag", async () => {
|
|
298
|
+
const { main } = await import("./map_cli.js");
|
|
299
|
+
const projectDir = path.join(tempDir, "project");
|
|
300
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
301
|
+
await main(["--root", projectDir, "--strict", "--out", path.join(tempDir, "out")]);
|
|
302
|
+
expect(stderrOutput).toContain("Scanning");
|
|
303
|
+
});
|
|
304
|
+
it("parses --httpsProbe flag", async () => {
|
|
305
|
+
const { main } = await import("./map_cli.js");
|
|
306
|
+
const projectDir = path.join(tempDir, "project");
|
|
307
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
308
|
+
await main(["--root", projectDir, "--httpsProbe", "--out", path.join(tempDir, "out")]);
|
|
309
|
+
expect(stderrOutput).toContain("Scanning");
|
|
310
|
+
});
|
|
311
|
+
it("parses --minScore filter", async () => {
|
|
312
|
+
const { main } = await import("./map_cli.js");
|
|
313
|
+
const projectDir = path.join(tempDir, "project");
|
|
314
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
315
|
+
await main(["--root", projectDir, "--minScore", "50", "--out", path.join(tempDir, "out")]);
|
|
316
|
+
expect(stderrOutput).toContain("Scanning");
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=map_cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map_cli.test.js","sourceRoot":"","sources":["../map_cli.test.ts"],"names":[],"mappings":"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"}
|
package/dist/runLog.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type RunLogEventV1 = {
|
|
2
|
+
version: "1.0";
|
|
3
|
+
runId: string;
|
|
4
|
+
at: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
task: {
|
|
7
|
+
name: string;
|
|
8
|
+
command: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
requirements?: {
|
|
11
|
+
python?: string;
|
|
12
|
+
packages?: string[];
|
|
13
|
+
features?: string[];
|
|
14
|
+
tags?: string[];
|
|
15
|
+
requireX64?: boolean;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
selected: {
|
|
19
|
+
pythonPath: string;
|
|
20
|
+
envId?: string;
|
|
21
|
+
score?: number;
|
|
22
|
+
status?: "good" | "warn" | "bad" | "unknown";
|
|
23
|
+
};
|
|
24
|
+
outcome: {
|
|
25
|
+
ok: boolean;
|
|
26
|
+
exitCode?: number | null;
|
|
27
|
+
durationMs?: number;
|
|
28
|
+
errorClass?: string;
|
|
29
|
+
stderrSnippet?: string;
|
|
30
|
+
};
|
|
31
|
+
doctor?: {
|
|
32
|
+
dominantIssue?: string;
|
|
33
|
+
findings?: string[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export type RunLogReadOptions = {
|
|
37
|
+
maxLines?: number;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Generate a run ID.
|
|
41
|
+
* @param input Optional deterministic seed (task signature). If omitted, returns UUID.
|
|
42
|
+
*/
|
|
43
|
+
export declare function newRunId(input?: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Append a run event to the JSONL log file.
|
|
46
|
+
* Creates parent directories if needed.
|
|
47
|
+
*/
|
|
48
|
+
export declare function appendRunLog(logPath: string, evt: RunLogEventV1): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Read run events from a JSONL log file.
|
|
51
|
+
* Returns the last `maxLines` events (default 5000).
|
|
52
|
+
* Skips malformed lines gracefully.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readRunLog(logPath: string, opts?: RunLogReadOptions): Promise<RunLogEventV1[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Count runs by outcome status.
|
|
57
|
+
*/
|
|
58
|
+
export declare function summarizeRuns(runs: RunLogEventV1[]): {
|
|
59
|
+
total: number;
|
|
60
|
+
passed: number;
|
|
61
|
+
failed: number;
|
|
62
|
+
byTask: Map<string, {
|
|
63
|
+
passed: number;
|
|
64
|
+
failed: number;
|
|
65
|
+
}>;
|
|
66
|
+
byEnv: Map<string, {
|
|
67
|
+
passed: number;
|
|
68
|
+
failed: number;
|
|
69
|
+
}>;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=runLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runLog.d.ts","sourceRoot":"","sources":["../runLog.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE;YACb,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,UAAU,CAAC,EAAE,OAAO,CAAC;SACtB,CAAC;KACH,CAAC;IAEF,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;KAC9C,CAAC;IAEF,OAAO,EAAE;QACP,EAAE,EAAE,OAAO,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrF;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAwBxG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CA8BA"}
|
package/dist/runLog.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// runLog.ts
|
|
2
|
+
//
|
|
3
|
+
// Append-only JSONL run log for tracking task executions against Python envs.
|
|
4
|
+
// Each line is one RunLogEventV1 — durable, streaming-friendly, keeps forever.
|
|
5
|
+
//
|
|
6
|
+
// Used by mapRender to create:
|
|
7
|
+
// - task nodes (one per run)
|
|
8
|
+
// - ROUTES_TASK_TO edges (task → env)
|
|
9
|
+
// - FAILED_RUN edges (task → env with dominant issue label)
|
|
10
|
+
import * as fs from "node:fs/promises";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
13
|
+
/**
|
|
14
|
+
* Generate a run ID.
|
|
15
|
+
* @param input Optional deterministic seed (task signature). If omitted, returns UUID.
|
|
16
|
+
*/
|
|
17
|
+
export function newRunId(input) {
|
|
18
|
+
if (!input)
|
|
19
|
+
return randomUUID();
|
|
20
|
+
// deterministic id from task signature if desired
|
|
21
|
+
const h = createHash("sha256").update(input).digest("hex").slice(0, 16);
|
|
22
|
+
return `run_${h}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Append a run event to the JSONL log file.
|
|
26
|
+
* Creates parent directories if needed.
|
|
27
|
+
*/
|
|
28
|
+
export async function appendRunLog(logPath, evt) {
|
|
29
|
+
await fs.mkdir(path.dirname(logPath), { recursive: true });
|
|
30
|
+
const line = JSON.stringify(evt) + "\n";
|
|
31
|
+
await fs.appendFile(logPath, line, "utf8");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read run events from a JSONL log file.
|
|
35
|
+
* Returns the last `maxLines` events (default 5000).
|
|
36
|
+
* Skips malformed lines gracefully.
|
|
37
|
+
*/
|
|
38
|
+
export async function readRunLog(logPath, opts = {}) {
|
|
39
|
+
const maxLines = opts.maxLines ?? 5000;
|
|
40
|
+
let raw = "";
|
|
41
|
+
try {
|
|
42
|
+
raw = await fs.readFile(logPath, "utf8");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const lines = raw.trimEnd().split("\n");
|
|
48
|
+
const tail = lines.slice(Math.max(0, lines.length - maxLines));
|
|
49
|
+
const out = [];
|
|
50
|
+
for (const l of tail) {
|
|
51
|
+
if (!l.trim())
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
const obj = JSON.parse(l);
|
|
55
|
+
if (obj?.version === "1.0")
|
|
56
|
+
out.push(obj);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// ignore malformed lines
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Count runs by outcome status.
|
|
66
|
+
*/
|
|
67
|
+
export function summarizeRuns(runs) {
|
|
68
|
+
const byTask = new Map();
|
|
69
|
+
const byEnv = new Map();
|
|
70
|
+
let passed = 0;
|
|
71
|
+
let failed = 0;
|
|
72
|
+
for (const run of runs) {
|
|
73
|
+
if (run.outcome.ok) {
|
|
74
|
+
passed++;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
failed++;
|
|
78
|
+
}
|
|
79
|
+
// By task name
|
|
80
|
+
const taskName = run.task.name;
|
|
81
|
+
const taskStats = byTask.get(taskName) ?? { passed: 0, failed: 0 };
|
|
82
|
+
if (run.outcome.ok)
|
|
83
|
+
taskStats.passed++;
|
|
84
|
+
else
|
|
85
|
+
taskStats.failed++;
|
|
86
|
+
byTask.set(taskName, taskStats);
|
|
87
|
+
// By env path
|
|
88
|
+
const envPath = run.selected.pythonPath;
|
|
89
|
+
const envStats = byEnv.get(envPath) ?? { passed: 0, failed: 0 };
|
|
90
|
+
if (run.outcome.ok)
|
|
91
|
+
envStats.passed++;
|
|
92
|
+
else
|
|
93
|
+
envStats.failed++;
|
|
94
|
+
byEnv.set(envPath, envStats);
|
|
95
|
+
}
|
|
96
|
+
return { total: runs.length, passed, failed, byTask, byEnv };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=runLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runLog.js","sourceRoot":"","sources":["../runLog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runLog.test.d.ts","sourceRoot":"","sources":["../runLog.test.ts"],"names":[],"mappings":""}
|