@lyupro/skillforge-mcp 1.1.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 (221) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/LICENSE +21 -0
  3. package/README.md +231 -0
  4. package/dist/cli/install.d.ts +41 -0
  5. package/dist/cli/install.d.ts.map +1 -0
  6. package/dist/cli/install.js +223 -0
  7. package/dist/cli/install.js.map +1 -0
  8. package/dist/config/config-schema.d.ts +175 -0
  9. package/dist/config/config-schema.d.ts.map +1 -0
  10. package/dist/config/config-schema.js +49 -0
  11. package/dist/config/config-schema.js.map +1 -0
  12. package/dist/config/config-store.d.ts +24 -0
  13. package/dist/config/config-store.d.ts.map +1 -0
  14. package/dist/config/config-store.js +67 -0
  15. package/dist/config/config-store.js.map +1 -0
  16. package/dist/config/index.d.ts +5 -0
  17. package/dist/config/index.d.ts.map +1 -0
  18. package/dist/config/index.js +3 -0
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/config.d.ts +25 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +73 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/core/errors.d.ts +9 -0
  25. package/dist/core/errors.d.ts.map +1 -0
  26. package/dist/core/errors.js +13 -0
  27. package/dist/core/errors.js.map +1 -0
  28. package/dist/core/index.d.ts +6 -0
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +5 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/core/skill-content-cache.d.ts +18 -0
  33. package/dist/core/skill-content-cache.d.ts.map +1 -0
  34. package/dist/core/skill-content-cache.js +56 -0
  35. package/dist/core/skill-content-cache.js.map +1 -0
  36. package/dist/core/skill-metadata-cache.d.ts +15 -0
  37. package/dist/core/skill-metadata-cache.d.ts.map +1 -0
  38. package/dist/core/skill-metadata-cache.js +31 -0
  39. package/dist/core/skill-metadata-cache.js.map +1 -0
  40. package/dist/core/skill-registry.d.ts +12 -0
  41. package/dist/core/skill-registry.d.ts.map +1 -0
  42. package/dist/core/skill-registry.js +28 -0
  43. package/dist/core/skill-registry.js.map +1 -0
  44. package/dist/core/skill-resolver.d.ts +6 -0
  45. package/dist/core/skill-resolver.d.ts.map +1 -0
  46. package/dist/core/skill-resolver.js +32 -0
  47. package/dist/core/skill-resolver.js.map +1 -0
  48. package/dist/core/types.d.ts +80 -0
  49. package/dist/core/types.d.ts.map +1 -0
  50. package/dist/core/types.js +10 -0
  51. package/dist/core/types.js.map +1 -0
  52. package/dist/decorators/base-decorator.d.ts +10 -0
  53. package/dist/decorators/base-decorator.d.ts.map +1 -0
  54. package/dist/decorators/base-decorator.js +13 -0
  55. package/dist/decorators/base-decorator.js.map +1 -0
  56. package/dist/decorators/cache-decorator.d.ts +33 -0
  57. package/dist/decorators/cache-decorator.d.ts.map +1 -0
  58. package/dist/decorators/cache-decorator.js +89 -0
  59. package/dist/decorators/cache-decorator.js.map +1 -0
  60. package/dist/decorators/decorator-chain.d.ts +16 -0
  61. package/dist/decorators/decorator-chain.d.ts.map +1 -0
  62. package/dist/decorators/decorator-chain.js +31 -0
  63. package/dist/decorators/decorator-chain.js.map +1 -0
  64. package/dist/decorators/index.d.ts +10 -0
  65. package/dist/decorators/index.d.ts.map +1 -0
  66. package/dist/decorators/index.js +6 -0
  67. package/dist/decorators/index.js.map +1 -0
  68. package/dist/decorators/logging-decorator.d.ts +15 -0
  69. package/dist/decorators/logging-decorator.d.ts.map +1 -0
  70. package/dist/decorators/logging-decorator.js +34 -0
  71. package/dist/decorators/logging-decorator.js.map +1 -0
  72. package/dist/decorators/timeout-decorator.d.ts +19 -0
  73. package/dist/decorators/timeout-decorator.d.ts.map +1 -0
  74. package/dist/decorators/timeout-decorator.js +59 -0
  75. package/dist/decorators/timeout-decorator.js.map +1 -0
  76. package/dist/factory/index.d.ts +2 -0
  77. package/dist/factory/index.d.ts.map +1 -0
  78. package/dist/factory/index.js +2 -0
  79. package/dist/factory/index.js.map +1 -0
  80. package/dist/factory/strategy-factory.d.ts +10 -0
  81. package/dist/factory/strategy-factory.d.ts.map +1 -0
  82. package/dist/factory/strategy-factory.js +37 -0
  83. package/dist/factory/strategy-factory.js.map +1 -0
  84. package/dist/handlers/composite-resolver.d.ts +34 -0
  85. package/dist/handlers/composite-resolver.d.ts.map +1 -0
  86. package/dist/handlers/composite-resolver.js +94 -0
  87. package/dist/handlers/composite-resolver.js.map +1 -0
  88. package/dist/handlers/hybrid-strategy.d.ts +14 -0
  89. package/dist/handlers/hybrid-strategy.d.ts.map +1 -0
  90. package/dist/handlers/hybrid-strategy.js +42 -0
  91. package/dist/handlers/hybrid-strategy.js.map +1 -0
  92. package/dist/handlers/index.d.ts +3 -0
  93. package/dist/handlers/index.d.ts.map +1 -0
  94. package/dist/handlers/index.js +2 -0
  95. package/dist/handlers/index.js.map +1 -0
  96. package/dist/handlers/invocation-strategy.d.ts +17 -0
  97. package/dist/handlers/invocation-strategy.d.ts.map +1 -0
  98. package/dist/handlers/invocation-strategy.js +2 -0
  99. package/dist/handlers/invocation-strategy.js.map +1 -0
  100. package/dist/handlers/prompt-strategy.d.ts +8 -0
  101. package/dist/handlers/prompt-strategy.d.ts.map +1 -0
  102. package/dist/handlers/prompt-strategy.js +31 -0
  103. package/dist/handlers/prompt-strategy.js.map +1 -0
  104. package/dist/handlers/script-strategy.d.ts +20 -0
  105. package/dist/handlers/script-strategy.d.ts.map +1 -0
  106. package/dist/handlers/script-strategy.js +87 -0
  107. package/dist/handlers/script-strategy.js.map +1 -0
  108. package/dist/installers/atomic-write.d.ts +13 -0
  109. package/dist/installers/atomic-write.d.ts.map +1 -0
  110. package/dist/installers/atomic-write.js +98 -0
  111. package/dist/installers/atomic-write.js.map +1 -0
  112. package/dist/installers/claude-installer.d.ts +26 -0
  113. package/dist/installers/claude-installer.d.ts.map +1 -0
  114. package/dist/installers/claude-installer.js +118 -0
  115. package/dist/installers/claude-installer.js.map +1 -0
  116. package/dist/installers/codex-installer.d.ts +30 -0
  117. package/dist/installers/codex-installer.d.ts.map +1 -0
  118. package/dist/installers/codex-installer.js +125 -0
  119. package/dist/installers/codex-installer.js.map +1 -0
  120. package/dist/installers/cursor-installer.d.ts +29 -0
  121. package/dist/installers/cursor-installer.d.ts.map +1 -0
  122. package/dist/installers/cursor-installer.js +126 -0
  123. package/dist/installers/cursor-installer.js.map +1 -0
  124. package/dist/installers/paths.d.ts +20 -0
  125. package/dist/installers/paths.d.ts.map +1 -0
  126. package/dist/installers/paths.js +50 -0
  127. package/dist/installers/paths.js.map +1 -0
  128. package/dist/installers/registry.d.ts +8 -0
  129. package/dist/installers/registry.d.ts.map +1 -0
  130. package/dist/installers/registry.js +18 -0
  131. package/dist/installers/registry.js.map +1 -0
  132. package/dist/installers/types.d.ts +45 -0
  133. package/dist/installers/types.d.ts.map +1 -0
  134. package/dist/installers/types.js +9 -0
  135. package/dist/installers/types.js.map +1 -0
  136. package/dist/parser/file-scanner.d.ts +10 -0
  137. package/dist/parser/file-scanner.d.ts.map +1 -0
  138. package/dist/parser/file-scanner.js +37 -0
  139. package/dist/parser/file-scanner.js.map +1 -0
  140. package/dist/parser/format-detector.d.ts +11 -0
  141. package/dist/parser/format-detector.d.ts.map +1 -0
  142. package/dist/parser/format-detector.js +13 -0
  143. package/dist/parser/format-detector.js.map +1 -0
  144. package/dist/parser/frontmatter-parser.d.ts +14 -0
  145. package/dist/parser/frontmatter-parser.d.ts.map +1 -0
  146. package/dist/parser/frontmatter-parser.js +98 -0
  147. package/dist/parser/frontmatter-parser.js.map +1 -0
  148. package/dist/parser/index.d.ts +4 -0
  149. package/dist/parser/index.d.ts.map +1 -0
  150. package/dist/parser/index.js +4 -0
  151. package/dist/parser/index.js.map +1 -0
  152. package/dist/parser/scripts-dir-detector.d.ts +7 -0
  153. package/dist/parser/scripts-dir-detector.d.ts.map +1 -0
  154. package/dist/parser/scripts-dir-detector.js +17 -0
  155. package/dist/parser/scripts-dir-detector.js.map +1 -0
  156. package/dist/security/blacklist-filter.d.ts +32 -0
  157. package/dist/security/blacklist-filter.d.ts.map +1 -0
  158. package/dist/security/blacklist-filter.js +35 -0
  159. package/dist/security/blacklist-filter.js.map +1 -0
  160. package/dist/security/index.d.ts +5 -0
  161. package/dist/security/index.d.ts.map +1 -0
  162. package/dist/security/index.js +3 -0
  163. package/dist/security/index.js.map +1 -0
  164. package/dist/security/pattern-scanner.d.ts +27 -0
  165. package/dist/security/pattern-scanner.d.ts.map +1 -0
  166. package/dist/security/pattern-scanner.js +46 -0
  167. package/dist/security/pattern-scanner.js.map +1 -0
  168. package/dist/security/sandbox-runner.d.ts +48 -0
  169. package/dist/security/sandbox-runner.d.ts.map +1 -0
  170. package/dist/security/sandbox-runner.js +131 -0
  171. package/dist/security/sandbox-runner.js.map +1 -0
  172. package/dist/server-deps.d.ts +28 -0
  173. package/dist/server-deps.d.ts.map +1 -0
  174. package/dist/server-deps.js +2 -0
  175. package/dist/server-deps.js.map +1 -0
  176. package/dist/server.d.ts +12 -0
  177. package/dist/server.d.ts.map +1 -0
  178. package/dist/server.js +174 -0
  179. package/dist/server.js.map +1 -0
  180. package/dist/tools/configure.d.ts +22 -0
  181. package/dist/tools/configure.d.ts.map +1 -0
  182. package/dist/tools/configure.js +126 -0
  183. package/dist/tools/configure.js.map +1 -0
  184. package/dist/tools/get.d.ts +10 -0
  185. package/dist/tools/get.d.ts.map +1 -0
  186. package/dist/tools/get.js +20 -0
  187. package/dist/tools/get.js.map +1 -0
  188. package/dist/tools/index.d.ts +9 -0
  189. package/dist/tools/index.d.ts.map +1 -0
  190. package/dist/tools/index.js +7 -0
  191. package/dist/tools/index.js.map +1 -0
  192. package/dist/tools/invoke.d.ts +12 -0
  193. package/dist/tools/invoke.d.ts.map +1 -0
  194. package/dist/tools/invoke.js +36 -0
  195. package/dist/tools/invoke.js.map +1 -0
  196. package/dist/tools/list.d.ts +16 -0
  197. package/dist/tools/list.d.ts.map +1 -0
  198. package/dist/tools/list.js +33 -0
  199. package/dist/tools/list.js.map +1 -0
  200. package/dist/tools/loader.d.ts +30 -0
  201. package/dist/tools/loader.d.ts.map +1 -0
  202. package/dist/tools/loader.js +92 -0
  203. package/dist/tools/loader.js.map +1 -0
  204. package/dist/tools/reload.d.ts +22 -0
  205. package/dist/tools/reload.d.ts.map +1 -0
  206. package/dist/tools/reload.js +39 -0
  207. package/dist/tools/reload.js.map +1 -0
  208. package/dist/watcher/chokidar-types.d.ts +20 -0
  209. package/dist/watcher/chokidar-types.d.ts.map +1 -0
  210. package/dist/watcher/chokidar-types.js +2 -0
  211. package/dist/watcher/chokidar-types.js.map +1 -0
  212. package/dist/watcher/folder-watcher.d.ts +27 -0
  213. package/dist/watcher/folder-watcher.d.ts.map +1 -0
  214. package/dist/watcher/folder-watcher.js +123 -0
  215. package/dist/watcher/folder-watcher.js.map +1 -0
  216. package/dist/watcher/index.d.ts +4 -0
  217. package/dist/watcher/index.d.ts.map +1 -0
  218. package/dist/watcher/index.js +2 -0
  219. package/dist/watcher/index.js.map +1 -0
  220. package/manifest.json +96 -0
  221. package/package.json +78 -0
