@lyupro/skillforge-mcp 1.2.0 → 1.4.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.
Files changed (81) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +47 -0
  4. package/README.md +27 -12
  5. package/dist/cli/dispatcher.d.ts.map +1 -1
  6. package/dist/cli/dispatcher.js +13 -10
  7. package/dist/cli/dispatcher.js.map +1 -1
  8. package/dist/cli/folders-format.d.ts +10 -0
  9. package/dist/cli/folders-format.d.ts.map +1 -0
  10. package/dist/cli/folders-format.js +41 -0
  11. package/dist/cli/folders-format.js.map +1 -0
  12. package/dist/cli/folders-handlers.d.ts +16 -0
  13. package/dist/cli/folders-handlers.d.ts.map +1 -0
  14. package/dist/cli/folders-handlers.js +195 -0
  15. package/dist/cli/folders-handlers.js.map +1 -0
  16. package/dist/cli/folders-shared.d.ts +29 -0
  17. package/dist/cli/folders-shared.d.ts.map +1 -0
  18. package/dist/cli/folders-shared.js +82 -0
  19. package/dist/cli/folders-shared.js.map +1 -0
  20. package/dist/cli/folders.d.ts +7 -2
  21. package/dist/cli/folders.d.ts.map +1 -1
  22. package/dist/cli/folders.js +28 -177
  23. package/dist/cli/folders.js.map +1 -1
  24. package/dist/cli/skills-format.d.ts +15 -0
  25. package/dist/cli/skills-format.d.ts.map +1 -0
  26. package/dist/cli/skills-format.js +84 -0
  27. package/dist/cli/skills-format.js.map +1 -0
  28. package/dist/cli/skills-handlers.d.ts +15 -0
  29. package/dist/cli/skills-handlers.d.ts.map +1 -0
  30. package/dist/cli/skills-handlers.js +112 -0
  31. package/dist/cli/skills-handlers.js.map +1 -0
  32. package/dist/cli/skills-shared.d.ts +32 -0
  33. package/dist/cli/skills-shared.d.ts.map +1 -0
  34. package/dist/cli/skills-shared.js +90 -0
  35. package/dist/cli/skills-shared.js.map +1 -0
  36. package/dist/cli/skills.d.ts +46 -0
  37. package/dist/cli/skills.d.ts.map +1 -0
  38. package/dist/cli/skills.js +107 -0
  39. package/dist/cli/skills.js.map +1 -0
  40. package/dist/cli/tools.d.ts.map +1 -1
  41. package/dist/cli/tools.js +6 -0
  42. package/dist/cli/tools.js.map +1 -1
  43. package/dist/config/config-schema.d.ts +248 -136
  44. package/dist/config/config-schema.d.ts.map +1 -1
  45. package/dist/config/config-schema.js +34 -14
  46. package/dist/config/config-schema.js.map +1 -1
  47. package/dist/detect/skill-source-conflict.d.ts +24 -7
  48. package/dist/detect/skill-source-conflict.d.ts.map +1 -1
  49. package/dist/detect/skill-source-conflict.js +62 -10
  50. package/dist/detect/skill-source-conflict.js.map +1 -1
  51. package/dist/reconcile.d.ts +5 -0
  52. package/dist/reconcile.d.ts.map +1 -0
  53. package/dist/reconcile.js +20 -0
  54. package/dist/reconcile.js.map +1 -0
  55. package/dist/runtime.d.ts +14 -0
  56. package/dist/runtime.d.ts.map +1 -0
  57. package/dist/runtime.js +29 -0
  58. package/dist/runtime.js.map +1 -0
  59. package/dist/server-deps.d.ts +3 -1
  60. package/dist/server-deps.d.ts.map +1 -1
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +26 -9
  63. package/dist/server.js.map +1 -1
  64. package/dist/tools/configure.d.ts +2 -0
  65. package/dist/tools/configure.d.ts.map +1 -1
  66. package/dist/tools/configure.js +22 -26
  67. package/dist/tools/configure.js.map +1 -1
  68. package/dist/tools/list.d.ts +2 -0
  69. package/dist/tools/list.d.ts.map +1 -1
  70. package/dist/tools/list.js +12 -0
  71. package/dist/tools/list.js.map +1 -1
  72. package/dist/watcher/config-watcher.d.ts +25 -0
  73. package/dist/watcher/config-watcher.d.ts.map +1 -0
  74. package/dist/watcher/config-watcher.js +92 -0
  75. package/dist/watcher/config-watcher.js.map +1 -0
  76. package/dist/watcher/index.d.ts +2 -0
  77. package/dist/watcher/index.d.ts.map +1 -1
  78. package/dist/watcher/index.js +1 -0
  79. package/dist/watcher/index.js.map +1 -1
  80. package/manifest.json +3 -3
  81. package/package.json +1 -1
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Shared helpers for the `folders` subcommand modules.
3
+ *
4
+ * Holds pure parsing/lookup logic split out of `folders.ts` so the entry
5
+ * module stays small and the handler modules can reuse it.
6
+ */
7
+ import { resolve } from 'node:path';
8
+ import { stat } from 'node:fs/promises';
9
+ /** Kebab-case shape required for a folder alias (lowercase words joined by `-`). */
10
+ export const ALIAS_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
11
+ /** Whether `name` is a valid kebab-case alias token. */
12
+ export function isValidAlias(name) {
13
+ return ALIAS_PATTERN.test(name);
14
+ }
15
+ /** Check whether a path exists and is a directory. Overridable for tests. */
16
+ export async function defaultIsDirectory(p) {
17
+ try {
18
+ const info = await stat(p);
19
+ return info.isDirectory();
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Locate a registered folder by `token`, matching an alias first and falling
27
+ * back to a resolved-path comparison. Shared so `remove`/`alias` address the
28
+ * same entry the same way.
29
+ */
30
+ export function findFolderEntry(folders, token) {
31
+ const byAlias = folders.find((f) => f.alias !== undefined && f.alias === token);
32
+ if (byAlias !== undefined)
33
+ return byAlias;
34
+ const absToken = resolve(token);
35
+ const byPath = folders.find((f) => resolve(f.path) === absToken);
36
+ return byPath ?? null;
37
+ }
38
+ /** Parse the flags accepted by `add`. Returns null on a malformed flag. */
39
+ export function parseAddFlags(args) {
40
+ let priority;
41
+ let tags;
42
+ let disabled = false;
43
+ let alias;
44
+ for (let i = 0; i < args.length; i += 1) {
45
+ const arg = args[i];
46
+ if (arg === '--disabled') {
47
+ disabled = true;
48
+ }
49
+ else if (arg === '--priority') {
50
+ const value = args[i + 1];
51
+ if (value === undefined)
52
+ return null;
53
+ const n = Number(value);
54
+ if (!Number.isInteger(n))
55
+ return null;
56
+ priority = n;
57
+ i += 1;
58
+ }
59
+ else if (arg === '--tags') {
60
+ const value = args[i + 1];
61
+ if (value === undefined)
62
+ return null;
63
+ tags = value
64
+ .split(',')
65
+ .map((t) => t.trim())
66
+ .filter((t) => t.length > 0);
67
+ i += 1;
68
+ }
69
+ else if (arg === '--alias') {
70
+ const value = args[i + 1];
71
+ if (value === undefined)
72
+ return null;
73
+ alias = value;
74
+ i += 1;
75
+ }
76
+ else {
77
+ return null;
78
+ }
79
+ }
80
+ return { priority, tags, disabled, alias };
81
+ }
82
+ //# sourceMappingURL=folders-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders-shared.js","sourceRoot":"","sources":["../../src/cli/folders-shared.ts"],"names":[],"mappings":"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"}
@@ -10,13 +10,18 @@
10
10
  * Usage:
11
11
  * skillforge folders list [--json] List registered folders
12
12
  * skillforge folders add <path> [flags] Register a folder
13
- * skillforge folders remove <path> Remove a folder entry
13
+ * skillforge folders remove <path|alias> Remove a folder entry
14
+ * skillforge folders alias <path|alias> <name> Set/change a folder alias
14
15
  * skillforge folders reset --yes Reset folders to default
15
16
  *
16
17
  * add flags:
17
- * --priority <n> Folder priority (default 100, lower wins ordering).
18
+ * --priority <n> Folder priority (default 100; higher wins on name collisions).
18
19
  * --tags <a,b,c> Comma-separated tags.
19
20
  * --disabled Register the folder disabled.
21
+ * --alias <name> Short kebab-case alias to address the folder later.
22
+ *
23
+ * This module keeps only the entry point + action dispatch; the handlers,
24
+ * table formatting, and shared parsing helpers live in sibling modules.
20
25
  */
21
26
  export interface FoldersDeps {
22
27
  stdout?: (text: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAwND;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCrF"}
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAcH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AA8BD;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCrF"}
@@ -10,204 +10,49 @@
10
10
  * Usage:
11
11
  * skillforge folders list [--json] List registered folders
12
12
  * skillforge folders add <path> [flags] Register a folder
13
- * skillforge folders remove <path> Remove a folder entry
13
+ * skillforge folders remove <path|alias> Remove a folder entry
14
+ * skillforge folders alias <path|alias> <name> Set/change a folder alias
14
15
  * skillforge folders reset --yes Reset folders to default
15
16
  *
16
17
  * add flags:
17
- * --priority <n> Folder priority (default 100, lower wins ordering).
18
+ * --priority <n> Folder priority (default 100; higher wins on name collisions).
18
19
  * --tags <a,b,c> Comma-separated tags.
19
20
  * --disabled Register the folder disabled.
21
+ * --alias <name> Short kebab-case alias to address the folder later.
22
+ *
23
+ * This module keeps only the entry point + action dispatch; the handlers,
24
+ * table formatting, and shared parsing helpers live in sibling modules.
20
25
  */
21
- import { resolve } from 'node:path';
22
- import { stat } from 'node:fs/promises';
23
26
  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';
27
+ import { defaultIsDirectory } from './folders-shared.js';
28
+ import { handleAdd, handleAlias, handleDisable, handleEnable, handleList, handleRemove, handleReset, } from './folders-handlers.js';
26
29
  const USAGE = `skillforge folders — manage skill folders from the terminal.
27
30
 
28
31
  Usage:
29
32
  skillforge folders <action> [args]
30
33
 
31
34
  Actions:
32
- list [--json] Print registered folders (path, priority, enabled, tags).
35
+ list [--json] Print registered folders (priority, enabled, alias, tags, path).
33
36
  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>.
37
+ Flags: --priority <n>, --tags <a,b,c>, --disabled,
38
+ --alias <name> (short kebab-case handle)
39
+ remove <path|alias> Remove the entry for <path> or its alias.
40
+ alias <path|alias> <name> Set or change the alias of a registered folder.
41
+ <name> must be kebab-case and unique.
42
+ enable <path|alias> Enable a previously disabled folder.
43
+ disable <path|alias> Disable a folder without removing it.
36
44
  reset --yes Reset folders to the default (empty) list.
37
45
  Without --yes, prints what would happen and exits.
38
46
 
39
47
  Examples:
40
48
  skillforge folders list --json
41
- skillforge folders add ~/.lyupro/skills --priority 50 --tags work,review
42
- skillforge folders remove ~/.lyupro/skills
49
+ skillforge folders add ~/.lyupro/skills --priority 50 --tags work,review --alias work
50
+ skillforge folders remove work
51
+ skillforge folders alias ~/.lyupro/skills work
52
+ skillforge folders disable work
53
+ skillforge folders enable work
43
54
  skillforge folders reset --yes
44
55
  `;
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
56
  /**
212
57
  * `folders` subcommand entry. Returns an exit code:
213
58
  * - 0 on success
@@ -229,6 +74,12 @@ export async function main(rawArgv, deps = {}) {
229
74
  return await handleAdd(store, rest, stdout, stderr, isDirectory);
230
75
  case 'remove':
231
76
  return await handleRemove(store, rest, stdout, stderr);
77
+ case 'alias':
78
+ return await handleAlias(store, rest, stdout, stderr);
79
+ case 'enable':
80
+ return await handleEnable(store, rest, stdout, stderr);
81
+ case 'disable':
82
+ return await handleDisable(store, rest, stdout, stderr);
232
83
  case 'reset':
233
84
  return await handleReset(store, rest, stdout, stderr);
234
85
  default: {
@@ -1 +1 @@
1
- {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAW/B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,EAAE,OAAoB,EAAE;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,IAAI,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,KAAK,KAAK;gBACR,OAAO,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,KAAK,QAAQ;gBACX,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,OAAO;gBACV,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,KAAK,QAAQ;gBACX,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,SAAS;gBACZ,OAAO,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1D,KAAK,OAAO;gBACV,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC,CAAC;gBACR,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,uCAAuC,MAAM,MAAM,CAAC,CAAC;gBAC9D,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,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,uBAAuB,GAAG,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Table rendering for the `skills list` and `skills get` subcommands.
3
+ *
4
+ * Split out of `skills.ts` so the entry module stays under the 400-line
5
+ * file-size gate. Pure formatting — no I/O.
6
+ */
7
+ import type { SkillSummary, SkillContent } from '../core/types.js';
8
+ import type { RebuildStats } from '../tools/loader.js';
9
+ /** Render the skills list as a fixed-width text table. */
10
+ export declare function formatSkillsTable(skills: SkillSummary[], folderLabel: (path: string) => string): string;
11
+ /** Render a single skill's content in human-readable form. */
12
+ export declare function formatSkillGet(skill: SkillContent): string;
13
+ /** Render the reload summary in human-readable form. */
14
+ export declare function formatReloadStats(stats: RebuildStats, folderCount: number): string;
15
+ //# sourceMappingURL=skills-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-format.d.ts","sourceRoot":"","sources":["../../src/cli/skills-format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUvD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EAAE,EACtB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACpC,MAAM,CA+BR;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAmB1D;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAcR"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Table rendering for the `skills list` and `skills get` subcommands.
3
+ *
4
+ * Split out of `skills.ts` so the entry module stays under the 400-line
5
+ * file-size gate. Pure formatting — no I/O.
6
+ */
7
+ const DESC_MAX = 60;
8
+ function truncate(s, max) {
9
+ if (s === undefined || s.length === 0)
10
+ return '-';
11
+ if (s.length <= max)
12
+ return s;
13
+ return `${s.slice(0, max - 1)}…`;
14
+ }
15
+ /** Render the skills list as a fixed-width text table. */
16
+ export function formatSkillsTable(skills, folderLabel) {
17
+ if (skills.length === 0) {
18
+ return 'No skills found.\n';
19
+ }
20
+ const rows = skills.map((s) => ({
21
+ name: s.name,
22
+ source: s.format,
23
+ folder: folderLabel(s.folder),
24
+ description: truncate(s.description, DESC_MAX),
25
+ }));
26
+ const headers = {
27
+ name: 'NAME',
28
+ source: 'SOURCE',
29
+ folder: 'FOLDER',
30
+ description: 'DESCRIPTION',
31
+ };
32
+ const width = {
33
+ name: Math.max(headers.name.length, ...rows.map((r) => r.name.length)),
34
+ source: Math.max(headers.source.length, ...rows.map((r) => r.source.length)),
35
+ folder: Math.max(headers.folder.length, ...rows.map((r) => r.folder.length)),
36
+ };
37
+ const pad = (text, len) => text.padEnd(len);
38
+ const lines = [
39
+ `${pad(headers.name, width.name)} ${pad(headers.source, width.source)} ${pad(headers.folder, width.folder)} ${headers.description}`,
40
+ ];
41
+ for (const r of rows) {
42
+ lines.push(`${pad(r.name, width.name)} ${pad(r.source, width.source)} ${pad(r.folder, width.folder)} ${r.description}`);
43
+ }
44
+ return `${lines.join('\n')}\n`;
45
+ }
46
+ /** Render a single skill's content in human-readable form. */
47
+ export function formatSkillGet(skill) {
48
+ const lines = [];
49
+ lines.push(`name: ${skill.name}`);
50
+ lines.push(`format: ${skill.format}`);
51
+ lines.push(`folder: ${skill.folder}`);
52
+ lines.push(`sourcePath: ${skill.sourcePath}`);
53
+ if (skill.description !== undefined) {
54
+ lines.push(`description: ${skill.description}`);
55
+ }
56
+ if (skill.tags !== undefined && skill.tags.length > 0) {
57
+ lines.push(`tags: ${skill.tags.join(', ')}`);
58
+ }
59
+ if (skill.strategy !== undefined) {
60
+ lines.push(`strategy: ${skill.strategy}`);
61
+ }
62
+ lines.push('');
63
+ lines.push('--- body ---');
64
+ lines.push(skill.body.trimEnd());
65
+ return `${lines.join('\n')}\n`;
66
+ }
67
+ /** Render the reload summary in human-readable form. */
68
+ export function formatReloadStats(stats, folderCount) {
69
+ const lines = [];
70
+ lines.push(`Reload complete.`);
71
+ lines.push(` folders: ${folderCount}`);
72
+ lines.push(` skills: ${stats.skills.length}`);
73
+ if (stats.errors.length > 0) {
74
+ lines.push(` errors: ${stats.errors.length}`);
75
+ for (const e of stats.errors) {
76
+ lines.push(` ${e.path}: ${e.message}`);
77
+ }
78
+ }
79
+ else {
80
+ lines.push(` errors: 0`);
81
+ }
82
+ return `${lines.join('\n')}\n`;
83
+ }
84
+ //# sourceMappingURL=skills-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-format.js","sourceRoot":"","sources":["../../src/cli/skills-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Action handlers for the `skills` subcommand.
3
+ *
4
+ * Each handler receives a ServerDeps (or a factory that builds one), the
5
+ * post-action args, and stdout/stderr sinks; it returns a process exit code.
6
+ * Split out of `skills.ts` so the entry module stays under the 400-line gate.
7
+ *
8
+ * Note: the CLI builds deps cold from config.json on disk. It reflects disk
9
+ * truth, NOT the state of any running MCP server session.
10
+ */
11
+ import type { ServerDeps } from '../server-deps.js';
12
+ export declare function handleSkillsList(deps: ServerDeps, rest: string[], stdout: (t: string) => void, stderr: (t: string) => void): Promise<number>;
13
+ export declare function handleSkillsGet(deps: ServerDeps, rest: string[], stdout: (t: string) => void, stderr: (t: string) => void): Promise<number>;
14
+ export declare function handleSkillsReload(deps: ServerDeps, rest: string[], stdout: (t: string) => void, stderr: (t: string) => void): Promise<number>;
15
+ //# sourceMappingURL=skills-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-handlers.d.ts","sourceRoot":"","sources":["../../src/cli/skills-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CA6CjB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Action handlers for the `skills` subcommand.
3
+ *
4
+ * Each handler receives a ServerDeps (or a factory that builds one), the
5
+ * post-action args, and stdout/stderr sinks; it returns a process exit code.
6
+ * Split out of `skills.ts` so the entry module stays under the 400-line gate.
7
+ *
8
+ * Note: the CLI builds deps cold from config.json on disk. It reflects disk
9
+ * truth, NOT the state of any running MCP server session.
10
+ */
11
+ import { resolve } from 'node:path';
12
+ import { handleList as toolHandleList } from '../tools/list.js';
13
+ import { handleGet as toolHandleGet } from '../tools/get.js';
14
+ import { rebuildRegistry } from '../tools/loader.js';
15
+ import { reconcileFolders } from '../reconcile.js';
16
+ import { parseListFlags, resolveFolderArg, buildFolderAliasMap } from './skills-shared.js';
17
+ import { formatSkillsTable, formatSkillGet, formatReloadStats } from './skills-format.js';
18
+ export async function handleSkillsList(deps, rest, stdout, stderr) {
19
+ const flags = parseListFlags(rest);
20
+ if (flags === null) {
21
+ stderr(`skillforge skills list: invalid or unknown flag\n`);
22
+ return 2;
23
+ }
24
+ // Resolve --folder alias/path to the configured folder path.
25
+ let resolvedFolder;
26
+ if (flags.folder !== undefined) {
27
+ const config = await deps.configStore.load();
28
+ const path = resolveFolderArg(flags.folder, config.folders);
29
+ if (path === null) {
30
+ // Fallback: treat as a raw path.
31
+ resolvedFolder = resolve(flags.folder);
32
+ }
33
+ else {
34
+ resolvedFolder = path;
35
+ }
36
+ }
37
+ try {
38
+ const result = await toolHandleList(deps, {
39
+ folder: resolvedFolder,
40
+ search: flags.search,
41
+ source: flags.source,
42
+ folderTag: flags.folderTag,
43
+ });
44
+ if (flags.asJson) {
45
+ stdout(`${JSON.stringify(result, null, 2)}\n`);
46
+ return 0;
47
+ }
48
+ // Build alias map for FOLDER column display.
49
+ const config = await deps.configStore.load();
50
+ const aliasMap = buildFolderAliasMap(config.folders, flags.folderFmt);
51
+ const folderLabel = (p) => aliasMap.get(resolve(p)) ?? p;
52
+ stdout(formatSkillsTable(result.skills, folderLabel));
53
+ return 0;
54
+ }
55
+ catch (err) {
56
+ const msg = err instanceof Error ? err.message : String(err);
57
+ stderr(`skillforge skills list: ${msg}\n`);
58
+ return 1;
59
+ }
60
+ }
61
+ export async function handleSkillsGet(deps, rest, stdout, stderr) {
62
+ const name = rest[0];
63
+ if (name === undefined || name.startsWith('--')) {
64
+ stderr(`skillforge skills get: missing <name>\n`);
65
+ return 2;
66
+ }
67
+ let asJson = false;
68
+ for (let i = 1; i < rest.length; i += 1) {
69
+ const arg = rest[i];
70
+ if (arg === '--json') {
71
+ asJson = true;
72
+ }
73
+ else {
74
+ stderr(`skillforge skills get: unknown flag: ${arg}\n`);
75
+ return 2;
76
+ }
77
+ }
78
+ try {
79
+ const skill = await toolHandleGet(deps, { name });
80
+ if (asJson) {
81
+ stdout(`${JSON.stringify(skill, null, 2)}\n`);
82
+ }
83
+ else {
84
+ stdout(formatSkillGet(skill));
85
+ }
86
+ return 0;
87
+ }
88
+ catch (err) {
89
+ const msg = err instanceof Error ? err.message : String(err);
90
+ stderr(`skillforge skills get: ${msg}\n`);
91
+ return 1;
92
+ }
93
+ }
94
+ export async function handleSkillsReload(deps, rest, stdout, stderr) {
95
+ for (const arg of rest) {
96
+ stderr(`skillforge skills reload: unknown flag: ${arg}\n`);
97
+ return 2;
98
+ }
99
+ try {
100
+ await reconcileFolders(deps);
101
+ const errors = [];
102
+ const stats = await rebuildRegistry(deps, { errorSink: errors });
103
+ stdout(formatReloadStats(stats, deps.folders.length));
104
+ return 0;
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ stderr(`skillforge skills reload: ${msg}\n`);
109
+ return 1;
110
+ }
111
+ }
112
+ //# sourceMappingURL=skills-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-handlers.js","sourceRoot":"","sources":["../../src/cli/skills-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAgB,EAChB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,mDAAmD,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,6DAA6D;IAC7D,IAAI,cAAkC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,iCAAiC;YACjC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE;YACxC,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEzE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,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,2BAA2B,GAAG,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAgB,EAChB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,wCAAwC,GAAG,IAAI,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,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,0BAA0B,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAgB,EAChB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,2CAA2C,GAAG,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,MAAM,GAA6C,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,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,6BAA6B,GAAG,IAAI,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}