@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,249 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SkillForge `folders` subcommand.
|
|
4
|
+
*
|
|
5
|
+
* Terminal-side skill-folder management. Without this, folders could only
|
|
6
|
+
* be registered from inside an LLM session via the `skills__configure` MCP
|
|
7
|
+
* tool. This subcommand exposes the same `ConfigStore` folder operations
|
|
8
|
+
* (load → mutate → save) to the shell — no separate config logic.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* skillforge folders list [--json] List registered folders
|
|
12
|
+
* skillforge folders add <path> [flags] Register a folder
|
|
13
|
+
* skillforge folders remove <path> Remove a folder entry
|
|
14
|
+
* skillforge folders reset --yes Reset folders to default
|
|
15
|
+
*
|
|
16
|
+
* add flags:
|
|
17
|
+
* --priority <n> Folder priority (default 100, lower wins ordering).
|
|
18
|
+
* --tags <a,b,c> Comma-separated tags.
|
|
19
|
+
* --disabled Register the folder disabled.
|
|
20
|
+
*/
|
|
21
|
+
import { resolve } from 'node:path';
|
|
22
|
+
import { stat } from 'node:fs/promises';
|
|
23
|
+
import { ConfigStore, defaultConfigPath } from '../config/config-store.js';
|
|
24
|
+
import { defaultConfig } from '../config/config-schema.js';
|
|
25
|
+
import { detectSkillSourceConflict, formatConflictHint, } from '../detect/skill-source-conflict.js';
|
|
26
|
+
const USAGE = `skillforge folders — manage skill folders from the terminal.
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
skillforge folders <action> [args]
|
|
30
|
+
|
|
31
|
+
Actions:
|
|
32
|
+
list [--json] Print registered folders (path, priority, enabled, tags).
|
|
33
|
+
add <path> [flags] Register a folder. Path must exist and be a directory.
|
|
34
|
+
Flags: --priority <n>, --tags <a,b,c>, --disabled
|
|
35
|
+
remove <path> Remove the entry for <path>.
|
|
36
|
+
reset --yes Reset folders to the default (empty) list.
|
|
37
|
+
Without --yes, prints what would happen and exits.
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
skillforge folders list --json
|
|
41
|
+
skillforge folders add ~/.lyupro/skills --priority 50 --tags work,review
|
|
42
|
+
skillforge folders remove ~/.lyupro/skills
|
|
43
|
+
skillforge folders reset --yes
|
|
44
|
+
`;
|
|
45
|
+
async function defaultIsDirectory(p) {
|
|
46
|
+
try {
|
|
47
|
+
const info = await stat(p);
|
|
48
|
+
return info.isDirectory();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Parse the flags accepted by `add`. Returns null on a malformed flag. */
|
|
55
|
+
function parseAddFlags(args) {
|
|
56
|
+
let priority;
|
|
57
|
+
let tags;
|
|
58
|
+
let disabled = false;
|
|
59
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
60
|
+
const arg = args[i];
|
|
61
|
+
if (arg === '--disabled') {
|
|
62
|
+
disabled = true;
|
|
63
|
+
}
|
|
64
|
+
else if (arg === '--priority') {
|
|
65
|
+
const value = args[i + 1];
|
|
66
|
+
if (value === undefined)
|
|
67
|
+
return null;
|
|
68
|
+
const n = Number(value);
|
|
69
|
+
if (!Number.isInteger(n))
|
|
70
|
+
return null;
|
|
71
|
+
priority = n;
|
|
72
|
+
i += 1;
|
|
73
|
+
}
|
|
74
|
+
else if (arg === '--tags') {
|
|
75
|
+
const value = args[i + 1];
|
|
76
|
+
if (value === undefined)
|
|
77
|
+
return null;
|
|
78
|
+
tags = value
|
|
79
|
+
.split(',')
|
|
80
|
+
.map((t) => t.trim())
|
|
81
|
+
.filter((t) => t.length > 0);
|
|
82
|
+
i += 1;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { priority, tags, disabled };
|
|
89
|
+
}
|
|
90
|
+
function formatFoldersTable(folders) {
|
|
91
|
+
if (folders.length === 0) {
|
|
92
|
+
return 'No folders registered.\n';
|
|
93
|
+
}
|
|
94
|
+
const rows = folders.map((f) => ({
|
|
95
|
+
priority: String(f.priority),
|
|
96
|
+
enabled: f.enabled ? 'yes' : 'no',
|
|
97
|
+
tags: f.tags.length > 0 ? f.tags.join(',') : '-',
|
|
98
|
+
path: f.path,
|
|
99
|
+
}));
|
|
100
|
+
const headers = { priority: 'PRIORITY', enabled: 'ENABLED', tags: 'TAGS', path: 'PATH' };
|
|
101
|
+
const width = {
|
|
102
|
+
priority: Math.max(headers.priority.length, ...rows.map((r) => r.priority.length)),
|
|
103
|
+
enabled: Math.max(headers.enabled.length, ...rows.map((r) => r.enabled.length)),
|
|
104
|
+
tags: Math.max(headers.tags.length, ...rows.map((r) => r.tags.length)),
|
|
105
|
+
};
|
|
106
|
+
const pad = (text, len) => text.padEnd(len);
|
|
107
|
+
const lines = [
|
|
108
|
+
`${pad(headers.priority, width.priority)} ${pad(headers.enabled, width.enabled)} ${pad(headers.tags, width.tags)} ${headers.path}`,
|
|
109
|
+
];
|
|
110
|
+
for (const r of rows) {
|
|
111
|
+
lines.push(`${pad(r.priority, width.priority)} ${pad(r.enabled, width.enabled)} ${pad(r.tags, width.tags)} ${r.path}`);
|
|
112
|
+
}
|
|
113
|
+
return `${lines.join('\n')}\n`;
|
|
114
|
+
}
|
|
115
|
+
async function handleList(store, rest, stdout, stderr) {
|
|
116
|
+
let asJson = false;
|
|
117
|
+
for (const arg of rest) {
|
|
118
|
+
if (arg === '--json') {
|
|
119
|
+
asJson = true;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
stderr(`skillforge folders list: unknown flag: ${arg}\n`);
|
|
123
|
+
return 2;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const config = await store.load();
|
|
127
|
+
if (asJson) {
|
|
128
|
+
stdout(`${JSON.stringify({ folders: config.folders }, null, 2)}\n`);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
stdout(formatFoldersTable(config.folders));
|
|
132
|
+
}
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
async function handleAdd(store, rest, stdout, stderr, isDirectory) {
|
|
136
|
+
const rawPath = rest[0];
|
|
137
|
+
if (rawPath === undefined || rawPath.startsWith('--')) {
|
|
138
|
+
stderr(`skillforge folders add: missing <path>\n`);
|
|
139
|
+
return 2;
|
|
140
|
+
}
|
|
141
|
+
const flags = parseAddFlags(rest.slice(1));
|
|
142
|
+
if (flags === null) {
|
|
143
|
+
stderr(`skillforge folders add: invalid or malformed flag\n`);
|
|
144
|
+
return 2;
|
|
145
|
+
}
|
|
146
|
+
const absPath = resolve(rawPath);
|
|
147
|
+
if (!(await isDirectory(absPath))) {
|
|
148
|
+
stderr(`skillforge folders add: path does not exist or is not a directory: ${absPath}\n`);
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
const config = await store.load();
|
|
152
|
+
const alreadyPresent = config.folders.some((f) => resolve(f.path) === absPath);
|
|
153
|
+
if (alreadyPresent) {
|
|
154
|
+
stdout(`Folder already registered: ${absPath}\n`);
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
const entry = {
|
|
158
|
+
path: absPath,
|
|
159
|
+
priority: flags.priority ?? 100,
|
|
160
|
+
enabled: !flags.disabled,
|
|
161
|
+
tags: flags.tags ?? [],
|
|
162
|
+
};
|
|
163
|
+
config.folders.push(entry);
|
|
164
|
+
await store.save(config);
|
|
165
|
+
stdout(`Registered folder: ${absPath}\n`);
|
|
166
|
+
// Informational only: a conflict does not block the add or change the exit code.
|
|
167
|
+
const conflict = detectSkillSourceConflict(absPath);
|
|
168
|
+
if (conflict !== null) {
|
|
169
|
+
stdout(`${formatConflictHint(conflict)}\n`);
|
|
170
|
+
}
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
async function handleRemove(store, rest, stdout, stderr) {
|
|
174
|
+
const rawPath = rest[0];
|
|
175
|
+
if (rawPath === undefined || rawPath.startsWith('--')) {
|
|
176
|
+
stderr(`skillforge folders remove: missing <path>\n`);
|
|
177
|
+
return 2;
|
|
178
|
+
}
|
|
179
|
+
const absPath = resolve(rawPath);
|
|
180
|
+
const config = await store.load();
|
|
181
|
+
const before = config.folders.length;
|
|
182
|
+
config.folders = config.folders.filter((f) => resolve(f.path) !== absPath);
|
|
183
|
+
if (config.folders.length === before) {
|
|
184
|
+
stderr(`skillforge folders remove: no registered folder matches: ${absPath}\n`);
|
|
185
|
+
return 1;
|
|
186
|
+
}
|
|
187
|
+
await store.save(config);
|
|
188
|
+
stdout(`Removed folder: ${absPath}\n`);
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
async function handleReset(store, rest, stdout, stderr) {
|
|
192
|
+
const confirmed = rest.includes('--yes');
|
|
193
|
+
for (const arg of rest) {
|
|
194
|
+
if (arg !== '--yes') {
|
|
195
|
+
stderr(`skillforge folders reset: unknown flag: ${arg}\n`);
|
|
196
|
+
return 2;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!confirmed) {
|
|
200
|
+
const config = await store.load();
|
|
201
|
+
stdout(`Would reset ${config.folders.length} folder(s) to the default (empty) list.\n` +
|
|
202
|
+
`Re-run with --yes to apply. No changes were made.\n`);
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
const config = await store.load();
|
|
206
|
+
config.folders = defaultConfig().folders;
|
|
207
|
+
await store.save(config);
|
|
208
|
+
stdout(`Reset folders to the default (empty) list.\n`);
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* `folders` subcommand entry. Returns an exit code:
|
|
213
|
+
* - 0 on success
|
|
214
|
+
* - 1 on a runtime/validation failure (e.g. bad path)
|
|
215
|
+
* - 2 on a missing/unknown sub-action or malformed flag
|
|
216
|
+
*/
|
|
217
|
+
export async function main(rawArgv, deps = {}) {
|
|
218
|
+
const stdout = deps.stdout ?? ((text) => process.stdout.write(text));
|
|
219
|
+
const stderr = deps.stderr ?? ((text) => process.stderr.write(text));
|
|
220
|
+
const isDirectory = deps.isDirectory ?? defaultIsDirectory;
|
|
221
|
+
const store = new ConfigStore({ filePath: deps.configPath ?? defaultConfigPath() });
|
|
222
|
+
const action = rawArgv[0];
|
|
223
|
+
const rest = rawArgv.slice(1);
|
|
224
|
+
try {
|
|
225
|
+
switch (action) {
|
|
226
|
+
case 'list':
|
|
227
|
+
return await handleList(store, rest, stdout, stderr);
|
|
228
|
+
case 'add':
|
|
229
|
+
return await handleAdd(store, rest, stdout, stderr, isDirectory);
|
|
230
|
+
case 'remove':
|
|
231
|
+
return await handleRemove(store, rest, stdout, stderr);
|
|
232
|
+
case 'reset':
|
|
233
|
+
return await handleReset(store, rest, stdout, stderr);
|
|
234
|
+
default: {
|
|
235
|
+
if (action !== undefined) {
|
|
236
|
+
stderr(`skillforge folders: unknown action: ${action}\n\n`);
|
|
237
|
+
}
|
|
238
|
+
stderr(USAGE);
|
|
239
|
+
return 2;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
245
|
+
stderr(`skillforge folders: ${msg}\n`);
|
|
246
|
+
return 1;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/install.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* skillforge install --all --entry local --binary-path /abs/path/to/server.js
|
|
15
15
|
* skillforge install --claude --force
|
|
16
16
|
*/
|
|
17
|
+
import type { Scope } from '../installers/paths.js';
|
|
17
18
|
import type { Installer } from '../installers/types.js';
|
|
18
19
|
export interface ParsedArgs {
|
|
19
20
|
claude: boolean;
|
|
@@ -25,6 +26,7 @@ export interface ParsedArgs {
|
|
|
25
26
|
force: boolean;
|
|
26
27
|
entry: 'npx' | 'local';
|
|
27
28
|
binaryPath?: string;
|
|
29
|
+
scope: Scope;
|
|
28
30
|
showHelp: boolean;
|
|
29
31
|
}
|
|
30
32
|
export declare class UsageError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAoCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwEpD;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAwCD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAuEtF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7D"}
|
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:
|
|
@@ -38,10 +38,20 @@ Modes:
|
|
|
38
38
|
--force Overwrite an existing SkillForge entry
|
|
39
39
|
|
|
40
40
|
Entry shape:
|
|
41
|
-
--entry npx (default) command=npx args=['-y','@lyupro/skillforge-mcp']
|
|
41
|
+
--entry npx (default) command=npx args=['-y','@lyupro/skillforge-mcp','serve']
|
|
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":"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"}
|
|
@@ -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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"}
|