@lyupro/skillforge-mcp 1.1.0 → 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 +49 -0
- package/README.md +77 -9
- package/dist/cli/dispatcher.d.ts +40 -0
- package/dist/cli/dispatcher.d.ts.map +1 -0
- package/dist/cli/dispatcher.js +146 -0
- package/dist/cli/dispatcher.js.map +1 -0
- 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 +48 -10
- 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/claude-installer.js +1 -1
- package/dist/installers/claude-installer.js.map +1 -1
- package/dist/installers/codex-installer.js +1 -1
- package/dist/installers/codex-installer.js.map +1 -1
- 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 +16 -21
- 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 +4 -3
- package/package.json +5 -4
|
@@ -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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"}
|
|
@@ -14,7 +14,7 @@ const SKILL_KEY = 'skillforge';
|
|
|
14
14
|
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
15
15
|
function buildEntry(opts, binaryFallback) {
|
|
16
16
|
if (opts.entry === 'npx') {
|
|
17
|
-
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
17
|
+
return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
|
|
18
18
|
}
|
|
19
19
|
const binary = opts.binaryPath ?? binaryFallback;
|
|
20
20
|
return { command: 'node', args: [binary] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-installer.js","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASjE,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAmBzC,SAAS,UAAU,CAAC,IAAoB,EAAE,cAAsB;IAC9D,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-installer.js","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ const SKILL_KEY = 'skillforge';
|
|
|
18
18
|
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
19
19
|
function buildEntry(opts, binaryFallback) {
|
|
20
20
|
if (opts.entry === 'npx') {
|
|
21
|
-
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
21
|
+
return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
|
|
22
22
|
}
|
|
23
23
|
return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAShE,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAmBzC,SAAS,UAAU,CAAC,IAAoB,EAAE,cAAsB;IAC9D,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAShE,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAmBzC,SAAS,UAAU,CAAC,IAAoB,EAAE,cAAsB;IAC9D,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,OAAO,IAAI,MAAM,aAAa,CAAC;AAE/B,SAAS,aAAa,CAAC,GAA4B;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAmB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,MAAM,CAAgB;IAE/B,YAAY,YAAyC,EAAE;QACrD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,UAAU,IAAI,eAAe,EAAE,CAAC;QAC7D,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,IAAI,gBAAgB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,QAAQ,GAAI,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAwB,IAAI,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAgC,CAAC;QAC5E,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5D,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,OAAO,EAAE,6DAA6D;aACvE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAA4B;YACpC,GAAG,QAAQ;YACX,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE;SAChD,CAAC;QACF,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAuB,CAAC;QAC9E,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAC7G,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,eAAe;gBACvB,UAAU,EAAE,IAAI,CAAC,WAAW;aAC7B,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC7D,MAAM,IAAI,GAA4B,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACzE,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAA0D;QACtE,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAuB,CAAC;QAC9E,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,QAAmC,CAAC,CAAC;QAE7F,IAAI,SAAkC,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAgB,CAAC;YAC7C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAgC,CAAC;YACxE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACrD,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC5D,SAAS,GAAG,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;gBAC7D,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,UAAU,EAAE,QAAQ,KAAK,IAAI;YAC7B,MAAM;YACN,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -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,23 +1,22 @@
|
|
|
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) {
|
|
19
18
|
if (opts.entry === 'npx') {
|
|
20
|
-
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
19
|
+
return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
|
|
21
20
|
}
|
|
22
21
|
return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
|
|
23
22
|
}
|
|
@@ -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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"}
|
|
@@ -1,20 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Config path helpers for host tools.
|
|
3
3
|
*
|
|
4
4
|
* Per repo convention, all SkillForge config paths use `os.homedir()`
|
|
5
|
-
* exclusively — no platform branching.
|
|
6
|
-
*
|
|
7
|
-
* control, so the platform-specific dispatch here is rubric-exempt.
|
|
5
|
+
* exclusively — no platform branching. Every host (Claude Code, Codex CLI,
|
|
6
|
+
* Cursor) stores its MCP config in a homedir-rooted file uniform across OSes.
|
|
8
7
|
*/
|
|
9
8
|
export interface PathOverrides {
|
|
10
9
|
claudeConfigPath: string;
|
|
11
10
|
codexConfigPath: string;
|
|
12
|
-
|
|
11
|
+
cursorConfigPath: string;
|
|
13
12
|
defaultBinaryPath: string;
|
|
14
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Install scope. `global` edits the host's home-directory config (the
|
|
16
|
+
* historical default); `project` edits a config file rooted at the current
|
|
17
|
+
* working directory so a single repo can opt into SkillForge.
|
|
18
|
+
*/
|
|
19
|
+
export type Scope = 'global' | 'project';
|
|
20
|
+
export type HostName = 'claude' | 'codex' | 'cursor';
|
|
15
21
|
export declare function claudeConfigPath(): string;
|
|
16
22
|
export declare function codexConfigPath(): string;
|
|
17
|
-
export declare function
|
|
23
|
+
export declare function cursorConfigPath(): string;
|
|
18
24
|
export declare function defaultBinaryPath(): string;
|
|
19
25
|
export declare function defaultPaths(): PathOverrides;
|
|
26
|
+
export declare function claudeProjectConfigPath(projectRoot: string): string;
|
|
27
|
+
export declare function codexProjectConfigPath(projectRoot: string): string;
|
|
28
|
+
export declare function cursorProjectConfigPath(projectRoot: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Validate that `projectRoot` is a usable directory for `--scope project`.
|
|
31
|
+
* Throws a clear error otherwise (caller maps this to a non-zero exit).
|
|
32
|
+
*/
|
|
33
|
+
export declare function assertProjectRoot(projectRoot: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the config path for a host under the given scope.
|
|
36
|
+
*
|
|
37
|
+
* - `global` → the host's home-directory config (historical default).
|
|
38
|
+
* - `project` → the host's repo-local config rooted at `projectRoot`
|
|
39
|
+
* (defaults to `process.cwd()`). Validates the root first.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveConfigPath(host: HostName, scope: Scope, projectRoot?: string): string;
|
|
20
42
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAKD,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,YAAY,IAAI,aAAa,CAO5C;AAWD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAID,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAElE;AAKD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,KAAK,EACZ,WAAW,GAAE,MAAsB,GAClC,MAAM,CAUR"}
|
package/dist/installers/paths.js
CHANGED
|
@@ -1,34 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Config path helpers for host tools.
|
|
3
3
|
*
|
|
4
4
|
* Per repo convention, all SkillForge config paths use `os.homedir()`
|
|
5
|
-
* exclusively — no platform branching.
|
|
6
|
-
*
|
|
7
|
-
* control, so the platform-specific dispatch here is rubric-exempt.
|
|
5
|
+
* exclusively — no platform branching. Every host (Claude Code, Codex CLI,
|
|
6
|
+
* Cursor) stores its MCP config in a homedir-rooted file uniform across OSes.
|
|
8
7
|
*/
|
|
9
8
|
import { join, resolve } from 'node:path';
|
|
10
|
-
import { homedir
|
|
9
|
+
import { homedir } from 'node:os';
|
|
11
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { statSync } from 'node:fs';
|
|
12
12
|
export function claudeConfigPath() {
|
|
13
13
|
return join(homedir(), '.claude.json');
|
|
14
14
|
}
|
|
15
15
|
export function codexConfigPath() {
|
|
16
16
|
return join(homedir(), '.codex', 'config.toml');
|
|
17
17
|
}
|
|
18
|
-
// Cursor
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
export function
|
|
23
|
-
|
|
24
|
-
if (os === 'win32') {
|
|
25
|
-
const appData = process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming');
|
|
26
|
-
return join(appData, 'Cursor', 'User', 'settings.json');
|
|
27
|
-
}
|
|
28
|
-
if (os === 'darwin') {
|
|
29
|
-
return join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'settings.json');
|
|
30
|
-
}
|
|
31
|
-
return join(homedir(), '.config', 'Cursor', 'User', 'settings.json');
|
|
18
|
+
// Cursor reads its global MCP server registry from ~/.cursor/mcp.json on
|
|
19
|
+
// every OS — the same top-level `mcpServers` shape as ~/.claude.json. This
|
|
20
|
+
// is distinct from Cursor's VS Code-style `settings.json`, which Cursor
|
|
21
|
+
// does NOT read MCP servers from.
|
|
22
|
+
export function cursorConfigPath() {
|
|
23
|
+
return join(homedir(), '.cursor', 'mcp.json');
|
|
32
24
|
}
|
|
33
25
|
// Fallback `--entry local` target when --binary-path is not supplied.
|
|
34
26
|
// Resolves to <package root>/dist/server.js via import.meta.url so the
|
|
@@ -43,8 +35,68 @@ export function defaultPaths() {
|
|
|
43
35
|
return {
|
|
44
36
|
claudeConfigPath: claudeConfigPath(),
|
|
45
37
|
codexConfigPath: codexConfigPath(),
|
|
46
|
-
|
|
38
|
+
cursorConfigPath: cursorConfigPath(),
|
|
47
39
|
defaultBinaryPath: defaultBinaryPath(),
|
|
48
40
|
};
|
|
49
41
|
}
|
|
42
|
+
// --- Project-scoped config paths -------------------------------------------
|
|
43
|
+
//
|
|
44
|
+
// `--scope project` targets a config file rooted at the current working
|
|
45
|
+
// directory instead of the home directory. The internal file shapes are
|
|
46
|
+
// identical to the global counterparts, so the same installer + atomic-write
|
|
47
|
+
// + merge logic applies unchanged — only the resolved path differs.
|
|
48
|
+
// Claude Code reads project-local MCP servers from `.mcp.json` at the repo
|
|
49
|
+
// root, with the same top-level `mcpServers` map as `~/.claude.json`.
|
|
50
|
+
export function claudeProjectConfigPath(projectRoot) {
|
|
51
|
+
return join(projectRoot, '.mcp.json');
|
|
52
|
+
}
|
|
53
|
+
// Codex CLI reads project-local config from `.codex/config.toml`, same
|
|
54
|
+
// `[mcp_servers.<name>]` table shape as `~/.codex/config.toml`.
|
|
55
|
+
export function codexProjectConfigPath(projectRoot) {
|
|
56
|
+
return join(projectRoot, '.codex', 'config.toml');
|
|
57
|
+
}
|
|
58
|
+
// Cursor reads project-local MCP servers from `.cursor/mcp.json`, the same
|
|
59
|
+
// top-level `mcpServers` JSON shape as the global `~/.cursor/mcp.json`, so
|
|
60
|
+
// the existing merge logic is reused verbatim.
|
|
61
|
+
export function cursorProjectConfigPath(projectRoot) {
|
|
62
|
+
return join(projectRoot, '.cursor', 'mcp.json');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate that `projectRoot` is a usable directory for `--scope project`.
|
|
66
|
+
* Throws a clear error otherwise (caller maps this to a non-zero exit).
|
|
67
|
+
*/
|
|
68
|
+
export function assertProjectRoot(projectRoot) {
|
|
69
|
+
let stat;
|
|
70
|
+
try {
|
|
71
|
+
stat = statSync(projectRoot);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new Error(`--scope project: cannot resolve a project root at "${projectRoot}" (path does not exist)`);
|
|
75
|
+
}
|
|
76
|
+
if (!stat.isDirectory()) {
|
|
77
|
+
throw new Error(`--scope project: project root "${projectRoot}" is not a directory`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve the config path for a host under the given scope.
|
|
82
|
+
*
|
|
83
|
+
* - `global` → the host's home-directory config (historical default).
|
|
84
|
+
* - `project` → the host's repo-local config rooted at `projectRoot`
|
|
85
|
+
* (defaults to `process.cwd()`). Validates the root first.
|
|
86
|
+
*/
|
|
87
|
+
export function resolveConfigPath(host, scope, projectRoot = process.cwd()) {
|
|
88
|
+
if (scope === 'global') {
|
|
89
|
+
if (host === 'claude')
|
|
90
|
+
return claudeConfigPath();
|
|
91
|
+
if (host === 'codex')
|
|
92
|
+
return codexConfigPath();
|
|
93
|
+
return cursorConfigPath();
|
|
94
|
+
}
|
|
95
|
+
assertProjectRoot(projectRoot);
|
|
96
|
+
if (host === 'claude')
|
|
97
|
+
return claudeProjectConfigPath(projectRoot);
|
|
98
|
+
if (host === 'codex')
|
|
99
|
+
return codexProjectConfigPath(projectRoot);
|
|
100
|
+
return cursorProjectConfigPath(projectRoot);
|
|
101
|
+
}
|
|
50
102
|
//# sourceMappingURL=paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
* Installer registry — stable enumeration of the three host installers
|
|
3
3
|
* consumed by the `--all` dispatcher and by --claude / --codex / --cursor.
|
|
4
4
|
*/
|
|
5
|
+
import { type HostName, type Scope } from './paths.js';
|
|
5
6
|
import type { Installer } from './types.js';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Build a single installer for `host`, with its config path resolved for the
|
|
9
|
+
* given scope. The resolved path is threaded into the existing `configPath`
|
|
10
|
+
* constructor override — installer merge / atomic-write logic is unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getInstallerByName(name: HostName, scope?: Scope, projectRoot?: string): Installer;
|
|
13
|
+
export declare function getAllInstallers(scope?: Scope, projectRoot?: string): Installer[];
|
|
8
14
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAKX;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,EAAE,CAIb"}
|
|
@@ -5,14 +5,21 @@
|
|
|
5
5
|
import { ClaudeInstaller } from './claude-installer.js';
|
|
6
6
|
import { CodexInstaller } from './codex-installer.js';
|
|
7
7
|
import { CursorInstaller } from './cursor-installer.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
import { resolveConfigPath } from './paths.js';
|
|
9
|
+
/**
|
|
10
|
+
* Build a single installer for `host`, with its config path resolved for the
|
|
11
|
+
* given scope. The resolved path is threaded into the existing `configPath`
|
|
12
|
+
* constructor override — installer merge / atomic-write logic is unchanged.
|
|
13
|
+
*/
|
|
14
|
+
export function getInstallerByName(name, scope = 'global', projectRoot) {
|
|
15
|
+
const configPath = resolveConfigPath(name, scope, projectRoot);
|
|
12
16
|
if (name === 'claude')
|
|
13
|
-
return new ClaudeInstaller();
|
|
17
|
+
return new ClaudeInstaller({ configPath });
|
|
14
18
|
if (name === 'codex')
|
|
15
|
-
return new CodexInstaller();
|
|
16
|
-
return new CursorInstaller();
|
|
19
|
+
return new CodexInstaller({ configPath });
|
|
20
|
+
return new CursorInstaller({ configPath });
|
|
21
|
+
}
|
|
22
|
+
export function getAllInstallers(scope = 'global', projectRoot) {
|
|
23
|
+
return ['claude', 'codex', 'cursor'].map((name) => getInstallerByName(name, scope, projectRoot));
|
|
17
24
|
}
|
|
18
25
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAA6B,MAAM,YAAY,CAAC;AAG1E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAc,EACd,QAAe,QAAQ,EACvB,WAAoB;IAEpB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAe,QAAQ,EACvB,WAAoB;IAEpB,OAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3D,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -13,6 +13,12 @@ export interface ConfigureResult {
|
|
|
13
13
|
blacklist: string[];
|
|
14
14
|
/** Skills visible in the registry after the action took effect. */
|
|
15
15
|
totalSkills: number;
|
|
16
|
+
/**
|
|
17
|
+
* Set by `add_folder` only, when the added folder is also served by a host
|
|
18
|
+
* CLI's native plugin/extension system (skills would load twice). It is an
|
|
19
|
+
* informational hint — the folder is still registered. Absent otherwise.
|
|
20
|
+
*/
|
|
21
|
+
conflictHint?: string;
|
|
16
22
|
}
|
|
17
23
|
export declare function handleConfigure(deps: ServerDeps, args: {
|
|
18
24
|
action: ConfigureAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/tools/configure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/tools/configure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAUpD,eAAO,MAAM,oBAAoB;;;;CAWvB,CAAC;AAEX,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,eAAe,GACf,cAAc,GACd,eAAe,GACf,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACvE,OAAO,CAAC,eAAe,CAAC,CAkG1B"}
|