vskill 0.5.104 → 0.5.106
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.md +123 -2
- package/agents.json +1 -1
- package/dist/agents/agents-registry.d.ts +0 -1
- package/dist/agents/agents-registry.js +10 -30
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/api/client.d.ts +21 -0
- package/dist/api/client.js +39 -5
- package/dist/api/client.js.map +1 -1
- package/dist/commands/diff.d.ts +2 -5
- package/dist/commands/diff.js +82 -117
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/eval/serve.js +4 -0
- package/dist/commands/eval/serve.js.map +1 -1
- package/dist/commands/keys.d.ts +14 -0
- package/dist/commands/keys.js +166 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/masked-stdin.d.ts +14 -0
- package/dist/commands/masked-stdin.js +79 -0
- package/dist/commands/masked-stdin.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -29
- package/dist/commands/skill.js +6 -32
- package/dist/commands/skill.js.map +1 -1
- package/dist/eval/anthropic-catalog.d.ts +49 -0
- package/dist/eval/anthropic-catalog.js +238 -0
- package/dist/eval/anthropic-catalog.js.map +1 -0
- package/dist/eval/llm.d.ts +1 -1
- package/dist/eval/llm.js +68 -10
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval/mcp-detector.js +24 -3
- package/dist/eval/mcp-detector.js.map +1 -1
- package/dist/eval/model-resolver.d.ts +39 -0
- package/dist/eval/model-resolver.js +94 -0
- package/dist/eval/model-resolver.js.map +1 -0
- package/dist/eval/pricing.js +42 -16
- package/dist/eval/pricing.js.map +1 -1
- package/dist/eval-server/api-routes.d.ts +9 -0
- package/dist/eval-server/api-routes.js +241 -73
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/authoring-routes.js +21 -1
- package/dist/eval-server/authoring-routes.js.map +1 -1
- package/dist/eval-server/boot-preflight.js +8 -10
- package/dist/eval-server/boot-preflight.js.map +1 -1
- package/dist/eval-server/darwin-migrator.d.ts +57 -0
- package/dist/eval-server/darwin-migrator.js +169 -0
- package/dist/eval-server/darwin-migrator.js.map +1 -0
- package/dist/eval-server/eval-server.d.ts +1 -0
- package/dist/eval-server/eval-server.js +21 -0
- package/dist/eval-server/eval-server.js.map +1 -1
- package/dist/eval-server/integration-routes.js +7 -0
- package/dist/eval-server/integration-routes.js.map +1 -1
- package/dist/eval-server/platform-proxy.d.ts +18 -0
- package/dist/eval-server/platform-proxy.js +153 -0
- package/dist/eval-server/platform-proxy.js.map +1 -0
- package/dist/eval-server/providers.d.ts +7 -12
- package/dist/eval-server/providers.js +13 -15
- package/dist/eval-server/providers.js.map +1 -1
- package/dist/eval-server/settings-store.d.ts +31 -26
- package/dist/eval-server/settings-store.js +246 -143
- package/dist/eval-server/settings-store.js.map +1 -1
- package/dist/eval-server/skill-create-routes.js +18 -0
- package/dist/eval-server/skill-create-routes.js.map +1 -1
- package/dist/eval-server/skill-name-resolver.d.ts +35 -0
- package/dist/eval-server/skill-name-resolver.js +146 -0
- package/dist/eval-server/skill-name-resolver.js.map +1 -0
- package/dist/eval-ui/assets/{CommandPalette-DiPALzlG.js → CommandPalette-COqdrmRl.js} +1 -1
- package/dist/eval-ui/assets/CreateSkillPage-C3IjO8es.js +12 -0
- package/dist/eval-ui/assets/UpdateDropdown-DnKKMBBN.js +1 -0
- package/dist/eval-ui/assets/index-Dmja1p3A.css +1 -0
- package/dist/eval-ui/assets/index-KIcQ5e5a.js +102 -0
- package/dist/eval-ui/index.html +2 -2
- package/dist/first-run-onboarding.d.ts +19 -0
- package/dist/first-run-onboarding.js +104 -0
- package/dist/first-run-onboarding.js.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/canonical.js +12 -13
- package/dist/installer/canonical.js.map +1 -1
- package/dist/utils/resolve-binary.js +7 -8
- package/dist/utils/resolve-binary.js.map +1 -1
- package/package.json +5 -2
- package/dist/eval-ui/assets/CreateSkillPage-BMrFELep.js +0 -12
- package/dist/eval-ui/assets/UpdateDropdown-Bj8kZzuR.js +0 -1
- package/dist/eval-ui/assets/_shimNode-D3bBqrAh.js +0 -1
- package/dist/eval-ui/assets/index-BSPDkfZG.js +0 -102
- package/dist/eval-ui/assets/index-C0Gc_4KC.css +0 -1
- package/dist/eval-ui/assets/resolve-binary-DIxhrZ6O.js +0 -2
package/dist/commands/diff.js
CHANGED
|
@@ -1,139 +1,104 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// vskill diff
|
|
3
|
-
// bundle (SKILL.md + scripts + references + evals). Delegates to the platform
|
|
4
|
-
// `/versions/compare` endpoint which returns per-file patches.
|
|
2
|
+
// `vskill diff <skill> <from> <to>` — multi-file version diff renderer.
|
|
5
3
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
4
|
+
// Fetches GitHub-backed compare data via the platform /versions/compare
|
|
5
|
+
// endpoint and renders it to stdout. Zero shell-outs (no `git`, no `diff`);
|
|
6
|
+
// pure fetch + stdout.write. Works on Windows cmd/PowerShell because it uses
|
|
7
|
+
// raw ANSI escape codes that Windows Terminal and modern cmd.exe render
|
|
8
|
+
// natively (conhost: enabled since Windows 10 1511+).
|
|
9
|
+
//
|
|
10
|
+
// Flags:
|
|
11
|
+
// default unified color diff (respects TTY + NO_COLOR/FORCE_COLOR)
|
|
12
|
+
// --stat per-file `filename +N -M` summary with a totals line
|
|
13
|
+
// --json pretty-printed raw compare response, no colors
|
|
14
|
+
// --files glob filter applied via minimatch
|
|
15
|
+
//
|
|
16
|
+
// Exit code: 0 on success, 1 on fetch error / non-OK HTTP.
|
|
9
17
|
// ---------------------------------------------------------------------------
|
|
10
18
|
import { minimatch } from "minimatch";
|
|
11
|
-
import { compareVersions
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
import { compareVersions } from "../api/client.js";
|
|
20
|
+
const ANSI = {
|
|
21
|
+
green: "\x1b[32m",
|
|
22
|
+
red: "\x1b[31m",
|
|
23
|
+
grey: "\x1b[90m",
|
|
24
|
+
cyan: "\x1b[36m",
|
|
25
|
+
bold: "\x1b[1m",
|
|
26
|
+
reset: "\x1b[0m",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Color output decision. Matches conventions used by git, diff, and ls:
|
|
30
|
+
* • FORCE_COLOR=1 → force colors on
|
|
31
|
+
* • NO_COLOR=1 → force colors off (https://no-color.org/)
|
|
32
|
+
* • else → colors iff stdout is a TTY
|
|
33
|
+
*/
|
|
34
|
+
function shouldColor() {
|
|
35
|
+
if (process.env.FORCE_COLOR && process.env.FORCE_COLOR !== "0")
|
|
25
36
|
return true;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return useColors() ? `${code}${text}${RESET}` : text;
|
|
30
|
-
}
|
|
31
|
-
function write(s) {
|
|
32
|
-
process.stdout.write(s);
|
|
33
|
-
}
|
|
34
|
-
function writeErr(s) {
|
|
35
|
-
process.stderr.write(s);
|
|
36
|
-
}
|
|
37
|
-
// ---- Filtering ------------------------------------------------------------
|
|
38
|
-
function filterFiles(files, pattern) {
|
|
39
|
-
if (!pattern)
|
|
40
|
-
return files;
|
|
41
|
-
return files.filter((f) => minimatch(f.filename, pattern));
|
|
42
|
-
}
|
|
43
|
-
// ---- Output modes ---------------------------------------------------------
|
|
44
|
-
function printJson(data) {
|
|
45
|
-
// Explicitly serialize without colors regardless of TTY state.
|
|
46
|
-
write(JSON.stringify(data, null, 2) + "\n");
|
|
47
|
-
}
|
|
48
|
-
function printStat(files) {
|
|
49
|
-
if (files.length === 0) {
|
|
50
|
-
write("No files changed.\n");
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
// Compute column widths for nice alignment.
|
|
54
|
-
const maxName = files.reduce((m, f) => Math.max(m, f.filename.length), 0);
|
|
55
|
-
let totalAdd = 0;
|
|
56
|
-
let totalDel = 0;
|
|
57
|
-
for (const f of files) {
|
|
58
|
-
totalAdd += f.additions || 0;
|
|
59
|
-
totalDel += f.deletions || 0;
|
|
60
|
-
const name = f.filename.padEnd(maxName, " ");
|
|
61
|
-
const plus = color(GREEN, `+${f.additions || 0}`);
|
|
62
|
-
const minus = color(RED, `-${f.deletions || 0}`);
|
|
63
|
-
write(`${name} ${plus} ${minus}\n`);
|
|
64
|
-
}
|
|
65
|
-
const sep = "-".repeat(Math.max(maxName, 10));
|
|
66
|
-
write(`${sep}\n`);
|
|
67
|
-
const totalLabel = `${files.length} file${files.length === 1 ? "" : "s"} changed`.padEnd(maxName, " ");
|
|
68
|
-
write(`${totalLabel} ${color(GREEN, `+${totalAdd}`)} ${color(RED, `-${totalDel}`)}\n`);
|
|
69
|
-
}
|
|
70
|
-
function printColorDiff(files, result) {
|
|
71
|
-
if (files.length === 0) {
|
|
72
|
-
write("No files changed.\n");
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (result.source === "local-content") {
|
|
76
|
-
write(color(GREY, "Showing SKILL.md diff only — full bundle diff unavailable for this version.\n\n"));
|
|
77
|
-
}
|
|
78
|
-
else if (result.githubCompareUrl) {
|
|
79
|
-
write(color(GREY, `View on GitHub: ${result.githubCompareUrl}\n\n`));
|
|
80
|
-
}
|
|
81
|
-
for (const f of files) {
|
|
82
|
-
// File header
|
|
83
|
-
write(color(BOLD, `diff --skill ${f.filename}\n`));
|
|
84
|
-
write(color(GREY, `status: ${f.status} `) +
|
|
85
|
-
color(GREEN, `+${f.additions || 0}`) +
|
|
86
|
-
" " +
|
|
87
|
-
color(RED, `-${f.deletions || 0}`) +
|
|
88
|
-
"\n");
|
|
89
|
-
const patch = f.patch ?? "";
|
|
90
|
-
if (!patch) {
|
|
91
|
-
write(color(GREY, "(no patch available)\n\n"));
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
for (const rawLine of patch.split("\n")) {
|
|
95
|
-
// Preserve the raw line. Unified-diff convention:
|
|
96
|
-
// '+' added, '-' removed, '@@' hunk header, ' ' context, '\\' no-newline
|
|
97
|
-
if (rawLine.startsWith("@@")) {
|
|
98
|
-
write(color(GREY, rawLine) + "\n");
|
|
99
|
-
}
|
|
100
|
-
else if (rawLine.startsWith("+") && !rawLine.startsWith("+++")) {
|
|
101
|
-
write(color(GREEN, rawLine) + "\n");
|
|
102
|
-
}
|
|
103
|
-
else if (rawLine.startsWith("-") && !rawLine.startsWith("---")) {
|
|
104
|
-
write(color(RED, rawLine) + "\n");
|
|
105
|
-
}
|
|
106
|
-
else if (rawLine.startsWith("+++") || rawLine.startsWith("---")) {
|
|
107
|
-
write(color(GREY, rawLine) + "\n");
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
write(rawLine + "\n");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
write("\n");
|
|
114
|
-
}
|
|
37
|
+
if (process.env.NO_COLOR)
|
|
38
|
+
return false;
|
|
39
|
+
return !!process.stdout.isTTY;
|
|
115
40
|
}
|
|
116
|
-
|
|
117
|
-
export async function diffCommand(skill, from, to, opts) {
|
|
41
|
+
export async function diffCommand(skill, from, to, opts = {}) {
|
|
118
42
|
let data;
|
|
119
43
|
try {
|
|
120
44
|
data = await compareVersions(skill, from, to);
|
|
121
45
|
}
|
|
122
46
|
catch (err) {
|
|
123
47
|
const msg = err instanceof Error ? err.message : String(err);
|
|
124
|
-
|
|
48
|
+
process.stderr.write(`vskill diff: ${msg}\n`);
|
|
125
49
|
process.exit(1);
|
|
126
|
-
return;
|
|
127
50
|
}
|
|
128
|
-
const
|
|
51
|
+
const files = opts.files
|
|
52
|
+
? data.files.filter((f) => minimatch(f.filename, opts.files))
|
|
53
|
+
: data.files;
|
|
129
54
|
if (opts.json) {
|
|
130
|
-
|
|
55
|
+
// --json emits raw compare response with filtered file list, pretty-printed,
|
|
56
|
+
// no colors so output is pipeable into `jq` etc.
|
|
57
|
+
process.stdout.write(JSON.stringify({ ...data, files }, null, 2) + "\n");
|
|
131
58
|
return;
|
|
132
59
|
}
|
|
133
60
|
if (opts.stat) {
|
|
134
|
-
printStat(
|
|
61
|
+
printStat(files);
|
|
135
62
|
return;
|
|
136
63
|
}
|
|
137
|
-
|
|
64
|
+
const useColor = shouldColor();
|
|
65
|
+
for (const file of files) {
|
|
66
|
+
printFileDiff(file, useColor);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function printStat(files) {
|
|
70
|
+
let totalAdd = 0;
|
|
71
|
+
let totalDel = 0;
|
|
72
|
+
for (const f of files) {
|
|
73
|
+
totalAdd += f.additions || 0;
|
|
74
|
+
totalDel += f.deletions || 0;
|
|
75
|
+
process.stdout.write(` ${f.filename} +${f.additions || 0} -${f.deletions || 0}\n`);
|
|
76
|
+
}
|
|
77
|
+
process.stdout.write(` ${files.length} files changed, ${totalAdd} insertions(+), ${totalDel} deletions(-)\n`);
|
|
78
|
+
}
|
|
79
|
+
function printFileDiff(file, useColor) {
|
|
80
|
+
const bold = useColor ? ANSI.bold : "";
|
|
81
|
+
const cyan = useColor ? ANSI.cyan : "";
|
|
82
|
+
const reset = useColor ? ANSI.reset : "";
|
|
83
|
+
process.stdout.write(`${bold}${cyan}diff --skill ${file.filename}${reset}\n`);
|
|
84
|
+
process.stdout.write(`${bold}status: ${file.status} +${file.additions || 0} -${file.deletions || 0}${reset}\n`);
|
|
85
|
+
if (!file.patch) {
|
|
86
|
+
process.stdout.write(`${useColor ? ANSI.grey : ""}(no patch content)${reset}\n`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
for (const line of file.patch.split("\n")) {
|
|
90
|
+
process.stdout.write(colorize(line, useColor) + "\n");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function colorize(line, useColor) {
|
|
94
|
+
if (!useColor)
|
|
95
|
+
return line;
|
|
96
|
+
if (line.startsWith("+") && !line.startsWith("+++"))
|
|
97
|
+
return `${ANSI.green}${line}${ANSI.reset}`;
|
|
98
|
+
if (line.startsWith("-") && !line.startsWith("---"))
|
|
99
|
+
return `${ANSI.red}${line}${ANSI.reset}`;
|
|
100
|
+
if (line.startsWith("@@"))
|
|
101
|
+
return `${ANSI.grey}${line}${ANSI.reset}`;
|
|
102
|
+
return line;
|
|
138
103
|
}
|
|
139
104
|
//# sourceMappingURL=diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,6 +118,10 @@ export async function runEvalServe(root, port) {
|
|
|
118
118
|
}
|
|
119
119
|
const effectivePort = port ?? projectPort(resolvedRoot);
|
|
120
120
|
const name = basename(resolvedRoot);
|
|
121
|
+
// 0702 T-041: prompt to configure API key on first run if none detected.
|
|
122
|
+
// Non-TTY / already-configured → silent skip.
|
|
123
|
+
const { firstRunOnboarding } = await import("../../first-run-onboarding.js");
|
|
124
|
+
await firstRunOnboarding();
|
|
121
125
|
// Handle port conflicts gracefully
|
|
122
126
|
if (await isPortInUse(effectivePort)) {
|
|
123
127
|
await handlePortConflict(effectivePort, resolvedRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/eval/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface KeysCommandIO {
|
|
2
|
+
stdout: {
|
|
3
|
+
write: (s: string) => boolean;
|
|
4
|
+
};
|
|
5
|
+
stderr: {
|
|
6
|
+
write: (s: string) => boolean;
|
|
7
|
+
};
|
|
8
|
+
exit: (code: number) => void;
|
|
9
|
+
/** Returns the secret key read from stdin (piped or interactive masked). */
|
|
10
|
+
readKeyFromStdin: () => Promise<string>;
|
|
11
|
+
/** True if stdin is piped (non-TTY). */
|
|
12
|
+
isPiped: () => boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function keysCommand(subcommand: string | undefined, arg: string | undefined, io?: KeysCommandIO): Promise<void>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// keys.ts — `vskill keys` subcommand dispatcher.
|
|
3
|
+
//
|
|
4
|
+
// Subcommands:
|
|
5
|
+
// set <provider> Prompt (masked) or read piped stdin, persist via store
|
|
6
|
+
// list Show [Provider, Status, Last Updated, Source] table
|
|
7
|
+
// remove <provider> Idempotent delete
|
|
8
|
+
// path Print absolute path of keys.env
|
|
9
|
+
//
|
|
10
|
+
// Keys are NEVER echoed. Only `redactKey()` output (****<last-4>) appears in
|
|
11
|
+
// user-facing output.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
import { PROVIDERS, isProviderId, } from "../eval-server/providers.js";
|
|
14
|
+
import { saveKey, removeKey, listKeys, getKeysFilePath, redactKey, } from "../eval-server/settings-store.js";
|
|
15
|
+
import { readSecretFromStdin } from "./masked-stdin.js";
|
|
16
|
+
function defaultIO() {
|
|
17
|
+
return {
|
|
18
|
+
stdout: process.stdout,
|
|
19
|
+
stderr: process.stderr,
|
|
20
|
+
exit: (code) => process.exit(code),
|
|
21
|
+
readKeyFromStdin: () => readSecretFromStdin(),
|
|
22
|
+
isPiped: () => !process.stdin.isTTY,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function usageText() {
|
|
26
|
+
return [
|
|
27
|
+
"Usage: vskill keys <subcommand>",
|
|
28
|
+
"",
|
|
29
|
+
"Subcommands:",
|
|
30
|
+
" set <provider> Store an API key (provider: anthropic, openai, openrouter)",
|
|
31
|
+
" list Show stored keys (redacted) and sources",
|
|
32
|
+
" remove <provider> Delete a stored key",
|
|
33
|
+
" path Print absolute path of keys.env",
|
|
34
|
+
"",
|
|
35
|
+
].join("\n");
|
|
36
|
+
}
|
|
37
|
+
function knownProvidersHint() {
|
|
38
|
+
const ids = PROVIDERS.map((p) => p.id).join(", ");
|
|
39
|
+
return `Known providers: ${ids}`;
|
|
40
|
+
}
|
|
41
|
+
function pad(s, width) {
|
|
42
|
+
if (s.length >= width)
|
|
43
|
+
return s;
|
|
44
|
+
return s + " ".repeat(width - s.length);
|
|
45
|
+
}
|
|
46
|
+
async function cmdSet(provider, io) {
|
|
47
|
+
if (!provider) {
|
|
48
|
+
io.stderr.write(`Usage: vskill keys set <provider>\n${knownProvidersHint()}\n`);
|
|
49
|
+
io.exit(1);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!isProviderId(provider)) {
|
|
53
|
+
io.stderr.write(`unknown provider: "${provider}"\n${knownProvidersHint()}\n`);
|
|
54
|
+
io.exit(1);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!io.isPiped()) {
|
|
58
|
+
io.stdout.write(`Paste API key for ${provider} (input masked): `);
|
|
59
|
+
}
|
|
60
|
+
const key = (await io.readKeyFromStdin()).trim();
|
|
61
|
+
if (!key) {
|
|
62
|
+
io.stderr.write("no key provided\n");
|
|
63
|
+
io.exit(1);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await saveKey(provider, key);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
// redactKey is guaranteed to not echo the raw key; err.message is already
|
|
71
|
+
// scrubbed by settings-store but we redact again for defense-in-depth.
|
|
72
|
+
const msg = err.message.replace(key, redactKey(key));
|
|
73
|
+
io.stderr.write(`failed to save key: ${msg}\n`);
|
|
74
|
+
io.exit(1);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
io.stdout.write(`Stored ${redactKey(key)} for ${provider} at ${getKeysFilePath()}\n`);
|
|
78
|
+
}
|
|
79
|
+
async function cmdList(io) {
|
|
80
|
+
const list = listKeys();
|
|
81
|
+
const headers = ["Provider", "Status", "Last Updated", "Source"];
|
|
82
|
+
const rows = [];
|
|
83
|
+
let anyAvailable = false;
|
|
84
|
+
for (const p of PROVIDERS) {
|
|
85
|
+
const meta = list[p.id];
|
|
86
|
+
const envSet = !!process.env[p.envVarName];
|
|
87
|
+
let source = "—";
|
|
88
|
+
if (envSet)
|
|
89
|
+
source = "env var";
|
|
90
|
+
else if (meta.stored)
|
|
91
|
+
source = "file";
|
|
92
|
+
let status = "not set";
|
|
93
|
+
if (envSet) {
|
|
94
|
+
const raw = process.env[p.envVarName] ?? "";
|
|
95
|
+
status = redactKey(raw);
|
|
96
|
+
anyAvailable = true;
|
|
97
|
+
}
|
|
98
|
+
else if (meta.stored) {
|
|
99
|
+
// We can't read the raw key without touching the store, but redact
|
|
100
|
+
// only needs last 4 chars. Read via the store's public readKey (which
|
|
101
|
+
// returns null if neither env nor memoryMap has it — but after
|
|
102
|
+
// listKeys+loadIfNeeded it's in the map).
|
|
103
|
+
const { readKey } = await import("../eval-server/settings-store.js");
|
|
104
|
+
const raw = readKey(p.id) ?? "";
|
|
105
|
+
status = redactKey(raw);
|
|
106
|
+
anyAvailable = true;
|
|
107
|
+
}
|
|
108
|
+
const updated = meta.updatedAt ?? "—";
|
|
109
|
+
rows.push([p.id, status, updated, source]);
|
|
110
|
+
}
|
|
111
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
112
|
+
io.stdout.write(headers.map((h, i) => pad(h, widths[i])).join(" ") + "\n");
|
|
113
|
+
io.stdout.write(widths.map((w) => "-".repeat(w)).join(" ") + "\n");
|
|
114
|
+
for (const row of rows) {
|
|
115
|
+
io.stdout.write(row.map((c, i) => pad(c, widths[i])).join(" ") + "\n");
|
|
116
|
+
}
|
|
117
|
+
if (!anyAvailable) {
|
|
118
|
+
io.stdout.write(`\nNo API keys configured. Run \`vskill keys set <provider>\` to add one.\n`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function cmdRemove(provider, io) {
|
|
122
|
+
if (!provider) {
|
|
123
|
+
io.stderr.write(`Usage: vskill keys remove <provider>\n${knownProvidersHint()}\n`);
|
|
124
|
+
io.exit(1);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!isProviderId(provider)) {
|
|
128
|
+
io.stderr.write(`unknown provider: "${provider}"\n${knownProvidersHint()}\n`);
|
|
129
|
+
io.exit(1);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
await removeKey(provider);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
io.stderr.write(`failed to remove key: ${err.message}\n`);
|
|
137
|
+
io.exit(1);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
io.stdout.write(`Removed ${provider} from keys.env\n`);
|
|
141
|
+
}
|
|
142
|
+
function cmdPath(io) {
|
|
143
|
+
io.stdout.write(`${getKeysFilePath()}\n`);
|
|
144
|
+
}
|
|
145
|
+
export async function keysCommand(subcommand, arg, io = defaultIO()) {
|
|
146
|
+
switch (subcommand) {
|
|
147
|
+
case "set":
|
|
148
|
+
return cmdSet(arg, io);
|
|
149
|
+
case "list":
|
|
150
|
+
return cmdList(io);
|
|
151
|
+
case "remove":
|
|
152
|
+
case "rm":
|
|
153
|
+
return cmdRemove(arg, io);
|
|
154
|
+
case "path":
|
|
155
|
+
return cmdPath(io);
|
|
156
|
+
case undefined:
|
|
157
|
+
io.stderr.write(usageText());
|
|
158
|
+
io.exit(1);
|
|
159
|
+
return;
|
|
160
|
+
default:
|
|
161
|
+
io.stderr.write(`unknown subcommand: "${subcommand}"\n${usageText()}`);
|
|
162
|
+
io.exit(1);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface MaskedStdinIO {
|
|
2
|
+
stdout: {
|
|
3
|
+
write: (s: string) => boolean;
|
|
4
|
+
};
|
|
5
|
+
stderr: {
|
|
6
|
+
write: (s: string) => boolean;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Read from stdin. If input is piped (non-TTY), reads until EOF and returns
|
|
11
|
+
* trimmed text. If TTY, reads interactively with masking (each char echoed
|
|
12
|
+
* as `*`) until Enter.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readSecretFromStdin(io?: MaskedStdinIO): Promise<string>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// masked-stdin.ts — Read a secret from stdin with character masking.
|
|
3
|
+
//
|
|
4
|
+
// Two modes:
|
|
5
|
+
// - Piped: `echo "sk-..." | vskill keys set anthropic` — read until EOF
|
|
6
|
+
// - Interactive TTY: raw mode, byte-by-byte read, echo "*" per char
|
|
7
|
+
//
|
|
8
|
+
// The raw key is NEVER echoed. Backspace/DEL erase one char (and remove a
|
|
9
|
+
// star from the display). Ctrl-C aborts with exit 1.
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Read from stdin. If input is piped (non-TTY), reads until EOF and returns
|
|
13
|
+
* trimmed text. If TTY, reads interactively with masking (each char echoed
|
|
14
|
+
* as `*`) until Enter.
|
|
15
|
+
*/
|
|
16
|
+
export async function readSecretFromStdin(io = { stdout: process.stdout, stderr: process.stderr }) {
|
|
17
|
+
const isTTY = !!process.stdin.isTTY;
|
|
18
|
+
if (!isTTY) {
|
|
19
|
+
return readPiped();
|
|
20
|
+
}
|
|
21
|
+
return readInteractiveMasked(io);
|
|
22
|
+
}
|
|
23
|
+
function readPiped() {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
process.stdin.on("data", (chunk) => chunks.push(chunk));
|
|
27
|
+
process.stdin.once("end", () => {
|
|
28
|
+
resolve(Buffer.concat(chunks).toString("utf8").trim());
|
|
29
|
+
});
|
|
30
|
+
process.stdin.once("error", reject);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function readInteractiveMasked(io) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const chars = [];
|
|
36
|
+
const stdin = process.stdin;
|
|
37
|
+
const wasRaw = stdin.isRaw === true;
|
|
38
|
+
if (typeof stdin.setRawMode === "function")
|
|
39
|
+
stdin.setRawMode(true);
|
|
40
|
+
stdin.resume();
|
|
41
|
+
const onData = (data) => {
|
|
42
|
+
const s = data.toString("utf8");
|
|
43
|
+
for (const ch of s) {
|
|
44
|
+
const code = ch.charCodeAt(0);
|
|
45
|
+
if (code === 3) {
|
|
46
|
+
// Ctrl-C
|
|
47
|
+
cleanup();
|
|
48
|
+
io.stdout.write("\n");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
if (code === 13 || code === 10) {
|
|
52
|
+
// Enter
|
|
53
|
+
cleanup();
|
|
54
|
+
io.stdout.write("\n");
|
|
55
|
+
resolve(chars.join(""));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (code === 127 || code === 8) {
|
|
59
|
+
// Backspace / DEL
|
|
60
|
+
if (chars.length > 0) {
|
|
61
|
+
chars.pop();
|
|
62
|
+
io.stdout.write("\b \b");
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
chars.push(ch);
|
|
67
|
+
io.stdout.write("*");
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function cleanup() {
|
|
71
|
+
stdin.removeListener("data", onData);
|
|
72
|
+
if (typeof stdin.setRawMode === "function")
|
|
73
|
+
stdin.setRawMode(wasRaw);
|
|
74
|
+
stdin.pause();
|
|
75
|
+
}
|
|
76
|
+
stdin.on("data", onData);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=masked-stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masked-stdin.js","sourceRoot":"","sources":["../../src/commands/masked-stdin.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.d.ts
CHANGED
|
@@ -1,32 +1,6 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
-
import { type
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
targetAgents: string[];
|
|
6
|
-
engine: EngineMode;
|
|
7
|
-
}
|
|
8
|
-
export interface EmittedFileDescriptor {
|
|
9
|
-
targetId: string;
|
|
10
|
-
relativePath: string;
|
|
11
|
-
content: string;
|
|
12
|
-
}
|
|
13
|
-
export interface DivergenceEntry {
|
|
14
|
-
targetId: string;
|
|
15
|
-
field: string;
|
|
16
|
-
originalValue: unknown;
|
|
17
|
-
translation: string | null;
|
|
18
|
-
kind: "dropped" | "translated" | "security-critical-dropped";
|
|
19
|
-
}
|
|
20
|
-
export interface EmitResult {
|
|
21
|
-
files: EmittedFileDescriptor[];
|
|
22
|
-
divergences: DivergenceEntry[];
|
|
23
|
-
skipped: Array<{
|
|
24
|
-
targetId: string;
|
|
25
|
-
reason: string;
|
|
26
|
-
}>;
|
|
27
|
-
divergenceReport: string;
|
|
28
|
-
}
|
|
29
|
-
type EmitSkillFn = (generated: GenerateSkillResult, options: EmitOptions) => EmitResult;
|
|
2
|
+
import { emitSkill as realEmitSkill, type EmitOptions, type EmittedFileDescriptor, type DivergenceEntry, type EmitResult, type EngineMode } from "../core/skill-emitter.js";
|
|
3
|
+
export type { EmitOptions, EmittedFileDescriptor, DivergenceEntry, EmitResult, EngineMode, };
|
|
4
|
+
type EmitSkillFn = typeof realEmitSkill;
|
|
30
5
|
export declare function __setEmitSkillForTest(fn: EmitSkillFn | null): void;
|
|
31
6
|
export declare function registerSkillCommand(program: Command): void;
|
|
32
|
-
export {};
|