@lyupro/skillforge-mcp 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.claude-plugin/marketplace.json +36 -0
  2. package/.claude-plugin/plugin.json +28 -0
  3. package/CHANGELOG.md +21 -0
  4. package/README.md +77 -9
  5. package/dist/cli/dispatcher.d.ts.map +1 -1
  6. package/dist/cli/dispatcher.js +24 -2
  7. package/dist/cli/dispatcher.js.map +1 -1
  8. package/dist/cli/folders.d.ts +36 -0
  9. package/dist/cli/folders.d.ts.map +1 -0
  10. package/dist/cli/folders.js +249 -0
  11. package/dist/cli/folders.js.map +1 -0
  12. package/dist/cli/install.d.ts +2 -0
  13. package/dist/cli/install.d.ts.map +1 -1
  14. package/dist/cli/install.js +47 -9
  15. package/dist/cli/install.js.map +1 -1
  16. package/dist/cli/tools.d.ts +49 -0
  17. package/dist/cli/tools.d.ts.map +1 -0
  18. package/dist/cli/tools.js +171 -0
  19. package/dist/cli/tools.js.map +1 -0
  20. package/dist/detect/skill-source-conflict.d.ts +47 -0
  21. package/dist/detect/skill-source-conflict.d.ts.map +1 -0
  22. package/dist/detect/skill-source-conflict.js +99 -0
  23. package/dist/detect/skill-source-conflict.js.map +1 -0
  24. package/dist/installers/cursor-installer.d.ts +6 -7
  25. package/dist/installers/cursor-installer.d.ts.map +1 -1
  26. package/dist/installers/cursor-installer.js +15 -20
  27. package/dist/installers/cursor-installer.js.map +1 -1
  28. package/dist/installers/paths.d.ts +28 -6
  29. package/dist/installers/paths.d.ts.map +1 -1
  30. package/dist/installers/paths.js +72 -20
  31. package/dist/installers/paths.js.map +1 -1
  32. package/dist/installers/registry.d.ts +8 -2
  33. package/dist/installers/registry.d.ts.map +1 -1
  34. package/dist/installers/registry.js +14 -7
  35. package/dist/installers/registry.js.map +1 -1
  36. package/dist/tools/configure.d.ts +6 -0
  37. package/dist/tools/configure.d.ts.map +1 -1
  38. package/dist/tools/configure.js +3 -0
  39. package/dist/tools/configure.js.map +1 -1
  40. package/manifest.json +3 -2
  41. package/package.json +3 -2
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-marketplace.json",
3
+ "name": "skillforge",
4
+ "description": "SkillForge — universal Markdown skills for Claude Code and any MCP client.",
5
+ "owner": {
6
+ "name": "Lyu Pro",
7
+ "email": "lyupro.dev@gmail.com"
8
+ },
9
+ "plugins": [
10
+ {
11
+ "name": "skillforge",
12
+ "source": {
13
+ "source": "npm",
14
+ "package": "@lyupro/skillforge-mcp"
15
+ },
16
+ "description": "Universal Skills MCP server — load Markdown skills from arbitrary folders, lazy-by-design, cross-tool.",
17
+ "version": "1.2.0",
18
+ "author": {
19
+ "name": "Lyu Pro",
20
+ "email": "lyupro.dev@gmail.com"
21
+ },
22
+ "homepage": "https://github.com/lyupro/skillforge-mcp",
23
+ "repository": "https://github.com/lyupro/skillforge-mcp",
24
+ "license": "MIT",
25
+ "keywords": [
26
+ "skills",
27
+ "mcp",
28
+ "productivity",
29
+ "developer-tools",
30
+ "cross-tool",
31
+ "lazy-loading"
32
+ ],
33
+ "category": "productivity"
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
+ "name": "skillforge",
4
+ "version": "1.2.0",
5
+ "description": "Universal Skills MCP server — load Markdown skills from arbitrary folders, lazy-by-design, cross-tool.",
6
+ "author": {
7
+ "name": "Lyu Pro",
8
+ "email": "lyupro.dev@gmail.com",
9
+ "url": "https://lyupro.com"
10
+ },
11
+ "homepage": "https://github.com/lyupro/skillforge-mcp",
12
+ "repository": "https://github.com/lyupro/skillforge-mcp",
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "skills",
16
+ "mcp",
17
+ "productivity",
18
+ "developer-tools",
19
+ "cross-tool",
20
+ "lazy-loading"
21
+ ],
22
+ "mcpServers": {
23
+ "skillforge": {
24
+ "command": "node",
25
+ "args": ["${CLAUDE_PLUGIN_ROOT}/dist/cli/dispatcher.js", "serve"]
26
+ }
27
+ }
28
+ }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
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.2.0] — 2026-05-16
6
+
7
+ Terminal-side tooling — inspect MCP tools and manage skill folders without an LLM session, plus repo-local install scope and Claude Code plugin packaging.
8
+
9
+ ### Added
10
+
11
+ - `skillforge tools` CLI subcommand — prints the 5 MCP tools the server exposes (`skills__list`, `skills__get`, `skills__invoke`, `skills__configure`, `skills__reload`) with each tool's description, parameters, and an example invocation. Pass `--json` for machine-readable output. Lets you confirm the tool surface without starting an LLM session.
12
+ - `skillforge folders` CLI subcommand — manage skill folders from the terminal: `folders list [--json]`, `folders add <path> [--priority N] [--tags a,b] [--disabled]`, `folders remove <path>`, `folders reset --yes`. Previously folder management was only reachable via the `skills__configure` MCP tool inside an LLM session; both surfaces now read and write the same persisted config.
13
+ - `--scope global|project` flag on `skillforge install` / `skillforge uninstall`. The default `global` scope edits each host's home-directory config (unchanged behavior). `--scope project` wires SkillForge into a repo-local config rooted at the current directory — `.mcp.json` (Claude Code), `.codex/config.toml` (Codex CLI), `.cursor/mcp.json` (Cursor).
14
+ - Skill-source conflict detection. Registering a folder that already lives inside another tool's native skill store (a Claude Code plugin cache or a Gemini CLI extension) now surfaces a hint to disable the duplicate source — otherwise the same skills load twice and skill names collide. The `folders add` CLI prints the hint; the `skills__configure` `add_folder` action returns it as a `conflictHint` field. The conflict is informational only — it never blocks the folder from being added, and SkillForge never edits another tool's config.
15
+ - Claude Code plugin packaging — `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`. SkillForge can now be installed via `claude plugin install` (rich `/plugins` UI card) in addition to `claude mcp add` and `skillforge install`.
16
+
17
+ ### Verified
18
+
19
+ - 535 / 535 tests passing + 1 win32-skip.
20
+ - `pnpm lint` (`tsc --noEmit`) clean.
21
+ - `pnpm build` clean.
22
+ - `pnpm check:size` — all source files ≤ 400 lines.
23
+
5
24
  ## [1.1.1] — 2026-05-15