@@ -0,0 +1,9 @@
1
+ export { listInputSchema, handleList } from './list.js';
2
+ export { getInputSchema, handleGet } from './get.js';
3
+ export { invokeInputSchema, handleInvoke } from './invoke.js';
4
+ export { ensureRegistryFresh } from './loader.js';
5
+ export { configureInputSchema, handleConfigure } from './configure.js';
6
+ export type { ConfigureAction, ConfigureResult } from './configure.js';
7
+ export { reloadInputSchema, handleReload } from './reload.js';
8
+ export type { ReloadResult } from './reload.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { listInputSchema, handleList } from './list.js';
2
+ export { getInputSchema, handleGet } from './get.js';
3
+ export { invokeInputSchema, handleInvoke } from './invoke.js';
4
+ export { ensureRegistryFresh } from './loader.js';
5
+ export { configureInputSchema, handleConfigure } from './configure.js';
6
+ export { reloadInputSchema, handleReload } from './reload.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ import type { ServerDeps } from '../server-deps.js';
3
+ import type { InvocationResult } from '../core/types.js';
4
+ export declare const invokeInputSchema: {
5
+ readonly name: z.ZodString;
6
+ readonly input: z.ZodDefault<z.ZodString>;
7
+ };
8
+ export declare function handleInvoke(deps: ServerDeps, args: {
9
+ name: string;
10
+ input?: string;
11
+ }): Promise<InvocationResult>;
12
+ //# sourceMappingURL=invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/tools/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC,gBAAgB,CAAC,CA4B3B"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { handleGet } from './get.js';
3
+ import { resolveComposite } from '../handlers/composite-resolver.js';
4
+ export const invokeInputSchema = {
5
+ name: z.string(),
6
+ input: z.string().default(''),
7
+ };
8
+ export async function handleInvoke(deps, args) {
9
+ const content = await handleGet(deps, { name: args.name });
10
+ const context = {
11
+ callerTool: 'invoke',
12
+ input: args.input ?? '',
13
+ };
14
+ // Composite branch: skills[] non-empty → resolve via composite-resolver.
15
+ if (content.skills && content.skills.length > 0) {
16
+ const loadSkill = async (name) => {
17
+ try {
18
+ return await handleGet(deps, { name });
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ };
24
+ const invokeNested = (skill, ctx) => {
25
+ const strategy = deps.factory.create(skill);
26
+ const wrapped = deps.decoratorChain.wrap(strategy);
27
+ return wrapped.invoke(skill, ctx);
28
+ };
29
+ return resolveComposite(content, context, loadSkill, invokeNested);
30
+ }
31
+ // Single-skill: factory + decorator chain.
32
+ const strategy = deps.factory.create(content);
33
+ const wrapped = deps.decoratorChain.wrap(strategy);
34
+ return wrapped.invoke(content, context);
35
+ }
36
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/tools/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACrB,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,IAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAsB;QACjC,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;KACxB,CAAC;IAEF,yEAAyE;IACzE,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;YACvC,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,KAA6C,EAAE,GAAsB,EAA6B,EAAE;YACxH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC;QACF,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;IAED,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import type { ServerDeps } from '../server-deps.js';
3
+ import type { SkillSummary } from '../core/types.js';
4
+ export declare const listInputSchema: {
5
+ readonly folder: z.ZodOptional<z.ZodString>;
6
+ readonly search: z.ZodOptional<z.ZodString>;
7
+ readonly source: z.ZodOptional<z.ZodEnum<["claude", "codex", "persona", "custom"]>>;
8
+ };
9
+ export declare function handleList(deps: ServerDeps, args: {
10
+ folder?: string;
11
+ search?: string;
12
+ source?: string;
13
+ }): Promise<{
14
+ skills: SkillSummary[];
15
+ }>;
16
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAyBrC"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { ensureRegistryFresh } from './loader.js';
3
+ export const listInputSchema = {
4
+ folder: z.string().optional(),
5
+ search: z.string().optional(),
6
+ source: z.enum(['claude', 'codex', 'persona', 'custom']).optional(),
7
+ };
8
+ export async function handleList(deps, args) {
9
+ await ensureRegistryFresh(deps);
10
+ const all = deps.registry.getAll();
11
+ const filtered = all.filter((meta) => {
12
+ if (args.folder !== undefined && meta.folder !== args.folder)
13
+ return false;
14
+ if (args.source !== undefined && meta.format !== args.source)
15
+ return false;
16
+ if (args.search !== undefined) {
17
+ const haystack = `${meta.name} ${meta.description ?? ''}`.toLowerCase();
18
+ if (!haystack.includes(args.search.toLowerCase()))
19
+ return false;
20
+ }
21
+ return true;
22
+ });
23
+ const skills = filtered.map((meta) => ({
24
+ name: meta.name,
25
+ description: meta.description,
26
+ sourcePath: meta.sourcePath,
27
+ folder: meta.folder,
28
+ tags: meta.tags,
29
+ format: meta.format,
30
+ }));
31
+ return { skills };
32
+ }
33
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3D,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,IAA2D;IAE3D,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ServerDeps } from '../server-deps.js';
2
+ export interface RebuildOptions {
3
+ /** When set, errors are pushed here instead of going to stderr. */
4
+ errorSink?: Array<{
5
+ path: string;
6
+ message: string;
7
+ }>;
8
+ }
9
+ export interface RebuildStats {
10
+ /** All skill names in the registry AFTER the rebuild. */
11
+ skills: string[];
12
+ /** Per-file failures encountered during scan/parse/blacklist. */
13
+ errors: Array<{
14
+ path: string;
15
+ message: string;
16
+ }>;
17
+ }
18
+ /** Unconditionally invalidate caches and rescan all configured folders.
19
+ * Pure rebuild — does NOT consult metadataCache.isValid() first.
20
+ * Used by both ensureRegistryFresh (after the freshness gate) and the
21
+ * reload tool (which always wants a fresh scan regardless of TTL). */
22
+ export declare function rebuildRegistry(deps: ServerDeps, opts?: RebuildOptions): Promise<RebuildStats>;
23
+ /**
24
+ * Ensures the skill registry is populated and fresh.
25
+ * Scans all configured folders on first call or when the TTL has expired.
26
+ * Individual bad files and missing folders are logged to stderr and skipped —
27
+ * one failure never aborts the whole scan.
28
+ */
29
+ export declare function ensureRegistryFresh(deps: ServerDeps): Promise<void>;
30
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/tools/loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;;uEAGuE;AACvE,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAmFpG;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE"}
@@ -0,0 +1,92 @@
1
+ /** Unconditionally invalidate caches and rescan all configured folders.
2
+ * Pure rebuild — does NOT consult metadataCache.isValid() first.
3
+ * Used by both ensureRegistryFresh (after the freshness gate) and the
4
+ * reload tool (which always wants a fresh scan regardless of TTL). */
5
+ export async function rebuildRegistry(deps, opts) {
6
+ const errorSink = opts?.errorSink;
7
+ deps.registry.clear();
8
+ deps.contentCache.clear();
9
+ // Collect all candidates grouped by skill name for conflict resolution.
10
+ const candidates = new Map();
11
+ for (const folder of deps.folders) {
12
+ let filePaths;
13
+ try {
14
+ filePaths = await deps.scanner.scan(folder);
15
+ }
16
+ catch (err) {
17
+ const msg = err instanceof Error ? err.message : String(err);
18
+ if (errorSink !== undefined) {
19
+ errorSink.push({ path: folder, message: msg });
20
+ }
21
+ else {
22
+ console.error(`[skillforge] skipped folder ${folder}: ${msg}`);
23
+ }
24
+ continue;
25
+ }
26
+ for (const filePath of filePaths) {
27
+ let content;
28
+ try {
29
+ content = await deps.parser.parseFile(filePath, folder);
30
+ }
31
+ catch (err) {
32
+ const msg = err instanceof Error ? err.message : String(err);
33
+ if (errorSink !== undefined) {
34
+ errorSink.push({ path: filePath, message: msg });
35
+ }
36
+ else {
37
+ console.error(`[skillforge] skipped ${filePath}: ${msg}`);
38
+ }
39
+ continue;
40
+ }
41
+ // Derive metadata snapshot (strip body + raw).
42
+ const { body: _body, raw: _raw, ...metadata } = content;
43
+ const meta = metadata;
44
+ const verdict = deps.blacklistFilter.evaluate(content);
45
+ if (!verdict.allowed) {
46
+ const detail = verdict.reason === 'manual'
47
+ ? 'blacklisted by name'
48
+ : `audit hit: ${verdict.pattern}`;
49
+ // Blacklist rejections are routine exclusions — always log to stderr, never sink.
50
+ console.error(`[skillforge] excluded "${meta.name}" from ${filePath} — ${detail}`);
51
+ continue;
52
+ }
53
+ const existing = candidates.get(meta.name) ?? [];
54
+ existing.push(meta);
55
+ candidates.set(meta.name, existing);
56
+ // Store full content so resolve winner can be cached below.
57
+ // We keep all candidates' content; winner selection happens after.
58
+ deps.contentCache.set(meta.name + '\x00' + folder, content);
59
+ }
60
+ }
61
+ // Resolve conflicts and register winners.
62
+ for (const [name, group] of candidates) {
63
+ const winner = deps.resolver.resolve(group, deps.folders);
64
+ deps.registry.register(winner);
65
+ // Retrieve the full content for the winner from the temporary keyed cache.
66
+ const tempKey = name + '\x00' + winner.folder;
67
+ const winnerContent = deps.contentCache.get(tempKey);
68
+ if (winnerContent !== undefined) {
69
+ deps.contentCache.set(name, winnerContent);
70
+ }
71
+ // Clean up temp keys (all candidates for this name).
72
+ for (const candidate of group) {
73
+ deps.contentCache.invalidate(name + '\x00' + candidate.folder);
74
+ }
75
+ }
76
+ deps.metadataCache.markFresh();
77
+ const skills = deps.registry.getAll().map((s) => s.name).sort();
78
+ const errors = errorSink ?? [];
79
+ return { skills, errors };
80
+ }
81
+ /**
82
+ * Ensures the skill registry is populated and fresh.
83
+ * Scans all configured folders on first call or when the TTL has expired.
84
+ * Individual bad files and missing folders are logged to stderr and skipped —
85
+ * one failure never aborts the whole scan.
86
+ */
87
+ export async function ensureRegistryFresh(deps) {
88
+ if (deps.metadataCache.isValid())
89
+ return;
90
+ await rebuildRegistry(deps); // errors go to stderr via default behavior
91
+ }
92
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/tools/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+ import type { ServerDeps } from '../server-deps.js';
3
+ export declare const reloadInputSchema: {
4
+ readonly folder: z.ZodOptional<z.ZodString>;
5
+ };
6
+ export interface ReloadResult {
7
+ /** Total skills in the registry after reload. */
8
+ loaded: number;
9
+ /** Skill names present after reload but not before. */
10
+ added: string[];
11
+ /** Skill names present before reload but not after. */
12
+ removed: string[];
13
+ /** Per-file errors collected during the rebuild. */
14
+ errors: Array<{
15
+ path: string;
16
+ message: string;
17
+ }>;
18
+ }
19
+ export declare function handleReload(deps: ServerDeps, args: {
20
+ folder?: string;
21
+ }): Promise<ReloadResult>;
22
+ //# sourceMappingURL=reload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../src/tools/reload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,iBAAiB;;CAEpB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,YAAY,CAAC,CAkCvB"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { resolve as resolvePath } from 'node:path';
3
+ import { rebuildRegistry } from './loader.js';
4
+ export const reloadInputSchema = {
5
+ folder: z.string().optional(),
6
+ };
7
+ export async function handleReload(deps, args) {
8
+ try {
9
+ if (args.folder !== undefined) {
10
+ const absolute = resolvePath(args.folder);
11
+ // Why: reload always rebuilds the FULL registry (every configured folder), not just
12
+ // the named one. Validating presence preserves the API contract for callers without
13
+ // forcing a partial-scan code path. Partial reload deferred — would require splitting
14
+ // the conflict-resolver logic, not worth the complexity in v0.x.
15
+ if (!deps.folders.includes(absolute)) {
16
+ throw new Error(`reload: folder "${args.folder}" is not currently configured`);
17
+ }
18
+ }
19
+ const before = new Set(deps.registry.getAll().map((s) => s.name));
20
+ deps.metadataCache.invalidate();
21
+ const errorSink = [];
22
+ const stats = await rebuildRegistry(deps, { errorSink });
23
+ const added = stats.skills.filter((n) => !before.has(n));
24
+ const removed = [...before].filter((n) => !stats.skills.includes(n)).sort();
25
+ return {
26
+ loaded: stats.skills.length,
27
+ added,
28
+ removed,
29
+ errors: stats.errors,
30
+ };
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ if (msg.startsWith('reload: '))
35
+ throw err;
36
+ throw new Error(`reload: ${msg}`);
37
+ }
38
+ }
39
+ //# sourceMappingURL=reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../src/tools/reload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrB,CAAC;AAaX,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,IAAyB;IAEzB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,oFAAoF;YACpF,oFAAoF;YACpF,sFAAsF;YACtF,iEAAiE;YACjE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,+BAA+B,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAEhC,MAAM,SAAS,GAA6C,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5E,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,KAAK;YACL,OAAO;YACP,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,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,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface ChokidarOptions {
2
+ ignored?: RegExp | readonly RegExp[];
3
+ ignoreInitial?: boolean;
4
+ persistent?: boolean;
5
+ awaitWriteFinish?: boolean | {
6
+ stabilityThreshold?: number;
7
+ pollInterval?: number;
8
+ };
9
+ depth?: number;
10
+ }
11
+ export interface ChokidarWatcher {
12
+ on(event: 'add' | 'change' | 'unlink' | 'error', handler: (...args: unknown[]) => void): this;
13
+ close(): Promise<void>;
14
+ add(paths: string | readonly string[]): void;
15
+ unwatch(paths: string | readonly string[]): void;
16
+ }
17
+ export interface ChokidarLike {
18
+ watch(paths: string | readonly string[], options?: ChokidarOptions): ChokidarWatcher;
19
+ }
20
+ //# sourceMappingURL=chokidar-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chokidar-types.d.ts","sourceRoot":"","sources":["../../src/watcher/chokidar-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,GAAG;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;CACtF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chokidar-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chokidar-types.js","sourceRoot":"","sources":["../../src/watcher/chokidar-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { ChokidarLike } from './chokidar-types.js';
2
+ export type WatcherEventType = 'add' | 'remove' | 'modify';
3
+ export interface WatcherEvent {
4
+ type: WatcherEventType;
5
+ /** Absolute path of the .md file that triggered the event. */
6
+ path: string;
7
+ /** Absolute path of the configured root folder that contains this file. */
8
+ folder: string;
9
+ }
10
+ export interface FolderWatcherOptions {
11
+ folders: readonly string[];
12
+ debounceMs?: number;
13
+ onBatch: (events: readonly WatcherEvent[]) => void;
14
+ chokidar?: ChokidarLike;
15
+ setTimeoutFn?: typeof setTimeout;
16
+ clearTimeoutFn?: typeof clearTimeout;
17
+ }
18
+ export declare class FolderWatcher {
19
+ #private;
20
+ constructor(opts: FolderWatcherOptions);
21
+ isRunning(): boolean;
22
+ getFolders(): string[];
23
+ start(): Promise<void>;
24
+ stop(): Promise<void>;
25
+ setFolders(folders: readonly string[]): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=folder-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/folder-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,UAAU,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,YAAY,CAAC;CACtC;AAuBD,qBAAa,aAAa;;gBAaZ,IAAI,EAAE,oBAAoB;IAStC,SAAS,IAAI,OAAO;IAIpB,UAAU,IAAI,MAAM,EAAE;IAIhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D5D"}
@@ -0,0 +1,123 @@
1
+ const IGNORED_PATTERNS = [/(^|[/\\])\..+/, /node_modules/, /[/\\]dist[/\\]/];
2
+ const CHOKIDAR_OPTS = {
3
+ ignored: IGNORED_PATTERNS,
4
+ ignoreInitial: true,
5
+ persistent: true,
6
+ awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
7
+ depth: 10,
8
+ };
9
+ async function loadDefaultChokidar() {
10
+ const mod = await import('chokidar');
11
+ return {
12
+ watch: (paths, options) => mod.watch(paths, options),
13
+ };
14
+ }
15
+ export class FolderWatcher {
16
+ #onBatch;
17
+ #debounceMs;
18
+ #setTimeoutFn;
19
+ #clearTimeoutFn;
20
+ #injectedChokidar;
21
+ #folders;
22
+ #watcher = null;
23
+ #resolvedChokidar = null;
24
+ #pendingTimer = null;
25
+ #buffer = [];
26
+ constructor(opts) {
27
+ this.#folders = [...opts.folders];
28
+ this.#debounceMs = opts.debounceMs ?? 500;
29
+ this.#onBatch = opts.onBatch;
30
+ this.#injectedChokidar = opts.chokidar;
31
+ this.#setTimeoutFn = opts.setTimeoutFn ?? setTimeout;
32
+ this.#clearTimeoutFn = opts.clearTimeoutFn ?? clearTimeout;
33
+ }
34
+ isRunning() {
35
+ return this.#watcher !== null;
36
+ }
37
+ getFolders() {
38
+ return [...this.#folders];
39
+ }
40
+ async start() {
41
+ if (this.#watcher !== null)
42
+ return;
43
+ const chokidar = this.#injectedChokidar ?? (await this.#getResolvedChokidar());
44
+ // Watch at least one path; chokidar requires a non-empty target.
45
+ const targets = this.#folders.length > 0 ? this.#folders : [];
46
+ if (targets.length === 0) {
47
+ // No folders configured — keep watcher null, stay no-op.
48
+ return;
49
+ }
50
+ this.#watcher = chokidar.watch(targets, CHOKIDAR_OPTS);
51
+ this.#watcher.on('add', (path) => this.#handleRaw('add', path));
52
+ this.#watcher.on('change', (path) => this.#handleRaw('modify', path));
53
+ this.#watcher.on('unlink', (path) => this.#handleRaw('remove', path));
54
+ this.#watcher.on('error', (err) => {
55
+ console.error(`[skillforge:watcher] error: ${String(err)}`);
56
+ });
57
+ }
58
+ async stop() {
59
+ if (this.#watcher === null)
60
+ return;
61
+ if (this.#pendingTimer !== null) {
62
+ this.#clearTimeoutFn(this.#pendingTimer);
63
+ this.#pendingTimer = null;
64
+ }
65
+ this.#buffer = [];
66
+ await this.#watcher.close();
67
+ this.#watcher = null;
68
+ }
69
+ async setFolders(folders) {
70
+ const newSet = new Set(folders);
71
+ const currentSet = new Set(this.#folders);
72
+ const added = [...newSet].filter((f) => !currentSet.has(f));
73
+ const removed = [...currentSet].filter((f) => !newSet.has(f));
74
+ this.#folders = [...folders];
75
+ if (this.#watcher === null)
76
+ return;
77
+ if (removed.length > 0) {
78
+ this.#watcher.unwatch(removed);
79
+ }
80
+ if (added.length > 0) {
81
+ this.#watcher.add(added);
82
+ }
83
+ }
84
+ async #getResolvedChokidar() {
85
+ if (this.#resolvedChokidar === null) {
86
+ this.#resolvedChokidar = await loadDefaultChokidar();
87
+ }
88
+ return this.#resolvedChokidar;
89
+ }
90
+ #handleRaw(type, path) {
91
+ if (!path.toLowerCase().endsWith('.md'))
92
+ return;
93
+ const folder = this.#findFolder(path);
94
+ if (folder === null)
95
+ return;
96
+ this.#buffer.push({ type, path, folder });
97
+ if (this.#pendingTimer !== null) {
98
+ this.#clearTimeoutFn(this.#pendingTimer);
99
+ }
100
+ this.#pendingTimer = this.#setTimeoutFn(() => {
101
+ const batch = this.#buffer;
102
+ this.#buffer = [];
103
+ this.#pendingTimer = null;
104
+ this.#onBatch(batch);
105
+ }, this.#debounceMs);
106
+ }
107
+ #findFolder(filePath) {
108
+ // Pick the longest configured folder that is a prefix of filePath.
109
+ let best = null;
110
+ for (const folder of this.#folders) {
111
+ const normalized = folder.endsWith('/') || folder.endsWith('\\') ? folder : folder + '/';
112
+ if (filePath.startsWith(normalized) ||
113
+ filePath.startsWith(folder + '\\') ||
114
+ filePath === folder) {
115
+ if (best === null || folder.length > best.length) {
116
+ best = folder;
117
+ }
118
+ }
119
+ }
120
+ return best;
121
+ }
122
+ }
123
+ //# sourceMappingURL=folder-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-watcher.js","sourceRoot":"","sources":["../../src/watcher/folder-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { FolderWatcher } from './folder-watcher.js';
2
+ export type { FolderWatcherOptions, WatcherEvent, WatcherEventType } from './folder-watcher.js';
3
+ export type { ChokidarLike, ChokidarWatcher, ChokidarOptions } from './chokidar-types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChG,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FolderWatcher } from './folder-watcher.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}