vskill 0.4.0 → 0.4.2
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/eval/__tests__/benchmark.test.js +29 -0
- package/dist/eval/__tests__/benchmark.test.js.map +1 -1
- package/dist/eval/__tests__/comparator.test.js +80 -0
- package/dist/eval/__tests__/comparator.test.js.map +1 -1
- package/dist/eval/__tests__/judge.test.js +75 -1
- package/dist/eval/__tests__/judge.test.js.map +1 -1
- package/dist/eval/__tests__/mcp-detector.test.js +55 -0
- package/dist/eval/__tests__/mcp-detector.test.js.map +1 -1
- package/dist/eval/__tests__/prompt-builder.test.js +18 -0
- package/dist/eval/__tests__/prompt-builder.test.js.map +1 -1
- package/dist/eval/action-items.d.ts +21 -0
- package/dist/eval/action-items.js +97 -0
- package/dist/eval/action-items.js.map +1 -0
- package/dist/eval/benchmark-history.d.ts +4 -4
- package/dist/eval/benchmark-history.js.map +1 -1
- package/dist/eval/benchmark.d.ts +18 -1
- package/dist/eval/benchmark.js.map +1 -1
- package/dist/eval/comparator.d.ts +2 -1
- package/dist/eval/comparator.js +10 -3
- package/dist/eval/comparator.js.map +1 -1
- package/dist/eval/judge.d.ts +3 -1
- package/dist/eval/judge.js +18 -2
- package/dist/eval/judge.js.map +1 -1
- package/dist/eval/llm.js +5 -7
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval/mcp-detector.js +30 -0
- package/dist/eval/mcp-detector.js.map +1 -1
- package/dist/eval/prompt-builder.js +22 -1
- package/dist/eval/prompt-builder.js.map +1 -1
- package/dist/eval/skill-scanner.d.ts +6 -0
- package/dist/eval/skill-scanner.js +55 -9
- package/dist/eval/skill-scanner.js.map +1 -1
- package/dist/eval-server/api-routes.js +37 -1
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/skill-create-routes.js +17 -2
- package/dist/eval-server/skill-create-routes.js.map +1 -1
- package/dist/eval-ui/assets/index-BHqTxODT.js +75 -0
- package/dist/eval-ui/index.html +1 -1
- package/dist/utils/__tests__/resolve-binary.integration.test.d.ts +1 -0
- package/dist/utils/__tests__/resolve-binary.integration.test.js +138 -0
- package/dist/utils/__tests__/resolve-binary.integration.test.js.map +1 -0
- package/dist/utils/resolve-binary.js +27 -8
- package/dist/utils/resolve-binary.js.map +1 -1
- package/package.json +1 -1
- package/dist/eval-ui/assets/index-CU39Pi0h.js +0 -75
package/dist/eval-ui/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Skill Studio</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BHqTxODT.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-WYEaSjlU.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for resolve-binary.ts
|
|
3
|
+
* These test against the REAL filesystem and PATH, not mocks.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
// Import the REAL module (no mocks)
|
|
9
|
+
import { resolveCliBinary, enhancedPath, clearResolveCache } from "../resolve-binary.js";
|
|
10
|
+
describe("resolveCliBinary integration", () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
clearResolveCache();
|
|
13
|
+
});
|
|
14
|
+
it("resolves 'node' to an absolute path that exists", () => {
|
|
15
|
+
const resolved = resolveCliBinary("node");
|
|
16
|
+
expect(resolved).toMatch(/^\//); // absolute path on Unix
|
|
17
|
+
expect(existsSync(resolved)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("resolved 'node' is actually executable", () => {
|
|
20
|
+
const resolved = resolveCliBinary("node");
|
|
21
|
+
const version = execSync(`"${resolved}" --version`, { timeout: 5_000 }).toString().trim();
|
|
22
|
+
expect(version).toMatch(/^v\d+/);
|
|
23
|
+
});
|
|
24
|
+
it("resolves 'npm' to an absolute path that exists", () => {
|
|
25
|
+
const resolved = resolveCliBinary("npm");
|
|
26
|
+
expect(resolved).toMatch(/^\//);
|
|
27
|
+
expect(existsSync(resolved)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it("returns bare name for nonexistent binary", () => {
|
|
30
|
+
const resolved = resolveCliBinary("totally-fake-binary-xyz-12345");
|
|
31
|
+
// Should fall through all strategies and return the bare name
|
|
32
|
+
expect(resolved).toBe("totally-fake-binary-xyz-12345");
|
|
33
|
+
});
|
|
34
|
+
it("caches results (second call is instant)", () => {
|
|
35
|
+
clearResolveCache();
|
|
36
|
+
const t1 = Date.now();
|
|
37
|
+
const first = resolveCliBinary("node");
|
|
38
|
+
const d1 = Date.now() - t1;
|
|
39
|
+
const t2 = Date.now();
|
|
40
|
+
const second = resolveCliBinary("node");
|
|
41
|
+
const d2 = Date.now() - t2;
|
|
42
|
+
expect(first).toBe(second);
|
|
43
|
+
// Cached call should be <1ms (no execSync)
|
|
44
|
+
expect(d2).toBeLessThan(5);
|
|
45
|
+
});
|
|
46
|
+
it("resolves different binaries to different paths", () => {
|
|
47
|
+
const node = resolveCliBinary("node");
|
|
48
|
+
const npm = resolveCliBinary("npm");
|
|
49
|
+
// They should be different files
|
|
50
|
+
expect(node).not.toBe(npm);
|
|
51
|
+
expect(node).toContain("node");
|
|
52
|
+
expect(npm).toContain("npm");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("enhancedPath integration", () => {
|
|
56
|
+
it("returns a string containing the original PATH", () => {
|
|
57
|
+
const original = "/usr/bin:/bin";
|
|
58
|
+
const enhanced = enhancedPath(original);
|
|
59
|
+
expect(enhanced).toContain(original);
|
|
60
|
+
});
|
|
61
|
+
it("adds at least one extra directory on macOS/Linux", () => {
|
|
62
|
+
if (process.platform === "win32")
|
|
63
|
+
return; // skip on Windows
|
|
64
|
+
const original = "/just/one/dir";
|
|
65
|
+
const enhanced = enhancedPath(original);
|
|
66
|
+
const parts = enhanced.split(":");
|
|
67
|
+
// Should have more than 1 part (the original + at least 1 extra)
|
|
68
|
+
expect(parts.length).toBeGreaterThan(1);
|
|
69
|
+
});
|
|
70
|
+
it("all added directories actually exist on disk", () => {
|
|
71
|
+
const original = "/just/one/dir";
|
|
72
|
+
const enhanced = enhancedPath(original);
|
|
73
|
+
const parts = enhanced.split(":");
|
|
74
|
+
// Skip the first part (our fake original)
|
|
75
|
+
const added = parts.slice(1);
|
|
76
|
+
for (const dir of added) {
|
|
77
|
+
expect(existsSync(dir)).toBe(true);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
it("does not duplicate paths", () => {
|
|
81
|
+
const enhanced = enhancedPath(process.env.PATH);
|
|
82
|
+
const parts = enhanced.split(":");
|
|
83
|
+
const unique = new Set(parts);
|
|
84
|
+
expect(parts.length).toBe(unique.size);
|
|
85
|
+
});
|
|
86
|
+
it("uses process.env.PATH when no argument provided", () => {
|
|
87
|
+
const enhanced = enhancedPath();
|
|
88
|
+
expect(enhanced).toContain(process.env.PATH.split(":")[0]);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("end-to-end: spawn with resolved binary", () => {
|
|
92
|
+
it("can spawn a resolved binary and get output", async () => {
|
|
93
|
+
const { spawn } = await import("node:child_process");
|
|
94
|
+
const resolved = resolveCliBinary("node");
|
|
95
|
+
const output = await new Promise((resolve, reject) => {
|
|
96
|
+
const proc = spawn(resolved, ["-e", "console.log('hello from resolved')"], {
|
|
97
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
98
|
+
env: { ...process.env, PATH: enhancedPath() },
|
|
99
|
+
});
|
|
100
|
+
let stdout = "";
|
|
101
|
+
proc.stdout.on("data", (d) => { stdout += d.toString(); });
|
|
102
|
+
proc.on("close", (code) => {
|
|
103
|
+
if (code === 0)
|
|
104
|
+
resolve(stdout.trim());
|
|
105
|
+
else
|
|
106
|
+
reject(new Error(`exit code ${code}`));
|
|
107
|
+
});
|
|
108
|
+
proc.on("error", reject);
|
|
109
|
+
});
|
|
110
|
+
expect(output).toBe("hello from resolved");
|
|
111
|
+
});
|
|
112
|
+
it("spawn with enhanced PATH can find binaries even with minimal PATH", async () => {
|
|
113
|
+
const { spawn } = await import("node:child_process");
|
|
114
|
+
const resolved = resolveCliBinary("node");
|
|
115
|
+
// Simulate a minimal PATH that doesn't include node's directory
|
|
116
|
+
const output = await new Promise((resolve, reject) => {
|
|
117
|
+
const proc = spawn(resolved, ["-e", "console.log(process.env.PATH)"], {
|
|
118
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
119
|
+
// Give it a minimal PATH but enhance it
|
|
120
|
+
env: { PATH: enhancedPath("/tmp") },
|
|
121
|
+
});
|
|
122
|
+
let stdout = "";
|
|
123
|
+
proc.stdout.on("data", (d) => { stdout += d.toString(); });
|
|
124
|
+
proc.on("close", (code) => {
|
|
125
|
+
if (code === 0)
|
|
126
|
+
resolve(stdout.trim());
|
|
127
|
+
else
|
|
128
|
+
reject(new Error(`exit code ${code}`));
|
|
129
|
+
});
|
|
130
|
+
proc.on("error", reject);
|
|
131
|
+
});
|
|
132
|
+
// The enhanced PATH should include common dirs
|
|
133
|
+
expect(output).toContain("/tmp");
|
|
134
|
+
// Should also include at least one more directory
|
|
135
|
+
expect(output.split(":").length).toBeGreaterThan(1);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=resolve-binary.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-binary.integration.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/resolve-binary.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,12 +46,23 @@ export function resolveCliBinary(name) {
|
|
|
46
46
|
export function enhancedPath(currentPath) {
|
|
47
47
|
const base = currentPath || process.env.PATH || "";
|
|
48
48
|
const extra = getExtraPaths();
|
|
49
|
-
// Deduplicate
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
// Deduplicate the entire PATH: base entries + extra dirs
|
|
50
|
+
// Preserves first-occurrence order (important for PATH precedence)
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
const deduped = [];
|
|
53
|
+
for (const dir of base.split(delimiter)) {
|
|
54
|
+
if (dir && !seen.has(dir)) {
|
|
55
|
+
seen.add(dir);
|
|
56
|
+
deduped.push(dir);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const dir of extra) {
|
|
60
|
+
if (!seen.has(dir)) {
|
|
61
|
+
seen.add(dir);
|
|
62
|
+
deduped.push(dir);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return deduped.join(delimiter);
|
|
55
66
|
}
|
|
56
67
|
/** Clear the resolution cache (useful for testing) */
|
|
57
68
|
export function clearResolveCache() {
|
|
@@ -105,11 +116,19 @@ function tryLoginShellWhich(name) {
|
|
|
105
116
|
const shell = process.env.SHELL || "/bin/sh";
|
|
106
117
|
try {
|
|
107
118
|
// Use login (-l) to load full PATH from .zshrc/.bashrc/.profile
|
|
108
|
-
//
|
|
119
|
+
// IMPORTANT: Pass minimal env with only HOME and USER so the login shell
|
|
120
|
+
// starts fresh and sources profile files from scratch. If we pass the
|
|
121
|
+
// parent's restricted PATH, the profile scripts may not work properly.
|
|
109
122
|
const result = execSync(`${shell} -lc 'which ${name} 2>/dev/null'`, {
|
|
110
123
|
stdio: ["pipe", "pipe", "pipe"],
|
|
111
124
|
timeout: 5_000,
|
|
112
|
-
env: {
|
|
125
|
+
env: {
|
|
126
|
+
HOME: process.env.HOME || homedir(),
|
|
127
|
+
USER: process.env.USER || "",
|
|
128
|
+
SHELL: shell,
|
|
129
|
+
TERM: process.env.TERM || "xterm-256color",
|
|
130
|
+
PS1: "", // suppress prompt rendering
|
|
131
|
+
},
|
|
113
132
|
}).toString().trim();
|
|
114
133
|
if (result && !result.includes("not found") && existsSync(result)) {
|
|
115
134
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-binary.js","sourceRoot":"","sources":["../../src/utils/resolve-binary.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qCAAqC;AACrC,EAAE;AACF,sEAAsE;AACtE,gDAAgD;AAChD,qEAAqE;AACrE,gEAAgE;AAChE,wDAAwD;AACxD,wDAAwD;AACxD,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,qCAAqC;AACrC,8EAA8E;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE5C,sEAAsE;AACtE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,
|
|
1
|
+
{"version":3,"file":"resolve-binary.js","sourceRoot":"","sources":["../../src/utils/resolve-binary.ts"],"names":[],"mappings":"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"}
|