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.
Files changed (86) hide show
  1. package/README.md +123 -2
  2. package/agents.json +1 -1
  3. package/dist/agents/agents-registry.d.ts +0 -1
  4. package/dist/agents/agents-registry.js +10 -30
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/api/client.d.ts +21 -0
  7. package/dist/api/client.js +39 -5
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/commands/diff.d.ts +2 -5
  10. package/dist/commands/diff.js +82 -117
  11. package/dist/commands/diff.js.map +1 -1
  12. package/dist/commands/eval/serve.js +4 -0
  13. package/dist/commands/eval/serve.js.map +1 -1
  14. package/dist/commands/keys.d.ts +14 -0
  15. package/dist/commands/keys.js +166 -0
  16. package/dist/commands/keys.js.map +1 -0
  17. package/dist/commands/masked-stdin.d.ts +14 -0
  18. package/dist/commands/masked-stdin.js +79 -0
  19. package/dist/commands/masked-stdin.js.map +1 -0
  20. package/dist/commands/skill.d.ts +3 -29
  21. package/dist/commands/skill.js +6 -32
  22. package/dist/commands/skill.js.map +1 -1
  23. package/dist/eval/anthropic-catalog.d.ts +49 -0
  24. package/dist/eval/anthropic-catalog.js +238 -0
  25. package/dist/eval/anthropic-catalog.js.map +1 -0
  26. package/dist/eval/llm.d.ts +1 -1
  27. package/dist/eval/llm.js +68 -10
  28. package/dist/eval/llm.js.map +1 -1
  29. package/dist/eval/mcp-detector.js +24 -3
  30. package/dist/eval/mcp-detector.js.map +1 -1
  31. package/dist/eval/model-resolver.d.ts +39 -0
  32. package/dist/eval/model-resolver.js +94 -0
  33. package/dist/eval/model-resolver.js.map +1 -0
  34. package/dist/eval/pricing.js +42 -16
  35. package/dist/eval/pricing.js.map +1 -1
  36. package/dist/eval-server/api-routes.d.ts +9 -0
  37. package/dist/eval-server/api-routes.js +241 -73
  38. package/dist/eval-server/api-routes.js.map +1 -1
  39. package/dist/eval-server/authoring-routes.js +21 -1
  40. package/dist/eval-server/authoring-routes.js.map +1 -1
  41. package/dist/eval-server/boot-preflight.js +8 -10
  42. package/dist/eval-server/boot-preflight.js.map +1 -1
  43. package/dist/eval-server/darwin-migrator.d.ts +57 -0
  44. package/dist/eval-server/darwin-migrator.js +169 -0
  45. package/dist/eval-server/darwin-migrator.js.map +1 -0
  46. package/dist/eval-server/eval-server.d.ts +1 -0
  47. package/dist/eval-server/eval-server.js +21 -0
  48. package/dist/eval-server/eval-server.js.map +1 -1
  49. package/dist/eval-server/integration-routes.js +7 -0
  50. package/dist/eval-server/integration-routes.js.map +1 -1
  51. package/dist/eval-server/platform-proxy.d.ts +18 -0
  52. package/dist/eval-server/platform-proxy.js +153 -0
  53. package/dist/eval-server/platform-proxy.js.map +1 -0
  54. package/dist/eval-server/providers.d.ts +7 -12
  55. package/dist/eval-server/providers.js +13 -15
  56. package/dist/eval-server/providers.js.map +1 -1
  57. package/dist/eval-server/settings-store.d.ts +31 -26
  58. package/dist/eval-server/settings-store.js +246 -143
  59. package/dist/eval-server/settings-store.js.map +1 -1
  60. package/dist/eval-server/skill-create-routes.js +18 -0
  61. package/dist/eval-server/skill-create-routes.js.map +1 -1
  62. package/dist/eval-server/skill-name-resolver.d.ts +35 -0
  63. package/dist/eval-server/skill-name-resolver.js +146 -0
  64. package/dist/eval-server/skill-name-resolver.js.map +1 -0
  65. package/dist/eval-ui/assets/{CommandPalette-DiPALzlG.js → CommandPalette-COqdrmRl.js} +1 -1
  66. package/dist/eval-ui/assets/CreateSkillPage-C3IjO8es.js +12 -0
  67. package/dist/eval-ui/assets/UpdateDropdown-DnKKMBBN.js +1 -0
  68. package/dist/eval-ui/assets/index-Dmja1p3A.css +1 -0
  69. package/dist/eval-ui/assets/index-KIcQ5e5a.js +102 -0
  70. package/dist/eval-ui/index.html +2 -2
  71. package/dist/first-run-onboarding.d.ts +19 -0
  72. package/dist/first-run-onboarding.js +104 -0
  73. package/dist/first-run-onboarding.js.map +1 -0
  74. package/dist/index.js +18 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/installer/canonical.js +12 -13
  77. package/dist/installer/canonical.js.map +1 -1
  78. package/dist/utils/resolve-binary.js +7 -8
  79. package/dist/utils/resolve-binary.js.map +1 -1
  80. package/package.json +5 -2
  81. package/dist/eval-ui/assets/CreateSkillPage-BMrFELep.js +0 -12
  82. package/dist/eval-ui/assets/UpdateDropdown-Bj8kZzuR.js +0 -1
  83. package/dist/eval-ui/assets/_shimNode-D3bBqrAh.js +0 -1
  84. package/dist/eval-ui/assets/index-BSPDkfZG.js +0 -102
  85. package/dist/eval-ui/assets/index-C0Gc_4KC.css +0 -1
  86. package/dist/eval-ui/assets/resolve-binary-DIxhrZ6O.js +0 -2