6
25
 
7
26
  Single-bin dispatcher — fixes `npx @lyupro/skillforge-mcp install --all` hanging on stdin.
@@ -138,5 +157,7 @@ All 10 verified through real parse pipeline + `StrategyFactory.create()` correct
138
157
  - **`pnpm build`** clean.
139
158
  - **`pnpm smoke`** end-to-end via subprocess `dist/server.js` — LoggingDecorator trace visible.
140
159
 
160
+ [1.2.0]: https://github.com/lyupro/skillforge-mcp/releases/tag/v1.2.0
161
+ [1.1.1]: https://github.com/lyupro/skillforge-mcp/releases/tag/v1.1.1
141
162
  [1.1.0]: https://github.com/lyupro/skillforge-mcp/releases/tag/v1.1.0
142
163
  [1.0.0]: https://github.com/lyupro/skillforge-mcp/releases/tag/v1.0.0
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)
7
7
  [![MCP](https://img.shields.io/badge/MCP-stdio-purple)](https://modelcontextprotocol.io)
8
8
 
9
- **v1.1.0** — 5 MCP tools, one-command install across Claude Code / Codex CLI / Cursor, 451 tests, 10 sample skills, modular architecture (all source files ≤ 400 lines).
9
+ **v1.2.0** — 5 MCP tools, one-command install across Claude Code / Codex CLI / Cursor, terminal `tools` + `folders` subcommands, global/project install scopes, Claude Code plugin packaging, 535 tests, 10 sample skills, modular architecture (all source files ≤ 400 lines).
10
10
 
11
11
  ---
12
12
 
@@ -25,21 +25,37 @@ One skill folder. One config file. Any tool can ask for any skill on demand.
25
25
  | No cross-tool format | Each tool ships its own skill layout | Universal frontmatter parser auto-detects Claude / Codex / persona / custom dialects |
26
26
  | Skill execution = "just inline body in prompt" | No scripts, no caching, no timeouts, no composition | Strategy pattern (prompt / script / hybrid) + decorator chain (logging → timeout → cache) + composite skills with cycle detection |
27
27
 
28
- ## One-command install (v1.1)
28
+ ## One-command install
29
29
 
30
30
  ```bash
31
31
  npx @lyupro/skillforge-mcp install --all
32
32
  ```
33
33
 
34
- Auto-detects Claude Code, Codex CLI, and Cursor on your machine and wires SkillForge into each. Supports `--dry-run`, `--uninstall`, and `--force`. Full reference: [docs/INSTALL_CLI.md](./docs/INSTALL_CLI.md).
34
+ Auto-detects Claude Code, Codex CLI, and Cursor on your machine and wires SkillForge into each. Supports `--dry-run`, `--uninstall`, and `--force`.
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):
37
+
38
+ ```bash
39
+ npx @lyupro/skillforge-mcp install --all --scope project
40
+ ```
41
+
42
+ Full reference: [docs/INSTALL_CLI.md](./docs/INSTALL_CLI.md).
35
43
 
36
44
  ## Quick Start
37
45
 
38
- ### Option 1 — Claude Code marketplace (recommended)
46
+ ### Option 1 — Claude Code plugin (recommended)
47
+
48
+ SkillForge ships a Claude Code plugin manifest, so it installs through the native `/plugins` UI with a rich plugin card:
39
49
 
40
50
  ```bash
41
- /plugin marketplace add lyupro/llm-plugins-marketplace
42
- /plugin install skillforge-mcp@lyupro-llm-plugins
51
+ /plugin marketplace add lyupro/skillforge-mcp
52
+ /plugin install skillforge
53
+ ```
54
+
55
+ Or install it directly:
56
+
57
+ ```bash
58
+ claude plugin install skillforge@lyupro/skillforge-mcp
43
59
  ```
44
60
 
45
61
  Restart your Claude Code session. The five tools (`skills__list`, `skills__get`, `skills__invoke`, `skills__configure`, `skills__reload`) appear in the tool list.
@@ -50,7 +66,11 @@ Restart your Claude Code session. The five tools (`skills__list`, `skills__get`,
50
66
  claude mcp add skillforge -- npx -y @lyupro/skillforge-mcp
51
67
  ```
52
68
 
53
- Works for any MCP host that can spawn a stdio command (Claude Code, Codex CLI, Cursor).
69
+ Works for any MCP host that can spawn a stdio command (Claude Code, Codex CLI, Cursor). Or let the install CLI wire every detected host at once:
70
+
71
+ ```bash
72
+ npx -y @lyupro/skillforge-mcp install --all
73
+ ```
54
74
 
55
75
  ### Option 3 — local build
56
76
 
@@ -75,6 +95,54 @@ After the install step, run these three checks from inside any wired LLM tool se
75
95
 
76
96
  If any call fails with `[skillforge] fatal:` on stderr, the most likely cause is a corrupt config file or a missing folder path — the error message points at the offending file. Delete or fix `~/.lyupro/.skillforge/config.json` and retry.
77
97
 
98
+ ## CLI commands
99
+
100
+ The `skillforge` / `skillforge-mcp` binary is a dispatcher — the first positional argument selects a subcommand. Run `skillforge --help` for the full list.
101
+
102
+ | Command | Purpose |
103
+ |---------|---------|
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`. |
106
+ | `uninstall` | Reverse a previous install. Accepts the same `--scope global\|project` flag. |
107
+ | `tools` | Print the 5 MCP tools the server exposes (name, description, parameters, example). Pass `--json` for machine-readable output. |
108
+ | `folders` | Manage skill folders from the terminal — `list` / `add` / `remove` / `reset`. |
109
+ | `--version`, `-v` | Print the package version. |
110
+ | `--help`, `-h` | Print combined usage. |
111
+
112
+ ### Inspect the MCP tools — `skillforge tools`
113
+
114
+ ```bash
115
+ skillforge tools # human-readable reference
116
+ skillforge tools --json # machine-readable: { "tools": [ ... ] }
117
+ ```
118
+
119
+ Prints every MCP tool the server exposes (`skills__list`, `skills__get`, `skills__invoke`, `skills__configure`, `skills__reload`) with its description, parameters, and an example invocation — handy for confirming the surface without starting a session.
120
+
121
+ ### Manage skill folders from the terminal — `skillforge folders`
122
+
123
+ Folder management is also available from the shell, not just via the `skills__configure` MCP tool inside an LLM session:
124
+
125
+ ```bash
126
+ skillforge folders list [--json] # print registered folders
127
+ skillforge folders add <path> [flags] # register a folder
128
+ skillforge folders remove <path> # remove a folder entry
129
+ skillforge folders reset --yes # reset folders to the default (empty) list
130
+ ```
131
+
132
+ `add` flags:
133
+
134
+ - `--priority <n>` — folder priority (default `100`; higher wins on name collisions).
135
+ - `--tags <a,b,c>` — comma-separated tags.
136
+ - `--disabled` — register the folder disabled.
137
+
138
+ ```bash
139
+ skillforge folders add ~/.lyupro/skills --priority 50 --tags work,review
140
+ ```
141
+
142
+ `reset` requires `--yes` to apply — without it, the command prints what would change and makes no edits. All `folders` actions read and write the same persisted config (`~/.lyupro/.skillforge/config.json`) as the `skills__configure` MCP tool.
143
+
144
+ If you register a folder that already lives inside another tool's native skill store (a Claude Code plugin cache or a Gemini CLI extension), `folders add` prints a hint to disable the duplicate source so the same skills don't load twice. SkillForge only prints the hint — it never edits another tool's config.
145
+
78
146
  ## MCP tool surface
79
147
 
80
148
  | Tool | Purpose |
@@ -166,8 +234,8 @@ For production use with untrusted skill authors, run SkillForge inside Docker or
166
234
  ## Updating
167
235
 
168
236
  ```bash
169
- # Marketplace install
170
- /plugin update skillforge-mcp@lyupro-llm-plugins
237
+ # Plugin install
238
+ /plugin update skillforge
171
239
 
172
240
  # npm install
173
241
  claude mcp remove skillforge
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAwBH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa1D;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAsBD;;;;;;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,CA4BxB"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAwCH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa1D;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAsBD;;;;;;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,CAkCxB"}
@@ -24,20 +24,36 @@
24
24
  * without an `--package=` override.
25
25
  */
26
26
  import { main as installMain } from './install.js';
27
+ import { main as toolsMain } from './tools.js';
28
+ import { main as foldersMain } from './folders.js';
27
29
  const USAGE = `skillforge-mcp — universal Skills MCP server + install CLI.
28
30
 
29
31
  Usage:
30
32
  skillforge-mcp <command> [flags]
31
33
 
32
34
  Commands:
35
+ serve Run the stdio MCP server. Default when no command is given.
36
+ Example: skillforge-mcp serve
33
37
  install Wire SkillForge into Claude Code / Codex CLI / Cursor.
38
+ Defaults to the host's global config; pass --scope project to
39
+ edit a repo-local config rooted at the current directory.
34
40
  Run "skillforge-mcp install --help" for installer flags.
41
+ Example: skillforge-mcp install --all
42
+ Example: skillforge-mcp install --all --scope project
35
43
  uninstall Reverse a previous install. Forwards to "install --uninstall".
36
- serve Run the stdio MCP server. Default when no command is given.
44
+ Accepts the same --scope global|project flag.
45
+ Example: skillforge-mcp uninstall --all
46
+ tools List the 5 MCP tools the server exposes (params + examples).
47
+ Pass --json for machine-readable output.
48
+ Example: skillforge-mcp tools --json
49
+ folders Manage skill folders from the terminal (list/add/remove/reset).
50
+ Run "skillforge-mcp folders" for sub-action usage.
51
+ Example: skillforge-mcp folders add ~/.lyupro/skills
37
52
 
38
53
  Options:
39
54
  --help, -h Show this message.
40
- --version Print the package version.
55
+ --version, -v Print the package version.
56
+ Example: skillforge-mcp --version
41
57
 
42
58
  Quick start:
43
59
  npx -y @lyupro/skillforge-mcp install --all
@@ -98,6 +114,12 @@ export async function main(rawArgv, overrides = {}) {
98
114
  if (first === 'uninstall') {
99
115
  return installMain(['--uninstall', ...rawArgv.slice(1)]);
100
116
  }
117
+ if (first === 'tools') {
118
+ return toolsMain(rawArgv.slice(1));
119
+ }
120
+ if (first === 'folders') {
121
+ return foldersMain(rawArgv.slice(1));
122
+ }
101
123
  if (first === 'serve' || first === undefined) {
102
124
  const start = overrides.startServe ?? defaultStartServe;
103
125
  await start();
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/cli/dispatcher.ts"],"names":[],"mappings":"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"}
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;AAEnD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCb,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;AAMD,KAAK,UAAU,iBAAiB;IAC9B,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3C,2CAA2C,CAC5C,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QAC3B,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC1B,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAiB,EACjB,YAAkD,EAAE;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzB,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,IAAI,iBAAiB,CAAC;QACxD,MAAM,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,KAAK,OAAO,KAAK,EAAE,CACxD,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;IAC7B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrD,IAAI,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACxB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SkillForge `folders` subcommand.
4
+ *
5
+ * Terminal-side skill-folder management. Without this, folders could only
6
+ * be registered from inside an LLM session via the `skills__configure` MCP
7
+ * tool. This subcommand exposes the same `ConfigStore` folder operations
8
+ * (load → mutate → save) to the shell — no separate config logic.
9
+ *
10
+ * Usage:
11
+ * skillforge folders list [--json] List registered folders
12
+ * skillforge folders add <path> [flags] Register a folder
13
+ * skillforge folders remove <path> Remove a folder entry
14
+ * skillforge folders reset --yes Reset folders to default
15
+ *
16
+ * add flags:
17
+ * --priority <n> Folder priority (default 100, lower wins ordering).
18
+ * --tags <a,b,c> Comma-separated tags.
19
+ * --disabled Register the folder disabled.
20
+ */
21
+ export interface FoldersDeps {
22
+ stdout?: (text: string) => void;
23
+ stderr?: (text: string) => void;
24
+ /** Override the config file path — tests inject a temp path here. */
25
+ configPath?: string;
26
+ /** Check whether a path exists and is a directory. Overridable for tests. */
27
+ isDirectory?: (p: string) => Promise<boolean>;
28
+ }
29
+ /**
30
+ * `folders` subcommand entry. Returns an exit code:
31
+ * - 0 on success
32
+ * - 1 on a runtime/validation failure (e.g. bad path)
33
+ * - 2 on a missing/unknown sub-action or malformed flag
34
+ */
35
+ export declare function main(rawArgv: string[], deps?: FoldersDeps): Promise<number>;
36
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAwND;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCrF"}
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SkillForge `folders` subcommand.
4
+ *
5
+ * Terminal-side skill-folder management. Without this, folders could only
6
+ * be registered from inside an LLM session via the `skills__configure` MCP
7
+ * tool. This subcommand exposes the same `ConfigStore` folder operations
8
+ * (load → mutate → save) to the shell — no separate config logic.
9
+ *
10
+ * Usage:
11
+ * skillforge folders list [--json] List registered folders
12
+ * skillforge folders add <path> [flags] Register a folder
13
+ * skillforge folders remove <path> Remove a folder entry
14
+ * skillforge folders reset --yes Reset folders to default
15
+ *
16
+ * add flags:
17
+ * --priority <n> Folder priority (default 100, lower wins ordering).
18
+ * --tags <a,b,c> Comma-separated tags.
19
+ * --disabled Register the folder disabled.
20
+ */
21
+ import { resolve } from 'node:path';
22
+ import { stat } from 'node:fs/promises';
23
+ import { ConfigStore, defaultConfigPath } from '../config/config-store.js';
24
+ import { defaultConfig } from '../config/config-schema.js';
25
+ import { detectSkillSourceConflict, formatConflictHint, } from '../detect/skill-source-conflict.js';
26
+ const USAGE = `skillforge folders — manage skill folders from the terminal.
27
+
28
+ Usage:
29
+ skillforge folders <action> [args]
30
+
31
+ Actions:
32
+ list [--json] Print registered folders (path, priority, enabled, tags).
33
+ add <path> [flags] Register a folder. Path must exist and be a directory.
34
+ Flags: --priority <n>, --tags <a,b,c>, --disabled
35
+ remove <path> Remove the entry for <path>.
36
+ reset --yes Reset folders to the default (empty) list.
37
+ Without --yes, prints what would happen and exits.
38
+
39
+ Examples:
40
+ skillforge folders list --json
41
+ skillforge folders add ~/.lyupro/skills --priority 50 --tags work,review
42
+ skillforge folders remove ~/.lyupro/skills
43
+ skillforge folders reset --yes
44
+ `;
45
+ async function defaultIsDirectory(p) {
46
+ try {
47
+ const info = await stat(p);
48
+ return info.isDirectory();
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /** Parse the flags accepted by `add`. Returns null on a malformed flag. */
55
+ function parseAddFlags(args) {
56
+ let priority;
57
+ let tags;
58
+ let disabled = false;
59
+ for (let i = 0; i < args.length; i += 1) {
60
+ const arg = args[i];
61
+ if (arg === '--disabled') {
62
+ disabled = true;
63
+ }
64
+ else if (arg === '--priority') {
65
+ const value = args[i + 1];
66
+ if (value === undefined)
67
+ return null;
68
+ const n = Number(value);
69
+ if (!Number.isInteger(n))
70
+ return null;
71
+ priority = n;
72
+ i += 1;
73
+ }
74
+ else if (arg === '--tags') {
75
+ const value = args[i + 1];
76
+ if (value === undefined)
77
+ return null;
78
+ tags = value
79
+ .split(',')
80
+ .map((t) => t.trim())
81
+ .filter((t) => t.length > 0);
82
+ i += 1;
83
+ }
84
+ else {
85
+ return null;
86
+ }
87
+ }
88
+ return { priority, tags, disabled };
89
+ }
90
+ function formatFoldersTable(folders) {
91
+ if (folders.length === 0) {
92
+ return 'No folders registered.\n';
93
+ }
94
+ const rows = folders.map((f) => ({
95
+ priority: String(f.priority),
96
+ enabled: f.enabled ? 'yes' : 'no',
97
+ tags: f.tags.length > 0 ? f.tags.join(',') : '-',
98
+ path: f.path,
99
+ }));
100
+ const headers = { priority: 'PRIORITY', enabled: 'ENABLED', tags: 'TAGS', path: 'PATH' };
101
+ const width = {
102
+ priority: Math.max(headers.priority.length, ...rows.map((r) => r.priority.length)),
103
+ enabled: Math.max(headers.enabled.length, ...rows.map((r) => r.enabled.length)),
104
+ tags: Math.max(headers.tags.length, ...rows.map((r) => r.tags.length)),
105
+ };
106
+ const pad = (text, len) => text.padEnd(len);
107
+ const lines = [
108
+ `${pad(headers.priority, width.priority)} ${pad(headers.enabled, width.enabled)} ${pad(headers.tags, width.tags)} ${headers.path}`,
109
+ ];
110
+ for (const r of rows) {
111
+ lines.push(`${pad(r.priority, width.priority)} ${pad(r.enabled, width.enabled)} ${pad(r.tags, width.tags)} ${r.path}`);
112
+ }
113
+ return `${lines.join('\n')}\n`;
114
+ }
115
+ async function handleList(store, rest, stdout, stderr) {
116
+ let asJson = false;
117
+ for (const arg of rest) {
118
+ if (arg === '--json') {
119
+ asJson = true;
120
+ }
121
+ else {
122
+ stderr(`skillforge folders list: unknown flag: ${arg}\n`);
123
+ return 2;
124
+ }
125
+ }
126
+ const config = await store.load();
127
+ if (asJson) {
128
+ stdout(`${JSON.stringify({ folders: config.folders }, null, 2)}\n`);
129
+ }
130
+ else {
131
+ stdout(formatFoldersTable(config.folders));
132
+ }
133
+ return 0;
134
+ }
135
+ async function handleAdd(store, rest, stdout, stderr, isDirectory) {
136
+ const rawPath = rest[0];
137
+ if (rawPath === undefined || rawPath.startsWith('--')) {
138
+ stderr(`skillforge folders add: missing <path>\n`);
139
+ return 2;
140
+ }
141
+ const flags = parseAddFlags(rest.slice(1));
142
+ if (flags === null) {
143
+ stderr(`skillforge folders add: invalid or malformed flag\n`);
144
+ return 2;
145
+ }
146
+ const absPath = resolve(rawPath);
147
+ if (!(await isDirectory(absPath))) {
148
+ stderr(`skillforge folders add: path does not exist or is not a directory: ${absPath}\n`);
149
+ return 1;
150
+ }
151
+ const config = await store.load();
152
+ const alreadyPresent = config.folders.some((f) => resolve(f.path) === absPath);
153
+ if (alreadyPresent) {
154
+ stdout(`Folder already registered: ${absPath}\n`);
155
+ return 0;
156
+ }
157
+ const entry = {
158
+ path: absPath,
159
+ priority: flags.priority ?? 100,
160
+ enabled: !flags.disabled,
161
+ tags: flags.tags ?? [],
162
+ };
163
+ config.folders.push(entry);
164
+ await store.save(config);
165
+ stdout(`Registered folder: ${absPath}\n`);
166
+ // Informational only: a conflict does not block the add or change the exit code.
167
+ const conflict = detectSkillSourceConflict(absPath);
168
+ if (conflict !== null) {
169
+ stdout(`${formatConflictHint(conflict)}\n`);
170
+ }
171
+ return 0;
172
+ }
173
+ async function handleRemove(store, rest, stdout, stderr) {
174
+ const rawPath = rest[0];
175
+ if (rawPath === undefined || rawPath.startsWith('--')) {
176
+ stderr(`skillforge folders remove: missing <path>\n`);
177
+ return 2;
178
+ }
179
+ const absPath = resolve(rawPath);
180
+ const config = await store.load();
181
+ const before = config.folders.length;
182
+ config.folders = config.folders.filter((f) => resolve(f.path) !== absPath);
183
+ if (config.folders.length === before) {
184
+ stderr(`skillforge folders remove: no registered folder matches: ${absPath}\n`);
185
+ return 1;
186
+ }
187
+ await store.save(config);
188
+ stdout(`Removed folder: ${absPath}\n`);
189
+ return 0;
190
+ }
191
+ async function handleReset(store, rest, stdout, stderr) {
192
+ const confirmed = rest.includes('--yes');
193
+ for (const arg of rest) {
194
+ if (arg !== '--yes') {
195
+ stderr(`skillforge folders reset: unknown flag: ${arg}\n`);
196
+ return 2;
197
+ }
198
+ }
199
+ if (!confirmed) {
200
+ const config = await store.load();
201
+ stdout(`Would reset ${config.folders.length} folder(s) to the default (empty) list.\n` +
202
+ `Re-run with --yes to apply. No changes were made.\n`);
203
+ return 0;
204
+ }
205
+ const config = await store.load();
206
+ config.folders = defaultConfig().folders;
207
+ await store.save(config);
208
+ stdout(`Reset folders to the default (empty) list.\n`);
209
+ return 0;
210
+ }
211
+ /**
212
+ * `folders` subcommand entry. Returns an exit code:
213
+ * - 0 on success
214
+ * - 1 on a runtime/validation failure (e.g. bad path)
215
+ * - 2 on a missing/unknown sub-action or malformed flag
216
+ */
217
+ export async function main(rawArgv, deps = {}) {
218
+ const stdout = deps.stdout ?? ((text) => process.stdout.write(text));
219
+ const stderr = deps.stderr ?? ((text) => process.stderr.write(text));
220
+ const isDirectory = deps.isDirectory ?? defaultIsDirectory;
221
+ const store = new ConfigStore({ filePath: deps.configPath ?? defaultConfigPath() });
222
+ const action = rawArgv[0];
223
+ const rest = rawArgv.slice(1);
224
+ try {
225
+ switch (action) {
226
+ case 'list':
227
+ return await handleList(store, rest, stdout, stderr);
228
+ case 'add':
229
+ return await handleAdd(store, rest, stdout, stderr, isDirectory);
230
+ case 'remove':
231
+ return await handleRemove(store, rest, stdout, stderr);
232
+ case 'reset':
233
+ return await handleReset(store, rest, stdout, stderr);
234
+ default: {
235
+ if (action !== undefined) {
236
+ stderr(`skillforge folders: unknown action: ${action}\n\n`);
237
+ }
238
+ stderr(USAGE);
239
+ return 2;
240
+ }
241
+ }
242
+ }
243
+ catch (err) {
244
+ const msg = err instanceof Error ? err.message : String(err);
245
+ stderr(`skillforge folders: ${msg}\n`);
246
+ return 1;
247
+ }
248
+ }
249
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/cli/folders.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EACL,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAW5C,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEF,KAAK,UAAU,kBAAkB,CAAC,CAAS;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,SAAS,aAAa,CACpB,IAAc;IAEd,IAAI,QAA4B,CAAC;IACjC,IAAI,IAA0B,CAAC;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtC,QAAQ,GAAG,CAAC,CAAC;YACb,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACrC,IAAI,GAAG,KAAK;iBACT,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAsB;IAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,0BAA0B,CAAC;IACpC,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACjC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;QAChD,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzF,MAAM,KAAK,GAAG;QACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACvE,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG;QACZ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE;KACtI,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAC9G,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAkB,EAClB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,0CAA0C,GAAG,IAAI,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAkB,EAClB,IAAc,EACd,MAA2B,EAC3B,MAA2B,EAC3B,WAA4C;IAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,0CAA0C,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,qDAAqD,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,sEAAsE,OAAO,IAAI,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;IAC/E,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,8BAA8B,OAAO,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAgB;QACzB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG;QAC/B,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;KACvB,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;IAC1C,iFAAiF;IACjF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAkB,EAClB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,6CAA6C,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACrC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,4DAA4D,OAAO,IAAI,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAkB,EAClB,IAAc,EACd,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,2CAA2C,GAAG,IAAI,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,CACJ,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,2CAA2C;YAC7E,qDAAqD,CACxD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC;IACzC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,8CAA8C,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,EAAE,OAAoB,EAAE;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,IAAI,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,KAAK,KAAK;gBACR,OAAO,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,KAAK,QAAQ;gBACX,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,OAAO;gBACV,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC,CAAC;gBACR,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,uCAAuC,MAAM,MAAM,CAAC,CAAC;gBAC9D,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -14,6 +14,7 @@
14
14
  * skillforge install --all --entry local --binary-path /abs/path/to/server.js
15
15
  * skillforge install --claude --force
16
16
  */
17
+ import type { Scope } from '../installers/paths.js';
17
18
  import type { Installer } from '../installers/types.js';
18
19
  export interface ParsedArgs {
19
20
  claude: boolean;
@@ -25,6 +26,7 @@ export interface ParsedArgs {
25
26
  force: boolean;
26
27
  entry: 'npx' | 'local';
27
28
  binaryPath?: string;
29
+ scope: Scope;
28
30
  showHelp: boolean;
29
31
  }
30
32
  export declare class UsageError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AA0BD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA+DpD;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;AAkCD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDtF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7D"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAoCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwEpD;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAwCD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAuEtF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7D"}