@lyupro/skillforge-mcp 1.4.0 → 1.5.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 (49) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +43 -0
  4. package/README.md +10 -10
  5. package/dist/cli/dispatcher.d.ts +11 -0
  6. package/dist/cli/dispatcher.d.ts.map +1 -1
  7. package/dist/cli/dispatcher.js +28 -12
  8. package/dist/cli/dispatcher.js.map +1 -1
  9. package/dist/cli/install.d.ts +2 -1
  10. package/dist/cli/install.d.ts.map +1 -1
  11. package/dist/cli/install.js +31 -10
  12. package/dist/cli/install.js.map +1 -1
  13. package/dist/installers/atomic-write.d.ts +7 -1
  14. package/dist/installers/atomic-write.d.ts.map +1 -1
  15. package/dist/installers/atomic-write.js +21 -1
  16. package/dist/installers/atomic-write.js.map +1 -1
  17. package/dist/installers/claude-installer.d.ts.map +1 -1
  18. package/dist/installers/claude-installer.js +1 -8
  19. package/dist/installers/claude-installer.js.map +1 -1
  20. package/dist/installers/codex-installer.d.ts.map +1 -1
  21. package/dist/installers/codex-installer.js +1 -7
  22. package/dist/installers/codex-installer.js.map +1 -1
  23. package/dist/installers/cursor-installer.d.ts.map +1 -1
  24. package/dist/installers/cursor-installer.js +1 -7
  25. package/dist/installers/cursor-installer.js.map +1 -1
  26. package/dist/installers/entry.d.ts +55 -0
  27. package/dist/installers/entry.d.ts.map +1 -0
  28. package/dist/installers/entry.js +73 -0
  29. package/dist/installers/entry.js.map +1 -0
  30. package/dist/installers/hermes-installer.d.ts +29 -0
  31. package/dist/installers/hermes-installer.d.ts.map +1 -0
  32. package/dist/installers/hermes-installer.js +133 -0
  33. package/dist/installers/hermes-installer.js.map +1 -0
  34. package/dist/installers/paths.d.ts +4 -1
  35. package/dist/installers/paths.d.ts.map +1 -1
  36. package/dist/installers/paths.js +30 -6
  37. package/dist/installers/paths.js.map +1 -1
  38. package/dist/installers/registry.d.ts +3 -2
  39. package/dist/installers/registry.d.ts.map +1 -1
  40. package/dist/installers/registry.js +8 -4
  41. package/dist/installers/registry.js.map +1 -1
  42. package/dist/installers/types.d.ts +1 -1
  43. package/dist/installers/types.d.ts.map +1 -1
  44. package/dist/server.d.ts +12 -4
  45. package/dist/server.d.ts.map +1 -1
  46. package/dist/server.js +12 -15
  47. package/dist/server.js.map +1 -1
  48. package/manifest.json +1 -1
  49. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-installer.d.ts","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAsDD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAsBlG"}
1
+ {"version":3,"file":"cursor-installer.d.ts","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAyCD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAsBlG"}
@@ -12,14 +12,8 @@ import { spawnSync } from 'node:child_process';
12
12
  import { access } from 'node:fs/promises';
13
13
  import { readJsonSafe, writeJsonAtomic } from './atomic-write.js';
14
14
  import { cursorConfigPath, defaultBinaryPath } from './paths.js';
15
+ import { buildEntry } from './entry.js';
15
16
  const SKILL_KEY = 'skillforge';
