@lyupro/skillforge-mcp 1.1.1 → 1.2.0
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/.claude-plugin/marketplace.json +36 -0
- package/.claude-plugin/plugin.json +28 -0
- package/CHANGELOG.md +21 -0
- package/README.md +77 -9
- package/dist/cli/dispatcher.d.ts.map +1 -1
- package/dist/cli/dispatcher.js +24 -2
- package/dist/cli/dispatcher.js.map +1 -1
- package/dist/cli/folders.d.ts +36 -0
- package/dist/cli/folders.d.ts.map +1 -0
- package/dist/cli/folders.js +249 -0
- package/dist/cli/folders.js.map +1 -0
- package/dist/cli/install.d.ts +2 -0
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +47 -9
- package/dist/cli/install.js.map +1 -1
- package/dist/cli/tools.d.ts +49 -0
- package/dist/cli/tools.d.ts.map +1 -0
- package/dist/cli/tools.js +171 -0
- package/dist/cli/tools.js.map +1 -0
- package/dist/detect/skill-source-conflict.d.ts +47 -0
- package/dist/detect/skill-source-conflict.d.ts.map +1 -0
- package/dist/detect/skill-source-conflict.js +99 -0
- package/dist/detect/skill-source-conflict.js.map +1 -0
- package/dist/installers/cursor-installer.d.ts +6 -7
- package/dist/installers/cursor-installer.d.ts.map +1 -1
- package/dist/installers/cursor-installer.js +15 -20
- package/dist/installers/cursor-installer.js.map +1 -1
- package/dist/installers/paths.d.ts +28 -6
- package/dist/installers/paths.d.ts.map +1 -1
- package/dist/installers/paths.js +72 -20
- package/dist/installers/paths.js.map +1 -1
- package/dist/installers/registry.d.ts +8 -2
- package/dist/installers/registry.d.ts.map +1 -1
- package/dist/installers/registry.js +14 -7
- package/dist/installers/registry.js.map +1 -1
- package/dist/tools/configure.d.ts +6 -0
- package/dist/tools/configure.d.ts.map +1 -1
- package/dist/tools/configure.js +3 -0
- package/dist/tools/configure.js.map +1 -1
- package/manifest.json +3 -2
- package/package.json +3 -2
package/dist/cli/install.js
CHANGED
|
@@ -29,7 +29,7 @@ Usage:
|
|
|
29
29
|
Targets (at least one required, unless --help):
|
|
30
30
|
--claude Edit ~/.claude.json
|
|
31
31
|
--codex Edit ~/.codex/config.toml
|
|
32
|
-
--cursor Edit
|
|
32
|
+
--cursor Edit ~/.cursor/mcp.json
|
|
33
33
|
--all Auto-detect installed hosts and install into each
|
|
34
34
|
|
|
35
35
|
Modes:
|
|
@@ -42,6 +42,16 @@ Entry shape:
|
|
|
42
42
|
--entry local command=node args=[<binary-path>]
|
|
43
43
|
--binary-path PATH Override the local-entry binary path (defaults to dist/server.js)
|
|
44
44
|
|
|
45
|
+
Scope:
|
|
46
|
+
--scope global (default) edit the host's home-directory config:
|
|
47
|
+
claude → ~/.claude.json
|
|
48
|
+
codex → ~/.codex/config.toml
|
|
49
|
+
cursor → ~/.cursor/mcp.json
|
|
50
|
+
--scope project edit a repo-local config rooted at the current directory:
|
|
51
|
+
claude → ./.mcp.json
|
|
52
|
+
codex → ./.codex/config.toml
|
|
53
|
+
cursor → ./.cursor/mcp.json
|
|
54
|
+
|
|
45
55
|
--help, -h Show this message
|
|
46
56
|
`;
|
|
47
57
|
export function parseArgs(argv) {
|
|
@@ -54,6 +64,7 @@ export function parseArgs(argv) {
|
|
|
54
64
|
uninstall: false,
|
|
55
65
|
force: false,
|
|
56
66
|
entry: 'npx',
|
|
67
|
+
scope: 'global',
|
|
57
68
|
showHelp: false,
|
|
58
69
|
};
|
|
59
70
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -100,6 +111,14 @@ export function parseArgs(argv) {
|
|
|
100
111
|
out.binaryPath = next;
|
|
101
112
|
break;
|
|
102
113
|
}
|
|
114
|
+
case '--scope': {
|
|
115
|
+
const next = argv[++i];
|
|
116
|
+
if (next !== 'global' && next !== 'project') {
|
|
117
|
+
throw new UsageError(`--scope must be 'global' or 'project' (got: ${String(next)})`);
|
|
118
|
+
}
|
|
119
|
+
out.scope = next;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
103
122
|
default:
|
|
104
123
|
throw new UsageError(`Unknown flag: ${arg}`);
|
|
105
124
|
}
|
|
@@ -110,12 +129,15 @@ function chooseInstallers(args, all) {
|
|
|
110
129
|
if (args.all)
|
|
111
130
|
return all;
|
|
112
131
|
const picked = [];
|
|
113
|
-
if (args.claude)
|
|
114
|
-
picked.push(all.find((i) => i.name === 'claude') ?? getInstallerByName('claude'));
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
132
|
+
if (args.claude) {
|
|
133
|
+
picked.push(all.find((i) => i.name === 'claude') ?? getInstallerByName('claude', args.scope));
|
|
134
|
+
}
|
|
135
|
+
if (args.codex) {
|
|
136
|
+
picked.push(all.find((i) => i.name === 'codex') ?? getInstallerByName('codex', args.scope));
|
|
137
|
+
}
|
|
138
|
+
if (args.cursor) {
|
|
139
|
+
picked.push(all.find((i) => i.name === 'cursor') ?? getInstallerByName('cursor', args.scope));
|
|
140
|
+
}
|
|
119
141
|
return picked;
|
|
120
142
|
}
|
|
121
143
|
function formatInstall(r) {
|
|
@@ -150,8 +172,24 @@ export async function runInstall(args, deps = {}) {
|
|
|
150
172
|
stderr('\nError: choose at least one of --claude / --codex / --cursor / --all');
|
|
151
173
|
return 2;
|
|
152
174
|
}
|
|
153
|
-
|
|
154
|
-
|
|
175
|
+
let allInstallers;
|
|
176
|
+
try {
|
|
177
|
+
allInstallers = deps.installers ?? getAllInstallers(args.scope);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
181
|
+
stderr(`Error: ${msg}`);
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
let installers;
|
|
185
|
+
try {
|
|
186
|
+
installers = chooseInstallers(args, allInstallers);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
stderr(`Error: ${msg}`);
|
|
191
|
+
return 1;
|
|
192
|
+
}
|
|
155
193
|
if (args.all) {
|
|
156
194
|
const detected = [];
|
|
157
195
|
for (const inst of installers) {
|
package/dist/cli/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAwBjF,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCb,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,GAAG,GAAe;QACtB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,UAAU;gBACb,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,SAAS;gBACZ,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,UAAU;gBACb,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,OAAO;gBACV,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,KAAK,WAAW;gBACd,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,aAAa;gBAChB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,SAAS;gBACZ,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACvC,MAAM,IAAI,UAAU,CAAC,0CAA0C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClF,CAAC;gBACD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;gBACjE,CAAC;gBACD,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5C,MAAM,IAAI,UAAU,CAAC,+CAA+C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvF,CAAC;gBACD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YACD;gBACE,MAAM,IAAI,UAAU,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,SAAS,gBAAgB,CAAC,IAAgB,EAAE,GAAgB;IAC1D,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACzB,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,CAAgB;IACrC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,CAAkB;IACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,aAAa,CAAC,CAAgB;IACrC,MAAM,KAAK,GAAG;QACZ,gBAAgB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,UAAU,eAAe,CAAC,CAAC,UAAU,EAAE;QAClG,aAAa;QACb,CAAC,CAAC,MAAM,IAAI,uBAAuB;QACnC,YAAY;QACZ,CAAC,CAAC,KAAK;KACR,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB,EAAE,OAAgB,EAAE;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,MAAM,CAAC,uEAAuE,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,aAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,aAAa,GAAG,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,UAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,gHAAgH,CAAC,CAAC;YACzH,OAAO,CAAC,CAAC;QACX,CAAC;QACD,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAmB;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IAEF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,mBAAmB;oBAAE,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtF,IAAI,WAAW,EAAE,CAAC;IAChB,6EAA6E;IAC7E,yFAAyF;IACzF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SkillForge `tools` subcommand.
|
|
4
|
+
*
|
|
5
|
+
* Prints the 5 MCP tools the stdio server exposes to an LLM client —
|
|
6
|
+
* name, description, parameters, and a short example invocation.
|
|
7
|
+
*
|
|
8
|
+
* Descriptions are NOT hand-written here: they are sourced at runtime
|
|
9
|
+
* from `manifest.json#tools[]` (the authoritative surface). The static
|
|
10
|
+
* PARAM table below carries only parameter metadata + examples; a test
|
|
11
|
+
* (`tools.test.ts`) asserts every entry's `name` lines up with the
|
|
12
|
+
* manifest so the two cannot drift.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* skillforge-mcp tools Human-readable reference
|
|
16
|
+
* skillforge-mcp tools --json Machine-readable JSON ({ tools: [...] })
|
|
17
|
+
*/
|
|
18
|
+
/** A single tool parameter, as declared by its Zod input schema. */
|
|
19
|
+
export interface ToolParam {
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
required: boolean;
|
|
23
|
+
note: string;
|
|
24
|
+
}
|
|
25
|
+
/** Static reference for one MCP tool (params + example, no description). */
|
|
26
|
+
interface ToolRef {
|
|
27
|
+
name: string;
|
|
28
|
+
params: ToolParam[];
|
|
29
|
+
example: string;
|
|
30
|
+
}
|
|
31
|
+
/** A fully-resolved tool record (description merged in from the manifest). */
|
|
32
|
+
export interface ResolvedTool extends ToolRef {
|
|
33
|
+
description: string;
|
|
34
|
+
}
|
|
35
|
+
/** Merge the static param refs with manifest descriptions; throws if a tool is missing. */
|
|
36
|
+
export declare function resolveTools(): Promise<ResolvedTool[]>;
|
|
37
|
+
export interface ToolsDeps {
|
|
38
|
+
stdout?: (text: string) => void;
|
|
39
|
+
stderr?: (text: string) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* `tools` subcommand entry. Returns an exit code:
|
|
43
|
+
* - 0 on success
|
|
44
|
+
* - 2 on an unknown flag
|
|
45
|
+
* - 1 on an unexpected failure
|
|
46
|
+
*/
|
|
47
|
+
export declare function main(rawArgv: string[], deps?: ToolsDeps): Promise<number>;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AA2FD,8EAA8E;AAC9E,MAAM,WAAW,YAAa,SAAQ,OAAO;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,2FAA2F;AAC3F,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAS5D;AAsBD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BnF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SkillForge `tools` subcommand.
|
|
4
|
+
*
|
|
5
|
+
* Prints the 5 MCP tools the stdio server exposes to an LLM client —
|
|
6
|
+
* name, description, parameters, and a short example invocation.
|
|
7
|
+
*
|
|
8
|
+
* Descriptions are NOT hand-written here: they are sourced at runtime
|
|
9
|
+
* from `manifest.json#tools[]` (the authoritative surface). The static
|
|
10
|
+
* PARAM table below carries only parameter metadata + examples; a test
|
|
11
|
+
* (`tools.test.ts`) asserts every entry's `name` lines up with the
|
|
12
|
+
* manifest so the two cannot drift.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* skillforge-mcp tools Human-readable reference
|
|
16
|
+
* skillforge-mcp tools --json Machine-readable JSON ({ tools: [...] })
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Parameter metadata for the 5 MCP tools. Sourced from the Zod input
|
|
20
|
+
* schemas in `src/tools/*.ts`. Descriptions are intentionally absent —
|
|
21
|
+
* they come from the manifest at runtime.
|
|
22
|
+
*/
|
|
23
|
+
const TOOL_REFS = [
|
|
24
|
+
{
|
|
25
|
+
name: 'skills__list',
|
|
26
|
+
params: [
|
|
27
|
+
{ name: 'folder', type: 'string', required: false, note: 'Restrict to one configured folder.' },
|
|
28
|
+
{ name: 'search', type: 'string', required: false, note: 'Case-insensitive substring over name + description.' },
|
|
29
|
+
{
|
|
30
|
+
name: 'source',
|
|
31
|
+
type: "'claude' | 'codex' | 'persona' | 'custom'",
|
|
32
|
+
required: false,
|
|
33
|
+
note: 'Filter by skill format.',
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
example: '{ "search": "review" }',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'skills__get',
|
|
40
|
+
params: [{ name: 'name', type: 'string', required: true, note: 'Exact skill name to retrieve.' }],
|
|
41
|
+
example: '{ "name": "code-review" }',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'skills__invoke',
|
|
45
|
+
params: [
|
|
46
|
+
{ name: 'name', type: 'string', required: true, note: 'Exact skill name to invoke.' },
|
|
47
|
+
{ name: 'input', type: 'string', required: false, note: 'Optional input forwarded to the skill (default "").' },
|
|
48
|
+
],
|
|
49
|
+
example: '{ "name": "code-review", "input": "diff against main" }',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'skills__configure',
|
|
53
|
+
params: [
|
|
54
|
+
{
|
|
55
|
+
name: 'action',
|
|
56
|
+
type: "'add_folder' | 'remove_folder' | 'list_folders' | 'set_blacklist' | 'get_blacklist' | 'reset'",
|
|
57
|
+
required: true,
|
|
58
|
+
note: 'Which configuration action to run.',
|
|
59
|
+
},
|
|
60
|
+
{ name: 'folder', type: 'string', required: false, note: 'Folder path — required by add_folder / remove_folder.' },
|
|
61
|
+
{
|
|
62
|
+
name: 'blacklist',
|
|
63
|
+
type: 'string[]',
|
|
64
|
+
required: false,
|
|
65
|
+
note: 'Blacklist patterns — required by set_blacklist.',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
example: '{ "action": "add_folder", "folder": "/abs/path/to/skills" }',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'skills__reload',
|
|
72
|
+
params: [
|
|
73
|
+
{
|
|
74
|
+
name: 'folder',
|
|
75
|
+
type: 'string',
|
|
76
|
+
required: false,
|
|
77
|
+
note: 'Validate this folder is configured before the full rescan.',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
example: '{}',
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
/** Resolve manifest.json relative to this module (dist/cli/tools.js → ../../manifest.json). */
|
|
84
|
+
async function readManifestTools() {
|
|
85
|
+
const { readFile } = await import('node:fs/promises');
|
|
86
|
+
const { fileURLToPath } = await import('node:url');
|
|
87
|
+
const { dirname, resolve } = await import('node:path');
|
|
88
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
89
|
+
const manifestPath = resolve(here, '..', '..', 'manifest.json');
|
|
90
|
+
const raw = await readFile(manifestPath, 'utf8');
|
|
91
|
+
const parsed = JSON.parse(raw);
|
|
92
|
+
if (!Array.isArray(parsed.tools)) {
|
|
93
|
+
throw new Error('manifest.json missing "tools" array');
|
|
94
|
+
}
|
|
95
|
+
const map = new Map();
|
|
96
|
+
for (const entry of parsed.tools) {
|
|
97
|
+
const t = entry;
|
|
98
|
+
if (typeof t.name !== 'string' || typeof t.description !== 'string') {
|
|
99
|
+
throw new Error('manifest.json tools[] entry missing string name/description');
|
|
100
|
+
}
|
|
101
|
+
map.set(t.name, t.description);
|
|
102
|
+
}
|
|
103
|
+
return map;
|
|
104
|
+
}
|
|
105
|
+
/** Merge the static param refs with manifest descriptions; throws if a tool is missing. */
|
|
106
|
+
export async function resolveTools() {
|
|
107
|
+
const descriptions = await readManifestTools();
|
|
108
|
+
return TOOL_REFS.map((ref) => {
|
|
109
|
+
const description = descriptions.get(ref.name);
|
|
110
|
+
if (description === undefined) {
|
|
111
|
+
throw new Error(`manifest.json has no tools[] entry for "${ref.name}"`);
|
|
112
|
+
}
|
|
113
|
+
return { ...ref, description };
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function formatHuman(tools) {
|
|
117
|
+
const lines = ['SkillForge MCP — tools exposed to the LLM client.', ''];
|
|
118
|
+
for (const tool of tools) {
|
|
119
|
+
lines.push(tool.name);
|
|
120
|
+
lines.push(` ${tool.description}`);
|
|
121
|
+
lines.push(' Parameters:');
|
|
122
|
+
if (tool.params.length === 0) {
|
|
123
|
+
lines.push(' (none)');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
for (const p of tool.params) {
|
|
127
|
+
const flag = p.required ? 'required' : 'optional';
|
|
128
|
+
lines.push(` ${p.name} (${p.type}, ${flag}) — ${p.note}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
lines.push(` Example: ${tool.example}`);
|
|
132
|
+
lines.push('');
|
|
133
|
+
}
|
|
134
|
+
return `${lines.join('\n').trimEnd()}\n`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* `tools` subcommand entry. Returns an exit code:
|
|
138
|
+
* - 0 on success
|
|
139
|
+
* - 2 on an unknown flag
|
|
140
|
+
* - 1 on an unexpected failure
|
|
141
|
+
*/
|
|
142
|
+
export async function main(rawArgv, deps = {}) {
|
|
143
|
+
const stdout = deps.stdout ?? ((text) => process.stdout.write(text));
|
|
144
|
+
const stderr = deps.stderr ?? ((text) => process.stderr.write(text));
|
|
145
|
+
let asJson = false;
|
|
146
|
+
for (const arg of rawArgv) {
|
|
147
|
+
if (arg === '--json') {
|
|
148
|
+
asJson = true;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
stderr(`skillforge-mcp tools: unknown flag: ${arg}\n`);
|
|
152
|
+
return 2;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const tools = await resolveTools();
|
|
157
|
+
if (asJson) {
|
|
158
|
+
stdout(`${JSON.stringify({ tools }, null, 2)}\n`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
stdout(formatHuman(tools));
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
167
|
+
stderr(`skillforge-mcp tools: ${msg}\n`);
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/cli/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill-source conflict detection.
|
|
3
|
+
*
|
|
4
|
+
* When a skill folder is registered that ALSO lives inside a host CLI's
|
|
5
|
+
* native plugin/extension store, the same skills load twice — wasted tokens
|
|
6
|
+
* and skill-name collisions. SkillForge detects this and prints a hint so the
|
|
7
|
+
* user can disable one source. We NEVER mutate another tool's config: this is
|
|
8
|
+
* detection + hint only.
|
|
9
|
+
*
|
|
10
|
+
* Detection is pure path logic — no host config file is read or written.
|
|
11
|
+
* The home directory is injectable so tests can supply a fake root.
|
|
12
|
+
*/
|
|
13
|
+
/** A host CLI whose native plugin/extension system can double-load skills. */
|
|
14
|
+
export type ConflictHost = 'claude' | 'gemini';
|
|
15
|
+
export interface SkillSourceConflict {
|
|
16
|
+
/** The host CLI that natively serves skills from this path. */
|
|
17
|
+
host: ConflictHost;
|
|
18
|
+
/** Native unit kind: Claude Code has plugins, Gemini CLI has extensions. */
|
|
19
|
+
kind: 'plugin' | 'extension';
|
|
20
|
+
/** Human-readable plugin/extension name derived from the path. */
|
|
21
|
+
name: string;
|
|
22
|
+
/** The absolute folder path that triggered the conflict. */
|
|
23
|
+
folderPath: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Detect whether `folderPath` is served by a host CLI's native plugin or
|
|
27
|
+
* extension system.
|
|
28
|
+
*
|
|
29
|
+
* - Claude Code — `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/...`
|
|
30
|
+
* The plugin name is the `<plugin>` segment (the marketplace prefix is
|
|
31
|
+
* included when present for a clearer label).
|
|
32
|
+
* - Gemini CLI — `~/.gemini/extensions/<extension>/...`
|
|
33
|
+
* The extension name is the first segment after `extensions/`.
|
|
34
|
+
*
|
|
35
|
+
* Codex and Cursor have no native skill system — they never conflict.
|
|
36
|
+
*
|
|
37
|
+
* @param folderPath Absolute folder path being registered.
|
|
38
|
+
* @param home Home directory root, injectable for tests.
|
|
39
|
+
* @returns A conflict descriptor, or null when there is no conflict.
|
|
40
|
+
*/
|
|
41
|
+
export declare function detectSkillSourceConflict(folderPath: string, home?: string): SkillSourceConflict | null;
|
|
42
|
+
/**
|
|
43
|
+
* Build the user-facing warning for a detected conflict. SkillForge prints
|
|
44
|
+
* this as an informational hint — it does not disable anything itself.
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatConflictHint(conflict: SkillSourceConflict): string;
|
|
47
|
+
//# sourceMappingURL=skill-source-conflict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-source-conflict.d.ts","sourceRoot":"","sources":["../../src/detect/skill-source-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,IAAI,EAAE,YAAY,CAAC;IACnB,4EAA4E;IAC5E,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAuBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAkB,GACvB,mBAAmB,GAAG,IAAI,CA6B5B;AAeD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAMxE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill-source conflict detection.
|
|
3
|
+
*
|
|
4
|
+
* When a skill folder is registered that ALSO lives inside a host CLI's
|
|
5
|
+
* native plugin/extension store, the same skills load twice — wasted tokens
|
|
6
|
+
* and skill-name collisions. SkillForge detects this and prints a hint so the
|
|
7
|
+
* user can disable one source. We NEVER mutate another tool's config: this is
|
|
8
|
+
* detection + hint only.
|
|
9
|
+
*
|
|
10
|
+
* Detection is pure path logic — no host config file is read or written.
|
|
11
|
+
* The home directory is injectable so tests can supply a fake root.
|
|
12
|
+
*/
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { resolve, sep } from 'node:path';
|
|
15
|
+
/** Normalise to an absolute path with consistent separators for prefix tests. */
|
|
16
|
+
function normalize(p) {
|
|
17
|
+
return resolve(p);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Return the path segments of `child` that follow `root`, or null when
|
|
21
|
+
* `child` is not inside `root`. Comparison is done on resolved absolute
|
|
22
|
+
* paths; segment splitting uses the platform separator.
|
|
23
|
+
*/
|
|
24
|
+
function segmentsUnder(child, root) {
|
|
25
|
+
const absChild = normalize(child);
|
|
26
|
+
const absRoot = normalize(root);
|
|
27
|
+
const rootWithSep = absRoot.endsWith(sep) ? absRoot : absRoot + sep;
|
|
28
|
+
if (!absChild.startsWith(rootWithSep))
|
|
29
|
+
return null;
|
|
30
|
+
return absChild
|
|
31
|
+
.slice(rootWithSep.length)
|
|
32
|
+
.split(sep)
|
|
33
|
+
.filter((s) => s.length > 0);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Detect whether `folderPath` is served by a host CLI's native plugin or
|
|
37
|
+
* extension system.
|
|
38
|
+
*
|
|
39
|
+
* - Claude Code — `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/...`
|
|
40
|
+
* The plugin name is the `<plugin>` segment (the marketplace prefix is
|
|
41
|
+
* included when present for a clearer label).
|
|
42
|
+
* - Gemini CLI — `~/.gemini/extensions/<extension>/...`
|
|
43
|
+
* The extension name is the first segment after `extensions/`.
|
|
44
|
+
*
|
|
45
|
+
* Codex and Cursor have no native skill system — they never conflict.
|
|
46
|
+
*
|
|
47
|
+
* @param folderPath Absolute folder path being registered.
|
|
48
|
+
* @param home Home directory root, injectable for tests.
|
|
49
|
+
* @returns A conflict descriptor, or null when there is no conflict.
|
|
50
|
+
*/
|
|
51
|
+
export function detectSkillSourceConflict(folderPath, home = homedir()) {
|
|
52
|
+
const claudeCacheRoot = resolve(home, '.claude', 'plugins', 'cache');
|
|
53
|
+
const claudeSegments = segmentsUnder(folderPath, claudeCacheRoot);
|
|
54
|
+
if (claudeSegments !== null && claudeSegments.length > 0) {
|
|
55
|
+
// cache/<marketplace>/<plugin>/<version>/... — prefer "marketplace/plugin"
|
|
56
|
+
// as the label; fall back to whatever single segment exists.
|
|
57
|
+
const marketplace = claudeSegments[0];
|
|
58
|
+
const plugin = claudeSegments[1];
|
|
59
|
+
const name = plugin !== undefined ? `${marketplace}/${plugin}` : marketplace;
|
|
60
|
+
return {
|
|
61
|
+
host: 'claude',
|
|
62
|
+
kind: 'plugin',
|
|
63
|
+
name,
|
|
64
|
+
folderPath: normalize(folderPath),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const geminiExtRoot = resolve(home, '.gemini', 'extensions');
|
|
68
|
+
const geminiSegments = segmentsUnder(folderPath, geminiExtRoot);
|
|
69
|
+
if (geminiSegments !== null && geminiSegments.length > 0) {
|
|
70
|
+
return {
|
|
71
|
+
host: 'gemini',
|
|
72
|
+
kind: 'extension',
|
|
73
|
+
name: geminiSegments[0],
|
|
74
|
+
folderPath: normalize(folderPath),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/** Human-readable host label for the hint text. */
|
|
80
|
+
function hostLabel(host) {
|
|
81
|
+
return host === 'claude' ? 'Claude Code' : 'Gemini CLI';
|
|
82
|
+
}
|
|
83
|
+
/** The host-specific command the user runs to disable the conflicting source. */
|
|
84
|
+
function disableCommand(conflict) {
|
|
85
|
+
if (conflict.host === 'claude') {
|
|
86
|
+
return `run /plugin and disable the "${conflict.name}" plugin`;
|
|
87
|
+
}
|
|
88
|
+
return `/extensions disable ${conflict.name}`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build the user-facing warning for a detected conflict. SkillForge prints
|
|
92
|
+
* this as an informational hint — it does not disable anything itself.
|
|
93
|
+
*/
|
|
94
|
+
export function formatConflictHint(conflict) {
|
|
95
|
+
return (`Warning: ${conflict.folderPath} is also loaded by the ` +
|
|
96
|
+
`${hostLabel(conflict.host)} ${conflict.kind} "${conflict.name}". ` +
|
|
97
|
+
`To avoid loading these skills twice, disable it: ${disableCommand(conflict)}`);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=skill-source-conflict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-source-conflict.js","sourceRoot":"","sources":["../../src/detect/skill-source-conflict.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cursor installer — edits Cursor's
|
|
2
|
+
* Cursor installer — edits Cursor's mcp.json `mcpServers.skillforge`.
|
|
3
3
|
*
|
|
4
|
-
* Cursor
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Linux: ~/.config/Cursor/User/settings.json
|
|
4
|
+
* Cursor reads MCP servers from `~/.cursor/mcp.json` (global) and
|
|
5
|
+
* `<project>/.cursor/mcp.json` (project) — uniform across all OSes. It
|
|
6
|
+
* does NOT read MCP servers from Cursor's VS Code-style `settings.json`.
|
|
8
7
|
*
|
|
9
|
-
* The MCP server registry lives under `
|
|
10
|
-
* { command, args, env? } shape used by Claude Code.
|
|
8
|
+
* The MCP server registry lives under the top-level `mcpServers.<name>`
|
|
9
|
+
* key with the same { command, args, env? } shape used by Claude Code.
|
|
11
10
|
*/
|
|
12
11
|
import type { Installer, InstallOptions, InstallResult, PreviewResult, UninstallResult } from './types.js';
|
|
13
12
|
export interface CursorInstallerPathOverrides {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-installer.d.ts","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cursor-installer.d.ts","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAsDD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAsBlG"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cursor installer — edits Cursor's
|
|
2
|
+
* Cursor installer — edits Cursor's mcp.json `mcpServers.skillforge`.
|
|
3
3
|
*
|
|
4
|
-
* Cursor
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Linux: ~/.config/Cursor/User/settings.json
|
|
4
|
+
* Cursor reads MCP servers from `~/.cursor/mcp.json` (global) and
|
|
5
|
+
* `<project>/.cursor/mcp.json` (project) — uniform across all OSes. It
|
|
6
|
+
* does NOT read MCP servers from Cursor's VS Code-style `settings.json`.
|
|
8
7
|
*
|
|
9
|
-
* The MCP server registry lives under `
|
|
10
|
-
* { command, args, env? } shape used by Claude Code.
|
|
8
|
+
* The MCP server registry lives under the top-level `mcpServers.<name>`
|
|
9
|
+
* key with the same { command, args, env? } shape used by Claude Code.
|
|
11
10
|
*/
|
|
12
11
|
import { spawnSync } from 'node:child_process';
|
|
13
12
|
import { access } from 'node:fs/promises';
|
|
14
13
|
import { readJsonSafe, writeJsonAtomic } from './atomic-write.js';
|
|
15
|
-
import {
|
|
14
|
+
import { cursorConfigPath, defaultBinaryPath } from './paths.js';
|
|
16
15
|
const SKILL_KEY = 'skillforge';
|
|
17
16
|
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
18
17
|
function buildEntry(opts, binaryFallback) {
|
|
@@ -40,22 +39,18 @@ async function fileExists(path) {
|
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
function readSkillforge(cfg) {
|
|
43
|
-
return cfg.
|
|
42
|
+
return cfg.mcpServers?.[SKILL_KEY];
|
|
44
43
|
}
|
|
45
44
|
function mergeInstall(existing, entry) {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
...existing,
|
|
50
|
-
mcp: { ...mcp, servers: { ...servers, [SKILL_KEY]: entry } },
|
|
51
|
-
};
|
|
45
|
+
const servers = existing.mcpServers ?? {};
|
|
46
|
+
return { ...existing, mcpServers: { ...servers, [SKILL_KEY]: entry } };
|
|
52
47
|
}
|
|
53
48
|
function mergeUninstall(existing) {
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
49
|
+
const servers = existing.mcpServers;
|
|
50
|
+
if (servers === undefined)
|
|
56
51
|
return existing;
|
|
57
|
-
const { [SKILL_KEY]: _drop, ...rest } =
|
|
58
|
-
return { ...existing,
|
|
52
|
+
const { [SKILL_KEY]: _drop, ...rest } = servers;
|
|
53
|
+
return { ...existing, mcpServers: rest };
|
|
59
54
|
}
|
|
60
55
|
export class CursorInstaller {
|
|
61
56
|
name = 'cursor';
|
|
@@ -63,7 +58,7 @@ export class CursorInstaller {
|
|
|
63
58
|
#binaryFallback;
|
|
64
59
|
#probe;
|
|
65
60
|
constructor(overrides = {}) {
|
|
66
|
-
this.#configPath = overrides.configPath ??
|
|
61
|
+
this.#configPath = overrides.configPath ?? cursorConfigPath();
|
|
67
62
|
this.#binaryFallback = overrides.binaryPath ?? defaultBinaryPath();
|
|
68
63
|
this.#probe = overrides.binaryProbe ?? probeCursorBinary;
|
|
69
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-installer.js","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cursor-installer.js","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"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"}
|