@@ -1,139 +1,104 @@
1
1
  // ---------------------------------------------------------------------------
2
- // vskill diff compare two published versions of a skill across the full
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
- // Zero shell-outs, pure fetch() + stdout.write(). Windows-safe (PowerShell,
7
- // cmd.exe) no `which`, no `&&`, no `~`, no `lsof`, no symlinks. ANSI colors
8
- // are emitted only when process.stdout.isTTY is true.
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, } from "../api/client.js";
12
- // ---- ANSI helpers ---------------------------------------------------------
13
- const GREEN = "\x1b[32m";
14
- const RED = "\x1b[31m";
15
- const GREY = "\x1b[90m";
16
- const BOLD = "\x1b[1m";
17
- const RESET = "\x1b[0m";
18
- function useColors() {
19
- // Respect NO_COLOR and FORCE_COLOR conventions. Fall back to TTY detection.
20
- if (process.env.NO_COLOR !== undefined)
21
- return false;
22
- if (process.env.FORCE_COLOR === "0")
23
- return false;
24
- if (process.env.FORCE_COLOR === "1")
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
- return process.stdout.isTTY === true;
27
- }
28
- function color(code, text) {
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
- // ---- Entrypoint -----------------------------------------------------------
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
- writeErr(`Compare failed: ${msg}\n`);
48
+ process.stderr.write(`vskill diff: ${msg}\n`);
125
49
  process.exit(1);
126
- return;
127
50
  }
128
- const filtered = filterFiles(data.files ?? [], opts.files);
51
+ const files = opts.files
52
+ ? data.files.filter((f) => minimatch(f.filename, opts.files))
53
+ : data.files;
129
54
  if (opts.json) {
130
- printJson({ ...data, files: filtered });
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(filtered);
61
+ printStat(files);
135
62
  return;
136
63
  }
137
- printColorDiff(filtered, data);
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,0EAA0E;AAC1E,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,eAAe,GAGhB,MAAM,kBAAkB,CAAC;AAW1B,8EAA8E;AAE9E,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAS,SAAS;IAChB,4EAA4E;IAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY;IACvC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAE9E,SAAS,WAAW,CAAC,KAAoB,EAAE,OAA2B;IACpE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,8EAA8E;AAE9E,SAAS,SAAS,CAAC,IAA2B;IAC5C,+DAA+D;IAC/D,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAoB;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QAC7B,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAClB,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CACtF,OAAO,EACP,GAAG,CACJ,CAAC;IACF,KAAK,CACH,GAAG,UAAU,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,IAAI,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB,EAAE,MAA6B;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACtC,KAAK,CACH,KAAK,CACH,IAAI,EACJ,iFAAiF,CAClF,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,MAAM,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,cAAc;QACd,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACnD,KAAK,CACH,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC;YAClC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI;YACJ,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CACP,CAAC;QAEF,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,kDAAkD;YAClD,2EAA2E;YAC3E,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,IAAY,EACZ,EAAU,EACV,IAAiB;IAEjB,IAAI,IAA2B,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
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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"}
@@ -1,32 +1,6 @@
1
1
  import type { Command } from "commander";
2
- import { type GenerateSkillResult } from "../core/skill-generator.js";
3
- export type EngineMode = "universal" | "anthropic-skill-creator";
4
- export interface EmitOptions {
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 {};