mcpick 0.0.21 → 0.0.22
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/.github/copilot-instructions.md +39 -21
- package/CHANGELOG.md +19 -5
- package/CONTEXT.md +49 -0
- package/README.md +146 -127
- package/dist/{add-BDyaBew0.js → add-Bok0qbXi.js} +4 -5
- package/dist/{add-json-BjgzdeG-.js → add-json-C44vy2A_.js} +3 -3
- package/dist/{atomic-write-BqEykHp9.js → atomic-write-4lANmzsO.js} +1 -1
- package/dist/{backup-DSDhHI5f.js → backup-bdg6dvsb.js} +5 -5
- package/dist/{cache-D6kd7qE8.js → cache-CSUcGdZP.js} +3 -3
- package/dist/cli-avr5R1LO.js +111 -0
- package/dist/clients-CSQgqHzb.js +30 -0
- package/dist/{clone-DYKPEsar.js → clone-CQ0skkT6.js} +6 -7
- package/dist/{config-DijVdEFn.js → config-BhX4eAgg.js} +4 -4
- package/dist/{dev-DRJRNp7y.js → dev-CTDg5g-c.js} +6 -6
- package/dist/{disable-xJXZfUR_.js → disable-DLlOj7sc.js} +3 -4
- package/dist/{enable-RrpcN6la.js → enable-CGFYYC2A.js} +3 -4
- package/dist/{get-Bb1eOOIZ.js → get-l-eAJhBy.js} +3 -3
- package/dist/{hooks-Bmn7pUZa.js → hooks-BWZ_Kgx3.js} +4 -4
- package/dist/index.js +1479 -312
- package/dist/list-By--kltj.js +100 -0
- package/dist/{marketplace-DcKk5dc1.js → marketplace-DdiKDDKK.js} +4 -5
- package/dist/output-BgN9Uuxf.js +17 -0
- package/dist/{paths-BPISiJi4.js → paths-6wrIM8yh.js} +1 -1
- package/dist/{plugin-cache-Bby9Dxm9.js → plugin-cache-DKcW8LGV.js} +3 -3
- package/dist/{plugins-Dc7DN6R_.js → plugins-CsXE8AH4.js} +5 -5
- package/dist/{profile-CX97sMGp.js → profile-DzGPsdsl.js} +5 -5
- package/dist/redact-Dltz2gde.js +88 -0
- package/dist/{reload-CYDhkCVZ.js → reload-C29-vuvy.js} +2 -2
- package/dist/{remove-D1owHLhG.js → remove-B5q4rQRU.js} +3 -4
- package/dist/{reset-project-choices-BfRSNN3m.js → reset-project-choices-Dhh4CxIC.js} +3 -3
- package/dist/{restore-DdMfUljI.js → restore-BI8aiszM.js} +6 -6
- package/dist/{settings-DEcWtzLE.js → settings-CZR8bVfh.js} +5 -5
- package/dist/skills-DPBDmION.js +216 -0
- package/dist/{validation-xMlbgGCF.js → validation-qWlF51fw.js} +1 -1
- package/package.json +20 -6
- package/dist/claude-cli-DnmBJrjg.js +0 -445
- package/dist/cli-CsFfnWBo.js +0 -84
- package/dist/hook-state-Di8lUsPr.js +0 -171
- package/dist/list-B8YeDWt6.js +0 -64
- package/dist/output-BchYq0mR.js +0 -15
- package/dist/profile-DkY_lBEm.js +0 -70
- package/dist/redact-O35tjnRD.js +0 -26
- package/dist/registry-CfUKT7_C.js +0 -92
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { o as get_enabled_servers_for_scope } from "./config-BhX4eAgg.js";
|
|
2
|
+
import { a as redact_url, n as redact_server, t as redact_portable_server } from "./redact-Dltz2gde.js";
|
|
3
|
+
import { A as get_client_adapter, T as get_all_available_servers } from "./index.js";
|
|
4
|
+
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
5
|
+
import { defineCommand } from "citty";
|
|
6
|
+
//#region src/cli/commands/list.ts
|
|
7
|
+
var list_default = defineCommand({
|
|
8
|
+
meta: {
|
|
9
|
+
name: "list",
|
|
10
|
+
description: "List all MCP servers and their status"
|
|
11
|
+
},
|
|
12
|
+
args: {
|
|
13
|
+
client: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Client to read: claude-code, gemini-cli, vscode, cursor, windsurf, opencode, or pi"
|
|
16
|
+
},
|
|
17
|
+
scope: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Scope to check: local, project, or user"
|
|
20
|
+
},
|
|
21
|
+
json: {
|
|
22
|
+
type: "boolean",
|
|
23
|
+
description: "Output as JSON",
|
|
24
|
+
default: false
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
async run({ args }) {
|
|
28
|
+
if (args.client && args.client !== "claude-code") {
|
|
29
|
+
await list_client_servers(args.client, args.scope, args.json);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const scopes = args.scope ? [args.scope] : [
|
|
33
|
+
"local",
|
|
34
|
+
"project",
|
|
35
|
+
"user"
|
|
36
|
+
];
|
|
37
|
+
if (args.scope && ![
|
|
38
|
+
"local",
|
|
39
|
+
"project",
|
|
40
|
+
"user"
|
|
41
|
+
].includes(args.scope)) error(`Invalid scope: ${args.scope}. Use local, project, or user.`);
|
|
42
|
+
const all_servers = await get_all_available_servers();
|
|
43
|
+
const enabled_by_scope = {};
|
|
44
|
+
for (const scope of scopes) enabled_by_scope[scope] = await get_enabled_servers_for_scope(scope);
|
|
45
|
+
if (args.json) output(all_servers.map((server) => {
|
|
46
|
+
const status = {};
|
|
47
|
+
for (const scope of scopes) status[scope] = enabled_by_scope[scope].includes(server.name);
|
|
48
|
+
const { name, ...rest } = redact_server(server);
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
...status,
|
|
52
|
+
...rest
|
|
53
|
+
};
|
|
54
|
+
}), true);
|
|
55
|
+
else {
|
|
56
|
+
if (all_servers.length === 0) {
|
|
57
|
+
console.log("No servers in registry.");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const server of all_servers) {
|
|
61
|
+
const statuses = scopes.map((scope) => {
|
|
62
|
+
return `${scope}:${enabled_by_scope[scope].includes(server.name) ? "on" : "off"}`;
|
|
63
|
+
}).join(" ");
|
|
64
|
+
console.log(`${server.name} ${statuses}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
async function list_client_servers(client, scope, json) {
|
|
70
|
+
const adapter = get_client_adapter(client);
|
|
71
|
+
if (!adapter) error(`Invalid client: ${client}. Use claude-code, gemini-cli, vscode, cursor, windsurf, opencode, or pi.`);
|
|
72
|
+
if (scope && ![
|
|
73
|
+
"local",
|
|
74
|
+
"project",
|
|
75
|
+
"user"
|
|
76
|
+
].includes(scope)) error(`Invalid scope: ${scope}. Use local, project, or user.`);
|
|
77
|
+
const supported_scopes = new Set(adapter.locations().map((location) => location.scope));
|
|
78
|
+
if (scope && !supported_scopes.has(scope)) error(`${adapter.label} does not support ${scope} scope in MCPick yet.`);
|
|
79
|
+
const servers = await adapter.read(scope);
|
|
80
|
+
if (json) {
|
|
81
|
+
output({
|
|
82
|
+
client: adapter.id,
|
|
83
|
+
servers: servers.map(redact_portable_server)
|
|
84
|
+
}, true);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (servers.length === 0) {
|
|
88
|
+
console.log(`No MCP servers found for ${adapter.label}.`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const server of servers) {
|
|
92
|
+
const status = server.disabled ? "off" : "on";
|
|
93
|
+
const target = server.command || (server.url ? redact_url(server.url) : "(unknown)");
|
|
94
|
+
console.log(`${server.name} ${status} ${server.transport} ${target}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { list_default as default };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=list-By--kltj.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { u as
|
|
3
|
-
import {
|
|
4
|
-
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
1
|
+
import { u as read_marketplace_manifest } from "./plugin-cache-DKcW8LGV.js";
|
|
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-BgN9Uuxf.js";
|
|
5
4
|
import { defineCommand } from "citty";
|
|
6
5
|
//#region src/cli/commands/marketplace.ts
|
|
7
6
|
const list = defineCommand({
|
|
@@ -165,4 +164,4 @@ var marketplace_default = defineCommand({
|
|
|
165
164
|
//#endregion
|
|
166
165
|
export { marketplace_default as default };
|
|
167
166
|
|
|
168
|
-
//# sourceMappingURL=marketplace-
|
|
167
|
+
//# sourceMappingURL=marketplace-DdiKDDKK.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { i as redact_text, o as redact_value } from "./redact-Dltz2gde.js";
|
|
2
|
+
//#region src/cli/output.ts
|
|
3
|
+
function output(data, json) {
|
|
4
|
+
const safe_data = redact_value(data);
|
|
5
|
+
if (json) console.log(JSON.stringify(safe_data, null, 2));
|
|
6
|
+
else if (typeof safe_data === "string") console.log(safe_data);
|
|
7
|
+
else if (Array.isArray(safe_data)) for (const item of safe_data) console.log(typeof item === "string" ? item : JSON.stringify(item));
|
|
8
|
+
else console.log(safe_data);
|
|
9
|
+
}
|
|
10
|
+
function error(message) {
|
|
11
|
+
console.error(`error: ${redact_text(message)}`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { output as n, error as t };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=output-BgN9Uuxf.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-6wrIM8yh.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as
|
|
2
|
+
import { t as atomic_json_write } from "./atomic-write-4lANmzsO.js";
|
|
3
|
+
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-6wrIM8yh.js";
|
|
4
4
|
import { lstat, readFile, readdir, readlink, rename, rm, symlink } from "node:fs/promises";
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
6
|
import { exec } from "node:child_process";
|
|
@@ -402,4 +402,4 @@ async function list_linked_plugins() {
|
|
|
402
402
|
//#endregion
|
|
403
403
|
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
404
|
|
|
405
|
-
//# sourceMappingURL=plugin-cache-
|
|
405
|
+
//# sourceMappingURL=plugin-cache-DKcW8LGV.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as output, t as error } from "./output-
|
|
1
|
+
import { a as read_claude_settings, i as get_all_plugins, n as build_enabled_plugins, s as write_claude_settings } from "./settings-CZR8bVfh.js";
|
|
2
|
+
import { l as read_known_marketplaces, o as parse_plugin_key } from "./plugin-cache-DKcW8LGV.js";
|
|
3
|
+
import { C as validate_plugin_via_cli, S as update_plugin_via_cli, f as install_plugin_via_cli, x as uninstall_plugin_via_cli } from "./index.js";
|
|
4
|
+
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
var plugins_default = defineCommand({
|
|
7
7
|
meta: {
|
|
@@ -209,4 +209,4 @@ var plugins_default = defineCommand({
|
|
|
209
209
|
//#endregion
|
|
210
210
|
export { plugins_default as default };
|
|
211
211
|
|
|
212
|
-
//# sourceMappingURL=plugins-
|
|
212
|
+
//# sourceMappingURL=plugins-CsXE8AH4.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { c as write_claude_config } from "./config-
|
|
2
|
-
import { s as write_claude_settings } from "./settings-
|
|
3
|
-
import { n as load_profile, r as save_profile, t as list_profiles } from "./
|
|
4
|
-
import { n as output, t as error } from "./output-
|
|
1
|
+
import { c as write_claude_config } from "./config-BhX4eAgg.js";
|
|
2
|
+
import { s as write_claude_settings } from "./settings-CZR8bVfh.js";
|
|
3
|
+
import { n as load_profile, r as save_profile, t as list_profiles } from "./index.js";
|
|
4
|
+
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
var profile_default = defineCommand({
|
|
7
7
|
meta: {
|
|
@@ -117,4 +117,4 @@ var profile_default = defineCommand({
|
|
|
117
117
|
//#endregion
|
|
118
118
|
export { profile_default as default };
|
|
119
119
|
|
|
120
|
-
//# sourceMappingURL=profile-
|
|
120
|
+
//# sourceMappingURL=profile-DzGPsdsl.js.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//#region src/utils/redact.ts
|
|
2
|
+
const SENSITIVE_KEY_PATTERN = /(api[_-]?key|token|secret|password|passwd|authorization|client[_-]?secret|access[_-]?token|refresh[_-]?token|private[_-]?key)/i;
|
|
3
|
+
const ANSI_PATTERN = new RegExp(String.raw`[\u001B\u009B][[\]()#;?]*(?:(?:(?:[a-zA-Z\d]*(?:;[a-zA-Z\d]*)*)?\u0007)|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))`, "g");
|
|
4
|
+
const TEXT_REDACTIONS = [
|
|
5
|
+
[/AKIA[A-Z0-9]{16}/g, "[REDACTED:AWS_ACCESS_KEY]"],
|
|
6
|
+
[/\bAIza[0-9A-Za-z_-]{35}\b/g, "[REDACTED:GOOGLE_API_KEY]"],
|
|
7
|
+
[/\bya29\.[0-9A-Za-z_-]{20,}\b/g, "[REDACTED:GOOGLE_OAUTH_TOKEN]"],
|
|
8
|
+
[/\bsk-(?:live|test)?_?[a-zA-Z0-9._-]{20,}\b/g, "[REDACTED:API_KEY]"],
|
|
9
|
+
[/\b(?:pk|rk)_(?:live|test)_[a-zA-Z0-9]{20,}\b/g, "[REDACTED:API_KEY]"],
|
|
10
|
+
[/\bBearer\s+[a-zA-Z0-9._~+/-]+=*/gi, "Bearer [REDACTED]"],
|
|
11
|
+
[/(:\/\/[^:\s/@]+):([^@\s]+)@/g, "$1:[REDACTED]@"],
|
|
12
|
+
[/([?&][^=&#\s]*(?:token|key|secret|password|passwd)[^=&#\s]*=)[^&#\s]*/gi, "$1[REDACTED]"],
|
|
13
|
+
[/\b(Authorization\s*:\s*)(?:Bearer\s+)?[^\s,}\]]+/gi, "$1[REDACTED]"],
|
|
14
|
+
[/\b((?:api[_-]?key|token|secret|password|passwd|client[_-]?secret|access[_-]?token|refresh[_-]?token)\s*[:=]\s*["']?)[^"'\s,}\]]{8,}/gi, "$1[REDACTED]"],
|
|
15
|
+
[/\b((?:SecretAccessKey|aws_secret_access_key)\s*[:=]\s*)[A-Za-z0-9/+=]{20,}/gi, "$1[REDACTED]"],
|
|
16
|
+
[/-----BEGIN\s+[\w\s]*PRIVATE\s+KEY-----[\s\S]*?-----END\s+[\w\s]*PRIVATE\s+KEY-----/g, "[REDACTED:PRIVATE_KEY]"]
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Redact known secret patterns from arbitrary text. This is a safety net for
|
|
20
|
+
* CLI stdout/stderr; structured MCP config redaction should happen first.
|
|
21
|
+
*/
|
|
22
|
+
function redact_text(text) {
|
|
23
|
+
let redacted = text;
|
|
24
|
+
for (const [pattern, replacement] of TEXT_REDACTIONS) redacted = redacted.replace(pattern, replacement);
|
|
25
|
+
return redacted.replace(ANSI_PATTERN, "");
|
|
26
|
+
}
|
|
27
|
+
function redact_value(value, key = "") {
|
|
28
|
+
if (typeof value === "string") return SENSITIVE_KEY_PATTERN.test(key) ? "***" : redact_text(value);
|
|
29
|
+
if (Array.isArray(value)) return value.map((item) => redact_value(item));
|
|
30
|
+
if (value && typeof value === "object") {
|
|
31
|
+
const redacted = {};
|
|
32
|
+
for (const [child_key, child_value] of Object.entries(value)) redacted[child_key] = child_key === "env" || child_key === "headers" ? redact_unknown_record(child_value) : SENSITIVE_KEY_PATTERN.test(child_key) ? "***" : redact_value(child_value, child_key);
|
|
33
|
+
return redacted;
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Redact sensitive values from a server config.
|
|
39
|
+
* Shows env/header key names but replaces values with "***".
|
|
40
|
+
*/
|
|
41
|
+
function redact_server_base(server) {
|
|
42
|
+
const redacted = redact_value(server);
|
|
43
|
+
if ("env" in redacted && redacted.env) redacted.env = redact_record(redacted.env);
|
|
44
|
+
if ("headers" in redacted && redacted.headers) redacted.headers = redact_record(redacted.headers);
|
|
45
|
+
if ("url" in redacted && redacted.url) redacted.url = redact_url(redacted.url);
|
|
46
|
+
return redacted;
|
|
47
|
+
}
|
|
48
|
+
function redact_server(server) {
|
|
49
|
+
return {
|
|
50
|
+
...redact_server_base(server),
|
|
51
|
+
name: server.name
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function redact_portable_server(server) {
|
|
55
|
+
return {
|
|
56
|
+
...redact_value(server),
|
|
57
|
+
...server.env ? { env: redact_record(server.env) } : {},
|
|
58
|
+
...server.headers ? { headers: redact_record(server.headers) } : {},
|
|
59
|
+
...server.url ? { url: redact_url(server.url) } : {}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function redact_url(url) {
|
|
63
|
+
try {
|
|
64
|
+
const parsed = new URL(url);
|
|
65
|
+
parsed.username = "";
|
|
66
|
+
parsed.password = "";
|
|
67
|
+
parsed.search = parsed.search ? "?redacted" : "";
|
|
68
|
+
parsed.hash = "";
|
|
69
|
+
return parsed.toString();
|
|
70
|
+
} catch {
|
|
71
|
+
return redact_text(url.replace(/[?#].*$/, "?redacted"));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function redact_unknown_record(value) {
|
|
75
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return redact_value(value);
|
|
76
|
+
const redacted = {};
|
|
77
|
+
for (const key of Object.keys(value)) redacted[key] = "***";
|
|
78
|
+
return redacted;
|
|
79
|
+
}
|
|
80
|
+
function redact_record(record) {
|
|
81
|
+
const redacted = {};
|
|
82
|
+
for (const key of Object.keys(record)) redacted[key] = "***";
|
|
83
|
+
return redacted;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
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
|
+
|
|
88
|
+
//# sourceMappingURL=redact-Dltz2gde.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as output } from "./output-
|
|
1
|
+
import { n as output } from "./output-BgN9Uuxf.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-C29-vuvy.js.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { t as error } from "./output-BchYq0mR.js";
|
|
1
|
+
import { O as read_server_registry, T as get_all_available_servers, b as remove_mcp_via_cli, k as write_server_registry } from "./index.js";
|
|
2
|
+
import { t as error } from "./output-BgN9Uuxf.js";
|
|
4
3
|
import { defineCommand } from "citty";
|
|
5
4
|
//#region src/cli/commands/remove.ts
|
|
6
5
|
var remove_default = defineCommand({
|
|
@@ -28,4 +27,4 @@ var remove_default = defineCommand({
|
|
|
28
27
|
//#endregion
|
|
29
28
|
export { remove_default as default };
|
|
30
29
|
|
|
31
|
-
//# sourceMappingURL=remove-
|
|
30
|
+
//# sourceMappingURL=remove-B5q4rQRU.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as output, t as error } from "./output-
|
|
1
|
+
import { y as mcp_reset_project_choices_via_cli } from "./index.js";
|
|
2
|
+
import { n as output, t as error } from "./output-BgN9Uuxf.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-Dhh4CxIC.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as validate_claude_config } from "./validation-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { n as output, t as error } from "./output-
|
|
1
|
+
import { t as validate_claude_config } from "./validation-qWlF51fw.js";
|
|
2
|
+
import { c as write_claude_config } from "./config-BhX4eAgg.js";
|
|
3
|
+
import { s as write_claude_settings } from "./settings-CZR8bVfh.js";
|
|
4
|
+
import { D as list_plugin_backups, E as list_backups } from "./index.js";
|
|
5
|
+
import { n as output, t as error } from "./output-BgN9Uuxf.js";
|
|
6
6
|
import { readFile } from "node:fs/promises";
|
|
7
7
|
import { defineCommand } from "citty";
|
|
8
8
|
//#region src/cli/commands/restore.ts
|
|
@@ -81,4 +81,4 @@ var restore_default = defineCommand({
|
|
|
81
81
|
//#endregion
|
|
82
82
|
export { restore_default as default };
|
|
83
83
|
|
|
84
|
-
//# sourceMappingURL=restore-
|
|
84
|
+
//# sourceMappingURL=restore-BI8aiszM.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as atomic_json_write } from "./atomic-write-4lANmzsO.js";
|
|
2
|
+
import { a as get_claude_settings_path } from "./paths-6wrIM8yh.js";
|
|
3
3
|
import { access, readFile } from "node:fs/promises";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
//#region src/core/settings.ts
|
|
@@ -105,8 +105,8 @@ async function get_all_hooks() {
|
|
|
105
105
|
* Checks both cache and marketplace source paths since Claude Code reads from both.
|
|
106
106
|
*/
|
|
107
107
|
async function get_all_plugin_hooks() {
|
|
108
|
-
const { read_installed_plugins } = await import("./plugin-cache-
|
|
109
|
-
const { get_marketplaces_dir } = await import("./paths-
|
|
108
|
+
const { read_installed_plugins } = await import("./plugin-cache-DKcW8LGV.js").then((n) => n.s);
|
|
109
|
+
const { get_marketplaces_dir } = await import("./paths-6wrIM8yh.js").then((n) => n.b);
|
|
110
110
|
const installed = await read_installed_plugins();
|
|
111
111
|
const entries = [];
|
|
112
112
|
const seen_hooks = /* @__PURE__ */ new Set();
|
|
@@ -198,4 +198,4 @@ async function add_hook(scope, event, matcher, handler) {
|
|
|
198
198
|
//#endregion
|
|
199
199
|
export { read_claude_settings as a, get_all_plugins as i, build_enabled_plugins as n, remove_hook as o, get_all_hooks as r, write_claude_settings as s, add_hook as t };
|
|
200
200
|
|
|
201
|
-
//# sourceMappingURL=settings-
|
|
201
|
+
//# sourceMappingURL=settings-CZR8bVfh.js.map
|
|
@@ -0,0 +1,216 @@
|
|
|
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-BgN9Uuxf.js";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
//#region src/cli/commands/skills.ts
|
|
5
|
+
function add_agent_args(cli_args, agent) {
|
|
6
|
+
const agents = split_cli_list(agent);
|
|
7
|
+
if (agents.length > 0) cli_args.push("--agent", ...agents);
|
|
8
|
+
}
|
|
9
|
+
function add_skill_args(cli_args, skill) {
|
|
10
|
+
const skills = split_cli_list(skill);
|
|
11
|
+
if (skills.length > 0) cli_args.push("--skill", ...skills);
|
|
12
|
+
}
|
|
13
|
+
async function print_result(result, json, fallback) {
|
|
14
|
+
if (json) {
|
|
15
|
+
if (result.stdout) try {
|
|
16
|
+
output(JSON.parse(result.stdout), true);
|
|
17
|
+
return;
|
|
18
|
+
} catch {}
|
|
19
|
+
output(result, true);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (result.success) {
|
|
23
|
+
output(result.stdout || fallback, false);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
error(result.stderr || result.error || "skills CLI failed");
|
|
27
|
+
}
|
|
28
|
+
var skills_default = defineCommand({
|
|
29
|
+
meta: {
|
|
30
|
+
name: "skills",
|
|
31
|
+
description: "Manage portable agent skills via the external skills CLI. Examples: mcpick skills add spences10/skills --agent pi --skill svelte-runes; mcpick skills list --agent pi --json"
|
|
32
|
+
},
|
|
33
|
+
subCommands: {
|
|
34
|
+
list: defineCommand({
|
|
35
|
+
meta: {
|
|
36
|
+
name: "list",
|
|
37
|
+
description: "List installed portable skills for supported agent clients"
|
|
38
|
+
},
|
|
39
|
+
args: {
|
|
40
|
+
agent: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "Agent/client to filter: claude-code, pi, opencode, codex, cursor, windsurf, or *"
|
|
43
|
+
},
|
|
44
|
+
global: {
|
|
45
|
+
type: "boolean",
|
|
46
|
+
description: "List global/user skills instead of project skills",
|
|
47
|
+
default: false
|
|
48
|
+
},
|
|
49
|
+
json: {
|
|
50
|
+
type: "boolean",
|
|
51
|
+
description: "Output as JSON",
|
|
52
|
+
default: false
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
async run({ args }) {
|
|
56
|
+
const cli_args = ["list"];
|
|
57
|
+
if (args.global) cli_args.push("--global");
|
|
58
|
+
add_agent_args(cli_args, args.agent);
|
|
59
|
+
if (args.json) cli_args.push("--json");
|
|
60
|
+
await print_result(await run_skills_cli(cli_args), args.json, "No skills found.");
|
|
61
|
+
}
|
|
62
|
+
}),
|
|
63
|
+
add: defineCommand({
|
|
64
|
+
meta: {
|
|
65
|
+
name: "add",
|
|
66
|
+
description: "Install portable skills from a repo/package using the external skills CLI"
|
|
67
|
+
},
|
|
68
|
+
args: {
|
|
69
|
+
source: {
|
|
70
|
+
type: "positional",
|
|
71
|
+
description: "Skill source, e.g. spences10/skills, a GitHub URL, npm package, or local path",
|
|
72
|
+
required: true
|
|
73
|
+
},
|
|
74
|
+
agent: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Agent/client(s) to install to. Use comma-separated values or * for all agents"
|
|
77
|
+
},
|
|
78
|
+
skill: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Skill name(s) to install. Use comma-separated values or * for all skills"
|
|
81
|
+
},
|
|
82
|
+
global: {
|
|
83
|
+
type: "boolean",
|
|
84
|
+
description: "Install globally/user-level instead of project-level",
|
|
85
|
+
default: false
|
|
86
|
+
},
|
|
87
|
+
list: {
|
|
88
|
+
type: "boolean",
|
|
89
|
+
description: "List available skills in the source without installing",
|
|
90
|
+
default: false
|
|
91
|
+
},
|
|
92
|
+
copy: {
|
|
93
|
+
type: "boolean",
|
|
94
|
+
description: "Copy files instead of symlinking into agent directories",
|
|
95
|
+
default: false
|
|
96
|
+
},
|
|
97
|
+
"full-depth": {
|
|
98
|
+
type: "boolean",
|
|
99
|
+
description: "Search all subdirectories even when a root SKILL.md exists",
|
|
100
|
+
default: false
|
|
101
|
+
},
|
|
102
|
+
yes: {
|
|
103
|
+
type: "boolean",
|
|
104
|
+
description: "Skip confirmation prompts. Defaults true so LLM/CI use does not hang.",
|
|
105
|
+
default: true
|
|
106
|
+
},
|
|
107
|
+
json: {
|
|
108
|
+
type: "boolean",
|
|
109
|
+
description: "Output as JSON",
|
|
110
|
+
default: false
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
async run({ args }) {
|
|
114
|
+
const cli_args = ["add", args.source];
|
|
115
|
+
if (args.global) cli_args.push("--global");
|
|
116
|
+
if (args.list) cli_args.push("--list");
|
|
117
|
+
if (args.copy) cli_args.push("--copy");
|
|
118
|
+
if (args["full-depth"]) cli_args.push("--full-depth");
|
|
119
|
+
if (args.yes) cli_args.push("--yes");
|
|
120
|
+
add_agent_args(cli_args, args.agent);
|
|
121
|
+
add_skill_args(cli_args, args.skill);
|
|
122
|
+
await print_result(await run_skills_cli(cli_args), args.json, "Skills command completed.");
|
|
123
|
+
}
|
|
124
|
+
}),
|
|
125
|
+
update: defineCommand({
|
|
126
|
+
meta: {
|
|
127
|
+
name: "update",
|
|
128
|
+
description: "Update installed portable skills to latest versions"
|
|
129
|
+
},
|
|
130
|
+
args: {
|
|
131
|
+
skills: {
|
|
132
|
+
type: "positional",
|
|
133
|
+
description: "Optional comma-separated skill names. Omit to update all selected skills.",
|
|
134
|
+
required: false
|
|
135
|
+
},
|
|
136
|
+
global: {
|
|
137
|
+
type: "boolean",
|
|
138
|
+
description: "Update global/user skills only",
|
|
139
|
+
default: false
|
|
140
|
+
},
|
|
141
|
+
project: {
|
|
142
|
+
type: "boolean",
|
|
143
|
+
description: "Update project skills only",
|
|
144
|
+
default: false
|
|
145
|
+
},
|
|
146
|
+
yes: {
|
|
147
|
+
type: "boolean",
|
|
148
|
+
description: "Skip confirmation prompts. Defaults true so LLM/CI use does not hang.",
|
|
149
|
+
default: true
|
|
150
|
+
},
|
|
151
|
+
json: {
|
|
152
|
+
type: "boolean",
|
|
153
|
+
description: "Output as JSON",
|
|
154
|
+
default: false
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
async run({ args }) {
|
|
158
|
+
const cli_args = ["update", ...split_cli_list(args.skills)];
|
|
159
|
+
if (args.global) cli_args.push("--global");
|
|
160
|
+
if (args.project) cli_args.push("--project");
|
|
161
|
+
if (args.yes) cli_args.push("--yes");
|
|
162
|
+
await print_result(await run_skills_cli(cli_args), args.json, "Skills updated.");
|
|
163
|
+
}
|
|
164
|
+
}),
|
|
165
|
+
remove: defineCommand({
|
|
166
|
+
meta: {
|
|
167
|
+
name: "remove",
|
|
168
|
+
description: "Remove installed portable skills"
|
|
169
|
+
},
|
|
170
|
+
args: {
|
|
171
|
+
skills: {
|
|
172
|
+
type: "positional",
|
|
173
|
+
description: "Skill name(s), comma-separated. Use --all to remove all.",
|
|
174
|
+
required: false
|
|
175
|
+
},
|
|
176
|
+
agent: {
|
|
177
|
+
type: "string",
|
|
178
|
+
description: "Agent/client(s) to remove from. Use comma-separated values or * for all agents"
|
|
179
|
+
},
|
|
180
|
+
global: {
|
|
181
|
+
type: "boolean",
|
|
182
|
+
description: "Remove from global/user scope instead of project scope",
|
|
183
|
+
default: false
|
|
184
|
+
},
|
|
185
|
+
all: {
|
|
186
|
+
type: "boolean",
|
|
187
|
+
description: "Remove all matching skills",
|
|
188
|
+
default: false
|
|
189
|
+
},
|
|
190
|
+
yes: {
|
|
191
|
+
type: "boolean",
|
|
192
|
+
description: "Skip confirmation prompts. Defaults true so LLM/CI use does not hang.",
|
|
193
|
+
default: true
|
|
194
|
+
},
|
|
195
|
+
json: {
|
|
196
|
+
type: "boolean",
|
|
197
|
+
description: "Output as JSON",
|
|
198
|
+
default: false
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
async run({ args }) {
|
|
202
|
+
if (!args.skills && !args.all) error("Pass a skill name, comma-separated skill names, or --all.");
|
|
203
|
+
const cli_args = ["remove", ...split_cli_list(args.skills)];
|
|
204
|
+
if (args.global) cli_args.push("--global");
|
|
205
|
+
if (args.all) cli_args.push("--all");
|
|
206
|
+
if (args.yes) cli_args.push("--yes");
|
|
207
|
+
add_agent_args(cli_args, args.agent);
|
|
208
|
+
await print_result(await run_skills_cli(cli_args), args.json, "Skills removed.");
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
//#endregion
|
|
214
|
+
export { skills_default as default };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=skills-DPBDmION.js.map
|
package/package.json
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcpick",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.22",
|
|
4
|
+
"description": "Vendor-neutral MCP configuration manager with first-class Claude Code support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
7
7
|
"claude-code",
|
|
8
8
|
"cli",
|
|
9
9
|
"configuration",
|
|
10
|
-
"
|
|
10
|
+
"cursor",
|
|
11
|
+
"gemini-cli",
|
|
12
|
+
"mcp",
|
|
13
|
+
"model-context-protocol",
|
|
14
|
+
"opencode",
|
|
15
|
+
"pi-coding-agent",
|
|
16
|
+
"vscode"
|
|
11
17
|
],
|
|
18
|
+
"homepage": "https://github.com/spences10/mcpick#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/spences10/mcpick/issues"
|
|
21
|
+
},
|
|
12
22
|
"license": "MIT",
|
|
13
23
|
"author": "",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/spences10/mcpick.git"
|
|
27
|
+
},
|
|
14
28
|
"bin": {
|
|
15
29
|
"mcpick": "./dist/index.js"
|
|
16
30
|
},
|
|
@@ -22,10 +36,10 @@
|
|
|
22
36
|
"valibot": "^1.3.1"
|
|
23
37
|
},
|
|
24
38
|
"devDependencies": {
|
|
25
|
-
"@changesets/cli": "^2.
|
|
39
|
+
"@changesets/cli": "^2.31.0",
|
|
26
40
|
"@types/node": "^25.6.0",
|
|
27
|
-
"vite-plus": "^0.1.
|
|
28
|
-
"vitest": "^4.1.
|
|
41
|
+
"vite-plus": "^0.1.19",
|
|
42
|
+
"vitest": "^4.1.5"
|
|
29
43
|
},
|
|
30
44
|
"engines": {
|
|
31
45
|
"node": ">=22.0.0"
|