mcpick 0.0.19 → 0.0.20

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.
@@ -0,0 +1,26 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v6
14
+
15
+ - uses: pnpm/action-setup@v6
16
+
17
+ - uses: actions/setup-node@v6
18
+ with:
19
+ node-version-file: package.json
20
+ cache: pnpm
21
+
22
+ - run: pnpm install --frozen-lockfile
23
+
24
+ - run: pnpm run build
25
+
26
+ - run: pnpm run test
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # mcpick
2
2
 
3
+ ## 0.0.20
4
+
5
+ ### Patch Changes
6
+
7
+ - 00ea930: chore: add unit tests and CI workflow with GitHub Actions
8
+ - 37a62e1: feat: auto-show help instead of TUI in non-TTY environments for LLM agents
9
+ - fc1db54: fix: replace exec with execFile to eliminate shell injection on all platforms
10
+
3
11
  ## 0.0.19
4
12
 
5
13
  ### Patch Changes
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Scott Spence
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
2
2
  import { t as add_server_to_registry } from "./registry-CfUKT7_C.js";
3
- import { t as add_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
3
+ import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
4
4
  import { n as output, t as error } from "./output-BchYq0mR.js";
5
5
  import { defineCommand } from "citty";
6
6
  //#region src/cli/commands/add.ts
@@ -110,4 +110,4 @@ function parse_key_value_pairs(input) {
110
110
  //#endregion
111
111
  export { add_default as default };
112
112
 
113
- //# sourceMappingURL=add-B9nVyh8T.js.map
113
+ //# sourceMappingURL=add-BDyaBew0.js.map
@@ -1,4 +1,4 @@
1
- import { u as mcp_add_json_via_cli } from "./claude-cli-BeA-bmoW.js";
1
+ import { u as mcp_add_json_via_cli } from "./claude-cli-DnmBJrjg.js";
2
2
  import { n as output, t as error } from "./output-BchYq0mR.js";
3
3
  import { defineCommand } from "citty";
4
4
  //#region src/cli/commands/add-json.ts
@@ -55,4 +55,4 @@ var add_json_default = defineCommand({
55
55
  //#endregion
56
56
  export { add_json_default as default };
57
57
 
58
- //# sourceMappingURL=add-json-CXNDl3al.js.map
58
+ //# sourceMappingURL=add-json-BjgzdeG-.js.map
@@ -1,58 +1,56 @@
1
- import { exec } from "node:child_process";
1
+ import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  //#region src/utils/claude-cli.ts
4
- const execAsync = promisify(exec);
4
+ const exec_file_async = promisify(execFile);
5
5
  /**
6
6
  * Check if Claude CLI is available
7
7
  */
8
8
  async function check_claude_cli() {
9
9
  try {
10
- await execAsync("claude --version");
10
+ await exec_file_async("claude", ["--version"]);
11
11
  return true;
12
12
  } catch {
13
13
  return false;
14
14
  }
15
15
  }
16
16
  /**
17
- * Escape a string for shell usage
18
- */
19
- function shell_escape(str) {
20
- return `'${str.replace(/'/g, "'\\''")}'`;
21
- }
22
- /**
23
- * Validate environment variable key
24
- * Must start with letter or underscore, contain only alphanumeric and underscores
17
+ * Validate environment variable key.
18
+ * Must start with letter or underscore, contain only alphanumeric and underscores.
25
19
  */
26
20
  function is_valid_env_key(key) {
27
21
  return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key);
28
22
  }
29
23
  /**
30
- * Build the claude mcp add command for a server
24
+ * Build args array for claude mcp add command.
25
+ * Returns raw args — no shell escaping needed since we use execFile.
31
26
  */
32
- function build_add_command(server, scope) {
33
- const parts = [
34
- "claude",
35
- "mcp",
36
- "add"
37
- ];
38
- parts.push(shell_escape(server.name));
27
+ function build_add_args(server, scope) {
28
+ const args = ["mcp", "add"];
29
+ args.push(server.name);
39
30
  const transport = server.type || "stdio";
40
- if (transport !== "stdio") parts.push("--transport", transport);
41
- parts.push("--scope", scope);
31
+ if (transport !== "stdio") args.push("--transport", transport);
32
+ args.push("--scope", scope);
42
33
  if (transport === "stdio") {
43
34
  if (server.env) {
44
- for (const [key, value] of Object.entries(server.env)) if (is_valid_env_key(key)) parts.push("-e", `${key}=${shell_escape(value)}`);
35
+ for (const [key, value] of Object.entries(server.env)) if (is_valid_env_key(key)) args.push("-e", `${key}=${value}`);
45
36
  }
46
37
  if ("command" in server && server.command) {
47
- parts.push("--");
48
- parts.push(shell_escape(server.command));
49
- if (server.args && server.args.length > 0) parts.push(...server.args.map((arg) => shell_escape(arg)));
38
+ args.push("--");
39
+ args.push(server.command);
40
+ if (server.args && server.args.length > 0) args.push(...server.args);
50
41
  }
51
42
  } else {
52
- if ("url" in server && server.url) parts.push(shell_escape(server.url));
53
- if ("headers" in server && server.headers) for (const [key, value] of Object.entries(server.headers)) parts.push("-H", shell_escape(`${key}: ${value}`));
43
+ if ("url" in server && server.url) args.push(server.url);
44
+ if ("headers" in server && server.headers) for (const [key, value] of Object.entries(server.headers)) args.push("-H", `${key}: ${value}`);
54
45
  }
55
- return parts.join(" ");
46
+ return args;
47
+ }
48
+ /**
49
+ * Run a claude CLI command using execFile (no shell).
50
+ * This avoids all shell escaping issues on every platform.
51
+ */
52
+ async function run_claude(args) {
53
+ return exec_file_async("claude", args);
56
54
  }
57
55
  /**
58
56
  * Add an MCP server using Claude CLI
@@ -62,9 +60,8 @@ async function add_mcp_via_cli(server, scope) {
62
60
  success: false,
63
61
  error: "Claude CLI not found. Please install Claude Code CLI."
64
62
  };
65
- const command = build_add_command(server, scope);
66
63
  try {
67
- await execAsync(command);
64
+ await run_claude(build_add_args(server, scope));
68
65
  return { success: true };
69
66
  } catch (error) {
70
67
  return {
@@ -82,7 +79,11 @@ async function remove_mcp_via_cli(name) {
82
79
  error: "Claude CLI not found. Please install Claude Code CLI."
83
80
  };
84
81
  try {
85
- await execAsync(`claude mcp remove ${shell_escape(name)}`);
82
+ await run_claude([
83
+ "mcp",
84
+ "remove",
85
+ name
86
+ ]);
86
87
  return { success: true };
87
88
  } catch (error) {
88
89
  return {
@@ -100,7 +101,13 @@ async function install_plugin_via_cli(key, scope = "user") {
100
101
  error: "Claude CLI not found. Please install Claude Code CLI."
101
102
  };
102
103
  try {
103
- await execAsync(`claude plugin install ${shell_escape(key)} --scope ${scope}`);
104
+ await run_claude([
105
+ "plugin",
106
+ "install",
107
+ key,
108
+ "--scope",
109
+ scope
110
+ ]);
104
111
  return { success: true };
105
112
  } catch (error) {
106
113
  return {
@@ -118,7 +125,13 @@ async function uninstall_plugin_via_cli(key, scope = "user") {
118
125
  error: "Claude CLI not found. Please install Claude Code CLI."
119
126
  };
120
127
  try {
121
- await execAsync(`claude plugin uninstall ${shell_escape(key)} --scope ${scope}`);
128
+ await run_claude([
129
+ "plugin",
130
+ "uninstall",
131
+ key,
132
+ "--scope",
133
+ scope
134
+ ]);
122
135
  return { success: true };
123
136
  } catch (error) {
124
137
  return {
@@ -136,7 +149,13 @@ async function update_plugin_via_cli(key, scope = "user") {
136
149
  error: "Claude CLI not found. Please install Claude Code CLI."
137
150
  };
138
151
  try {
139
- await execAsync(`claude plugin update ${shell_escape(key)} --scope ${scope}`);
152
+ await run_claude([
153
+ "plugin",
154
+ "update",
155
+ key,
156
+ "--scope",
157
+ scope
158
+ ]);
140
159
  return { success: true };
141
160
  } catch (error) {
142
161
  return {
@@ -146,9 +165,6 @@ async function update_plugin_via_cli(key, scope = "user") {
146
165
  }
147
166
  }
148
167
  /**
149
- * Add a marketplace via Claude CLI
150
- */
151
- /**
152
168
  * Extract GitHub owner/repo from various source formats.
153
169
  * Returns null if not a recognizable GitHub reference.
154
170
  */
@@ -203,7 +219,12 @@ async function marketplace_add_via_cli(source) {
203
219
  };
204
220
  }
205
221
  try {
206
- await execAsync(`claude plugin marketplace add ${shell_escape(source)}`);
222
+ await run_claude([
223
+ "plugin",
224
+ "marketplace",
225
+ "add",
226
+ source
227
+ ]);
207
228
  return { success: true };
208
229
  } catch (error) {
209
230
  const message = error instanceof Error ? error.message : "Unknown error";
@@ -230,7 +251,12 @@ async function marketplace_remove_via_cli(name) {
230
251
  error: "Claude CLI not found. Please install Claude Code CLI."
231
252
  };
232
253
  try {
233
- await execAsync(`claude plugin marketplace remove ${shell_escape(name)}`);
254
+ await run_claude([
255
+ "plugin",
256
+ "marketplace",
257
+ "remove",
258
+ name
259
+ ]);
234
260
  return { success: true };
235
261
  } catch (error) {
236
262
  return {
@@ -248,7 +274,13 @@ async function marketplace_update_via_cli(name) {
248
274
  error: "Claude CLI not found. Please install Claude Code CLI."
249
275
  };
250
276
  try {
251
- await execAsync(name ? `claude plugin marketplace update ${shell_escape(name)}` : "claude plugin marketplace update");
277
+ const args = [
278
+ "plugin",
279
+ "marketplace",
280
+ "update"
281
+ ];
282
+ if (name) args.push(name);
283
+ await run_claude(args);
252
284
  return { success: true };
253
285
  } catch (error) {
254
286
  return {
@@ -266,7 +298,11 @@ async function marketplace_list_via_cli() {
266
298
  error: "Claude CLI not found. Please install Claude Code CLI."
267
299
  };
268
300
  try {
269
- const { stdout } = await execAsync("claude plugin marketplace list");
301
+ const { stdout } = await run_claude([
302
+ "plugin",
303
+ "marketplace",
304
+ "list"
305
+ ]);
270
306
  return {
271
307
  success: true,
272
308
  stdout: stdout.trim()
@@ -297,7 +333,11 @@ async function validate_plugin_via_cli(path) {
297
333
  error: "Claude CLI not found. Please install Claude Code CLI."
298
334
  };
299
335
  try {
300
- const { stdout } = await execAsync(`claude plugin validate ${shell_escape(path)}`);
336
+ const { stdout } = await run_claude([
337
+ "plugin",
338
+ "validate",
339
+ path
340
+ ]);
301
341
  return {
302
342
  success: true,
303
343
  stdout: stdout.trim()
@@ -318,7 +358,11 @@ async function mcp_get_via_cli(name) {
318
358
  error: "Claude CLI not found. Please install Claude Code CLI."
319
359
  };
320
360
  try {
321
- const { stdout } = await execAsync(`claude mcp get ${shell_escape(name)}`);
361
+ const { stdout } = await run_claude([
362
+ "mcp",
363
+ "get",
364
+ name
365
+ ]);
322
366
  return {
323
367
  success: true,
324
368
  stdout: stdout.trim()
@@ -339,7 +383,14 @@ async function mcp_add_json_via_cli(name, json, scope = "local") {
339
383
  error: "Claude CLI not found. Please install Claude Code CLI."
340
384
  };
341
385
  try {
342
- await execAsync(`claude mcp add-json ${shell_escape(name)} ${shell_escape(json)} --scope ${scope}`);
386
+ await run_claude([
387
+ "mcp",
388
+ "add-json",
389
+ name,
390
+ json,
391
+ "--scope",
392
+ scope
393
+ ]);
343
394
  return { success: true };
344
395
  } catch (error) {
345
396
  return {
@@ -357,7 +408,7 @@ async function mcp_reset_project_choices_via_cli() {
357
408
  error: "Claude CLI not found. Please install Claude Code CLI."
358
409
  };
359
410
  try {
360
- await execAsync("claude mcp reset-project-choices");
411
+ await run_claude(["mcp", "reset-project-choices"]);
361
412
  return { success: true };
362
413
  } catch (error) {
363
414
  return {
@@ -391,4 +442,4 @@ function get_scope_options() {
391
442
  //#endregion
392
443
  export { install_plugin_via_cli as a, marketplace_remove_via_cli as c, mcp_get_via_cli as d, mcp_reset_project_choices_via_cli as f, validate_plugin_via_cli as g, update_plugin_via_cli as h, get_scope_options as i, marketplace_update_via_cli as l, uninstall_plugin_via_cli as m, check_claude_cli as n, marketplace_add_via_cli as o, remove_mcp_via_cli as p, get_scope_description as r, marketplace_list_via_cli as s, add_mcp_via_cli as t, mcp_add_json_via_cli as u };
393
444
 
394
- //# sourceMappingURL=claude-cli-BeA-bmoW.js.map
445
+ //# sourceMappingURL=claude-cli-DnmBJrjg.js.map
@@ -7,22 +7,22 @@ const main = defineCommand({
7
7
  },
8
8
  subCommands: {
9
9
  list: () => import("./list-B8YeDWt6.js").then((m) => m.default),
10
- enable: () => import("./enable-Bdnnn_Cq.js").then((m) => m.default),
11
- disable: () => import("./disable-BA8tXPJN.js").then((m) => m.default),
12
- remove: () => import("./remove-DIPWYMpk.js").then((m) => m.default),
13
- add: () => import("./add-B9nVyh8T.js").then((m) => m.default),
14
- "add-json": () => import("./add-json-CXNDl3al.js").then((m) => m.default),
15
- clone: () => import("./clone-DLFLewBY.js").then((m) => m.default),
16
- get: () => import("./get-BPjMXTMc.js").then((m) => m.default),
17
- "reset-project-choices": () => import("./reset-project-choices-DRM5KByw.js").then((m) => m.default),
10
+ enable: () => import("./enable-RrpcN6la.js").then((m) => m.default),
11
+ disable: () => import("./disable-xJXZfUR_.js").then((m) => m.default),
12
+ remove: () => import("./remove-D1owHLhG.js").then((m) => m.default),
13
+ add: () => import("./add-BDyaBew0.js").then((m) => m.default),
14
+ "add-json": () => import("./add-json-BjgzdeG-.js").then((m) => m.default),
15
+ clone: () => import("./clone-DYKPEsar.js").then((m) => m.default),
16
+ get: () => import("./get-Bb1eOOIZ.js").then((m) => m.default),
17
+ "reset-project-choices": () => import("./reset-project-choices-BfRSNN3m.js").then((m) => m.default),
18
18
  backup: () => import("./backup-DSDhHI5f.js").then((m) => m.default),
19
19
  restore: () => import("./restore-DdMfUljI.js").then((m) => m.default),
20
20
  profile: () => import("./profile-CX97sMGp.js").then((m) => m.default),
21
- plugins: () => import("./plugins-DHYJF5CP.js").then((m) => m.default),
21
+ plugins: () => import("./plugins-Dc7DN6R_.js").then((m) => m.default),
22
22
  hooks: () => import("./hooks-Bmn7pUZa.js").then((m) => m.default),
23
23
  cache: () => import("./cache-D6kd7qE8.js").then((m) => m.default),
24
24
  dev: () => import("./dev-DRJRNp7y.js").then((m) => m.default),
25
- marketplace: () => import("./marketplace-Br89Tg-Z.js").then((m) => m.default),
25
+ marketplace: () => import("./marketplace-DcKk5dc1.js").then((m) => m.default),
26
26
  reload: () => import("./reload-CYDhkCVZ.js").then((m) => m.default)
27
27
  }
28
28
  });
@@ -81,4 +81,4 @@ const run = () => runMain(main, { showUsage: show_usage_with_examples });
81
81
  //#endregion
82
82
  export { run };
83
83
 
84
- //# sourceMappingURL=cli-DNNZjJYL.js.map
84
+ //# sourceMappingURL=cli-CsFfnWBo.js.map
@@ -1,6 +1,6 @@
1
1
  import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
2
2
  import { t as add_server_to_registry } from "./registry-CfUKT7_C.js";
3
- import { t as add_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
3
+ import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
4
4
  import { i as find_server_in_scope, r as detect_server_scope } from "./config-DijVdEFn.js";
5
5
  import { n as output, t as error } from "./output-BchYq0mR.js";
6
6
  import { t as redact_server } from "./redact-O35tjnRD.js";
@@ -85,4 +85,4 @@ var clone_default = defineCommand({
85
85
  //#endregion
86
86
  export { clone_default as default };
87
87
 
88
- //# sourceMappingURL=clone-DLFLewBY.js.map
88
+ //# sourceMappingURL=clone-DYKPEsar.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as get_all_available_servers } from "./registry-CfUKT7_C.js";
2
- import { p as remove_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
2
+ import { p as remove_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
3
3
  import { t as error } from "./output-BchYq0mR.js";
4
4
  import { defineCommand } from "citty";
5
5
  //#region src/cli/commands/disable.ts
@@ -36,4 +36,4 @@ var disable_default = defineCommand({
36
36
  //#endregion
37
37
  export { disable_default as default };
38
38
 
39
- //# sourceMappingURL=disable-BA8tXPJN.js.map
39
+ //# sourceMappingURL=disable-xJXZfUR_.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as get_all_available_servers } from "./registry-CfUKT7_C.js";
2
- import { t as add_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
2
+ import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
3
3
  import { t as error } from "./output-BchYq0mR.js";
4
4
  import { defineCommand } from "citty";
5
5
  //#region src/cli/commands/enable.ts
@@ -37,4 +37,4 @@ var enable_default = defineCommand({
37
37
  //#endregion
38
38
  export { enable_default as default };
39
39
 
40
- //# sourceMappingURL=enable-Bdnnn_Cq.js.map
40
+ //# sourceMappingURL=enable-RrpcN6la.js.map
@@ -1,4 +1,4 @@
1
- import { d as mcp_get_via_cli } from "./claude-cli-BeA-bmoW.js";
1
+ import { d as mcp_get_via_cli } from "./claude-cli-DnmBJrjg.js";
2
2
  import { n as output, t as error } from "./output-BchYq0mR.js";
3
3
  import { defineCommand } from "citty";
4
4
  //#region src/cli/commands/get.ts
@@ -38,4 +38,4 @@ var get_default = defineCommand({
38
38
  //#endregion
39
39
  export { get_default as default };
40
40
 
41
- //# sourceMappingURL=get-BPjMXTMc.js.map
41
+ //# sourceMappingURL=get-Bb1eOOIZ.js.map
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { m as get_plugin_backup_filename, n as get_backup_filename, r as get_backups_dir, t as ensure_directory_exists } from "./paths-BPISiJi4.js";
3
3
  import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
4
4
  import { i as list_plugin_backups, n as get_all_available_servers, o as sync_servers_to_registry, r as list_backups, t as add_server_to_registry } from "./registry-CfUKT7_C.js";
5
- import { a as install_plugin_via_cli, c as marketplace_remove_via_cli, h as update_plugin_via_cli, i as get_scope_options, l as marketplace_update_via_cli, m as uninstall_plugin_via_cli, n as check_claude_cli, o as marketplace_add_via_cli, p as remove_mcp_via_cli, r as get_scope_description, t as add_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
5
+ import { a as install_plugin_via_cli, c as marketplace_remove_via_cli, h as update_plugin_via_cli, i as get_scope_options, l as marketplace_update_via_cli, m as uninstall_plugin_via_cli, n as check_claude_cli, o as marketplace_add_via_cli, p as remove_mcp_via_cli, r as get_scope_description, t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
6
6
  import { a as get_enabled_servers, c as write_claude_config, n as create_config_from_servers, o as get_enabled_servers_for_scope, s as read_claude_config } from "./config-DijVdEFn.js";
7
7
  import { a as read_claude_settings, i as get_all_plugins, n as build_enabled_plugins, r as get_all_hooks, s as write_claude_settings } from "./settings-DEcWtzLE.js";
8
8
  import { d as refresh_all_marketplaces, l as read_known_marketplaces, n as clear_plugin_caches, r as get_cached_plugins_info, t as clean_orphaned_versions, u as read_marketplace_manifest } from "./plugin-cache-Bby9Dxm9.js";
@@ -1238,8 +1238,10 @@ const SUBCOMMANDS = new Set([
1238
1238
  "reload"
1239
1239
  ]);
1240
1240
  const arg = process.argv[2];
1241
- if (arg && SUBCOMMANDS.has(arg) || arg === "--help" || arg === "-h") import("./cli-DNNZjJYL.js").then((m) => m.run());
1242
- else main().catch((error) => {
1241
+ if (arg && SUBCOMMANDS.has(arg) || arg === "--help" || arg === "-h" || !process.stdout.isTTY) {
1242
+ if (!arg && !process.stdout.isTTY) process.argv.push("--help");
1243
+ import("./cli-CsFfnWBo.js").then((m) => m.run());
1244
+ } else main().catch((error) => {
1243
1245
  console.error("Fatal error:", error);
1244
1246
  process.exit(1);
1245
1247
  });
@@ -1,4 +1,4 @@
1
- import { c as marketplace_remove_via_cli, l as marketplace_update_via_cli, o as marketplace_add_via_cli, s as marketplace_list_via_cli } from "./claude-cli-BeA-bmoW.js";
1
+ import { c as marketplace_remove_via_cli, l as marketplace_update_via_cli, o as marketplace_add_via_cli, s as marketplace_list_via_cli } from "./claude-cli-DnmBJrjg.js";
2
2
  import { u as read_marketplace_manifest } from "./plugin-cache-Bby9Dxm9.js";
3
3
  import { a as redisable_restored_hooks, t as check_restored_hooks } from "./hook-state-Di8lUsPr.js";
4
4
  import { n as output, t as error } from "./output-BchYq0mR.js";
@@ -165,4 +165,4 @@ var marketplace_default = defineCommand({
165
165
  //#endregion
166
166
  export { marketplace_default as default };
167
167
 
168
- //# sourceMappingURL=marketplace-Br89Tg-Z.js.map
168
+ //# sourceMappingURL=marketplace-DcKk5dc1.js.map
@@ -1,4 +1,4 @@
1
- import { a as install_plugin_via_cli, g as validate_plugin_via_cli, h as update_plugin_via_cli, m as uninstall_plugin_via_cli } from "./claude-cli-BeA-bmoW.js";
1
+ import { a as install_plugin_via_cli, g as validate_plugin_via_cli, h as update_plugin_via_cli, m as uninstall_plugin_via_cli } from "./claude-cli-DnmBJrjg.js";
2
2
  import { a as read_claude_settings, i as get_all_plugins, n as build_enabled_plugins, s as write_claude_settings } from "./settings-DEcWtzLE.js";
3
3
  import { l as read_known_marketplaces, o as parse_plugin_key } from "./plugin-cache-Bby9Dxm9.js";
4
4
  import { n as output, t as error } from "./output-BchYq0mR.js";
@@ -209,4 +209,4 @@ var plugins_default = defineCommand({
209
209
  //#endregion
210
210
  export { plugins_default as default };
211
211
 
212
- //# sourceMappingURL=plugins-DHYJF5CP.js.map
212
+ //# sourceMappingURL=plugins-Dc7DN6R_.js.map
@@ -1,5 +1,5 @@
1
1
  import { a as read_server_registry, n as get_all_available_servers, s as write_server_registry } from "./registry-CfUKT7_C.js";
2
- import { p as remove_mcp_via_cli } from "./claude-cli-BeA-bmoW.js";
2
+ import { p as remove_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
3
3
  import { t as error } from "./output-BchYq0mR.js";
4
4
  import { defineCommand } from "citty";
5
5
  //#region src/cli/commands/remove.ts
@@ -28,4 +28,4 @@ var remove_default = defineCommand({
28
28
  //#endregion
29
29
  export { remove_default as default };
30
30
 
31
- //# sourceMappingURL=remove-DIPWYMpk.js.map
31
+ //# sourceMappingURL=remove-D1owHLhG.js.map
@@ -1,4 +1,4 @@
1
- import { f as mcp_reset_project_choices_via_cli } from "./claude-cli-BeA-bmoW.js";
1
+ import { f as mcp_reset_project_choices_via_cli } from "./claude-cli-DnmBJrjg.js";
2
2
  import { n as output, t as error } from "./output-BchYq0mR.js";
3
3
  import { defineCommand } from "citty";
4
4
  //#region src/cli/commands/reset-project-choices.ts
@@ -25,4 +25,4 @@ var reset_project_choices_default = defineCommand({
25
25
  //#endregion
26
26
  export { reset_project_choices_default as default };
27
27
 
28
- //# sourceMappingURL=reset-project-choices-DRM5KByw.js.map
28
+ //# sourceMappingURL=reset-project-choices-BfRSNN3m.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcpick",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "description": "Claude Code extension manager — MCP servers, plugins (skills, hooks, agents), and marketplaces",
5
5
  "keywords": [
6
6
  "claude",
@@ -17,15 +17,15 @@
17
17
  "type": "module",
18
18
  "main": "./dist/index.js",
19
19
  "dependencies": {
20
- "@clack/prompts": "^1.1.0",
21
- "citty": "^0.2.1",
20
+ "@clack/prompts": "^1.2.0",
21
+ "citty": "^0.2.2",
22
22
  "valibot": "^1.3.1"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@changesets/cli": "^2.30.0",
26
- "@types/node": "^25.5.0",
27
- "vite-plus": "^0.1.15",
28
- "vitest": "^4.1.2"
26
+ "@types/node": "^25.6.0",
27
+ "vite-plus": "^0.1.16",
28
+ "vitest": "^4.1.4"
29
29
  },
30
30
  "engines": {
31
31
  "node": ">=22.0.0"