@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +43 -0
- package/README.md +10 -10
- package/dist/cli/dispatcher.d.ts +11 -0
- package/dist/cli/dispatcher.d.ts.map +1 -1
- package/dist/cli/dispatcher.js +28 -12
- package/dist/cli/dispatcher.js.map +1 -1
- package/dist/cli/install.d.ts +2 -1
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +31 -10
- package/dist/cli/install.js.map +1 -1
- package/dist/installers/atomic-write.d.ts +7 -1
- package/dist/installers/atomic-write.d.ts.map +1 -1
- package/dist/installers/atomic-write.js +21 -1
- package/dist/installers/atomic-write.js.map +1 -1
- package/dist/installers/claude-installer.d.ts.map +1 -1
- package/dist/installers/claude-installer.js +1 -8
- package/dist/installers/claude-installer.js.map +1 -1
- package/dist/installers/codex-installer.d.ts.map +1 -1
- package/dist/installers/codex-installer.js +1 -7
- package/dist/installers/codex-installer.js.map +1 -1
- package/dist/installers/cursor-installer.d.ts.map +1 -1
- package/dist/installers/cursor-installer.js +1 -7
- package/dist/installers/cursor-installer.js.map +1 -1
- package/dist/installers/entry.d.ts +55 -0
- package/dist/installers/entry.d.ts.map +1 -0
- package/dist/installers/entry.js +73 -0
- package/dist/installers/entry.js.map +1 -0
- package/dist/installers/hermes-installer.d.ts +29 -0
- package/dist/installers/hermes-installer.d.ts.map +1 -0
- package/dist/installers/hermes-installer.js +133 -0
- package/dist/installers/hermes-installer.js.map +1 -0
- package/dist/installers/paths.d.ts +4 -1
- package/dist/installers/paths.d.ts.map +1 -1
- package/dist/installers/paths.js +30 -6
- package/dist/installers/paths.js.map +1 -1
- package/dist/installers/registry.d.ts +3 -2
- package/dist/installers/registry.d.ts.map +1 -1
- package/dist/installers/registry.js +8 -4
- package/dist/installers/registry.js.map +1 -1
- package/dist/installers/types.d.ts +1 -1
- package/dist/installers/types.d.ts.map +1 -1
- package/dist/server.d.ts +12 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -15
- package/dist/server.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +4 -3
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"package": "@lyupro/skillforge-mcp"
|
|
15
15
|
},
|
|
16
16
|
"description": "Universal Skills MCP server — load Markdown skills from arbitrary folders, lazy-by-design, cross-tool.",
|
|
17
|
-
"version": "1.
|
|
17
|
+
"version": "1.5.0",
|
|
18
18
|
"author": {
|
|
19
19
|
"name": "Lyu Pro",
|
|
20
20
|
"email": "lyupro.dev@gmail.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "skillforge",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"description": "Universal Skills MCP server — load Markdown skills from arbitrary folders, lazy-by-design, cross-tool.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Lyu Pro",
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **SkillForge MCP** are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [1.5.0] — 2026-05-18
|
|
6
|
+
|
|
7
|
+
A fourth host installer target: Hermes Agent.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`skillforge install --hermes`** — wires SkillForge into the Hermes Agent config. The installer edits the Hermes YAML config (`~/.hermes/config.yaml`, or `$HERMES_HOME/config.yaml`; `--scope project` targets `./.hermes/config.yaml`) and adds a `mcp_servers.skillforge` entry. The config is round-tripped through a comment-preserving YAML parser, so the sibling `mcp:` provider key, other servers, and operator comments survive the edit. The entry carries the Hermes-specific `enabled` / `timeout` / `connect_timeout` fields alongside `command` / `args`. `install --all` now auto-detects and installs into Hermes too; `--hermes --uninstall` and `--hermes --dry-run` work as for the other hosts.
|
|
12
|
+
- A post-install reminder for Hermes — the host caches its MCP tool list, so a fresh install needs `/reload-mcp`, a new session, or `hermes gateway restart` before SkillForge appears.
|
|
13
|
+
|
|
14
|
+
### Verified
|
|
15
|
+
|
|
16
|
+
- 649 tests passing + 2 skipped.
|
|
17
|
+
- `pnpm lint` (`tsc --noEmit`) clean, `pnpm build` clean, `pnpm smoke` passes.
|
|
18
|
+
- All source files ≤ 400 lines.
|
|
19
|
+
|
|
20
|
+
## [1.4.2] — 2026-05-18
|
|
21
|
+
|
|
22
|
+
A single canonical entry point and a registry-independent install default.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **`--entry auto` — the new default for `skillforge install`** (`src/installers/entry.ts`). The previous default, `--entry npx`, wrote `command=npx args=['-y','@lyupro/skillforge-mcp','serve']`, which re-resolves the package from the npm registry on every server spawn. On a machine with a registry cooldown policy (`min-release-age` in `.npmrc`) or no network, that resolution fails and the server does not start. `--entry auto` inspects the installer's own on-disk location: a stable install writes `command=node args=[<absolute dist/cli/dispatcher.js>,'serve']` — no registry, no network, offline-safe; a one-shot `npx … install` run (no stable file to point at) falls back to an npx entry. `--entry npx` and `--entry local` remain available as explicit overrides.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- **One canonical entry point.** `dist/cli/dispatcher.js` is the single entry point — run it with `serve` (its default subcommand) to start the MCP stdio server. `src/server.ts` is now a pure module (`buildServer` / `buildDeps` / `startServer`) and is no longer directly runnable. The server-start sequence, previously duplicated between `server.ts` and the dispatcher, now lives in one exported `startServer()`.
|
|
31
|
+
- **Installer entries target the canonical dispatcher.** `skillforge install` (`--entry auto` and `--entry local`) now points host configs at `dist/cli/dispatcher.js` with an explicit `serve` argument, instead of the internal `dist/server.js` module. The default `--binary-path` is `dist/cli/dispatcher.js`.
|
|
32
|
+
- The three host installers (Claude Code / Codex CLI / Cursor) share a single entry-resolution module (`src/installers/entry.ts`) instead of each carrying its own copy of the entry-building logic.
|
|
33
|
+
|
|
34
|
+
### Verified
|
|
35
|
+
|
|
36
|
+
- 627 tests passing + 2 skipped (sandbox + a win32-only symlink skip).
|
|
37
|
+
- `pnpm lint` (`tsc --noEmit`) clean, `pnpm build` clean, `pnpm smoke` passes against `dist/cli/dispatcher.js serve`.
|
|
38
|
+
- All source files ≤ 400 lines.
|
|
39
|
+
|
|
40
|
+
## [1.4.1] — 2026-05-18
|
|
41
|
+
|
|
42
|
+
A fix for the CLI silently doing nothing under a global install.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **CLI was a silent no-op when installed globally** (`src/cli/dispatcher.ts`) — `npm install -g` installs the bin as a symlink (`/usr/bin/skillforge-mcp` → `dist/cli/dispatcher.js`). The dispatcher gated its entry point on `process.argv[1] === fileURLToPath(import.meta.url)`; under a symlinked bin `process.argv[1]` is the symlink path while `import.meta.url` resolves to the real file, so the strings never matched. Every command — `install`, `serve`, `tools`, `folders`, `skills`, `--version`, `--help` — parsed, did nothing, and exited 0 with no output. Affected every global install on Linux/macOS; Windows escaped it because the npm `.cmd` shim passes the resolved file path as `argv[1]`. Entry detection now resolves both sides through `realpath` (new exported `isMainModule` helper), so symlinked and direct invocations both work.
|
|
47
|
+
|
|
5
48
|
## [1.4.0] — 2026-05-17
|
|
6
49
|
|
|
7
50
|
Config live-reload, a new `skills` CLI subcommand, more accurate conflict detection, and forward-compatible config schemas.
|
package/README.md
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
[](https://modelcontextprotocol.io)
|
|
8
8
|
|
|
9
|
-
**v1.
|
|
9
|
+
**v1.5.0** — 5 MCP tools, one-command install across Claude Code / Codex CLI / Cursor / Hermes Agent, terminal `tools` + `folders` + `skills` subcommands, config live-reload, forward-compatible config schemas, global/project install scopes, Claude Code plugin packaging, 649 tests, 10 sample skills, modular architecture (all source files ≤ 400 lines).
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
## What it is
|
|
14
14
|
|
|
15
|
-
A standalone [Model Context Protocol](https://modelcontextprotocol.io) server that exposes Markdown-defined **skills** (prompts, templates, scripts) to any MCP-capable LLM tool — Claude Code, OpenAI Codex CLI, Cursor, or custom clients via `@modelcontextprotocol/sdk`.
|
|
15
|
+
A standalone [Model Context Protocol](https://modelcontextprotocol.io) server that exposes Markdown-defined **skills** (prompts, templates, scripts) to any MCP-capable LLM tool — Claude Code, OpenAI Codex CLI, Cursor, Hermes Agent, or custom clients via `@modelcontextprotocol/sdk`.
|
|
16
16
|
|
|
17
17
|
One skill folder. One config file. Any tool can ask for any skill on demand.
|
|
18
18
|
|
|
@@ -31,9 +31,9 @@ One skill folder. One config file. Any tool can ask for any skill on demand.
|
|
|
31
31
|
npx @lyupro/skillforge-mcp install --all
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
Auto-detects Claude Code, Codex CLI, and
|
|
34
|
+
Auto-detects Claude Code, Codex CLI, Cursor, and Hermes Agent on your machine and wires SkillForge into each. Supports `--dry-run`, `--uninstall`, and `--force`.
|
|
35
35
|
|
|
36
|
-
By default the installer edits each host's global config. Pass `--scope project` to wire SkillForge into a repo-local config rooted at the current directory instead — `.mcp.json` (Claude Code), `.codex/config.toml` (Codex CLI), `.cursor/mcp.json` (Cursor):
|
|
36
|
+
By default the installer edits each host's global config. Pass `--scope project` to wire SkillForge into a repo-local config rooted at the current directory instead — `.mcp.json` (Claude Code), `.codex/config.toml` (Codex CLI), `.cursor/mcp.json` (Cursor), `.hermes/config.yaml` (Hermes Agent):
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
39
|
npx @lyupro/skillforge-mcp install --all --scope project
|
|
@@ -83,7 +83,7 @@ After install, point SkillForge at your skill folder:
|
|
|
83
83
|
> use skills__list
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
See [docs/INSTALL.md](./docs/INSTALL.md) for Codex CLI, Cursor, and manual MCP-client setups.
|
|
86
|
+
See [docs/INSTALL.md](./docs/INSTALL.md) for Codex CLI, Cursor, Hermes Agent, and manual MCP-client setups.
|
|
87
87
|
|
|
88
88
|
## Verify Installation
|
|
89
89
|
|
|
@@ -102,7 +102,7 @@ The `skillforge` / `skillforge-mcp` binary is a dispatcher — the first positio
|
|
|
102
102
|
| Command | Purpose |
|
|
103
103
|
|---------|---------|
|
|
104
104
|
| `serve` | Run the stdio MCP server. Default when no command is given. |
|
|
105
|
-
| `install` | Wire SkillForge into Claude Code / Codex CLI / Cursor. Flags: `--claude` / `--codex` / `--cursor` / `--all`, `--dry-run`, `--uninstall`, `--force`, `--entry npx\|local`, `--binary-path <path>`, `--scope global\|project`. |
|
|
105
|
+
| `install` | Wire SkillForge into Claude Code / Codex CLI / Cursor / Hermes Agent. Flags: `--claude` / `--codex` / `--cursor` / `--hermes` / `--all`, `--dry-run`, `--uninstall`, `--force`, `--entry auto\|npx\|local`, `--binary-path <path>`, `--scope global\|project`. |
|
|
106
106
|
| `uninstall` | Reverse a previous install. Accepts the same `--scope global\|project` flag. |
|
|
107
107
|
| `tools` | Print the 5 MCP tools the server exposes (name, description, parameters, example). Pass `--json` for machine-readable output. |
|
|
108
108
|
| `folders` | Manage skill folders from the terminal — `list` / `add` / `remove` / `alias` / `enable` / `disable` / `reset`. |
|
|
@@ -263,7 +263,7 @@ pnpm install
|
|
|
263
263
|
pnpm build
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
The wiring in Claude Code / Codex / Cursor points at the same binary path — restarting the host session picks up the new build. Your persisted config at `~/.lyupro/.skillforge/config.json` survives the upgrade.
|
|
266
|
+
The wiring in Claude Code / Codex / Cursor / Hermes points at the same binary path — restarting the host session picks up the new build. Your persisted config at `~/.lyupro/.skillforge/config.json` survives the upgrade.
|
|
267
267
|
|
|
268
268
|
## Documentation
|
|
269
269
|
|
|
@@ -274,7 +274,7 @@ The wiring in Claude Code / Codex / Cursor points at the same binary path — re
|
|
|
274
274
|
| [docs/CONFIGURATION.md](./docs/CONFIGURATION.md) | Power users — folder management, blacklist, sandbox config, env overrides |
|
|
275
275
|
| [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | Contributors — design patterns, module responsibilities, extension points |
|
|
276
276
|
| [docs/SECURITY.md](./docs/SECURITY.md) | Security-conscious operators — threat model, audit checklist, sandbox limits, disclosure policy |
|
|
277
|
-
| [docs/INTEGRATION/](./docs/INTEGRATION/) | Per-tool wiring guides (claude-code / codex / cursor / custom-llm-tools) |
|
|
277
|
+
| [docs/INTEGRATION/](./docs/INTEGRATION/) | Per-tool wiring guides (claude-code / codex / cursor / hermes / custom-llm-tools) |
|
|
278
278
|
| [skills/](./skills/) | 10 ready-to-use sample skills (prompt / script / hybrid examples) |
|
|
279
279
|
| [examples/configs/](./examples/configs/) | Sample `config.json` files for common setups |
|
|
280
280
|
|
|
@@ -289,14 +289,14 @@ pnpm install
|
|
|
289
289
|
pnpm build
|
|
290
290
|
|
|
291
291
|
# Wire into Claude Code using the absolute path
|
|
292
|
-
claude mcp add skillforge -- node /absolute/path/to/skillforge-mcp/dist/
|
|
292
|
+
claude mcp add skillforge -- node /absolute/path/to/skillforge-mcp/dist/cli/dispatcher.js serve
|
|
293
293
|
```
|
|
294
294
|
|
|
295
295
|
Development commands:
|
|
296
296
|
|
|
297
297
|
```bash
|
|
298
298
|
pnpm install
|
|
299
|
-
pnpm dev # tsx watch src/
|
|
299
|
+
pnpm dev # tsx watch src/cli/dispatcher.ts serve
|
|
300
300
|
pnpm test # vitest run
|
|
301
301
|
pnpm test:coverage # coverage report
|
|
302
302
|
pnpm lint # tsc --noEmit
|
package/dist/cli/dispatcher.d.ts
CHANGED
|
@@ -24,6 +24,17 @@
|
|
|
24
24
|
* without an `--package=` override.
|
|
25
25
|
*/
|
|
26
26
|
export declare function readPackageVersion(): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* True when this module file is the process entry point — robust to symlinked
|
|
29
|
+
* bins. `npm install -g` installs the bin as a symlink (e.g.
|
|
30
|
+
* `/usr/bin/skillforge-mcp` → `dist/cli/dispatcher.js`), so `process.argv[1]`
|
|
31
|
+
* holds the symlink path while `import.meta.url` resolves to the real file.
|
|
32
|
+
* A direct string compare of the two never matches under a global install,
|
|
33
|
+
* which left the CLI a silent no-op on every Linux/macOS install. Both sides
|
|
34
|
+
* are passed through `realpath` so the symlinked and direct-invocation cases
|
|
35
|
+
* both resolve to the same canonical path.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isMainModule(entryArg: string | undefined, moduleUrl: string): boolean;
|
|
27
38
|
export interface ServeDeps {
|
|
28
39
|
start: () => Promise<void>;
|
|
29
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAiDH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAST;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAOD;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACnD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqCxB"}
|
package/dist/cli/dispatcher.js
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
* into one and routes by argv, so the documented quick-start works
|
|
24
24
|
* without an `--package=` override.
|
|
25
25
|
*/
|
|
26
|
+
import { realpathSync } from 'node:fs';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
26
28
|
import { main as installMain } from './install.js';
|
|
27
29
|
import { main as toolsMain } from './tools.js';
|
|
28
30
|
import { main as foldersMain } from './folders.js';
|
|
@@ -80,15 +82,32 @@ export async function readPackageVersion() {
|
|
|
80
82
|
}
|
|
81
83
|
return parsed.version;
|
|
82
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* True when this module file is the process entry point — robust to symlinked
|
|
87
|
+
* bins. `npm install -g` installs the bin as a symlink (e.g.
|
|
88
|
+
* `/usr/bin/skillforge-mcp` → `dist/cli/dispatcher.js`), so `process.argv[1]`
|
|
89
|
+
* holds the symlink path while `import.meta.url` resolves to the real file.
|
|
90
|
+
* A direct string compare of the two never matches under a global install,
|
|
91
|
+
* which left the CLI a silent no-op on every Linux/macOS install. Both sides
|
|
92
|
+
* are passed through `realpath` so the symlinked and direct-invocation cases
|
|
93
|
+
* both resolve to the same canonical path.
|
|
94
|
+
*/
|
|
95
|
+
export function isMainModule(entryArg, moduleUrl) {
|
|
96
|
+
if (entryArg === undefined)
|
|
97
|
+
return false;
|
|
98
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
99
|
+
if (entryArg === modulePath)
|
|
100
|
+
return true;
|
|
101
|
+
try {
|
|
102
|
+
return realpathSync(entryArg) === realpathSync(modulePath);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
83
108
|
async function defaultStartServe() {
|
|
84
|
-
const {
|
|
85
|
-
|
|
86
|
-
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
87
|
-
const deps = await buildDeps();
|
|
88
|
-
const server = buildServer(deps);
|
|
89
|
-
await server.connect(new StdioServerTransport());
|
|
90
|
-
await startRuntime(deps);
|
|
91
|
-
registerShutdown(deps);
|
|
109
|
+
const { startServer } = await import('../server.js');
|
|
110
|
+
await startServer();
|
|
92
111
|
}
|
|
93
112
|
/**
|
|
94
113
|
* Dispatcher entry. Returns:
|
|
@@ -131,10 +150,7 @@ export async function main(rawArgv, overrides = {}) {
|
|
|
131
150
|
process.stderr.write(`skillforge-mcp: unknown command: ${first}\n\n${USAGE}`);
|
|
132
151
|
return 2;
|
|
133
152
|
}
|
|
134
|
-
import {
|
|
135
|
-
const isDirectRun = process.argv[1] !== undefined &&
|
|
136
|
-
fileURLToPath(import.meta.url) === process.argv[1];
|
|
137
|
-
if (isDirectRun) {
|
|
153
|
+
if (isMainModule(process.argv[1], import.meta.url)) {
|
|
138
154
|
main(process.argv.slice(2))
|
|
139
155
|
.then((code) => {
|
|
140
156
|
if (code !== null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,0DAA0D;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;IACxD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/install.d.ts
CHANGED
|
@@ -20,11 +20,12 @@ export interface ParsedArgs {
|
|
|
20
20
|
claude: boolean;
|
|
21
21
|
codex: boolean;
|
|
22
22
|
cursor: boolean;
|
|
23
|
+
hermes: boolean;
|
|
23
24
|
all: boolean;
|
|
24
25
|
dryRun: boolean;
|
|
25
26
|
uninstall: boolean;
|
|
26
27
|
force: boolean;
|
|
27
|
-
entry: 'npx' | 'local';
|
|
28
|
+
entry: 'npx' | 'local' | 'auto';
|
|
28
29
|
binaryPath?: string;
|
|
29
30
|
scope: Scope;
|
|
30
31
|
showHelp: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AA0CD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA4EpD;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAmDD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4EtF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7D"}
|
package/dist/cli/install.js
CHANGED
|
@@ -30,6 +30,7 @@ Targets (at least one required, unless --help):
|
|
|
30
30
|
--claude Edit ~/.claude.json
|
|
31
31
|
--codex Edit ~/.codex/config.toml
|
|
32
32
|
--cursor Edit ~/.cursor/mcp.json
|
|
33
|
+
--hermes Edit ~/.hermes/config.yaml (or $HERMES_HOME/config.yaml)
|
|
33
34
|
--all Auto-detect installed hosts and install into each
|
|
34
35
|
|
|
35
36
|
Modes:
|
|
@@ -38,19 +39,24 @@ Modes:
|
|
|
38
39
|
--force Overwrite an existing SkillForge entry
|
|
39
40
|
|
|
40
41
|
Entry shape:
|
|
41
|
-
--entry
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
--entry auto (default) detect this installer's own on-disk location:
|
|
43
|
+
stable install → command=node args=[<dispatcher.js>,'serve']
|
|
44
|
+
ephemeral npx run → command=npx args=['-y','@lyupro/skillforge-mcp','serve']
|
|
45
|
+
--entry npx force command=npx args=['-y','@lyupro/skillforge-mcp','serve']
|
|
46
|
+
--entry local force command=node args=[<binary-path>,'serve']
|
|
47
|
+
--binary-path PATH Override the binary path (defaults to dist/cli/dispatcher.js)
|
|
44
48
|
|
|
45
49
|
Scope:
|
|
46
50
|
--scope global (default) edit the host's home-directory config:
|
|
47
51
|
claude → ~/.claude.json
|
|
48
52
|
codex → ~/.codex/config.toml
|
|
49
53
|
cursor → ~/.cursor/mcp.json
|
|
54
|
+
hermes → ~/.hermes/config.yaml
|
|
50
55
|
--scope project edit a repo-local config rooted at the current directory:
|
|
51
56
|
claude → ./.mcp.json
|
|
52
57
|
codex → ./.codex/config.toml
|
|
53
58
|
cursor → ./.cursor/mcp.json
|
|
59
|
+
hermes → ./.hermes/config.yaml
|
|
54
60
|
|
|
55
61
|
--help, -h Show this message
|
|
56
62
|
`;
|
|
@@ -59,11 +65,12 @@ export function parseArgs(argv) {
|
|
|
59
65
|
claude: false,
|
|
60
66
|
codex: false,
|
|
61
67
|
cursor: false,
|
|
68
|
+
hermes: false,
|
|
62
69
|
all: false,
|
|
63
70
|
dryRun: false,
|
|
64
71
|
uninstall: false,
|
|
65
72
|
force: false,
|
|
66
|
-
entry: '
|
|
73
|
+
entry: 'auto',
|
|
67
74
|
scope: 'global',
|
|
68
75
|
showHelp: false,
|
|
69
76
|
};
|
|
@@ -79,6 +86,9 @@ export function parseArgs(argv) {
|
|
|
79
86
|
case '--cursor':
|
|
80
87
|
out.cursor = true;
|
|
81
88
|
break;
|
|
89
|
+
case '--hermes':
|
|
90
|
+
out.hermes = true;
|
|
91
|
+
break;
|
|
82
92
|
case '--all':
|
|
83
93
|
out.all = true;
|
|
84
94
|
break;
|
|
@@ -97,8 +107,8 @@ export function parseArgs(argv) {
|
|
|
97
107
|
break;
|
|
98
108
|
case '--entry': {
|
|
99
109
|
const next = argv[++i];
|
|
100
|
-
if (next !== 'npx' && next !== 'local') {
|
|
101
|
-
throw new UsageError(`--entry must be 'npx' or 'local' (got: ${String(next)})`);
|
|
110
|
+
if (next !== 'npx' && next !== 'local' && next !== 'auto') {
|
|
111
|
+
throw new UsageError(`--entry must be 'auto', 'npx', or 'local' (got: ${String(next)})`);
|
|
102
112
|
}
|
|
103
113
|
out.entry = next;
|
|
104
114
|
break;
|
|
@@ -138,8 +148,17 @@ function chooseInstallers(args, all) {
|
|
|
138
148
|
if (args.cursor) {
|
|
139
149
|
picked.push(all.find((i) => i.name === 'cursor') ?? getInstallerByName('cursor', args.scope));
|
|
140
150
|
}
|
|
151
|
+
if (args.hermes) {
|
|
152
|
+
picked.push(all.find((i) => i.name === 'hermes') ?? getInstallerByName('hermes', args.scope));
|
|
153
|
+
}
|
|
141
154
|
return picked;
|
|
142
155
|
}
|
|
156
|
+
// Hermes caches its MCP tool list; a fresh install stays invisible until the
|
|
157
|
+
// host re-opens MCP tools. Printed once after a real Hermes install/update.
|
|
158
|
+
const HERMES_RELOAD_HINT = '[hermes] Hermes caches its MCP tool list — reload to pick up SkillForge:\n' +
|
|
159
|
+
' CLI: run /reload-mcp or start a new session;\n' +
|
|
160
|
+
' Telegram gateway: run `hermes gateway restart`.\n' +
|
|
161
|
+
' Verify with: hermes mcp list';
|
|
143
162
|
function formatInstall(r) {
|
|
144
163
|
const tag = r.status.toUpperCase();
|
|
145
164
|
const msg = r.message !== undefined ? ` (${r.message})` : '';
|
|
@@ -167,9 +186,9 @@ export async function runInstall(args, deps = {}) {
|
|
|
167
186
|
stdout(USAGE);
|
|
168
187
|
return 0;
|
|
169
188
|
}
|
|
170
|
-
if (!args.all && !args.claude && !args.codex && !args.cursor) {
|
|
189
|
+
if (!args.all && !args.claude && !args.codex && !args.cursor && !args.hermes) {
|
|
171
190
|
stderr(USAGE);
|
|
172
|
-
stderr('\nError: choose at least one of --claude / --codex / --cursor / --all');
|
|
191
|
+
stderr('\nError: choose at least one of --claude / --codex / --cursor / --hermes / --all');
|
|
173
192
|
return 2;
|
|
174
193
|
}
|
|
175
194
|
let allInstallers;
|
|
@@ -221,8 +240,10 @@ export async function runInstall(args, deps = {}) {
|
|
|
221
240
|
else {
|
|
222
241
|
const result = await inst.install(opts);
|
|
223
242
|
stdout(formatInstall(result));
|
|
224
|
-
if (
|
|
225
|
-
|
|
243
|
+
if (inst.name === 'hermes' &&
|
|
244
|
+
(result.status === 'installed' || result.status === 'updated')) {
|
|
245
|
+
stdout(HERMES_RELOAD_HINT);
|
|
246
|
+
}
|
|
226
247
|
}
|
|
227
248
|
}
|
|
228
249
|
catch (err) {
|
package/dist/cli/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Atomic JSON / TOML helpers with .backup snapshots.
|
|
2
|
+
* Atomic JSON / TOML / text helpers with .backup snapshots.
|
|
3
3
|
*
|
|
4
4
|
* Read helpers return null on missing file, throw on corrupt content.
|
|
5
5
|
* Write helpers go via <path>.tmp + fs.rename and snapshot the previous
|
|
6
6
|
* content into <path>.backup before overwriting. On rename failure the
|
|
7
7
|
* backup is restored.
|
|
8
|
+
*
|
|
9
|
+
* The text helpers carry no format knowledge — a caller that needs to
|
|
10
|
+
* preserve comments (e.g. the YAML installer) parses and serializes the
|
|
11
|
+
* document itself, then writes the resulting string atomically here.
|
|
8
12
|
*/
|
|
9
13
|
export declare function readJsonSafe(path: string): Promise<unknown | null>;
|
|
10
14
|
export declare function readTomlSafe(path: string): Promise<Record<string, unknown> | null>;
|
|
11
15
|
export declare function writeJsonAtomic(path: string, data: unknown): Promise<void>;
|
|
12
16
|
export declare function writeTomlAtomic(path: string, data: Record<string, unknown>): Promise<void>;
|
|
17
|
+
export declare function readTextSafe(path: string): Promise<string | null>;
|
|
18
|
+
export declare function writeTextAtomic(path: string, contents: string): Promise<void>;
|
|
13
19
|
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/installers/atomic-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/installers/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAaxE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAaxF;AA6BD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhG;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOvE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Atomic JSON / TOML helpers with .backup snapshots.
|
|
2
|
+
* Atomic JSON / TOML / text helpers with .backup snapshots.
|
|
3
3
|
*
|
|
4
4
|
* Read helpers return null on missing file, throw on corrupt content.
|
|
5
5
|
* Write helpers go via <path>.tmp + fs.rename and snapshot the previous
|
|
6
6
|
* content into <path>.backup before overwriting. On rename failure the
|
|
7
7
|
* backup is restored.
|
|
8
|
+
*
|
|
9
|
+
* The text helpers carry no format knowledge — a caller that needs to
|
|
10
|
+
* preserve comments (e.g. the YAML installer) parses and serializes the
|
|
11
|
+
* document itself, then writes the resulting string atomically here.
|
|
8
12
|
*/
|
|
9
13
|
import { readFile, writeFile, rename, mkdir, access, copyFile, unlink } from 'node:fs/promises';
|
|
10
14
|
import { dirname } from 'node:path';
|
|
@@ -95,4 +99,20 @@ export async function writeTomlAtomic(path, data) {
|
|
|
95
99
|
await writeFile(tmpPath, contents, 'utf8');
|
|
96
100
|
await backupAndRename(path, tmpPath);
|
|
97
101
|
}
|
|
102
|
+
export async function readTextSafe(path) {
|
|
103
|
+
if (!(await fileExists(path)))
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
return await readFile(path, 'utf8');
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new Error(`atomic-write: failed to read "${path}": ${String(err)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export async function writeTextAtomic(path, contents) {
|
|
113
|
+
await mkdir(dirname(path), { recursive: true });
|
|
114
|
+
const tmpPath = `${path}.tmp`;
|
|
115
|
+
await writeFile(tmpPath, contents, 'utf8');
|
|
116
|
+
await backupAndRename(path, tmpPath);
|
|
117
|
+
}
|
|
98
118
|
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/installers/atomic-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/installers/atomic-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-installer.d.ts","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"claude-installer.d.ts","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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;AAyBD,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;IAerC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CA4BlG"}
|
|
@@ -10,15 +10,8 @@ import { spawnSync } from 'node:child_process';
|
|
|
10
10
|
import { access } from 'node:fs/promises';
|
|
11
11
|
import { readJsonSafe, writeJsonAtomic } from './atomic-write.js';
|
|
12
12
|
import { claudeConfigPath, defaultBinaryPath } from './paths.js';
|
|
13
|
+
import { buildEntry } from './entry.js';
|
|
13
14
|
const SKILL_KEY = 'skillforge';
|
|
14
|
-
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
15
|
-
function buildEntry(opts, binaryFallback) {
|
|
16
|
-
if (opts.entry === 'npx') {
|
|
17
|
-
return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
|
|
18
|
-
}
|
|
19
|
-
const binary = opts.binaryPath ?? binaryFallback;
|
|
20
|
-
return { command: 'node', args: [binary] };
|
|
21
|
-
}
|
|
22
15
|
function probeClaudeBinary() {
|
|
23
16
|
try {
|
|
24
17
|
const result = spawnSync('claude', ['--version'], { stdio: 'ignore' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-installer.js","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-installer.js","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-installer.d.ts","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"codex-installer.d.ts","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AA+BD,qBAAa,cAAe,YAAW,SAAS;;IAC9C,QAAQ,CAAC,IAAI,WAAW;gBAKZ,SAAS,GAAE,2BAAgC;IAMjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAerC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CA4BlG"}
|
|
@@ -14,14 +14,8 @@ import { spawnSync } from 'node:child_process';
|
|
|
14
14
|
import { access } from 'node:fs/promises';
|
|
15
15
|
import { readTomlSafe, writeTomlAtomic } from './atomic-write.js';
|
|
16
16
|
import { codexConfigPath, defaultBinaryPath } from './paths.js';
|
|
17
|
+
import { buildEntry } from './entry.js';
|
|
17
18
|
const SKILL_KEY = 'skillforge';
|
|
18
|
-
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
19
|
-
function buildEntry(opts, binaryFallback) {
|
|
20
|
-
if (opts.entry === 'npx') {
|
|
21
|
-
return { command: 'npx', args: ['-y', NPX_PKG, 'serve'] };
|
|
22
|
-
}
|
|
23
|
-
return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
|
|
24
|
-
}
|
|
25
19
|
function probeCodexBinary() {
|
|
26
20
|
try {
|
|
27
21
|
const result = spawnSync('codex', ['--version'], { stdio: 'ignore' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"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"}
|