mcpick 0.0.22 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +4 -0
- package/dist/add-LJQa2my2.js +164 -0
- package/dist/add-json-TEdYweZ5.js +95 -0
- package/dist/{backup-bdg6dvsb.js → backup-kyS5IVIr.js} +5 -5
- package/dist/{cache-CSUcGdZP.js → cache-DTfzTsEE.js} +3 -3
- package/dist/{cli-avr5R1LO.js → cli-By-0nYNQ.js} +22 -21
- package/dist/{clients-CSQgqHzb.js → clients-qMozizys.js} +3 -3
- package/dist/{clone-CQ0skkT6.js → clone-BVhYjRGO.js} +5 -5
- package/dist/{config-BhX4eAgg.js → config-DzMmTJYL.js} +4 -4
- package/dist/{dev-CTDg5g-c.js → dev-Cst8WkQ-.js} +6 -6
- package/dist/disable-BaOs9lrm.js +83 -0
- package/dist/enable--3mjSmTq.js +84 -0
- package/dist/{get-l-eAJhBy.js → get-CjhNWyRj.js} +2 -2
- package/dist/{hooks-BWZ_Kgx3.js → hooks-DFmxgD0t.js} +3 -4
- package/dist/index.js +533 -68
- package/dist/{list-By--kltj.js → list-D5CkCXpP.js} +5 -5
- package/dist/{marketplace-DdiKDDKK.js → marketplace-C3EGyIG0.js} +3 -3
- package/dist/{output-BgN9Uuxf.js → output-HtT5HCof.js} +2 -2
- package/dist/{paths-6wrIM8yh.js → paths-BPISiJi4.js} +1 -1
- package/dist/{plugin-cache-DKcW8LGV.js → plugin-cache-BSgB42wa.js} +35 -16
- package/dist/{plugins-CsXE8AH4.js → plugins-Dn2mPFKm.js} +4 -5
- package/dist/{profile-DzGPsdsl.js → profile-Dq3ORPil.js} +4 -5
- package/dist/{redact-Dltz2gde.js → redact-wBMtzbno.js} +1 -1
- package/dist/{reload-C29-vuvy.js → reload-257iU7Z7.js} +2 -2
- package/dist/remove-26XFzkPd.js +87 -0
- package/dist/{reset-project-choices-Dhh4CxIC.js → reset-project-choices-D2F04LfC.js} +2 -2
- package/dist/{restore-BI8aiszM.js → restore-BYYsoNqF.js} +5 -6
- package/dist/rollback-CPdaME91.js +55 -0
- package/dist/{skills-DPBDmION.js → skills-DfWk9mpk.js} +2 -2
- package/dist/{validation-qWlF51fw.js → validation-xMlbgGCF.js} +1 -1
- package/package.json +4 -4
- package/.github/copilot-instructions.md +0 -50
- package/.github/workflows/ci.yml +0 -26
- package/.vscode/settings.json +0 -5
- package/CONTEXT.md +0 -49
- package/dist/add-Bok0qbXi.js +0 -112
- package/dist/add-json-C44vy2A_.js +0 -58
- package/dist/atomic-write-4lANmzsO.js +0 -26
- package/dist/disable-DLlOj7sc.js +0 -38
- package/dist/enable-CGFYYC2A.js +0 -39
- package/dist/remove-B5q4rQRU.js +0 -30
- package/dist/settings-CZR8bVfh.js +0 -201
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { o as get_enabled_servers_for_scope } from "./config-
|
|
2
|
-
import { a as redact_url, n as redact_server, t as redact_portable_server } from "./redact-
|
|
3
|
-
import {
|
|
4
|
-
import { n as output, t as error } from "./output-
|
|
1
|
+
import { o as get_enabled_servers_for_scope } from "./config-DzMmTJYL.js";
|
|
2
|
+
import { a as redact_url, n as redact_server, t as redact_portable_server } from "./redact-wBMtzbno.js";
|
|
3
|
+
import { M as get_client_adapter, T as get_all_available_servers } from "./index.js";
|
|
4
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
//#region src/cli/commands/list.ts
|
|
7
7
|
var list_default = defineCommand({
|
|
@@ -97,4 +97,4 @@ async function list_client_servers(client, scope, json) {
|
|
|
97
97
|
//#endregion
|
|
98
98
|
export { list_default as default };
|
|
99
99
|
|
|
100
|
-
//# sourceMappingURL=list-
|
|
100
|
+
//# sourceMappingURL=list-D5CkCXpP.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { u as read_marketplace_manifest } from "./plugin-cache-
|
|
1
|
+
import { u as read_marketplace_manifest } from "./plugin-cache-BSgB42wa.js";
|
|
2
2
|
import { g as marketplace_update_via_cli, h as marketplace_remove_via_cli, m as marketplace_list_via_cli, o as check_restored_hooks, p as marketplace_add_via_cli, u as redisable_restored_hooks } from "./index.js";
|
|
3
|
-
import { n as output, t as error } from "./output-
|
|
3
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
//#region src/cli/commands/marketplace.ts
|
|
6
6
|
const list = defineCommand({
|
|
@@ -164,4 +164,4 @@ var marketplace_default = defineCommand({
|
|
|
164
164
|
//#endregion
|
|
165
165
|
export { marketplace_default as default };
|
|
166
166
|
|
|
167
|
-
//# sourceMappingURL=marketplace-
|
|
167
|
+
//# sourceMappingURL=marketplace-C3EGyIG0.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as redact_text, o as redact_value } from "./redact-
|
|
1
|
+
import { i as redact_text, o as redact_value } from "./redact-wBMtzbno.js";
|
|
2
2
|
//#region src/cli/output.ts
|
|
3
3
|
function output(data, json) {
|
|
4
4
|
const safe_data = redact_value(data);
|
|
@@ -14,4 +14,4 @@ function error(message) {
|
|
|
14
14
|
//#endregion
|
|
15
15
|
export { output as n, error as t };
|
|
16
16
|
|
|
17
|
-
//# sourceMappingURL=output-
|
|
17
|
+
//# sourceMappingURL=output-HtT5HCof.js.map
|
|
@@ -121,4 +121,4 @@ function get_marketplace_manifest_path(name) {
|
|
|
121
121
|
//#endregion
|
|
122
122
|
export { get_profiles_dir as _, get_claude_settings_path as a, paths_exports as b, get_disabled_hooks_path as c, get_marketplace_manifest_path as d, get_marketplaces_dir as f, get_profile_path as g, get_plugin_cache_dir as h, get_claude_config_path as i, get_installed_plugins_path as l, get_plugin_backup_filename as m, get_backup_filename as n, get_current_project_path as o, get_mcpick_dir as p, get_backups_dir as r, get_dev_overrides_path as s, ensure_directory_exists as t, get_known_marketplaces_path as u, get_project_mcp_json_path as v, get_server_registry_path as y };
|
|
123
123
|
|
|
124
|
-
//# sourceMappingURL=paths-
|
|
124
|
+
//# sourceMappingURL=paths-BPISiJi4.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import { t as
|
|
3
|
-
import {
|
|
2
|
+
import { d as get_marketplace_manifest_path, h as get_plugin_cache_dir, l as get_installed_plugins_path, t as ensure_directory_exists, u as get_known_marketplaces_path } from "./paths-BPISiJi4.js";
|
|
3
|
+
import { W as atomic_json_write } from "./index.js";
|
|
4
4
|
import { lstat, readFile, readdir, readlink, rename, rm, symlink } from "node:fs/promises";
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
|
-
import {
|
|
6
|
+
import { execFile } from "node:child_process";
|
|
7
7
|
import { promisify } from "node:util";
|
|
8
8
|
//#region src/core/plugin-cache.ts
|
|
9
9
|
var plugin_cache_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -22,7 +22,14 @@ var plugin_cache_exports = /* @__PURE__ */ __exportAll({
|
|
|
22
22
|
unlink_local_plugin: () => unlink_local_plugin,
|
|
23
23
|
write_installed_plugins: () => write_installed_plugins
|
|
24
24
|
});
|
|
25
|
-
const
|
|
25
|
+
const execFileAsync = promisify(execFile);
|
|
26
|
+
function git(dir, args, timeout) {
|
|
27
|
+
return execFileAsync("git", [
|
|
28
|
+
"-C",
|
|
29
|
+
dir,
|
|
30
|
+
...args
|
|
31
|
+
], { timeout });
|
|
32
|
+
}
|
|
26
33
|
const EMPTY_INSTALLED = {
|
|
27
34
|
version: 2,
|
|
28
35
|
plugins: {}
|
|
@@ -59,8 +66,8 @@ async function read_marketplace_manifest(name) {
|
|
|
59
66
|
}
|
|
60
67
|
async function get_marketplace_head_sha(marketplace_path) {
|
|
61
68
|
try {
|
|
62
|
-
const { stdout } = await
|
|
63
|
-
return stdout.trim() || null;
|
|
69
|
+
const { stdout } = await git(marketplace_path, ["rev-parse", "HEAD"], 1e4);
|
|
70
|
+
return String(stdout).trim() || null;
|
|
64
71
|
} catch {
|
|
65
72
|
return null;
|
|
66
73
|
}
|
|
@@ -70,25 +77,37 @@ async function get_marketplace_head_sha(marketplace_path) {
|
|
|
70
77
|
* Resets the fetch refspec, fetches all branches, and checks out the default branch.
|
|
71
78
|
*/
|
|
72
79
|
async function recover_deleted_branch(dir) {
|
|
73
|
-
const q = JSON.stringify(dir);
|
|
74
80
|
try {
|
|
75
|
-
await
|
|
76
|
-
|
|
81
|
+
await git(dir, [
|
|
82
|
+
"remote",
|
|
83
|
+
"set-branches",
|
|
84
|
+
"origin",
|
|
85
|
+
"*"
|
|
86
|
+
], 1e4);
|
|
87
|
+
await git(dir, ["fetch", "origin"], 3e4);
|
|
77
88
|
let default_branch = "main";
|
|
78
89
|
try {
|
|
79
|
-
const { stdout } = await
|
|
80
|
-
const match = stdout.trim().match(/refs\/remotes\/origin\/(.+)/);
|
|
90
|
+
const { stdout } = await git(dir, ["symbolic-ref", "refs/remotes/origin/HEAD"], 5e3);
|
|
91
|
+
const match = String(stdout).trim().match(/refs\/remotes\/origin\/(.+)/);
|
|
81
92
|
if (match) default_branch = match[1];
|
|
82
93
|
} catch {
|
|
83
94
|
try {
|
|
84
|
-
await
|
|
95
|
+
await git(dir, [
|
|
96
|
+
"rev-parse",
|
|
97
|
+
"--verify",
|
|
98
|
+
"origin/main"
|
|
99
|
+
], 5e3);
|
|
85
100
|
default_branch = "main";
|
|
86
101
|
} catch {
|
|
87
102
|
default_branch = "master";
|
|
88
103
|
}
|
|
89
104
|
}
|
|
90
|
-
await
|
|
91
|
-
await
|
|
105
|
+
await git(dir, ["checkout", default_branch], 1e4);
|
|
106
|
+
await git(dir, [
|
|
107
|
+
"reset",
|
|
108
|
+
"--hard",
|
|
109
|
+
`origin/${default_branch}`
|
|
110
|
+
], 1e4);
|
|
92
111
|
return { recovered: true };
|
|
93
112
|
} catch (err) {
|
|
94
113
|
return {
|
|
@@ -100,7 +119,7 @@ async function recover_deleted_branch(dir) {
|
|
|
100
119
|
async function refresh_marketplace(name, marketplace) {
|
|
101
120
|
const dir = marketplace.installLocation;
|
|
102
121
|
try {
|
|
103
|
-
await
|
|
122
|
+
await git(dir, ["pull", "--ff-only"], 3e4);
|
|
104
123
|
return { success: true };
|
|
105
124
|
} catch {
|
|
106
125
|
const recovery = await recover_deleted_branch(dir);
|
|
@@ -402,4 +421,4 @@ async function list_linked_plugins() {
|
|
|
402
421
|
//#endregion
|
|
403
422
|
export { list_linked_plugins as a, read_installed_plugins as c, refresh_all_marketplaces as d, scan_all_cache_keys as f, link_local_plugin as i, read_known_marketplaces as l, clear_plugin_caches as n, parse_plugin_key as o, unlink_local_plugin as p, get_cached_plugins_info as r, plugin_cache_exports as s, clean_orphaned_versions as t, read_marketplace_manifest as u };
|
|
404
423
|
|
|
405
|
-
//# sourceMappingURL=plugin-cache-
|
|
424
|
+
//# sourceMappingURL=plugin-cache-BSgB42wa.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
1
|
+
import { l as read_known_marketplaces, o as parse_plugin_key } from "./plugin-cache-BSgB42wa.js";
|
|
2
|
+
import { B as get_all_plugins, C as validate_plugin_via_cli, R as build_enabled_plugins, S as update_plugin_via_cli, U as write_claude_settings, V as read_claude_settings, f as install_plugin_via_cli, x as uninstall_plugin_via_cli } from "./index.js";
|
|
3
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
5
4
|
import { defineCommand } from "citty";
|
|
6
5
|
var plugins_default = defineCommand({
|
|
7
6
|
meta: {
|
|
@@ -209,4 +208,4 @@ var plugins_default = defineCommand({
|
|
|
209
208
|
//#endregion
|
|
210
209
|
export { plugins_default as default };
|
|
211
210
|
|
|
212
|
-
//# sourceMappingURL=plugins-
|
|
211
|
+
//# sourceMappingURL=plugins-Dn2mPFKm.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { c as write_claude_config } from "./config-
|
|
2
|
-
import {
|
|
3
|
-
import { n as
|
|
4
|
-
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
1
|
+
import { c as write_claude_config } from "./config-DzMmTJYL.js";
|
|
2
|
+
import { U as write_claude_settings, n as load_profile, r as save_profile, t as list_profiles } from "./index.js";
|
|
3
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
5
4
|
import { defineCommand } from "citty";
|
|
6
5
|
var profile_default = defineCommand({
|
|
7
6
|
meta: {
|
|
@@ -117,4 +116,4 @@ var profile_default = defineCommand({
|
|
|
117
116
|
//#endregion
|
|
118
117
|
export { profile_default as default };
|
|
119
118
|
|
|
120
|
-
//# sourceMappingURL=profile-
|
|
119
|
+
//# sourceMappingURL=profile-Dq3ORPil.js.map
|
|
@@ -85,4 +85,4 @@ function redact_record(record) {
|
|
|
85
85
|
//#endregion
|
|
86
86
|
export { redact_url as a, redact_text as i, redact_server as n, redact_value as o, redact_server_base as r, redact_portable_server as t };
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=redact-
|
|
88
|
+
//# sourceMappingURL=redact-wBMtzbno.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as output } from "./output-
|
|
1
|
+
import { n as output } from "./output-HtT5HCof.js";
|
|
2
2
|
import { defineCommand } from "citty";
|
|
3
3
|
//#region src/cli/commands/reload.ts
|
|
4
4
|
var reload_default = defineCommand({
|
|
@@ -28,4 +28,4 @@ var reload_default = defineCommand({
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { reload_default as default };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=reload-
|
|
31
|
+
//# sourceMappingURL=reload-257iU7Z7.js.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { F as resolve_client_location, M as get_client_adapter, O as read_server_registry, P as remove_client_server, T as get_all_available_servers, b as remove_mcp_via_cli, k as write_server_registry } from "./index.js";
|
|
2
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
//#region src/cli/commands/remove.ts
|
|
5
|
+
var remove_default = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "remove",
|
|
8
|
+
description: "Remove an MCP server from the registry and disable it"
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
server: {
|
|
12
|
+
type: "positional",
|
|
13
|
+
description: "Server name to remove",
|
|
14
|
+
required: true
|
|
15
|
+
},
|
|
16
|
+
client: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Client to edit: claude-code, gemini-cli, vscode, cursor, windsurf, opencode, or pi",
|
|
19
|
+
default: "claude-code"
|
|
20
|
+
},
|
|
21
|
+
scope: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Scope: local, project, or user"
|
|
24
|
+
},
|
|
25
|
+
location: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Exact config path when a client has multiple matching locations"
|
|
28
|
+
},
|
|
29
|
+
json: {
|
|
30
|
+
type: "boolean",
|
|
31
|
+
description: "Output as JSON",
|
|
32
|
+
default: false
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
async run({ args }) {
|
|
36
|
+
if (args.client && args.client !== "claude-code") {
|
|
37
|
+
await remove_from_client(args.client, args.server, args.scope, args.location, args.json);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const scope = args.scope || "local";
|
|
41
|
+
if (![
|
|
42
|
+
"local",
|
|
43
|
+
"project",
|
|
44
|
+
"user"
|
|
45
|
+
].includes(scope)) error(`Invalid scope: ${scope}. Use local, project, or user.`);
|
|
46
|
+
if (!(await get_all_available_servers()).find((s) => s.name === args.server)) error(`Server '${args.server}' not found. Run 'mcpick list' to see available servers.`);
|
|
47
|
+
const registry = await read_server_registry();
|
|
48
|
+
const index = registry.servers.findIndex((s) => s.name === args.server);
|
|
49
|
+
if (index >= 0) {
|
|
50
|
+
registry.servers.splice(index, 1);
|
|
51
|
+
await write_server_registry(registry);
|
|
52
|
+
}
|
|
53
|
+
await remove_mcp_via_cli(args.server, scope);
|
|
54
|
+
if (args.json) output({
|
|
55
|
+
removed: args.server,
|
|
56
|
+
client: "claude-code",
|
|
57
|
+
scope
|
|
58
|
+
}, true);
|
|
59
|
+
else console.log(`Removed '${args.server}'`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
async function remove_from_client(client, server, scope, location_path, json) {
|
|
63
|
+
const adapter = get_client_adapter(client);
|
|
64
|
+
if (!adapter) error(`Invalid client: ${client}. Use claude-code, gemini-cli, vscode, cursor, windsurf, opencode, or pi.`);
|
|
65
|
+
if (scope && ![
|
|
66
|
+
"local",
|
|
67
|
+
"project",
|
|
68
|
+
"user"
|
|
69
|
+
].includes(scope)) error(`Invalid scope: ${scope}. Use local, project, or user.`);
|
|
70
|
+
try {
|
|
71
|
+
const location = resolve_client_location(adapter, scope, location_path);
|
|
72
|
+
await remove_client_server(adapter, location, server);
|
|
73
|
+
if (json) output({
|
|
74
|
+
removed: server,
|
|
75
|
+
client: adapter.id,
|
|
76
|
+
scope: location.scope,
|
|
77
|
+
location: location.path
|
|
78
|
+
}, true);
|
|
79
|
+
else console.log(`Removed '${server}' (${adapter.id}:${location.scope})`);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
error(err instanceof Error ? err.message : "Failed to remove server");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { remove_default as default };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=remove-26XFzkPd.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { y as mcp_reset_project_choices_via_cli } from "./index.js";
|
|
2
|
-
import { n as output, t as error } from "./output-
|
|
2
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/cli/commands/reset-project-choices.ts
|
|
5
5
|
var reset_project_choices_default = defineCommand({
|
|
@@ -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-
|
|
28
|
+
//# sourceMappingURL=reset-project-choices-D2F04LfC.js.map
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { t as validate_claude_config } from "./validation-
|
|
2
|
-
import { c as write_claude_config } from "./config-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
1
|
+
import { t as validate_claude_config } from "./validation-xMlbgGCF.js";
|
|
2
|
+
import { c as write_claude_config } from "./config-DzMmTJYL.js";
|
|
3
|
+
import { D as list_plugin_backups, E as list_backups, U as write_claude_settings } from "./index.js";
|
|
4
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
6
5
|
import { readFile } from "node:fs/promises";
|
|
7
6
|
import { defineCommand } from "citty";
|
|
8
7
|
//#region src/cli/commands/restore.ts
|
|
@@ -81,4 +80,4 @@ var restore_default = defineCommand({
|
|
|
81
80
|
//#endregion
|
|
82
81
|
export { restore_default as default };
|
|
83
82
|
|
|
84
|
-
//# sourceMappingURL=restore-
|
|
83
|
+
//# sourceMappingURL=restore-BYYsoNqF.js.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { G as list_config_backups, K as restore_config_backup } from "./index.js";
|
|
2
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
//#region src/cli/commands/rollback.ts
|
|
5
|
+
var rollback_default = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "rollback",
|
|
8
|
+
description: "List or restore automatic config backups created before safe writes"
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
file: {
|
|
12
|
+
type: "positional",
|
|
13
|
+
description: "Config backup filename or path. Defaults to latest backup.",
|
|
14
|
+
required: false
|
|
15
|
+
},
|
|
16
|
+
list: {
|
|
17
|
+
type: "boolean",
|
|
18
|
+
description: "List available config rollback backups",
|
|
19
|
+
default: false
|
|
20
|
+
},
|
|
21
|
+
json: {
|
|
22
|
+
type: "boolean",
|
|
23
|
+
description: "Output as JSON",
|
|
24
|
+
default: false
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
async run({ args }) {
|
|
28
|
+
try {
|
|
29
|
+
const backups = await list_config_backups();
|
|
30
|
+
if (args.list) {
|
|
31
|
+
if (args.json) {
|
|
32
|
+
output(backups, true);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (backups.length === 0) {
|
|
36
|
+
console.log("No config rollback backups found.");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
for (const backup of backups) console.log(`${backup.created_at} ${backup.path} -> ${backup.original_path}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const backup_path = args.file || backups[0]?.path;
|
|
43
|
+
if (!backup_path) error("No config rollback backups found.");
|
|
44
|
+
const restored = await restore_config_backup(backup_path);
|
|
45
|
+
if (args.json) output({ restored }, true);
|
|
46
|
+
else console.log(`Restored ${restored.original_path} from ${restored.path}`);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
error(err instanceof Error ? err.message : "Rollback failed");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
//#endregion
|
|
53
|
+
export { rollback_default as default };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=rollback-CPdaME91.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as split_cli_list, i as run_skills_cli } from "./index.js";
|
|
2
|
-
import { n as output, t as error } from "./output-
|
|
2
|
+
import { n as output, t as error } from "./output-HtT5HCof.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/cli/commands/skills.ts
|
|
5
5
|
function add_agent_args(cli_args, agent) {
|
|
@@ -213,4 +213,4 @@ var skills_default = defineCommand({
|
|
|
213
213
|
//#endregion
|
|
214
214
|
export { skills_default as default };
|
|
215
215
|
|
|
216
|
-
//# sourceMappingURL=skills-
|
|
216
|
+
//# sourceMappingURL=skills-DfWk9mpk.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcpick",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.23",
|
|
4
4
|
"description": "Vendor-neutral MCP configuration manager with first-class Claude Code support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"url": "https://github.com/spences10/mcpick/issues"
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
|
23
|
-
"author": "",
|
|
23
|
+
"author": "spences10 <spences10apps@gmail.com>",
|
|
24
24
|
"repository": {
|
|
25
25
|
"type": "git",
|
|
26
26
|
"url": "git+https://github.com/spences10/mcpick.git"
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"type": "module",
|
|
32
32
|
"main": "./dist/index.js",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@clack/prompts": "^1.
|
|
34
|
+
"@clack/prompts": "^1.3.0",
|
|
35
35
|
"citty": "^0.2.2",
|
|
36
36
|
"valibot": "^1.3.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@changesets/cli": "^2.31.0",
|
|
40
40
|
"@types/node": "^25.6.0",
|
|
41
|
-
"vite-plus": "^0.1.
|
|
41
|
+
"vite-plus": "^0.1.20",
|
|
42
42
|
"vitest": "^4.1.5"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# MCPick Development Instructions
|
|
2
|
-
|
|
3
|
-
## Project shape
|
|
4
|
-
|
|
5
|
-
MCPick is a vendor-neutral MCP configuration manager with first-class
|
|
6
|
-
Claude Code support.
|
|
7
|
-
|
|
8
|
-
- Keep MCP server functionality client-neutral where possible.
|
|
9
|
-
- Keep Claude Code plugins, hooks, marketplaces, and cache commands
|
|
10
|
-
clearly Claude-specific.
|
|
11
|
-
- Prefer CLI flows that work well for LLM agents: non-interactive
|
|
12
|
-
flags, `--json`, useful help text, and redacted output.
|
|
13
|
-
|
|
14
|
-
## Prerequisites
|
|
15
|
-
|
|
16
|
-
- Node.js >=22.0.0
|
|
17
|
-
- pnpm
|
|
18
|
-
|
|
19
|
-
## Common commands
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
pnpm install
|
|
23
|
-
pnpm test
|
|
24
|
-
pnpm run check
|
|
25
|
-
pnpm build
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Validation before finishing
|
|
29
|
-
|
|
30
|
-
Always run:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
pnpm run check
|
|
34
|
-
pnpm test
|
|
35
|
-
pnpm build
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`pnpm run check` validates formatting, lint, and types through
|
|
39
|
-
vite-plus.
|
|
40
|
-
|
|
41
|
-
## Changesets
|
|
42
|
-
|
|
43
|
-
For user-facing changes, add a changeset:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
pnpm changeset
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Use a short message prefixed with `feat`, `fix`, `chore`, or
|
|
50
|
-
`breaking`.
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
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/.vscode/settings.json
DELETED
package/CONTEXT.md
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# MCPick
|
|
2
|
-
|
|
3
|
-
MCPick manages Model Context Protocol configuration across AI
|
|
4
|
-
development tools without making one vendor's config format the
|
|
5
|
-
product model.
|
|
6
|
-
|
|
7
|
-
## Language
|
|
8
|
-
|
|
9
|
-
**MCP Server**: A runnable or remote tool provider exposed through the
|
|
10
|
-
Model Context Protocol. _Avoid_: Claude server, plugin server
|
|
11
|
-
|
|
12
|
-
**MCP Client**: An AI application that loads MCP Server configuration
|
|
13
|
-
and exposes those tools to a model. _Avoid_: Vendor, app, host
|
|
14
|
-
|
|
15
|
-
**Client Adapter**: A module that translates between MCPick's portable
|
|
16
|
-
MCP Server shape and one MCP Client's config file shape. _Avoid_:
|
|
17
|
-
Provider, integration, plugin
|
|
18
|
-
|
|
19
|
-
**Portable Server**: MCPick's canonical representation of an MCP
|
|
20
|
-
Server independent of any MCP Client config file. _Avoid_: Claude
|
|
21
|
-
config, raw config
|
|
22
|
-
|
|
23
|
-
**Config Location**: A file path and scope where an MCP Client reads
|
|
24
|
-
MCP Server configuration. _Avoid_: path helper, config target
|
|
25
|
-
|
|
26
|
-
**Profile**: A saved set of Portable Servers intended to be applied to
|
|
27
|
-
one or more MCP Clients. _Avoid_: Claude profile
|
|
28
|
-
|
|
29
|
-
## Relationships
|
|
30
|
-
|
|
31
|
-
- An **MCP Client** reads one or more **Config Locations**.
|
|
32
|
-
- A **Client Adapter** translates between a **Config Location** and
|
|
33
|
-
**Portable Servers**.
|
|
34
|
-
- A **Profile** contains **Portable Servers**.
|
|
35
|
-
- An **MCP Server** may appear in multiple **MCP Clients** with
|
|
36
|
-
client-specific options.
|
|
37
|
-
|
|
38
|
-
## Example dialogue
|
|
39
|
-
|
|
40
|
-
> **Dev:** "Can we enable the Google docs MCP server in Gemini and
|
|
41
|
-
> Cursor without rewriting the JSON twice?" **Domain expert:** "Yes —
|
|
42
|
-
> keep it as a **Portable Server**, then let each **Client Adapter**
|
|
43
|
-
> write the right **Config Location**."
|
|
44
|
-
|
|
45
|
-
## Flagged ambiguities
|
|
46
|
-
|
|
47
|
-
- "server config" used to mean both MCPick registry entries and
|
|
48
|
-
client-specific JSON. Resolved: **Portable Server** for MCPick's
|
|
49
|
-
shape, **Config Location** for client-owned files.
|