mcpick 0.0.19 → 0.0.21

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,19 @@
1
1
  # mcpick
2
2
 
3
+ ## 0.0.21
4
+
5
+ ### Patch Changes
6
+
7
+ - 47e40be: chore: reorder TUI menu and update README for agent-first usage
8
+
9
+ ## 0.0.20
10
+
11
+ ### Patch Changes
12
+
13
+ - 00ea930: chore: add unit tests and CI workflow with GitHub Actions
14
+ - 37a62e1: feat: auto-show help instead of TUI in non-TTY environments for LLM agents
15
+ - fc1db54: fix: replace exec with execFile to eliminate shell injection on all platforms
16
+
3
17
  ## 0.0.19
4
18
 
5
19
  ### 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.
package/README.md CHANGED
@@ -1,366 +1,187 @@
1
1
  # McPick
2
2
 
3
- A CLI tool for managing MCP servers, plugins, and plugin caches in
4
- Claude Code. Toggle servers and plugins on/off, manage stale plugin
5
- caches, and optimise context usage and performance.
3
+ [![built with vite+](https://img.shields.io/badge/built%20with-Vite+-646CFF?logo=vite&logoColor=white)](https://viteplus.dev)
4
+ [![tested with vitest](https://img.shields.io/badge/tested%20with-Vitest-6E9F18?logo=vitest&logoColor=white)](https://vitest.dev)
6
5
 
7
- ## Installation
6
+ Claude Code extension manager — MCP servers, plugins (skills, hooks,
7
+ agents), and marketplaces.
8
8
 
9
- ### One-time Usage (recommended)
9
+ ## Quick Start
10
10
 
11
- ```bash
12
- pnpx mcpick
13
- # or
14
- pnpm dlx mcpick
15
- # or
16
- npx mcpick
17
- ```
18
-
19
- ### Global Installation
11
+ Use mcpick inline in Claude Code sessions. Tell Claude:
20
12
 
21
- ```bash
22
- pnpm install -g mcpick
23
- # or
24
- npm install -g mcpick
25
13
  ```
26
-
27
- ## The Problem
28
-
29
- Using the Claude Code `/doctor` command you may see something like
30
- this if you have many MCP servers configured:
31
-
32
- ```bash
33
- Context Usage Warnings
34
- └ ⚠ Large MCP tools context (~66,687 tokens > 25,000)
35
- └ MCP servers:
36
- └ mcp-omnisearch-testing: 20 tools (~10,494 tokens)
37
- └ mcp-omnisearch: 20 tools (~10,454 tokens)
38
- └ mcp-sqlite-tools-testing: 19 tools (~9,910 tokens)
39
- └ mcp-sqlite-tools: 19 tools (~9,872 tokens)
40
- └ playwright: 21 tools (~9,804 tokens)
41
- └ (7 more servers)
14
+ Use npx mcpick to add the marketplace at spences10/claude-code-toolkit
42
15
  ```
43
16
 
44
- Claude Code loads **all** MCP servers from your `.claude.json` file at
45
- startup, regardless of whether you need them for your current task.
46
- This can lead to:
47
-
48
- - 🐌 Slower Claude Code startup times
49
- - 💾 High context token usage
50
- - 🧠 Cognitive overload from too many available tools
51
-
52
- ## The Solution
53
-
54
- McPick provides an intuitive CLI menu and non-interactive subcommands
55
- to:
56
-
57
- - ✅ **Toggle servers on/off** - Enable only the MCP servers you need
58
- for your current task
59
- - 🔌 **Toggle plugins on/off** - Enable or disable Claude Code
60
- marketplace plugins
61
- - 🗑️ **Manage plugin cache** - Detect stale plugins, clear caches,
62
- clean orphaned versions, refresh marketplaces
63
- - 📁 **Manage server registry** - Keep a database of all your
64
- available MCP servers
65
- - 🔄 **Safe configuration** - Only modifies the `mcpServers` section,
66
- preserving other Claude Code settings
67
- - 💾 **Backup & restore** - Create focused backups of your MCP server
68
- configurations
69
-
70
- ## Features
71
-
72
- ### Interactive Menu
17
+ ```
18
+ Use npx mcpick to list my plugins and disable the ones I'm not using
19
+ ```
73
20
 
74
- ```bash
75
- ┌ McPick - MCP Server Configuration Manager
76
-
77
- ◆ What would you like to do?
78
- │ ● Enable / Disable MCP servers (Toggle MCP servers on/off)
79
- │ ○ Enable / Disable plugins (Toggle Claude Code plugins on/off)
80
- │ ○ Manage plugin cache (View, clear, or refresh plugin caches)
81
- │ ○ Backup config
82
- │ ○ Add MCP server
83
- │ ○ Restore from backup
84
- │ ○ Load profile
85
- │ ○ Save profile
86
- │ ○ Exit
87
-
21
+ ```
22
+ Use npx mcpick to enable only the mcp-sqlite-tools server
88
23
  ```
89
24
 
90
- ### Scope Support
25
+ McPick auto-detects non-TTY environments and shows structured help
26
+ instead of launching the interactive TUI — so LLM agents can read
27
+ `npx mcpick --help` and figure out the rest.
91
28
 
92
- MCPick supports the three MCP server scopes used by Claude Code:
29
+ ## Concepts
93
30
 
94
- | Scope | Description | Storage Location |
95
- | ----------- | ------------------------------------ | --------------------------------------------- |
96
- | **Local** | Project-specific servers (default) | `~/.claude.json` → `projects[cwd].mcpServers` |
97
- | **Project** | Shared via `.mcp.json` in repository | `.mcp.json` in project root |
98
- | **User** | Global servers for all projects | `~/.claude.json` → `mcpServers` |
31
+ Marketplaces contain plugins. Plugins contain skills
32
+ (`/slash-commands`), hooks, agents, and MCP servers.
99
33
 
100
- When you select "Enable / Disable MCP servers", MCPick will:
34
+ ```
35
+ Marketplace → Plugin → Skills, Hooks, Agents, MCP Servers
36
+ ```
101
37
 
102
- 1. Ask which scope you want to edit
103
- 2. Show servers already enabled for that scope (pre-checked)
104
- 3. Use `claude mcp add/remove` CLI commands for Local and Project
105
- scopes
38
+ ## Common Workflows
106
39
 
107
- This integration ensures your changes are correctly applied to the
108
- right configuration location.
40
+ ### Install skills from a marketplace
109
41
 
110
- ### Smart Server Management
42
+ ```bash
43
+ # 1. Add the marketplace
44
+ npx mcpick marketplace add spences10/claude-code-toolkit
111
45
 
112
- - **Auto-discovery**: Automatically imports servers from your existing
113
- `.claude.json`
114
- - **Registry sync**: Maintains a registry of available servers for
115
- quick selection
116
- - **Selective enabling**: Choose exactly which servers to enable via
117
- multiselect
118
- - **Configuration safety**: Preserves all non-MCP settings in your
119
- Claude Code config
46
+ # 2. Install a plugin from it
47
+ npx mcpick plugins install my-plugin@claude-code-toolkit
120
48
 
121
- ### Backup System
49
+ # 3. Skills are now available as /slash-commands in Claude Code
50
+ ```
122
51
 
123
- - **Focused backups**: Only backs up MCP server configurations (not
124
- the entire 30k+ line config)
125
- - **Automatic cleanup**: Keeps last 10 backups to prevent storage
126
- bloat
127
- - **Easy restoration**: Restore from any previous backup with a simple
128
- menu
52
+ Marketplace sources can be:
129
53
 
130
- ### Profiles
54
+ - `owner/repo` — GitHub shorthand
55
+ - `https://github.com/owner/repo` — full URL
56
+ - `./local-path` — local directory
131
57
 
132
- Load predefined sets of MCP servers instantly:
58
+ ### Toggle MCP servers
133
59
 
134
60
  ```bash
135
- # Apply a profile
136
- mcpick --profile database
137
- mcpick -p database
138
-
139
- # Save current config as a profile
140
- mcpick --save-profile mysetup
141
- mcpick -s mysetup
142
-
143
- # List available profiles
144
- mcpick --list-profiles
145
- mcpick -l
61
+ npx mcpick list # List servers and status
62
+ npx mcpick enable <server> # Enable a server
63
+ npx mcpick disable <server> # Disable a server
64
+ npx mcpick add --name <n> ... # Add a new server
65
+ npx mcpick remove <server> # Remove a server
146
66
  ```
147
67
 
148
- Profiles are stored in `~/.claude/mcpick/profiles/`. You can also
149
- create them manually:
150
-
151
- ```json
152
- // ~/.claude/mcpick/profiles/database.json
153
- {
154
- "mcp-sqlite-tools": {
155
- "type": "stdio",
156
- "command": "npx",
157
- "args": ["-y", "mcp-sqlite-tools"]
158
- }
159
- }
68
+ ### Manage plugins
69
+
70
+ ```bash
71
+ npx mcpick plugins list # List plugins and status
72
+ npx mcpick plugins install <key> # Install from marketplace
73
+ npx mcpick plugins uninstall <key> # Remove plugin
74
+ npx mcpick plugins update <key> # Update to latest
75
+ npx mcpick plugins enable <key> # Enable plugin
76
+ npx mcpick plugins disable <key> # Disable plugin
160
77
  ```
161
78
 
162
- Or use full format with `mcpServers` wrapper:
79
+ ### Manage marketplaces
163
80
 
164
- ```json
165
- {
166
- "mcpServers": {
167
- "server-name": { ... }
168
- }
169
- }
81
+ ```bash
82
+ npx mcpick marketplace list # List configured marketplaces
83
+ npx mcpick marketplace add <src> # Add a marketplace
84
+ npx mcpick marketplace remove <n> # Remove a marketplace
85
+ npx mcpick marketplace update # Update all marketplaces
170
86
  ```
171
87
 
172
- ### Plugin Cache Management
88
+ ### Manage hooks
173
89
 
174
- Claude Code caches marketplace plugins at `~/.claude/plugins/cache/`.
175
- When marketplace authors update plugins, your cached versions can go
176
- stale. McPick detects this and lets you fix it.
90
+ ```bash
91
+ npx mcpick hooks list # List all hooks
92
+ npx mcpick hooks add # Add a settings hook
93
+ npx mcpick hooks remove # Remove a hook
94
+ ```
177
95
 
178
- #### Interactive
96
+ ### Plugin cache
179
97
 
180
- Select "Manage plugin cache" from the main menu to:
98
+ ```bash
99
+ npx mcpick cache status # Show staleness info
100
+ npx mcpick cache clear [key] # Clear plugin cache
101
+ npx mcpick cache clean-orphaned # Remove orphaned dirs
102
+ npx mcpick cache refresh # Git pull marketplaces
103
+ ```
181
104
 
182
- - **View cache status** - See all cached plugins with staleness
183
- indicators (version mismatch, commits behind, orphaned versions)
184
- - **Clear plugin caches** - Refreshes the marketplace and clears
185
- selected caches so they rebuild with the latest version
186
- - **Clean orphaned versions** - Remove old version directories marked
187
- as orphaned
188
- - **Refresh marketplaces** - Git pull all marketplace clones to get
189
- latest plugin listings
105
+ ### Profiles
190
106
 
191
- #### CLI Subcommands
107
+ Switch between server/plugin configurations instantly:
192
108
 
193
109
  ```bash
194
- # Show cache status for all plugins
195
- npx mcpick cache status
196
- npx mcpick cache status --json
197
-
198
- # Clear a specific plugin cache (refreshes marketplace first)
199
- npx mcpick cache clear plugin-name@marketplace
200
- npx mcpick cache clear --all
110
+ npx mcpick --profile database # Apply a profile
111
+ npx mcpick --save-profile mysetup # Save current config
112
+ npx mcpick --list-profiles # List profiles
113
+ ```
201
114
 
202
- # Remove orphaned version directories
203
- npx mcpick cache clean-orphaned
115
+ ### Backups
204
116
 
205
- # Refresh all marketplace clones
206
- npx mcpick cache refresh
117
+ ```bash
118
+ npx mcpick backup # Create timestamped backup
119
+ npx mcpick restore [file] # Restore from backup
207
120
  ```
208
121
 
209
- ### Plugin Management
122
+ All commands support `--json` for machine-readable output.
210
123
 
211
- Install, update, and toggle Claude Code marketplace plugins:
124
+ ## Interactive TUI
212
125
 
213
- ```bash
214
- # List all plugins and their status
215
- npx mcpick plugins list
216
- npx mcpick plugins list --json
126
+ Running `npx mcpick` in a terminal (TTY) launches the interactive
127
+ menu for human use:
217
128
 
218
- # Install/uninstall a plugin (wraps claude plugin CLI)
219
- npx mcpick plugins install plugin-name@marketplace
220
- npx mcpick plugins uninstall plugin-name@marketplace
129
+ ```
130
+ ┌ MCPick - Claude Code Extension Manager
131
+
132
+ ◆ What would you like to do?
133
+ │ ● Enable / Disable MCP servers
134
+ │ ○ Manage plugins
135
+ │ ○ Manage marketplaces
136
+ │ ○ Manage hooks
137
+ │ ○ Manage plugin cache
138
+ │ ○ Backup config
139
+ │ ○ Add MCP server
140
+ │ ○ Restore from backup
141
+ │ ○ Load profile
142
+ │ ○ Save profile
143
+ │ ○ Exit
144
+
145
+ ```
221
146
 
222
- # Update a plugin to latest version
223
- npx mcpick plugins update plugin-name@marketplace
147
+ In non-TTY environments (LLM agents, piped output), mcpick
148
+ automatically shows `--help` instead.
224
149
 
225
- # Enable/disable a plugin
226
- npx mcpick plugins enable plugin-name@marketplace
227
- npx mcpick plugins disable plugin-name@marketplace
228
- ```
150
+ ## The Problem
229
151
 
230
- All plugin commands support `--scope` (user, project, local) and
231
- `--json` flags.
152
+ Claude Code loads **all** MCP servers at startup. With many servers
153
+ configured, `/doctor` shows:
232
154
 
233
- ### CLI Subcommands
155
+ ```
156
+ Context Usage Warnings
157
+ └ ⚠ Large MCP tools context (~66,687 tokens > 25,000)
158
+ ```
234
159
 
235
- McPick supports both an interactive menu (default) and non-interactive
236
- CLI subcommands for scripting and LLM tool use:
160
+ This means slower startup, wasted context tokens, and cognitive
161
+ overload from too many tools. McPick lets you toggle servers on/off so
162
+ you only load what you need.
237
163
 
238
- ```bash
239
- # MCP server management
240
- npx mcpick list # List servers
241
- npx mcpick enable <server> # Enable a server
242
- npx mcpick disable <server> # Disable a server
243
- npx mcpick add --name <n> ... # Add a server
244
- npx mcpick remove <server> # Remove a server
245
-
246
- # Backups and profiles
247
- npx mcpick backup # Create backup
248
- npx mcpick restore [file] # Restore from backup
249
- npx mcpick profile list # List profiles
250
- npx mcpick profile load <name> # Load a profile
251
- npx mcpick profile save <name> # Save current config
252
-
253
- # Plugin management
254
- npx mcpick plugins list # List plugins
255
- npx mcpick plugins enable <key> # Enable plugin
256
- npx mcpick plugins disable <key> # Disable plugin
257
- npx mcpick plugins install <key> # Install from marketplace
258
- npx mcpick plugins uninstall <key> # Remove plugin
259
- npx mcpick plugins update <key> # Update to latest version
164
+ ## Scope Support
260
165
 
261
- # Cache management
262
- npx mcpick cache status # Show staleness info
263
- npx mcpick cache clear [key] # Clear plugin cache
264
- npx mcpick cache clean-orphaned # Remove orphaned dirs
265
- npx mcpick cache refresh # Git pull marketplaces
266
- ```
166
+ | Scope | Description | Storage Location |
167
+ | ----------- | ---------------------------------- | --------------------------------------------- |
168
+ | **Local** | Project-specific servers (default) | `~/.claude.json` → `projects[cwd].mcpServers` |
169
+ | **Project** | Shared via `.mcp.json` in repo | `.mcp.json` in project root |
170
+ | **User** | Global servers for all projects | `~/.claude.json` → `mcpServers` |
267
171
 
268
- All subcommands support `--json` for machine-readable output.
269
-
270
- ### Typical Workflow
271
-
272
- 1. **Before a coding session**: Run `mcpick -p <profile>` or use the
273
- interactive menu to enable relevant servers
274
- 2. **Launch Claude Code**: Run `claude` to start with your configured
275
- servers
276
- 3. **Switch contexts**: Run `mcpick -p <other-profile>` to quickly
277
- switch server sets
278
-
279
- ### Adding New Servers
280
-
281
- 1. Select "Add MCP server"
282
- 2. Provide server details:
283
- - Name (e.g., "mcp-sqlite-tools")
284
- - Command (e.g., "npx")
285
- - Arguments (e.g., "-y", "mcp-sqlite-tools")
286
- - Description (optional)
287
- - Environment variables (optional)
288
-
289
- ## Configuration
290
-
291
- MCPick works with the standard Claude Code configuration format:
292
-
293
- ```json
294
- {
295
- "mcpServers": {
296
- "server-name": {
297
- "command": "npx",
298
- "args": ["-y", "mcp-server-package"],
299
- "env": {
300
- "API_KEY": "your-key"
301
- }
302
- }
303
- }
304
- }
305
- ```
172
+ ## File Locations
306
173
 
307
- ### File Locations
308
-
309
- - **Claude Config**: `~/.claude.json` (your main Claude Code
310
- configuration)
311
- - **Project Config**: `.mcp.json` (project-specific shared config,
312
- committed to git)
313
- - **MCPick Registry**: `~/.claude/mcpick/servers.json` (MCPick's
314
- server database)
315
- - **Backups**: `~/.claude/mcpick/backups/` (MCP configuration backups)
316
- - **Profiles**: `~/.claude/mcpick/profiles/` (predefined server sets)
317
- - **Plugin Cache**: `~/.claude/plugins/cache/` (cached plugin files)
318
- - **Installed Plugins**: `~/.claude/plugins/installed_plugins.json`
319
- (plugin install registry)
320
- - **Marketplaces**: `~/.claude/plugins/marketplaces/` (marketplace git
321
- clones)
322
-
323
- #### MCP Server Storage by Scope
324
-
325
- | Scope | Location | Use Case |
326
- | ------- | ------------------------------------------------------------ | ---------------------------------- |
327
- | Local | `~/.claude.json` → `projects["/path/to/project"].mcpServers` | Personal project config |
328
- | Project | `.mcp.json` in project root | Shared team config (commit to git) |
329
- | User | `~/.claude.json` → `mcpServers` | Global servers for all projects |
330
-
331
- > **Note**: MCPick automatically detects servers in parent
332
- > directories. If you have local servers configured at
333
- > `/Users/you/projects` and run MCPick from
334
- > `/Users/you/projects/myapp`, it will find and display them.
335
-
336
- ## Safety Features
337
-
338
- - **Non-destructive**: Only modifies the `mcpServers` section of your
339
- Claude Code config
340
- - **Backup integration**: Automatically creates backups before major
341
- changes
342
- - **Validation**: Ensures all server configurations are valid before
343
- writing
344
- - **Error handling**: Graceful failure modes with helpful error
345
- messages
346
-
347
- ## Future Features
348
-
349
- McPick is actively being developed with new features planned. See the
350
- [roadmap](./docs/ROADMAP.md) for details on:
351
-
352
- - **Settings Validation** - Validate your Claude Code settings files
353
- using the
354
- [claude-code-settings-schema](https://github.com/spences10/claude-code-settings-schema)
355
- - **Permissions Management** - Interactive tool permission
356
- configuration with presets (Safe Mode, Dev Mode, Review Mode)
357
-
358
- Have ideas for other features?
359
- [Open an issue](https://github.com/spences10/mcpick/issues) or check
360
- out the [contribution guide](./docs/ROADMAP.md)!
174
+ | File | Purpose |
175
+ | ------------------------------------------ | ---------------------------- |
176
+ | `~/.claude.json` | Claude Code configuration |
177
+ | `.mcp.json` | Project-specific shared config |
178
+ | `~/.claude/mcpick/servers.json` | Server registry |
179
+ | `~/.claude/mcpick/backups/` | Configuration backups |
180
+ | `~/.claude/mcpick/profiles/` | Saved profiles |
181
+ | `~/.claude/plugins/cache/` | Cached plugin files |
182
+ | `~/.claude/plugins/marketplaces/` | Marketplace git clones |
361
183
 
362
184
  ## Requirements
363
185
 
364
186
  - Node.js 22+
365
187
  - Claude Code installed and configured
366
- - pnpm (for building from source)
@@ -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";
@@ -1108,14 +1108,19 @@ async function main() {
1108
1108
  hint: "Toggle MCP servers on/off"
1109
1109
  },
1110
1110
  {
1111
- value: "edit-plugins",
1112
- label: "Manage plugins",
1113
- hint: "Toggle, install, uninstall, or update plugins"
1111
+ value: "add-server",
1112
+ label: "Add MCP server",
1113
+ hint: "Register a new MCP server"
1114
1114
  },
1115
1115
  {
1116
1116
  value: "manage-marketplace",
1117
1117
  label: "Manage marketplaces",
1118
- hint: "Add, remove, or update plugin marketplaces"
1118
+ hint: "Add a marketplace, then install plugins from it"
1119
+ },
1120
+ {
1121
+ value: "edit-plugins",
1122
+ label: "Manage plugins",
1123
+ hint: "Toggle, install, uninstall, or update plugins"
1119
1124
  },
1120
1125
  {
1121
1126
  value: "manage-hooks",
@@ -1127,21 +1132,6 @@ async function main() {
1127
1132
  label: "Manage plugin cache",
1128
1133
  hint: "View, clear, or refresh plugin caches"
1129
1134
  },
1130
- {
1131
- value: "backup",
1132
- label: "Backup config",
1133
- hint: "Create a timestamped backup"
1134
- },
1135
- {
1136
- value: "add-server",
1137
- label: "Add MCP server",
1138
- hint: "Register a new MCP server"
1139
- },
1140
- {
1141
- value: "restore",
1142
- label: "Restore from backup",
1143
- hint: "Restore from a previous backup"
1144
- },
1145
1135
  {
1146
1136
  value: "load-profile",
1147
1137
  label: "Load profile",
@@ -1152,6 +1142,16 @@ async function main() {
1152
1142
  label: "Save profile",
1153
1143
  hint: "Save current config as profile"
1154
1144
  },
1145
+ {
1146
+ value: "backup",
1147
+ label: "Backup config",
1148
+ hint: "Create a timestamped backup"
1149
+ },
1150
+ {
1151
+ value: "restore",
1152
+ label: "Restore from backup",
1153
+ hint: "Restore from a previous backup"
1154
+ },
1155
1155
  {
1156
1156
  value: "exit",
1157
1157
  label: "Exit",
@@ -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.21",
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"