vskill 0.5.107 → 0.5.109

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 (66) hide show
  1. package/README.md +109 -0
  2. package/agents.json +1 -1
  3. package/dist/commands/add.d.ts +36 -0
  4. package/dist/commands/add.js +149 -0
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/cleanup.d.ts +6 -1
  7. package/dist/commands/cleanup.js +37 -5
  8. package/dist/commands/cleanup.js.map +1 -1
  9. package/dist/commands/disable.d.ts +8 -0
  10. package/dist/commands/disable.js +194 -0
  11. package/dist/commands/disable.js.map +1 -0
  12. package/dist/commands/enable.d.ts +11 -0
  13. package/dist/commands/enable.js +209 -0
  14. package/dist/commands/enable.js.map +1 -0
  15. package/dist/commands/eval/serve.js +18 -4
  16. package/dist/commands/eval/serve.js.map +1 -1
  17. package/dist/commands/list.d.ts +2 -0
  18. package/dist/commands/list.js +83 -1
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/remove.d.ts +2 -0
  21. package/dist/commands/remove.js +84 -11
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/eval/llm.js +7 -0
  24. package/dist/eval/llm.js.map +1 -1
  25. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.d.ts +1 -0
  26. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.js +16 -0
  27. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.js.map +1 -0
  28. package/dist/eval-server/api-routes.d.ts +13 -2
  29. package/dist/eval-server/api-routes.js +314 -37
  30. package/dist/eval-server/api-routes.js.map +1 -1
  31. package/dist/eval-server/check-dist-freshness.d.ts +19 -0
  32. package/dist/eval-server/check-dist-freshness.js +100 -0
  33. package/dist/eval-server/check-dist-freshness.js.map +1 -0
  34. package/dist/eval-server/eval-server.js +17 -6
  35. package/dist/eval-server/eval-server.js.map +1 -1
  36. package/dist/eval-server/improve-routes.js +50 -2
  37. package/dist/eval-server/improve-routes.js.map +1 -1
  38. package/dist/eval-server/platform-proxy.d.ts +22 -0
  39. package/dist/eval-server/platform-proxy.js +53 -4
  40. package/dist/eval-server/platform-proxy.js.map +1 -1
  41. package/dist/eval-server/providers.js +4 -1
  42. package/dist/eval-server/providers.js.map +1 -1
  43. package/dist/eval-server/settings-store.js +19 -1
  44. package/dist/eval-server/settings-store.js.map +1 -1
  45. package/dist/eval-server/skill-create-routes.d.ts +9 -0
  46. package/dist/eval-server/skill-create-routes.js +107 -19
  47. package/dist/eval-server/skill-create-routes.js.map +1 -1
  48. package/dist/eval-server/studio-json.js +12 -3
  49. package/dist/eval-server/studio-json.js.map +1 -1
  50. package/dist/eval-ui/assets/{CommandPalette-sazEtk0a.js → CommandPalette-3xE9OCOe.js} +1 -1
  51. package/dist/eval-ui/assets/CreateSkillPage-BEdLsGoc.js +12 -0
  52. package/dist/eval-ui/assets/{UpdateDropdown-Ce9LXOxb.js → UpdateDropdown-Bwk3qR7G.js} +1 -1
  53. package/dist/eval-ui/assets/{index-vn5bFfrb.js → index-CdnFViSu.js} +38 -38
  54. package/dist/eval-ui/assets/index-CyYEYhQ8.css +1 -0
  55. package/dist/eval-ui/index.html +2 -2
  56. package/dist/index.js +38 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/lib/skill-lifecycle.d.ts +78 -0
  59. package/dist/lib/skill-lifecycle.js +136 -0
  60. package/dist/lib/skill-lifecycle.js.map +1 -0
  61. package/dist/utils/version.d.ts +13 -0
  62. package/dist/utils/version.js +29 -0
  63. package/dist/utils/version.js.map +1 -1
  64. package/package.json +1 -1
  65. package/dist/eval-ui/assets/CreateSkillPage-B5qENwBj.js +0 -12
  66. package/dist/eval-ui/assets/index-BBoVqs6V.css +0 -1