16
- const NPX_PKG = '@lyupro/skillforge-mcp';
17
- function buildEntry(opts, binaryFallback) {
18
- if (opts.entry === 'npx') {
19
- return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
20
- }
21
- return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
22
- }
23
17
  function probeCursorBinary() {
24
18
  try {
25
19
  const result = spawnSync('cursor', ['--version'], { stdio: 'ignore' });
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-installer.js","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor-installer.js","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAS1D,MAAM,SAAS,GAAG,YAAY,CAAC;AAa/B,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAiB;IACvC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,QAAsB,EAAE,KAAkB;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IAC1C,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CAAC,QAAsB;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAChD,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,MAAM,CAAgB;IAE/B,YAAY,YAA0C,EAAE;QACtD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,IAAI,iBAAiB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,QAAQ,GAAI,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAyB,IAAI,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC/C,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,OAAO,EAAE,6DAA6D;aACvE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;YACrD,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAwB,CAAC;QAC/E,IAAI,QAAQ,KAAK,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAA0D;QACtE,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAwB,CAAC;QAC/E,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5E,IAAI,SAAuB,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACrD,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,UAAU,EAAE,QAAQ,KAAK,IAAI;YAC7B,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Server-entry resolution shared by every host installer.
3
+ *
4
+ * A host config entry is a { command, args } pair the host spawns to start
5
+ * the SkillForge MCP server. Three entry shapes:
6
+ *
7
+ * - 'npx' — command=npx, args=['-y', <pkg>, 'serve']. Resolves the package
8
+ * from the registry on every server spawn; needed only for a
9
+ * one-shot `npx … install` run with nothing installed on disk.
10
+ * - 'local' — command=node, args=[<binary>, 'serve']. Explicit binary path.
11
+ * - 'auto' — (default) inspect the installer's own on-disk location: a
12
+ * stable install resolves to a node-entry on the absolute
13
+ * dispatcher path (no registry round-trip, offline-safe); an
14
+ * ephemeral `npx` run has no stable file to point at and falls
15
+ * back to an npx-entry.
16
+ */
17
+ import type { InstallOptions } from './types.js';
18
+ /** npm package name used by the npx entry shape. */
19
+ export declare const NPX_PKG = "@lyupro/skillforge-mcp";
20
+ /** A host MCP server config entry — the { command, args } pair to spawn. */
21
+ export interface ServerEntry {
22
+ command: string;
23
+ args: string[];
24
+ env?: Record<string, string>;
25
+ }
26
+ /** npx entry — registry round-trip on every server spawn. */
27
+ export declare function npxEntry(): ServerEntry;
28
+ /** Local node entry pointing at an absolute binary path. */
29
+ export declare function localEntry(binary: string): ServerEntry;
30
+ /**
31
+ * True when `modulePath` lives inside an npx cache directory — i.e. the
32
+ * installer is running from a one-shot `npx @lyupro/skillforge-mcp install`
33
+ * rather than a stable global / local install. npx caches each package run
34
+ * under a `_npx` path segment (`~/.npm/_npx/<hash>/node_modules/...`).
35
+ */
36
+ export declare function isEphemeralPath(modulePath: string): boolean;
37
+ /**
38
+ * Resolve the absolute path to `dist/cli/dispatcher.js` from a module URL.
39
+ * This file lives at <root>/(dist|src)/installers/entry.(js|ts); the
40
+ * dispatcher target is always <root>/dist/cli/dispatcher.js, so resolving
41
+ * three segments up to the package root then down works from both layouts.
42
+ */
43
+ export declare function resolveDispatcherPath(moduleUrl: string): string;
44
+ /**
45
+ * `--entry auto`: a stable install → a node-entry on the absolute dispatcher
46
+ * path; an ephemeral `npx` run → an npx-entry (no stable file to point at).
47
+ * `moduleUrl` is injectable so tests can exercise both branches.
48
+ */
49
+ export declare function resolveAutoEntry(moduleUrl?: string): ServerEntry;
50
+ /**
51
+ * Build the server entry for the requested shape. An explicit `--binary-path`
52
+ * forces a local entry on that path regardless of `npx` vs `auto`.
53
+ */
54
+ export declare function buildEntry(opts: InstallOptions, binaryFallback: string): ServerEntry;
55
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/installers/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,oDAAoD;AACpD,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,IAAI,WAAW,CAEtC;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,MAAwB,GAAG,WAAW,CAIjF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,CAMpF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Server-entry resolution shared by every host installer.
3
+ *
4
+ * A host config entry is a { command, args } pair the host spawns to start
5
+ * the SkillForge MCP server. Three entry shapes:
6
+ *
7
+ * - 'npx' — command=npx, args=['-y', <pkg>, 'serve']. Resolves the package
8
+ * from the registry on every server spawn; needed only for a
9
+ * one-shot `npx … install` run with nothing installed on disk.
10
+ * - 'local' — command=node, args=[<binary>, 'serve']. Explicit binary path.
11
+ * - 'auto' — (default) inspect the installer's own on-disk location: a
12
+ * stable install resolves to a node-entry on the absolute
13
+ * dispatcher path (no registry round-trip, offline-safe); an
14
+ * ephemeral `npx` run has no stable file to point at and falls
15
+ * back to an npx-entry.
16
+ */
17
+ import { fileURLToPath } from 'node:url';
18
+ import { resolve } from 'node:path';
19
+ /** npm package name used by the npx entry shape. */
20
+ export const NPX_PKG = '@lyupro/skillforge-mcp';
21
+ /** npx entry — registry round-trip on every server spawn. */
22
+ export function npxEntry() {
23
+ return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
24
+ }
25
+ /** Local node entry pointing at an absolute binary path. */
26
+ export function localEntry(binary) {
27
+ return { command: 'node', args: [binary, 'serve'] };
28
+ }
29
+ /**
30
+ * True when `modulePath` lives inside an npx cache directory — i.e. the
31
+ * installer is running from a one-shot `npx @lyupro/skillforge-mcp install`
32
+ * rather than a stable global / local install. npx caches each package run
33
+ * under a `_npx` path segment (`~/.npm/_npx/<hash>/node_modules/...`).
34
+ */
35
+ export function isEphemeralPath(modulePath) {
36
+ return modulePath.split(/[\\/]/).includes('_npx');
37
+ }
38
+ /**
39
+ * Resolve the absolute path to `dist/cli/dispatcher.js` from a module URL.
40
+ * This file lives at <root>/(dist|src)/installers/entry.(js|ts); the
41
+ * dispatcher target is always <root>/dist/cli/dispatcher.js, so resolving
42
+ * three segments up to the package root then down works from both layouts.
43
+ */
44
+ export function resolveDispatcherPath(moduleUrl) {
45
+ const here = fileURLToPath(moduleUrl);
46
+ return resolve(here, '..', '..', '..', 'dist', 'cli', 'dispatcher.js');
47
+ }
48
+ /**
49
+ * `--entry auto`: a stable install → a node-entry on the absolute dispatcher
50
+ * path; an ephemeral `npx` run → an npx-entry (no stable file to point at).
51
+ * `moduleUrl` is injectable so tests can exercise both branches.
52
+ */
53
+ export function resolveAutoEntry(moduleUrl = import.meta.url) {
54
+ const here = fileURLToPath(moduleUrl);
55
+ if (isEphemeralPath(here))
56
+ return npxEntry();
57
+ return localEntry(resolveDispatcherPath(moduleUrl));
58
+ }
59
+ /**
60
+ * Build the server entry for the requested shape. An explicit `--binary-path`
61
+ * forces a local entry on that path regardless of `npx` vs `auto`.
62
+ */
63
+ export function buildEntry(opts, binaryFallback) {
64
+ if (opts.entry === 'local')
65
+ return localEntry(opts.binaryPath ?? binaryFallback);
66
+ if (opts.entry === 'npx')
67
+ return npxEntry();
68
+ // 'auto'
69
+ if (opts.binaryPath !== undefined)
70
+ return localEntry(opts.binaryPath);
71
+ return resolveAutoEntry();
72
+ }
73
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/installers/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,oDAAoD;AACpD,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAShD,6DAA6D;AAC7D,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB,MAAM,CAAC,IAAI,CAAC,GAAG;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,EAAE,CAAC;IAC7C,OAAO,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB,EAAE,cAAsB;IACrE,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;QAAE,OAAO,QAAQ,EAAE,CAAC;IAC5C,SAAS;IACT,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtE,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Hermes installer — edits the Hermes config (YAML) mcp_servers.skillforge.
3
+ *
4
+ * Hermes stores its config as YAML at ~/.hermes/config.yaml (or
5
+ * $HERMES_HOME/config.yaml). MCP servers live under the top-level
6
+ * `mcp_servers` map; an unrelated top-level `mcp:` key holds the LLM
7
+ * provider config and is never touched here.
8
+ *
9
+ * The config is round-tripped through the `yaml` Document API so existing
10
+ * entries, the `mcp:` block, and operator comments survive a load/save.
11
+ */
12
+ import type { Installer, InstallOptions, InstallResult, PreviewResult, UninstallResult } from './types.js';
13
+ export interface HermesInstallerPathOverrides {
14
+ configPath?: string;
15
+ binaryPath?: string;
16
+ binaryProbe?: () => boolean;
17
+ }
18
+ export declare class HermesInstaller implements Installer {
19
+ #private;
20
+ readonly name = "hermes";
21
+ constructor(overrides?: HermesInstallerPathOverrides);
22
+ detect(): Promise<boolean>;
23
+ install(opts: InstallOptions): Promise<InstallResult>;
24
+ uninstall(): Promise<UninstallResult>;
25
+ preview(opts: InstallOptions & {
26
+ action: 'install' | 'uninstall';
27
+ }): Promise<PreviewResult>;
28
+ }
29
+ //# sourceMappingURL=hermes-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-installer.d.ts","sourceRoot":"","sources":["../../src/installers/hermes-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAwDD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAcrC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAmBlG"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Hermes installer — edits the Hermes config (YAML) mcp_servers.skillforge.
3
+ *
4
+ * Hermes stores its config as YAML at ~/.hermes/config.yaml (or
5
+ * $HERMES_HOME/config.yaml). MCP servers live under the top-level
6
+ * `mcp_servers` map; an unrelated top-level `mcp:` key holds the LLM
7
+ * provider config and is never touched here.
8
+ *
9
+ * The config is round-tripped through the `yaml` Document API so existing
10
+ * entries, the `mcp:` block, and operator comments survive a load/save.
11
+ */
12
+ import { spawnSync } from 'node:child_process';
13
+ import { access } from 'node:fs/promises';
14
+ import { Document, parseDocument } from 'yaml';
15
+ import { readTextSafe, writeTextAtomic } from './atomic-write.js';
16
+ import { hermesConfigPath, defaultBinaryPath } from './paths.js';
17
+ import { buildEntry } from './entry.js';
18
+ const SKILL_KEY = 'skillforge';
19
+ const MCP_SERVERS_KEY = 'mcp_servers';
20
+ // Hermes-specific connection knobs (seconds). Hermes expects these on the
21
+ // server entry; the Claude / Codex / Cursor schemas have no such fields.
22
+ const HERMES_TIMEOUT = 120;
23
+ const HERMES_CONNECT_TIMEOUT = 60;
24
+ function buildHermesEntry(opts, binaryFallback) {
25
+ const entry = buildEntry(opts, binaryFallback);
26
+ return {
27
+ command: entry.command,
28
+ args: entry.args,
29
+ enabled: true,
30
+ timeout: HERMES_TIMEOUT,
31
+ connect_timeout: HERMES_CONNECT_TIMEOUT,
32
+ };
33
+ }
34
+ function probeHermesBinary() {
35
+ try {
36
+ const result = spawnSync('hermes', ['--version'], { stdio: 'ignore' });
37
+ return result.status === 0;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ async function fileExists(path) {
44
+ try {
45
+ await access(path);
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Parse the config text into a yaml Document. An empty or missing file
54
+ * yields a fresh empty-map document. Corrupt YAML throws a clear error so
55
+ * the installer fails fast rather than overwriting a half-written file.
56
+ */
57
+ function parseConfig(raw, configPath) {
58
+ if (raw === null || raw.trim() === '')
59
+ return new Document({});
60
+ const doc = parseDocument(raw);
61
+ if (doc.errors.length > 0) {
62
+ throw new Error(`Hermes config at "${configPath}" is not valid YAML: ${doc.errors[0].message}`);
63
+ }
64
+ return doc;
65
+ }
66
+ export class HermesInstaller {
67
+ name = 'hermes';
68
+ #configPath;
69
+ #binaryFallback;
70
+ #probe;
71
+ constructor(overrides = {}) {
72
+ this.#configPath = overrides.configPath ?? hermesConfigPath();
73
+ this.#binaryFallback = overrides.binaryPath ?? defaultBinaryPath();
74
+ this.#probe = overrides.binaryProbe ?? probeHermesBinary;
75
+ }
76
+ async detect() {
77
+ if (this.#probe())
78
+ return true;
79
+ return fileExists(this.#configPath);
80
+ }
81
+ async install(opts) {
82
+ const raw = await readTextSafe(this.#configPath);
83
+ const doc = parseConfig(raw, this.#configPath);
84
+ const exists = doc.hasIn([MCP_SERVERS_KEY, SKILL_KEY]);
85
+ if (exists && opts.force !== true) {
86
+ return {
87
+ tool: this.name,
88
+ status: 'already-installed',
89
+ configPath: this.#configPath,
90
+ message: `SkillForge entry already present; pass --force to overwrite`,
91
+ };
92
+ }
93
+ doc.setIn([MCP_SERVERS_KEY, SKILL_KEY], buildHermesEntry(opts, this.#binaryFallback));
94
+ await writeTextAtomic(this.#configPath, doc.toString());
95
+ return {
96
+ tool: this.name,
97
+ status: exists ? 'updated' : 'installed',
98
+ configPath: this.#configPath,
99
+ };
100
+ }
101
+ async uninstall() {
102
+ const raw = await readTextSafe(this.#configPath);
103
+ if (raw === null) {
104
+ return { tool: this.name, status: 'not-installed', configPath: this.#configPath };
105
+ }
106
+ const doc = parseConfig(raw, this.#configPath);
107
+ if (!doc.hasIn([MCP_SERVERS_KEY, SKILL_KEY])) {
108
+ return { tool: this.name, status: 'not-installed', configPath: this.#configPath };
109
+ }
110
+ doc.deleteIn([MCP_SERVERS_KEY, SKILL_KEY]);
111
+ await writeTextAtomic(this.#configPath, doc.toString());
112
+ return { tool: this.name, status: 'uninstalled', configPath: this.#configPath };
113
+ }
114
+ async preview(opts) {
115
+ const raw = await readTextSafe(this.#configPath);
116
+ const doc = parseConfig(raw, this.#configPath);
117
+ if (opts.action === 'install') {
118
+ doc.setIn([MCP_SERVERS_KEY, SKILL_KEY], buildHermesEntry(opts, this.#binaryFallback));
119
+ }
120
+ else if (doc.hasIn([MCP_SERVERS_KEY, SKILL_KEY])) {
121
+ doc.deleteIn([MCP_SERVERS_KEY, SKILL_KEY]);
122
+ }
123
+ return {
124
+ tool: this.name,
125
+ configPath: this.#configPath,
126
+ willCreate: raw === null,
127
+ before: raw,
128
+ after: doc.toString(),
129
+ action: opts.action,
130
+ };
131
+ }
132
+ }
133
+ //# sourceMappingURL=hermes-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-installer.js","sourceRoot":"","sources":["../../src/installers/hermes-installer.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export interface PathOverrides {
9
9
  claudeConfigPath: string;
10
10
  codexConfigPath: string;
11
11
  cursorConfigPath: string;
12
+ hermesConfigPath: string;
12
13
  defaultBinaryPath: string;
13
14
  }
14
15
  /**
@@ -17,15 +18,17 @@ export interface PathOverrides {
17
18
  * working directory so a single repo can opt into SkillForge.
18
19
  */
19
20
  export type Scope = 'global' | 'project';
20
- export type HostName = 'claude' | 'codex' | 'cursor';
21
+ export type HostName = 'claude' | 'codex' | 'cursor' | 'hermes';
21
22
  export declare function claudeConfigPath(): string;
22
23
  export declare function codexConfigPath(): string;
23
24
  export declare function cursorConfigPath(): string;
25
+ export declare function hermesConfigPath(): string;
24
26
  export declare function defaultBinaryPath(): string;
25
27
  export declare function defaultPaths(): PathOverrides;
26
28
  export declare function claudeProjectConfigPath(projectRoot: string): string;
27
29
  export declare function codexProjectConfigPath(projectRoot: string): string;
28
30
  export declare function cursorProjectConfigPath(projectRoot: string): string;
31
+ export declare function hermesProjectConfigPath(projectRoot: string): string;
29
32
  /**
30
33
  * Validate that `projectRoot` is a usable directory for `--scope project`.
31
34
  * Throws a clear error otherwise (caller maps this to a non-zero exit).
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAKD,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,YAAY,IAAI,aAAa,CAO5C;AAWD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAID,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAElE;AAKD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,KAAK,EACZ,WAAW,GAAE,MAAsB,GAClC,MAAM,CAUR"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAQD,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,YAAY,IAAI,aAAa,CAQ5C;AAWD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAID,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAElE;AAKD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAID,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,KAAK,EACZ,WAAW,GAAE,MAAsB,GAClC,MAAM,CAYR"}
@@ -22,20 +22,35 @@ export function codexConfigPath() {
22
22
  export function cursorConfigPath() {
23
23
  return join(homedir(), '.cursor', 'mcp.json');
24
24
  }
25
+ // Hermes stores its config as YAML. The location honors the HERMES_HOME
26
+ // environment variable when set (Hermes profiles / non-standard home);
27
+ // otherwise it falls back to ~/.hermes/config.yaml. MCP servers live under
28
+ // the top-level `mcp_servers` key — distinct from the `mcp:` provider key.
29
+ export function hermesConfigPath() {
30
+ const home = process.env.HERMES_HOME;
31
+ if (home !== undefined && home.trim() !== '') {
32
+ return join(home, 'config.yaml');
33
+ }
34
+ return join(homedir(), '.hermes', 'config.yaml');
35
+ }
25
36
  // Fallback `--entry local` target when --binary-path is not supplied.
26
- // Resolves to <package root>/dist/server.js via import.meta.url so the
27
- // path works whether the file is executed from dist/ or src/ (tsx).
37
+ // Resolves to <package root>/dist/cli/dispatcher.js via import.meta.url so
38
+ // the path works whether the file is executed from dist/ or src/ (tsx).
39
+ // dispatcher.js is the single CLI entry point — invoked with `serve` it
40
+ // starts the MCP stdio server. (The legacy dist/server.js path was retired
41
+ // when the dispatcher landed.)
28
42
  export function defaultBinaryPath() {
29
43
  const here = fileURLToPath(import.meta.url);
30
44
  // here = <root>/(dist|src)/installers/paths.(js|ts)
31
- // Resolve up three segments to reach the package root, then dist/server.js.
32
- return resolve(here, '..', '..', '..', 'dist', 'server.js');
45
+ // Resolve up three segments to the package root, then dist/cli/dispatcher.js.
46
+ return resolve(here, '..', '..', '..', 'dist', 'cli', 'dispatcher.js');
33
47
  }
34
48
  export function defaultPaths() {
35
49
  return {
36
50
  claudeConfigPath: claudeConfigPath(),
37
51
  codexConfigPath: codexConfigPath(),
38
52
  cursorConfigPath: cursorConfigPath(),
53
+ hermesConfigPath: hermesConfigPath(),
39
54
  defaultBinaryPath: defaultBinaryPath(),
40
55
  };
41
56
  }
@@ -61,6 +76,11 @@ export function codexProjectConfigPath(projectRoot) {
61
76
  export function cursorProjectConfigPath(projectRoot) {
62
77
  return join(projectRoot, '.cursor', 'mcp.json');
63
78
  }
79
+ // Hermes reads project-local config from `.hermes/config.yaml` at the repo
80
+ // root, the same YAML `mcp_servers` shape as the global `~/.hermes/config.yaml`.
81
+ export function hermesProjectConfigPath(projectRoot) {
82
+ return join(projectRoot, '.hermes', 'config.yaml');
83
+ }
64
84
  /**
65
85
  * Validate that `projectRoot` is a usable directory for `--scope project`.
66
86
  * Throws a clear error otherwise (caller maps this to a non-zero exit).
@@ -90,13 +110,17 @@ export function resolveConfigPath(host, scope, projectRoot = process.cwd()) {
90
110
  return claudeConfigPath();
91
111
  if (host === 'codex')
92
112
  return codexConfigPath();
93
- return cursorConfigPath();
113
+ if (host === 'cursor')
114
+ return cursorConfigPath();
115
+ return hermesConfigPath();
94
116
  }
95
117
  assertProjectRoot(projectRoot);
96
118
  if (host === 'claude')
97
119
  return claudeProjectConfigPath(projectRoot);
98
120
  if (host === 'codex')
99
121
  return codexProjectConfigPath(projectRoot);
100
- return cursorProjectConfigPath(projectRoot);
122
+ if (host === 'cursor')
123
+ return cursorProjectConfigPath(projectRoot);
124
+ return hermesProjectConfigPath(projectRoot);
101
125
  }
102
126
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Installer registry — stable enumeration of the three host installers
3
- * consumed by the `--all` dispatcher and by --claude / --codex / --cursor.
2
+ * Installer registry — stable enumeration of the four host installers
3
+ * consumed by the `--all` dispatcher and by --claude / --codex / --cursor /
4
+ * --hermes.
4
5
  */
5
6
  import { type HostName, type Scope } from './paths.js';
6
7
  import type { Installer } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAKX;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,EAAE,CAIb"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAMX;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,KAAgB,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,EAAE,CAIb"}
@@ -1,10 +1,12 @@
1
1
  /**
2
- * Installer registry — stable enumeration of the three host installers
3
- * consumed by the `--all` dispatcher and by --claude / --codex / --cursor.
2
+ * Installer registry — stable enumeration of the four host installers
3
+ * consumed by the `--all` dispatcher and by --claude / --codex / --cursor /
4
+ * --hermes.
4
5
  */
5
6
  import { ClaudeInstaller } from './claude-installer.js';
6
7
  import { CodexInstaller } from './codex-installer.js';
7
8
  import { CursorInstaller } from './cursor-installer.js';
9
+ import { HermesInstaller } from './hermes-installer.js';
8
10
  import { resolveConfigPath } from './paths.js';
9
11
  /**
10
12
  * Build a single installer for `host`, with its config path resolved for the
@@ -17,9 +19,11 @@ export function getInstallerByName(name, scope = 'global', projectRoot) {
17
19
  return new ClaudeInstaller({ configPath });
18
20
  if (name === 'codex')
19
21
  return new CodexInstaller({ configPath });
20
- return new CursorInstaller({ configPath });
22
+ if (name === 'cursor')
23
+ return new CursorInstaller({ configPath });
24
+ return new HermesInstaller({ configPath });
21
25
  }
22
26
  export function getAllInstallers(scope = 'global', projectRoot) {
23
- return ['claude', 'codex', 'cursor'].map((name) => getInstallerByName(name, scope, projectRoot));
27
+ return ['claude', 'codex', 'cursor', 'hermes'].map((name) => getInstallerByName(name, scope, projectRoot));
24
28
  }
25
29
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAA6B,MAAM,YAAY,CAAC;AAG1E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAc,EACd,QAAe,QAAQ,EACvB,WAAoB;IAEpB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAe,QAAQ,EACvB,WAAoB;IAEpB,OAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3D,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAC7C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/installers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAA6B,MAAM,YAAY,CAAC;AAG1E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAc,EACd,QAAe,QAAQ,EACvB,WAAoB;IAEpB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAChE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAe,QAAQ,EACvB,WAAoB;IAEpB,OAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrE,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAC7C,CAAC;AACJ,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * implementing this contract so the CLI dispatcher can iterate them
6
6
  * uniformly under `--all`, `--dry-run`, and `--uninstall`.
7
7
  */
8
- export type EntryKind = 'npx' | 'local';
8
+ export type EntryKind = 'npx' | 'local' | 'auto';
9
9
  export interface InstallOptions {
10
10
  entry: EntryKind;
11
11
  binaryPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installers/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,mBAAmB,GACnB,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,eAAe,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7F"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installers/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,mBAAmB,GACnB,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,eAAe,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7F"}
package/dist/server.d.ts CHANGED
@@ -1,12 +1,20 @@
1
- #!/usr/bin/env node
2
1
  /**
3
- * SkillForge MCP — stdio entry point.
2
+ * SkillForge MCP — server module.
4
3
  *
5
- * buildServer() and buildDeps() are exported for integration tests so the
6
- * same wiring is exercised in-process without spawning a subprocess.
4
+ * Exports the server wiring: buildServer() + buildDeps() (also used by the
5
+ * integration tests for in-process exercise) and startServer(), the single
6
+ * server-start sequence. This file is a pure module — it is never run
7
+ * directly; the canonical entry point is dist/cli/dispatcher.js (`serve`).
7
8
  */
8
9
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
10
  import type { ServerDeps } from './server-deps.js';
10
11
  export declare function buildServer(deps: ServerDeps): McpServer;
11
12
  export declare function buildDeps(): Promise<ServerDeps>;
13
+ /**
14
+ * Start the MCP stdio server: build deps, register tools, connect the stdio
15
+ * transport, then start the runtime watchers and shutdown handlers. This is
16
+ * the single server-start sequence — the dispatcher's `serve` command calls
17
+ * it, and nothing else does.
18
+ */
19
+ export declare function startServer(): Promise<void>;
12
20
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAcnD,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAmGvD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CA8ErD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAcnD,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAmGvD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CA8ErD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}