@@ -0,0 +1,194 @@
1
+ // ---------------------------------------------------------------------------
2
+ // vskill disable <name> -- remove the enabledPlugins[<name>@<marketplace>]
3
+ // entry without deleting on-disk skill files. Wraps `claude plugin uninstall`
4
+ // per ADR 0724-01.
5
+ // ---------------------------------------------------------------------------
6
+ import { readLockfile } from "../lockfile/index.js";
7
+ import { isPluginEnabled } from "../settings/index.js";
8
+ import { claudePluginUninstall } from "../utils/claude-plugin.js";
9
+ import { detectInstalledAgents } from "../agents/agents-registry.js";
10
+ import { resolveCliBinary } from "../utils/resolve-binary.js";
11
+ import { buildPerAgentReport, resolvePluginId, } from "../lib/skill-lifecycle.js";
12
+ import { bold, cyan, dim, green, red, yellow } from "../utils/output.js";
13
+ export async function disableCommand(skillName, opts) {
14
+ // F-006 fix: Commander accepts any string for --scope <scope> (no built-in
15
+ // choices on action callbacks). Validate at the entry point so a typo like
16
+ // `--scope projet` errors loudly instead of silently routing to user scope.
17
+ if (opts.scope !== undefined &&
18
+ opts.scope !== "user" &&
19
+ opts.scope !== "project") {
20
+ const msg = `Invalid --scope "${opts.scope}". Allowed values: user, project.`;
21
+ if (opts.json) {
22
+ console.log(JSON.stringify({ error: msg }));
23
+ }
24
+ else {
25
+ console.error(red(msg));
26
+ }
27
+ process.exit(1);
28
+ return;
29
+ }
30
+ const scope = opts.scope ?? "user";
31
+ // ----- 1. Validate skill is in lockfile --------------------------------
32
+ const lock = readLockfile();
33
+ const entry = lock?.skills[skillName];
34
+ if (!entry) {
35
+ const msg = `Skill "${skillName}" is not installed (no entry in vskill.lock).`;
36
+ const hint = `Run ${cyan("vskill install " + skillName)} first.`;
37
+ if (opts.json) {
38
+ console.log(JSON.stringify({ error: msg, hint }));
39
+ }
40
+ else {
41
+ console.error(red(msg));
42
+ console.error(dim(hint));
43
+ }
44
+ process.exit(1);
45
+ return;
46
+ }
47
+ // ----- 2. Resolve plugin id (AC-US3-04) --------------------------------
48
+ const pluginId = resolvePluginId(skillName, entry);
49
+ const agents = await detectInstalledAgents();
50
+ if (pluginId === null) {
51
+ const report = buildPerAgentReport({
52
+ skill: skillName,
53
+ scope,
54
+ action: "not-applicable",
55
+ agents,
56
+ });
57
+ emitOk(opts, {
58
+ skill: skillName,
59
+ scope,
60
+ pluginId: null,
61
+ status: "auto-discovered",
62
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
63
+ });
64
+ if (!opts.json) {
65
+ console.log(dim(`${bold(skillName)} is auto-discovered — no plugin entry to disable. To stop loading, run ${cyan("vskill remove " + skillName)}.`));
66
+ for (const r of report)
67
+ console.log(` ${dim(">")} ${r.line}`);
68
+ }
69
+ return;
70
+ }
71
+ // ----- 3. Idempotency check (AC-US3-03) --------------------------------
72
+ const cwd = process.cwd();
73
+ const targetSettingsOpts = scope === "project" ? { scope, projectDir: cwd } : { scope: "user" };
74
+ const enabledAtTarget = isPluginEnabled(pluginId, targetSettingsOpts);
75
+ if (!enabledAtTarget) {
76
+ const report = buildPerAgentReport({
77
+ skill: skillName,
78
+ scope,
79
+ action: "already-disabled",
80
+ agents,
81
+ });
82
+ emitOk(opts, {
83
+ skill: skillName,
84
+ scope,
85
+ pluginId,
86
+ status: "already-disabled",
87
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
88
+ });
89
+ if (!opts.json) {
90
+ console.log(yellow(`${bold(skillName)} already disabled in ${scope} scope.`));
91
+ for (const r of report)
92
+ console.log(` ${dim(">")} ${r.line}`);
93
+ }
94
+ return;
95
+ }
96
+ // ----- 4. Dry-run preview ---------------------------------------------
97
+ if (opts.dryRun) {
98
+ const report = buildPerAgentReport({
99
+ skill: skillName,
100
+ scope,
101
+ action: "disabled",
102
+ agents,
103
+ });
104
+ const claudeBin = safeResolve("claude");
105
+ const argv = `claude plugin uninstall --scope ${scope} -- ${pluginId}`;
106
+ emitOk(opts, {
107
+ skill: skillName,
108
+ scope,
109
+ pluginId,
110
+ status: "dry-run",
111
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
112
+ });
113
+ if (!opts.json) {
114
+ console.log(bold(`Dry-run — would execute:`));
115
+ console.log(` ${cyan(argv)}`);
116
+ if (opts.verbose) {
117
+ console.log(dim(` binary: ${claudeBin ?? "<claude not found on PATH>"}`));
118
+ console.log(dim(` scope: ${scope}`));
119
+ if (scope === "project")
120
+ console.log(dim(` cwd: ${cwd}`));
121
+ }
122
+ for (const r of report)
123
+ console.log(` ${dim(">")} ${r.line}`);
124
+ }
125
+ return;
126
+ }
127
+ // ----- 5. Actually disable via claude CLI ------------------------------
128
+ try {
129
+ if (opts.verbose) {
130
+ const claudeBin = safeResolve("claude");
131
+ console.log(dim(`claude binary: ${claudeBin ?? "<not found>"} | scope: ${scope}${scope === "project" ? ` | cwd: ${cwd}` : ""}`));
132
+ }
133
+ claudePluginUninstall(pluginId, scope, scope === "project" ? { cwd } : undefined);
134
+ }
135
+ catch (err) {
136
+ const msg = `Failed to disable ${skillName} (${pluginId}) in ${scope} scope: ${err.message}`;
137
+ if (opts.json) {
138
+ console.log(JSON.stringify({ error: msg, skill: skillName, scope, pluginId }));
139
+ }
140
+ else {
141
+ console.error(red(msg));
142
+ }
143
+ process.exit(1);
144
+ return;
145
+ }
146
+ // ----- 6. AC-US3-05: hint about other-scope state ---------------------
147
+ const otherScope = scope === "user" ? "project" : "user";
148
+ const otherSettingsOpts = otherScope === "project"
149
+ ? { scope: otherScope, projectDir: cwd }
150
+ : { scope: "user" };
151
+ let stillEnabledOther = false;
152
+ try {
153
+ stillEnabledOther = isPluginEnabled(pluginId, otherSettingsOpts);
154
+ }
155
+ catch {
156
+ // non-fatal — don't break the success path on a settings.json read error
157
+ }
158
+ // ----- 7. Per-agent report --------------------------------------------
159
+ const report = buildPerAgentReport({
160
+ skill: skillName,
161
+ scope,
162
+ action: "disabled",
163
+ agents,
164
+ });
165
+ emitOk(opts, {
166
+ skill: skillName,
167
+ scope,
168
+ pluginId,
169
+ status: "disabled",
170
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
171
+ });
172
+ if (!opts.json) {
173
+ console.log(green(`Disabled ${bold(skillName)} (${pluginId}) in ${scope} scope.`));
174
+ for (const r of report)
175
+ console.log(` ${dim(">")} ${r.line}`);
176
+ if (stillEnabledOther) {
177
+ console.log(yellow(`Hint: still enabled in ${otherScope} scope. Run vskill disable ${skillName} --scope ${otherScope} to fully disable.`));
178
+ }
179
+ }
180
+ }
181
+ function emitOk(opts, payload) {
182
+ if (opts.json) {
183
+ console.log(JSON.stringify(payload));
184
+ }
185
+ }
186
+ function safeResolve(name) {
187
+ try {
188
+ return resolveCliBinary(name);
189
+ }
190
+ catch {
191
+ return null;
192
+ }
193
+ }
194
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../../src/commands/disable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface EnableOptions {
2
+ /** Settings scope. Defaults to "user" — matches `claude plugin install` default. */
3
+ scope?: "user" | "project";
4
+ /** Print the would-be invocation without running it. */
5
+ dryRun?: boolean;
6
+ /** Verbose output (resolved paths, claude binary, exit code). */
7
+ verbose?: boolean;
8
+ /** Emit machine-readable JSON instead of human-readable lines. */
9
+ json?: boolean;
10
+ }
11
+ export declare function enableCommand(skillName: string, opts: EnableOptions): Promise<void>;
@@ -0,0 +1,209 @@
1
+ // ---------------------------------------------------------------------------
2
+ // vskill enable <name> -- flip enabledPlugins[<name>@<marketplace>] back on
3
+ // without re-extracting the skill files. Wraps `claude plugin install` per
4
+ // ADR 0724-01.
5
+ // ---------------------------------------------------------------------------
6
+ import { readLockfile } from "../lockfile/index.js";
7
+ import { isPluginEnabled } from "../settings/index.js";
8
+ import { claudePluginInstall } from "../utils/claude-plugin.js";
9
+ import { detectInstalledAgents } from "../agents/agents-registry.js";
10
+ import { resolveCliBinary } from "../utils/resolve-binary.js";
11
+ import { buildPerAgentReport, classifyAgentSurface, resolvePluginId, } from "../lib/skill-lifecycle.js";
12
+ import { bold, cyan, dim, green, red, yellow } from "../utils/output.js";
13
+ export async function enableCommand(skillName, opts) {
14
+ // F-006 fix: Commander accepts any string for --scope <scope> (no built-in
15
+ // choices on action callbacks). Validate at the entry point so a typo like
16
+ // `--scope projet` errors loudly instead of silently routing to user scope.
17
+ if (opts.scope !== undefined &&
18
+ opts.scope !== "user" &&
19
+ opts.scope !== "project") {
20
+ const msg = `Invalid --scope "${opts.scope}". Allowed values: user, project.`;
21
+ if (opts.json) {
22
+ console.log(JSON.stringify({ error: msg }));
23
+ }
24
+ else {
25
+ console.error(red(msg));
26
+ }
27
+ process.exit(1);
28
+ return;
29
+ }
30
+ const scope = opts.scope ?? "user";
31
+ // ----- 1. Validate skill is in lockfile (AC-US2-02) ---------------------
32
+ const lock = readLockfile();
33
+ const entry = lock?.skills[skillName];
34
+ if (!entry) {
35
+ const msg = `Skill "${skillName}" is not installed (no entry in vskill.lock).`;
36
+ const hint = `Run ${cyan("vskill install " + skillName)} first.`;
37
+ if (opts.json) {
38
+ console.log(JSON.stringify({ error: msg, hint }));
39
+ }
40
+ else {
41
+ console.error(red(msg));
42
+ console.error(dim(hint));
43
+ }
44
+ process.exit(1);
45
+ return;
46
+ }
47
+ // ----- 2. Resolve plugin id (AC-US3-04 mirror) --------------------------
48
+ const pluginId = resolvePluginId(skillName, entry);
49
+ // Detect agents up-front for the per-agent report.
50
+ const agents = await detectInstalledAgents();
51
+ // Auto-discovered skill: nothing to flip in settings.json. Print a no-op
52
+ // line and exit 0. This also covers the "only-non-claude-agents detected"
53
+ // case (AC-US5-03) implicitly — there's nobody to enable for.
54
+ if (pluginId === null) {
55
+ const report = buildPerAgentReport({
56
+ skill: skillName,
57
+ scope,
58
+ action: "not-applicable",
59
+ agents,
60
+ });
61
+ emitOk(opts, {
62
+ skill: skillName,
63
+ scope,
64
+ pluginId: null,
65
+ status: "auto-discovered",
66
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
67
+ });
68
+ if (!opts.json) {
69
+ console.log(dim(`${bold(skillName)} is auto-discovered by agents from their skills dir — no enable step needed.`));
70
+ for (const r of report)
71
+ console.log(` ${dim(">")} ${r.line}`);
72
+ }
73
+ return;
74
+ }
75
+ // ----- 3. AC-US5-03: when no claude-code-style agent is detected --------
76
+ const hasClaudeStyle = agents.some((a) => classifyAgentSurface(a) === "claude-code-style");
77
+ if (!hasClaudeStyle) {
78
+ const report = buildPerAgentReport({
79
+ skill: skillName,
80
+ scope,
81
+ action: "not-applicable",
82
+ agents,
83
+ });
84
+ emitOk(opts, {
85
+ skill: skillName,
86
+ scope,
87
+ pluginId,
88
+ status: "auto-discovered",
89
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
90
+ });
91
+ if (!opts.json) {
92
+ console.log(dim(`No agent requires explicit enable — detected agents auto-discover from their skills dir. Skill is already on disk and live.`));
93
+ for (const r of report)
94
+ console.log(` ${dim(">")} ${r.line}`);
95
+ }
96
+ return;
97
+ }
98
+ // ----- 4. Idempotency check (AC-US2-03) --------------------------------
99
+ const cwd = process.cwd();
100
+ const settingsOpts = scope === "project" ? { scope, projectDir: cwd } : { scope: "user" };
101
+ const already = isPluginEnabled(pluginId, settingsOpts);
102
+ if (already) {
103
+ const report = buildPerAgentReport({
104
+ skill: skillName,
105
+ scope,
106
+ action: "already-enabled",
107
+ agents,
108
+ });
109
+ emitOk(opts, {
110
+ skill: skillName,
111
+ scope,
112
+ pluginId,
113
+ status: "already-enabled",
114
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
115
+ });
116
+ if (!opts.json) {
117
+ console.log(yellow(`${bold(skillName)} already enabled in ${scope} scope.`));
118
+ for (const r of report)
119
+ console.log(` ${dim(">")} ${r.line}`);
120
+ }
121
+ return;
122
+ }
123
+ // ----- 5. Dry-run preview (AC-US2-05, AC-US6-01) -----------------------
124
+ if (opts.dryRun) {
125
+ const report = buildPerAgentReport({
126
+ skill: skillName,
127
+ scope,
128
+ action: "enabled",
129
+ agents,
130
+ });
131
+ const claudeBin = safeResolve("claude");
132
+ const argv = `claude plugin install --scope ${scope} -- ${pluginId}`;
133
+ emitOk(opts, {
134
+ skill: skillName,
135
+ scope,
136
+ pluginId,
137
+ status: "dry-run",
138
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
139
+ });
140
+ if (!opts.json) {
141
+ console.log(bold(`Dry-run — would execute:`));
142
+ console.log(` ${cyan(argv)}`);
143
+ if (opts.verbose) {
144
+ console.log(dim(` binary: ${claudeBin ?? "<claude not found on PATH>"}`));
145
+ console.log(dim(` scope: ${scope}`));
146
+ if (scope === "project")
147
+ console.log(dim(` cwd: ${cwd}`));
148
+ }
149
+ for (const r of report)
150
+ console.log(` ${dim(">")} ${r.line}`);
151
+ }
152
+ return;
153
+ }
154
+ // ----- 6. Actually enable via claude CLI (AC-US2-01, AC-US2-04) --------
155
+ try {
156
+ if (opts.verbose) {
157
+ const claudeBin = safeResolve("claude");
158
+ console.log(dim(`claude binary: ${claudeBin ?? "<not found>"} | scope: ${scope}${scope === "project" ? ` | cwd: ${cwd}` : ""}`));
159
+ }
160
+ claudePluginInstall(pluginId, scope, scope === "project" ? { cwd } : undefined);
161
+ }
162
+ catch (err) {
163
+ const msg = `Failed to enable ${skillName} (${pluginId}) in ${scope} scope: ${err.message}`;
164
+ if (opts.json) {
165
+ console.log(JSON.stringify({ error: msg, skill: skillName, scope, pluginId }));
166
+ }
167
+ else {
168
+ console.error(red(msg));
169
+ }
170
+ process.exit(1);
171
+ return;
172
+ }
173
+ // ----- 7. Per-agent success report -------------------------------------
174
+ const report = buildPerAgentReport({
175
+ skill: skillName,
176
+ scope,
177
+ action: "enabled",
178
+ agents,
179
+ });
180
+ emitOk(opts, {
181
+ skill: skillName,
182
+ scope,
183
+ pluginId,
184
+ status: "enabled",
185
+ perAgent: report.map(({ line: _line, ...rest }) => rest),
186
+ });
187
+ if (!opts.json) {
188
+ console.log(green(`Enabled ${bold(skillName)} (${pluginId}) in ${scope} scope.`));
189
+ for (const r of report)
190
+ console.log(` ${dim(">")} ${r.line}`);
191
+ }
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Helpers
195
+ // ---------------------------------------------------------------------------
196
+ function emitOk(opts, payload) {
197
+ if (opts.json) {
198
+ console.log(JSON.stringify(payload));
199
+ }
200
+ }
201
+ function safeResolve(name) {
202
+ try {
203
+ return resolveCliBinary(name);
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../src/commands/enable.ts"],"names":[],"mappings":"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"}
@@ -86,6 +86,14 @@ async function probeVskillServer(port) {
86
86
  * actionable. The probe alone distinguishes our server from everything
87
87
  * else, which is the only discrimination `vskill studio` needs.
88
88
  */
89
+ function killHint(port) {
90
+ // Printable strings only — vskill itself doesn't shell out (Windows-safe).
91
+ // Show both Unix and Windows so the user can copy whichever applies.
92
+ const unix = `lsof -ti:${port} | xargs kill`;
93
+ const win = `for /f "tokens=5" %a in ('netstat -ano ^| findstr :${port}') do taskkill /F /PID %a`;
94
+ return (` ${dim("To free the port (macOS/Linux):")} ${cyan(unix)}\n` +
95
+ ` ${dim("To free the port (Windows): ")} ${cyan(win)}\n`);
96
+ }
89
97
  async function handlePortConflict(port, resolvedRoot) {
90
98
  const existing = await probeVskillServer(port);
91
99
  if (existing) {
@@ -94,14 +102,20 @@ async function handlePortConflict(port, resolvedRoot) {
94
102
  `\n ${bold("Project:")} ${cyan(existing.projectName || "unknown")}${sameProject ? dim(" (same project)") : ""}` +
95
103
  `\n ${bold("Root:")} ${dim(existing.root)}` +
96
104
  `\n ${bold("Model:")} ${dim(existing.model)}` +
97
- `\n\n ${dim("Open the browser to:")} ${cyan(`http://localhost:${port}`)}\n`);
105
+ `\n\n ${dim("Open the browser to:")} ${cyan(`http://localhost:${port}`)}` +
106
+ `\n\n ${dim("Or restart fresh — kill the existing server, then re-run vskill studio:")}\n` +
107
+ killHint(port) +
108
+ "\n");
98
109
  // Reuse semantics: exit cleanly so the user can point their browser.
99
110
  process.exit(0);
100
111
  }
101
112
  // Port occupied by a non-vskill process. No PID discovery (Windows can't
102
- // do it portably, and the PID wasn't actionable anyway).
103
- console.error(red(`\n Port ${port} is in use by a non-vskill process please free it manually.\n`) +
104
- ` ${dim("Or pick a different port:")} ${cyan(`vskill eval serve --port ${port + 1}`)}\n`);
113
+ // do it portably, and the PID wasn't actionable anyway). Print kill hints
114
+ // for both platforms so the user can free the port without leaving the
115
+ // terminal.
116
+ console.error(red(`\n Port ${port} is in use by a non-vskill process — please free it manually.\n\n`) +
117
+ killHint(port) +
118
+ `\n ${dim("Or pick a different port:")} ${cyan(`vskill eval serve --port ${port + 1}`)}\n`);
105
119
  process.exit(1);
106
120
  }
107
121
  // ---------------------------------------------------------------------------
@@ -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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"}
@@ -1,5 +1,7 @@
1
1
  interface ListOptions {
2
2
  agents?: boolean;
3
+ /** 0724 T-005: per-scope enable status table. */
4
+ installed?: boolean;
3
5
  json?: boolean;
4
6
  }
5
7
  export declare function listCommand(opts: ListOptions): Promise<void>;
@@ -3,8 +3,14 @@
3
3
  // ---------------------------------------------------------------------------
4
4
  import { readLockfile, readSkillsShLock } from "../lockfile/index.js";
5
5
  import { detectInstalledAgents, AGENTS_REGISTRY, } from "../agents/agents-registry.js";
6
- import { bold, green, dim, cyan, yellow, table } from "../utils/output.js";
6
+ import { isPluginEnabled } from "../settings/index.js";
7
+ import { resolvePluginId } from "../lib/skill-lifecycle.js";
8
+ import { bold, green, red, dim, cyan, yellow, table } from "../utils/output.js";
7
9
  export async function listCommand(opts) {
10
+ if (opts.installed) {
11
+ await listInstalledWithStatus(opts.json);
12
+ return;
13
+ }
8
14
  if (opts.agents) {
9
15
  await listAgents(opts.json);
10
16
  }
@@ -92,4 +98,80 @@ async function listSkills(json) {
92
98
  }
93
99
  console.log(table(headers, rows));
94
100
  }
101
+ async function listInstalledWithStatus(json) {
102
+ const lock = readLockfile();
103
+ if (!lock) {
104
+ console.log(yellow("No vskill.lock found. Run ") +
105
+ cyan("vskill install") +
106
+ yellow(" first."));
107
+ process.exit(1);
108
+ return;
109
+ }
110
+ const skillNames = Object.keys(lock.skills);
111
+ const cwd = process.cwd();
112
+ const rowsData = skillNames.map((name) => {
113
+ const entry = lock.skills[name];
114
+ const pluginId = resolvePluginId(name, entry);
115
+ if (pluginId === null) {
116
+ return {
117
+ name,
118
+ version: entry.version || "-",
119
+ source: entry.source || "-",
120
+ enabledUser: false,
121
+ enabledProject: false,
122
+ autoDiscovered: true,
123
+ };
124
+ }
125
+ let enabledUser = false;
126
+ let enabledProject = false;
127
+ try {
128
+ enabledUser = isPluginEnabled(pluginId, { scope: "user" });
129
+ }
130
+ catch {
131
+ enabledUser = false;
132
+ }
133
+ try {
134
+ enabledProject = isPluginEnabled(pluginId, {
135
+ scope: "project",
136
+ projectDir: cwd,
137
+ });
138
+ }
139
+ catch {
140
+ enabledProject = false;
141
+ }
142
+ return {
143
+ name,
144
+ version: entry.version || "-",
145
+ source: entry.source || "-",
146
+ enabledUser,
147
+ enabledProject,
148
+ autoDiscovered: false,
149
+ };
150
+ });
151
+ if (json) {
152
+ console.log(JSON.stringify(rowsData, null, 2));
153
+ return;
154
+ }
155
+ if (rowsData.length === 0) {
156
+ console.log(dim("No skills installed yet."));
157
+ console.log(dim(`Run ${cyan("vskill install <owner/repo>")} to install a skill.`));
158
+ return;
159
+ }
160
+ console.log(bold(`Installed Skills (${rowsData.length})\n`));
161
+ const headers = ["Skill", "Version", "Source", "User Scope", "Project Scope"];
162
+ const rows = rowsData.map((r) => {
163
+ const userCell = r.autoDiscovered
164
+ ? dim("n/a")
165
+ : r.enabledUser
166
+ ? green("enabled")
167
+ : red("disabled");
168
+ const projectCell = r.autoDiscovered
169
+ ? dim("n/a")
170
+ : r.enabledProject
171
+ ? green("enabled")
172
+ : red("disabled");
173
+ return [bold(r.name), r.version, dim(r.source), userCell, projectCell];
174
+ });
175
+ console.log(table(headers, rows));
176
+ }
95
177
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ interface RemoveOptions {
2
2
  global?: boolean;
3
3
  local?: boolean;
4
4
  force?: boolean;
5
+ /** 0724 T-007: structured JSON output (matches enable/disable shape). */
6
+ json?: boolean;
5
7
  }
6
8
  export declare function removeCommand(skillName: string, opts: RemoveOptions): Promise<void>;
7
9
  export {};