@klhapp/skillmux 1.3.3 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +64 -23
- package/docs/README.md +42 -17
- package/docs/assets/architecture.svg +42 -44
- package/docs/cli.md +49 -7
- package/docs/concepts.md +42 -19
- package/docs/configuration.md +53 -7
- package/docs/deployment.md +76 -20
- package/docs/getting-started.md +62 -18
- package/docs/mcp-routing.md +11 -4
- package/docs/releasing.md +11 -4
- package/docs/schema.json +1 -2
- package/docs/skill-management.md +14 -9
- package/docs/troubleshooting.md +85 -5
- package/package.json +1 -1
- package/src/cli.ts +61 -6
- package/src/commands/config.ts +2 -0
- package/src/config-service.ts +8 -0
- package/src/config-watcher.ts +11 -8
- package/src/deployment.ts +39 -0
- package/src/doctor.ts +47 -18
- package/src/metrics.ts +18 -0
- package/src/output.ts +5 -1
- package/src/router-core.ts +6 -1
- package/src/server.ts +60 -42
package/docs/configuration.md
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Configuration
|
|
2
2
|
|
|
3
|
-
Skillmux manages one
|
|
4
|
-
running in the Skillmux process.
|
|
3
|
+
Skillmux manages one configured vault checkout and defaults to FTS5 plus
|
|
4
|
+
GTE-small running in the Skillmux process. The vault source of truth is the
|
|
5
|
+
logical collection; a vault checkout is its physical copy. Most users need no
|
|
6
|
+
config file.
|
|
5
7
|
|
|
6
8
|
Deployment and inference use separate terms:
|
|
7
9
|
|
|
@@ -13,14 +15,30 @@ Deployment and inference use separate terms:
|
|
|
13
15
|
A shared HTTP deployment can use local inference. A local stdio deployment can
|
|
14
16
|
use remote inference.
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
Published server images set `SKILLMUX_IMAGE_VARIANT=full` or
|
|
19
|
+
`SKILLMUX_IMAGE_VARIANT=slim` themselves. It is an operational identity value,
|
|
20
|
+
not an inference setting; use `doctor`, `config status`, `/health/ready`, or
|
|
21
|
+
the deployment-info metric to inspect it. Do not put credentials or token
|
|
22
|
+
values in any of those outputs.
|
|
23
|
+
|
|
24
|
+
Read [Concepts](concepts.md#vault-source-of-truth-and-checkouts) for vault
|
|
25
|
+
terms and the delivery model. For detailed CLI
|
|
17
26
|
commands, target resolution, and automation envelopes, see
|
|
18
|
-
[CLI reference](cli.md). For
|
|
27
|
+
[CLI reference](cli.md). For Linux CLI installation, see the
|
|
28
|
+
[pinned checksum-verified download](getting-started.md#install-the-cli) or the
|
|
29
|
+
[attested GitHub CLI path](getting-started.md#install-with-github-cli-attestation).
|
|
30
|
+
For labelled datasets, threshold certification,
|
|
19
31
|
reference values, and the apply lifecycle, see
|
|
20
32
|
[Policy calibration](calibration.md).
|
|
21
33
|
|
|
22
34
|
## Machine config bootstrap
|
|
23
35
|
|
|
36
|
+
Configuration is optional: `skillmux serve` and `skillmux serve --transport
|
|
37
|
+
http` start with defaults even when `~/.config/skillmux` does not exist. The
|
|
38
|
+
optional config watcher does not create that directory; reload stays inactive
|
|
39
|
+
until the server starts with a watchable config parent. Once active, malformed
|
|
40
|
+
updates are reported and the last known good configuration remains in use.
|
|
41
|
+
|
|
24
42
|
Create `~/.config/skillmux/config.toml` from a populated vault:
|
|
25
43
|
|
|
26
44
|
```sh
|
|
@@ -48,7 +66,7 @@ mode = "local"
|
|
|
48
66
|
The versioned `gte-small-v1` configuration uses normalized, mean-pooled
|
|
49
67
|
`Xenova/gte-small` embeddings with 384 dimensions, quantized to q8 on CPU.
|
|
50
68
|
Skillmux CLI installations download the model when inference first
|
|
51
|
-
loads it and cache it in `~/.cache/skillmux/models`. The full
|
|
69
|
+
loads it and cache it in `~/.cache/skillmux/models`. The full image
|
|
52
70
|
already contains the model.
|
|
53
71
|
|
|
54
72
|
Skillmux combines FTS5 and cosine result lists with reciprocal-rank fusion.
|
|
@@ -138,6 +156,13 @@ clearly-scoped BGE reference profile for smoke tests.
|
|
|
138
156
|
|
|
139
157
|
## HTTP server
|
|
140
158
|
|
|
159
|
+
The HTTP server provides separate MCP and administrative surfaces:
|
|
160
|
+
|
|
161
|
+
| Surface | User | Purpose | CLI required |
|
|
162
|
+
| --- | --- | --- | --- |
|
|
163
|
+
| `/mcp` | AI clients | Resolve and fetch skills | No |
|
|
164
|
+
| `/admin/v1/*` | Operators | Inspect or update server configuration | Yes, when using named CLI contexts |
|
|
165
|
+
|
|
141
166
|
```toml
|
|
142
167
|
[server]
|
|
143
168
|
hostname = "127.0.0.1"
|
|
@@ -149,12 +174,28 @@ allowed_origins = []
|
|
|
149
174
|
enabled = false
|
|
150
175
|
requests_per_minute = 60
|
|
151
176
|
trust_proxy = false
|
|
177
|
+
|
|
178
|
+
[server.admin]
|
|
179
|
+
enabled = false
|
|
180
|
+
token_env = "SKILLMUX_ADMIN_TOKEN"
|
|
152
181
|
```
|
|
153
182
|
|
|
154
183
|
Defaults are loopback-only (`hostname = "127.0.0.1"`) with CORS deny-by-default (`allowed_origins = []`) — a zero-config `skillmux serve --transport http` is not reachable from the network or from a browser tab on another origin. Docker sets `hostname` to `0.0.0.0` automatically (`RUNNING_IN_DOCKER=true`) since port-mapping needs the container to accept connections on all interfaces.
|
|
155
184
|
|
|
156
185
|
Before exposing HTTP beyond localhost, set `hostname` to a reachable interface, `auth_enabled = true` with a token, and populate `allowed_origins` with the specific origins that need browser access. `rate_limit.trust_proxy` should stay `false` unless a trusted reverse proxy sets `X-Forwarded-For` — it's otherwise a client-controlled, spoofable header and trusting it defeats per-client rate limiting.
|
|
157
186
|
|
|
187
|
+
`server.auth_token_env` names the MCP token for AI clients calling `/mcp`.
|
|
188
|
+
`server.admin.token_env` names a distinct administrative token for operators
|
|
189
|
+
calling `/admin/v1/*` when that API is enabled. Do not reuse or imply either
|
|
190
|
+
token authorizes the other surface. Named CLI contexts use the administrative
|
|
191
|
+
token to inspect or update the deployed server configuration only; they cannot
|
|
192
|
+
install, pin, synchronize, or otherwise manage remote client skill directories.
|
|
193
|
+
Docker images likewise do not manage host agent directories.
|
|
194
|
+
Inside the server image, only read-only `config show`, `get`, `validate`,
|
|
195
|
+
`diff`, and `status` are available. Run `config init` or `config set` with the
|
|
196
|
+
host CLI; the image returns `CONTAINER_COMMAND_UNSUPPORTED` with the exact host
|
|
197
|
+
command to run. See [Deployment](deployment.md#container-command-contract).
|
|
198
|
+
|
|
158
199
|
## Tiers and the manifest
|
|
159
200
|
|
|
160
201
|
`skillmux init` and `skillmux sync` manage native delivery by pinning selected
|
|
@@ -205,7 +246,12 @@ Both commands accept one or more `skill_id` arguments per call; all of them are
|
|
|
205
246
|
>
|
|
206
247
|
> **Breaking change:** `[project.<group>].repos` has been renamed to `paths` — it was never required to be a git repository, just a local directory, and the old name collided in meaning with `skillmux install <repo>`'s unrelated git-source `repo` concept. A manifest still using `repos` fails to parse with an error pointing at `paths`; migrate by renaming the key (values are unchanged).
|
|
207
248
|
|
|
208
|
-
Every `[core]`/`[project.*]` skill_id must resolve from the
|
|
249
|
+
Every `[core]`/`[project.*]` skill_id must resolve from the configured
|
|
250
|
+
`vault_path` checkout — pinning a skill that only exists in a
|
|
251
|
+
`local_vault_paths` entry (see below) fails `sync` with a distinct error, since
|
|
252
|
+
the manifest is meant to be portable across machines and a machine-local
|
|
253
|
+
override wouldn't exist elsewhere. `doctor` validates the manifest as part of
|
|
254
|
+
its checks, surfacing any violation without writing anything back.
|
|
209
255
|
|
|
210
256
|
### Ownership marker
|
|
211
257
|
|
|
@@ -236,7 +282,7 @@ cannot be inferred.
|
|
|
236
282
|
`local_vault_paths` (in `config.toml`, alongside `vault_path`) lets one machine layer override-only skills on top of the shared vault — a skill being authored locally, a machine-specific script, or a patched copy of an upstream skill — without touching `vault_path` itself:
|
|
237
283
|
|
|
238
284
|
```toml
|
|
239
|
-
vault_path = "~/skills" #
|
|
285
|
+
vault_path = "~/skills" # configured checkout; owns skillmux.toml and the sync git hook
|
|
240
286
|
local_vault_paths = ["~/skills-local"] # optional, default []: override-only, checked first
|
|
241
287
|
```
|
|
242
288
|
|
package/docs/deployment.md
CHANGED
|
@@ -6,12 +6,16 @@ Choose a deployment from the client count and inference source:
|
|
|
6
6
|
| --- | --- | --- | --- |
|
|
7
7
|
| Native skill management | Skillmux CLI | Filesystem | None required |
|
|
8
8
|
| Local MCP retrieval | Skillmux CLI | stdio | Downloaded GTE-small |
|
|
9
|
-
| Shared MCP with local inference |
|
|
10
|
-
| Shared MCP with remote or lexical retrieval |
|
|
9
|
+
| Shared MCP with local inference | Skillmux server (full image) | Streamable HTTP | Bundled GTE-small |
|
|
10
|
+
| Shared MCP with remote or lexical retrieval | Skillmux server (slim image, advanced) | Streamable HTTP | Remote endpoint or lexical fallback |
|
|
11
11
|
|
|
12
12
|
Install the CLI with either the Bun package or standalone Linux executable;
|
|
13
|
-
they expose the same commands and can also serve HTTP.
|
|
14
|
-
|
|
13
|
+
they expose the same commands and can also serve HTTP. The Linux executable
|
|
14
|
+
has a [pinned, checksum-verified download](getting-started.md#install-the-cli)
|
|
15
|
+
that defaults to `~/.local/bin`, plus an
|
|
16
|
+
[attested GitHub CLI path](getting-started.md#install-with-github-cli-attestation).
|
|
17
|
+
Deploy the full image
|
|
18
|
+
for a shared Skillmux server by default. Docker can serve stdio when a client
|
|
15
19
|
requires a container command; use slim only for remote or lexical retrieval.
|
|
16
20
|
|
|
17
21
|
“Local inference” means the model runs in the Skillmux process. It does not
|
|
@@ -36,7 +40,11 @@ skillmux serve --transport http --port 3000
|
|
|
36
40
|
The native HTTP server binds `127.0.0.1` by default. Configure authentication
|
|
37
41
|
and a reachable hostname before serving other machines.
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
Neither native command needs a config file or an existing `~/.config/skillmux`
|
|
44
|
+
directory. They use safe defaults until you add a config for a vault checkout,
|
|
45
|
+
remote inference, or server policy.
|
|
46
|
+
|
|
47
|
+
## Skillmux server images
|
|
40
48
|
|
|
41
49
|
Skillmux publishes Linux AMD64 and ARM64 images to GHCR and Docker Hub:
|
|
42
50
|
|
|
@@ -82,6 +90,10 @@ without arguments starts Streamable HTTP MCP on port 3000:
|
|
|
82
90
|
docker run ghcr.io/klhq/skillmux:latest
|
|
83
91
|
```
|
|
84
92
|
|
|
93
|
+
This default works without mounting or creating a config path. The image uses
|
|
94
|
+
`/vault` and `/data`; mount them when you need a persistent vault checkout or
|
|
95
|
+
index state.
|
|
96
|
+
|
|
85
97
|
Arguments after the image replace that default, so one-shot maintenance and
|
|
86
98
|
stdio use the same image:
|
|
87
99
|
|
|
@@ -105,6 +117,13 @@ context management, calibration, evaluation, and configuration initialization
|
|
|
105
117
|
or mutation. Install the Skillmux CLI on the host when a command needs to
|
|
106
118
|
manage a local vault or agent directory.
|
|
107
119
|
|
|
120
|
+
A rejected command exits with code 2 and tells you the exact host command to
|
|
121
|
+
run. In `--json` mode, the error code is
|
|
122
|
+
`CONTAINER_COMMAND_UNSUPPORTED`; `error.details.rejected_command`,
|
|
123
|
+
`recommended_host_command`, and `documentation` are stable automation fields.
|
|
124
|
+
For example, `docker run --rm ghcr.io/klhq/skillmux:latest models download
|
|
125
|
+
--json` recommends `skillmux models download` on the host.
|
|
126
|
+
|
|
108
127
|
## Slim image
|
|
109
128
|
|
|
110
129
|
The slim image stays ready in lexical mode without an inference endpoint.
|
|
@@ -154,6 +173,19 @@ docker run --no-healthcheck -i --rm \
|
|
|
154
173
|
The container must keep standard input open, so use `-i`. Disable the baked
|
|
155
174
|
HTTP health check for stdio because no HTTP listener is started.
|
|
156
175
|
|
|
176
|
+
## HTTP surfaces
|
|
177
|
+
|
|
178
|
+
The shared server exposes two distinct HTTP surfaces:
|
|
179
|
+
|
|
180
|
+
| Surface | User | Purpose | CLI required |
|
|
181
|
+
| --- | --- | --- | --- |
|
|
182
|
+
| `/mcp` | AI clients | Resolve and fetch skills | No |
|
|
183
|
+
| `/admin/v1/*` | Operators | Inspect or update server configuration | Yes, when using named CLI contexts |
|
|
184
|
+
|
|
185
|
+
Configure and distribute separate bearer tokens. An MCP token authenticates an
|
|
186
|
+
AI client to `/mcp` only; an administrative token authenticates an operator to
|
|
187
|
+
`/admin/v1/*` only. Neither token grants access to the other surface.
|
|
188
|
+
|
|
157
189
|
## Expose HTTP safely
|
|
158
190
|
|
|
159
191
|
The Skillmux CLI binds `127.0.0.1`. Docker binds `0.0.0.0` so
|
|
@@ -170,24 +202,32 @@ allowed_origins = []
|
|
|
170
202
|
enabled = true
|
|
171
203
|
requests_per_minute = 60
|
|
172
204
|
trust_proxy = false
|
|
205
|
+
|
|
206
|
+
[server.admin]
|
|
207
|
+
enabled = true
|
|
208
|
+
token_env = "SKILLMUX_ADMIN_TOKEN"
|
|
173
209
|
```
|
|
174
210
|
|
|
175
211
|
Set the token in the process environment:
|
|
176
212
|
|
|
177
213
|
```sh
|
|
178
|
-
export SKILLMUX_AUTH_TOKEN="replace-with-
|
|
214
|
+
export SKILLMUX_AUTH_TOKEN="replace-with-an-mcp-token"
|
|
215
|
+
export SKILLMUX_ADMIN_TOKEN="replace-with-a-separate-admin-token"
|
|
179
216
|
skillmux serve --transport http
|
|
180
217
|
```
|
|
181
218
|
|
|
182
219
|
Clients send:
|
|
183
220
|
|
|
184
221
|
```text
|
|
185
|
-
Authorization: Bearer replace-with-
|
|
222
|
+
Authorization: Bearer replace-with-an-mcp-token
|
|
186
223
|
```
|
|
187
224
|
|
|
188
225
|
`allowed_origins` controls browser CORS requests. Requests without an `Origin`
|
|
189
226
|
header, including MCP clients and curl, do not need a CORS entry.
|
|
190
227
|
|
|
228
|
+
The `Authorization` example above is for an MCP client calling `/mcp`.
|
|
229
|
+
Administrative requests instead use the token named by `server.admin.token_env`.
|
|
230
|
+
|
|
191
231
|
Keep `trust_proxy = false` unless a trusted reverse proxy overwrites
|
|
192
232
|
`X-Forwarded-For`. A client can spoof that header when it reaches Skillmux
|
|
193
233
|
directly.
|
|
@@ -199,22 +239,27 @@ The HTTP server provides:
|
|
|
199
239
|
| Endpoint | Purpose |
|
|
200
240
|
| --- | --- |
|
|
201
241
|
| `GET /health/live` | Process liveness |
|
|
202
|
-
| `GET /health/ready` | Vault, index, inference,
|
|
242
|
+
| `GET /health/ready` | Vault, index, inference, active capability, version, runtime, and image variant |
|
|
203
243
|
| `GET /health` | Compatibility alias for liveness |
|
|
204
244
|
| `GET /metrics` | Prometheus text exposition |
|
|
205
245
|
| `GET /stats` | Aggregated routing outcomes for `skillmux report` |
|
|
206
246
|
| `POST /mcp` | Streamable HTTP MCP transport |
|
|
247
|
+
| `/admin/v1/*` | Administrative configuration API (when enabled) |
|
|
207
248
|
|
|
208
249
|
The Docker health check calls `/health/ready`.
|
|
209
250
|
|
|
210
|
-
Prometheus metrics cover request totals, resolve outcomes, latency, errors,
|
|
211
|
-
rate-limit rejections
|
|
212
|
-
|
|
251
|
+
Prometheus metrics cover request totals, resolve outcomes, latency, errors,
|
|
252
|
+
rate-limit rejections, and a `skill_router_deployment_info` gauge labelled with
|
|
253
|
+
`version`, `runtime`, and `image_variant`. The values match `skillmux doctor`,
|
|
254
|
+
`skillmux config status`, and `/health/ready`; use `image_variant="none"` for
|
|
255
|
+
a host runtime. These operational outputs never include credentials, API keys,
|
|
256
|
+
or token values. Health and metrics do not require bearer authentication, but
|
|
257
|
+
`/stats` does when server authentication is enabled. CORS still applies to
|
|
213
258
|
browser requests.
|
|
214
259
|
|
|
215
260
|
## Remote administration
|
|
216
261
|
|
|
217
|
-
Name a deployed server without storing its token:
|
|
262
|
+
Name a deployed server without storing its **administrative** token:
|
|
218
263
|
|
|
219
264
|
```sh
|
|
220
265
|
skillmux context add prod \
|
|
@@ -225,17 +270,25 @@ skillmux config status
|
|
|
225
270
|
```
|
|
226
271
|
|
|
227
272
|
The context stores the token environment variable name. Export its value in
|
|
228
|
-
the shell before running admin commands.
|
|
273
|
+
the shell before running admin commands. This token is separate from the MCP
|
|
274
|
+
token configured with `server.auth_token_env`; it does not authenticate MCP
|
|
275
|
+
clients.
|
|
229
276
|
|
|
230
277
|
Enable the admin API and use a separate admin token in server configuration.
|
|
231
278
|
Read [CLI reference](cli.md#administrative-http-api-adminv1) for routes and
|
|
232
279
|
[Configuration](configuration.md#http-server) for reload behavior.
|
|
233
280
|
|
|
281
|
+
Named contexts administer the deployed server configuration only. They do not
|
|
282
|
+
install, pin, synchronize, or otherwise manage skill directories on remote
|
|
283
|
+
client machines. Run those filesystem-management commands through Skillmux CLI
|
|
284
|
+
on the machine that owns the directories. The full and slim server images read
|
|
285
|
+
their mounted vault checkout and do not manage host agent directories.
|
|
286
|
+
|
|
234
287
|
## Persistent data and backups
|
|
235
288
|
|
|
236
289
|
Persist `state_dir` to retain the index, audit log, and calibration evidence.
|
|
237
|
-
Skill content remains in the vault and should use its own
|
|
238
|
-
workflow.
|
|
290
|
+
Skill content remains in the server's vault checkout and should use its own
|
|
291
|
+
backup or Git workflow.
|
|
239
292
|
|
|
240
293
|
Treat the state database as sensitive because audit rows can contain raw user
|
|
241
294
|
queries. Stop the process or use SQLite-safe backup tooling before copying a
|
|
@@ -243,8 +296,11 @@ live database.
|
|
|
243
296
|
|
|
244
297
|
## Native pins with shared retrieval
|
|
245
298
|
|
|
246
|
-
For the combined topology, use one Git-backed vault source of truth
|
|
247
|
-
machine that manages native skills keeps its
|
|
248
|
-
the shared service mounts its own
|
|
249
|
-
|
|
250
|
-
|
|
299
|
+
For the combined topology, use one Git-backed vault source of truth. A vault
|
|
300
|
+
checkout is a physical copy: each machine that manages native skills keeps its
|
|
301
|
+
own checkout and runs the Skillmux CLI; the shared service mounts its own
|
|
302
|
+
checkout for retrieval. On one machine, `~/skills` can be both the source of
|
|
303
|
+
truth and its checkout. Skillmux does not pull, push, replicate, or determine
|
|
304
|
+
freshness between checkouts; Git and your deployment process own that
|
|
305
|
+
responsibility. The server image reads its mounted checkout and does not manage
|
|
306
|
+
host agent directories.
|
package/docs/getting-started.md
CHANGED
|
@@ -7,7 +7,7 @@ an installation.
|
|
|
7
7
|
| --- | --- | --- |
|
|
8
8
|
| [Manage native skills](#manage-native-skills) | Managed links in client skill directories | Skillmux CLI |
|
|
9
9
|
| [Add local MCP retrieval](#add-local-mcp-retrieval) | Local stdio MCP | Skillmux CLI |
|
|
10
|
-
| [Run a shared MCP service](#run-a-shared-mcp-service) | Streamable HTTP MCP |
|
|
10
|
+
| [Run a shared MCP service](#run-a-shared-mcp-service) | Streamable HTTP MCP | Skillmux server (full image) |
|
|
11
11
|
|
|
12
12
|
Native management and local MCP retrieval can run together. Complete both
|
|
13
13
|
recipes if you want pinned skills plus on-demand access to the rest of the
|
|
@@ -25,23 +25,54 @@ skillmux --help
|
|
|
25
25
|
|
|
26
26
|
Native target sync needs permission to create directory symlinks on Windows.
|
|
27
27
|
|
|
28
|
-
Linux users
|
|
29
|
-
|
|
28
|
+
Linux users can install the standalone executable without the GitHub CLI or a
|
|
29
|
+
package manager. This example selects AMD64 or ARM64, downloads the pinned
|
|
30
|
+
`v1.3.4` release, verifies the SHA-256 digest published for that release, and
|
|
31
|
+
installs to the user-writable default `~/.local/bin`:
|
|
30
32
|
|
|
31
33
|
```sh
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
version=v1.3.4
|
|
35
|
+
case "$(uname -m)" in
|
|
36
|
+
x86_64|amd64) asset=skillmux-linux-amd64; sha256=0d0155475748a937ac9b5878c57e1fa14d8fe6957317cb43bbdafd710cbc1966 ;;
|
|
37
|
+
aarch64|arm64) asset=skillmux-linux-arm64; sha256=8cd186707221a8fefbb79eac46ef14d0c5fdae08a2d76e64a01af17a80af0e06 ;;
|
|
38
|
+
*) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;;
|
|
39
|
+
esac
|
|
40
|
+
bin_dir="${SKILLMUX_BIN_DIR:-$HOME/.local/bin}"
|
|
41
|
+
curl --fail --location --output "$asset" "https://github.com/klhq/skillmux/releases/download/$version/$asset"
|
|
42
|
+
printf '%s %s\n' "$sha256" "$asset" | sha256sum --check -
|
|
43
|
+
install -Dm755 "$asset" "$bin_dir/skillmux"
|
|
36
44
|
```
|
|
37
45
|
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
Ensure `~/.local/bin` is on `PATH`. To use another user-writable location, set
|
|
47
|
+
`SKILLMUX_BIN_DIR` before the command. A system-wide installation is an
|
|
48
|
+
explicit choice: `sudo install -Dm755 "$asset" /usr/local/bin/skillmux`.
|
|
40
49
|
|
|
41
|
-
|
|
50
|
+
### Install with GitHub CLI attestation
|
|
42
51
|
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
If you want GitHub build-provenance verification, use the GitHub CLI instead.
|
|
53
|
+
This keeps the same pinned release and user-writable install location:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
version=v1.3.4
|
|
57
|
+
case "$(uname -m)" in
|
|
58
|
+
x86_64|amd64) asset=skillmux-linux-amd64 ;;
|
|
59
|
+
aarch64|arm64) asset=skillmux-linux-arm64 ;;
|
|
60
|
+
*) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;;
|
|
61
|
+
esac
|
|
62
|
+
bin_dir="${SKILLMUX_BIN_DIR:-$HOME/.local/bin}"
|
|
63
|
+
mkdir -p "$bin_dir"
|
|
64
|
+
gh release download "$version" --repo klhq/skillmux --pattern "$asset" --dir "$bin_dir"
|
|
65
|
+
gh attestation verify "$bin_dir/$asset" --repo klhq/skillmux
|
|
66
|
+
install -m755 "$bin_dir/$asset" "$bin_dir/skillmux"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The Bun package and standalone Linux executable expose the same Skillmux CLI
|
|
70
|
+
commands.
|
|
71
|
+
|
|
72
|
+
## Prepare a vault checkout
|
|
73
|
+
|
|
74
|
+
Skillmux defaults to the `~/skills` vault checkout. Each direct child directory
|
|
75
|
+
represents one skill:
|
|
45
76
|
|
|
46
77
|
```text
|
|
47
78
|
~/skills/
|
|
@@ -95,9 +126,9 @@ The planner:
|
|
|
95
126
|
5. applies the plan after confirmation.
|
|
96
127
|
|
|
97
128
|
Skillmux writes machine config under `~/.config/skillmux`, stores tier policy
|
|
98
|
-
in
|
|
99
|
-
`.skillmux` marker. It preserves unmanaged files and existing
|
|
100
|
-
text.
|
|
129
|
+
in the configured vault checkout's `skillmux.toml`, and records its entries in
|
|
130
|
+
each target's `.skillmux` marker. It preserves unmanaged files and existing
|
|
131
|
+
instruction text.
|
|
101
132
|
|
|
102
133
|
Use explicit flags for automation:
|
|
103
134
|
|
|
@@ -214,13 +245,26 @@ authentication before exposing the service beyond a trusted host. Continue
|
|
|
214
245
|
with [Deployment](deployment.md) for remote inference, network policy,
|
|
215
246
|
monitoring, and backups.
|
|
216
247
|
|
|
248
|
+
The server keeps its two HTTP surfaces separate:
|
|
249
|
+
|
|
250
|
+
| Surface | User | Purpose | CLI required |
|
|
251
|
+
| --- | --- | --- | --- |
|
|
252
|
+
| `/mcp` | AI clients | Resolve and fetch skills | No |
|
|
253
|
+
| `/admin/v1/*` | Operators | Inspect or update server configuration | Yes, when using named CLI contexts |
|
|
254
|
+
|
|
255
|
+
Configure separate MCP and administrative bearer tokens; one never grants
|
|
256
|
+
access to the other. Named CLI contexts can administer this deployed server,
|
|
257
|
+
but cannot install, pin, synchronize, or otherwise manage skill directories on
|
|
258
|
+
remote client machines. See [Deployment](deployment.md#http-surfaces).
|
|
259
|
+
|
|
217
260
|
Manage the mounted vault on the host. A retrieval-only container should mount
|
|
218
261
|
it read-only.
|
|
219
262
|
|
|
220
263
|
## Combine native pins with shared retrieval
|
|
221
264
|
|
|
222
265
|
Use this topology when users need native core or project pins and also one
|
|
223
|
-
shared MCP endpoint. Keep one Git-backed vault
|
|
266
|
+
shared MCP endpoint. Keep one Git-backed vault source of truth. A vault
|
|
267
|
+
checkout is its physical copy; on one machine, `~/skills` can be both:
|
|
224
268
|
|
|
225
269
|
- each machine that owns client skill directories keeps its own checkout and
|
|
226
270
|
runs the Skillmux CLI for `init`, pinning, and `sync`;
|
|
@@ -228,8 +272,8 @@ shared MCP endpoint. Keep one Git-backed vault as the source of truth:
|
|
|
228
272
|
HTTP;
|
|
229
273
|
- MCP-only clients connect to the shared server and do not need the CLI.
|
|
230
274
|
|
|
231
|
-
Skillmux does not pull, push, replicate, or
|
|
232
|
-
and your deployment process own vault replication and freshness.
|
|
275
|
+
Skillmux does not pull, push, replicate, or determine freshness between
|
|
276
|
+
checkouts. Git and your deployment process own vault replication and freshness.
|
|
233
277
|
|
|
234
278
|
## Next steps
|
|
235
279
|
|
package/docs/mcp-routing.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# MCP routing
|
|
2
2
|
|
|
3
|
-
Skillmux exposes
|
|
4
|
-
|
|
3
|
+
Skillmux exposes its configured vault checkout through two Model Context
|
|
4
|
+
Protocol tools. A vault source of truth is the logical collection; a checkout
|
|
5
|
+
is its physical copy. Choose a transport based on where the process runs:
|
|
5
6
|
|
|
6
7
|
| Topology | Transport | Typical package |
|
|
7
8
|
| --- | --- | --- |
|
|
8
9
|
| Skillmux beside one client | stdio | Skillmux CLI |
|
|
9
|
-
| Shared Skillmux
|
|
10
|
+
| Shared Skillmux server | Streamable HTTP | Full image by default; slim image for remote or lexical retrieval |
|
|
10
11
|
|
|
11
12
|
Both transports expose the same `resolve_skill` and `fetch_skill` contract.
|
|
12
13
|
Local native pinning is optional and can run beside stdio MCP.
|
|
@@ -55,6 +56,12 @@ The default host accepts loopback connections only. Configure authentication
|
|
|
55
56
|
and network exposure before serving other machines. See
|
|
56
57
|
[Deployment](deployment.md#expose-http-safely).
|
|
57
58
|
|
|
59
|
+
This is the MCP surface for AI clients. Its bearer token applies only to
|
|
60
|
+
`/mcp`; server configuration uses the separate operator surface at
|
|
61
|
+
`/admin/v1/*`. AI clients do not need the CLI to use `/mcp`; named CLI contexts
|
|
62
|
+
are for administering the deployed server, not remote client skill directories.
|
|
63
|
+
See [Deployment](deployment.md#http-surfaces).
|
|
64
|
+
|
|
58
65
|
## Tool contract
|
|
59
66
|
|
|
60
67
|
### `resolve_skill`
|
|
@@ -115,7 +122,7 @@ Skillmux builds candidates in stages:
|
|
|
115
122
|
|
|
116
123
|
The default local inference configuration uses FTS5 and quantized
|
|
117
124
|
`Xenova/gte-small` embeddings. Skillmux CLI installations cache the
|
|
118
|
-
downloaded model under `~/.cache/skillmux/models`; the full
|
|
125
|
+
downloaded model under `~/.cache/skillmux/models`; the full image
|
|
119
126
|
includes it. The slim image starts with lexical retrieval and can call an
|
|
120
127
|
OpenAI-compatible embedding endpoint.
|
|
121
128
|
|
package/docs/releasing.md
CHANGED
|
@@ -37,10 +37,11 @@ The release workflow publishes:
|
|
|
37
37
|
|
|
38
38
|
- `skillmux-linux-amd64`
|
|
39
39
|
- `skillmux-linux-arm64`
|
|
40
|
+
- SHA-256 digests for the Linux binaries in the GitHub Release asset metadata
|
|
40
41
|
- GitHub build provenance attestations when the repository is public
|
|
41
|
-
-
|
|
42
|
+
- Skillmux server full image to GHCR and Docker Hub: `:<version>`, `:<major>.<minor>`,
|
|
42
43
|
and `:latest`; this variant includes GTE-small
|
|
43
|
-
-
|
|
44
|
+
- Skillmux server slim image to GHCR and Docker Hub: `:<version>-slim`,
|
|
44
45
|
`:<major>.<minor>-slim`, and `:latest-slim`; this variant contains no model
|
|
45
46
|
files and uses remote embeddings or lexical fallback
|
|
46
47
|
- Multi-architecture `linux/amd64` and `linux/arm64` images with SBOM and
|
|
@@ -75,10 +76,12 @@ Private repositories still publish BuildKit SBOM/provenance with container
|
|
|
75
76
|
images, but GitHub artifact attestations are skipped because GitHub does not
|
|
76
77
|
support them for user-owned private repositories.
|
|
77
78
|
|
|
78
|
-
Verify downloaded
|
|
79
|
+
Verify a downloaded binary with its published SHA-256 digest, or use GitHub
|
|
80
|
+
CLI build-provenance attestation. Keep the release tag pinned:
|
|
79
81
|
|
|
80
82
|
```bash
|
|
81
|
-
|
|
83
|
+
version=v1.3.4
|
|
84
|
+
gh release download "$version" --repo klhq/skillmux --pattern skillmux-linux-amd64
|
|
82
85
|
gh attestation verify skillmux-linux-amd64 --repo klhq/skillmux
|
|
83
86
|
./skillmux-linux-amd64 config show
|
|
84
87
|
```
|
|
@@ -93,3 +96,7 @@ docker run --rm \
|
|
|
93
96
|
|
|
94
97
|
curl --fail http://127.0.0.1:3000/health/ready
|
|
95
98
|
```
|
|
99
|
+
|
|
100
|
+
The image reads this vault checkout for retrieval; it does not manage host
|
|
101
|
+
agent directories. Git and the deployment process own replication and
|
|
102
|
+
freshness across vault checkouts.
|
package/docs/schema.json
CHANGED
package/docs/skill-management.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# Managing skills
|
|
2
2
|
|
|
3
|
-
Skillmux keeps skill content in a
|
|
4
|
-
skills into client directories.
|
|
5
|
-
|
|
3
|
+
Skillmux keeps skill content in a vault checkout and materializes selected
|
|
4
|
+
skills into client directories. The vault source of truth is the logical
|
|
5
|
+
collection; a checkout is its physical copy. This guide covers the commands
|
|
6
|
+
that change or inspect that state.
|
|
6
7
|
|
|
7
|
-
Run these commands on the machine that owns the vault and client
|
|
8
|
-
For a retrieval-only Docker service, manage the mounted
|
|
9
|
-
keep the container mount read-only
|
|
8
|
+
Run these commands on the machine that owns the vault checkout and client
|
|
9
|
+
directories. For a retrieval-only Docker service, manage the mounted checkout
|
|
10
|
+
on the host and keep the container mount read-only; the server image does not
|
|
11
|
+
manage host agent directories.
|
|
10
12
|
|
|
11
13
|
## Install from Git
|
|
12
14
|
|
|
@@ -129,13 +131,15 @@ skillmux sync
|
|
|
129
131
|
Sync compares the manifest with entries recorded in each target's `.skillmux`
|
|
130
132
|
marker. It creates missing symlinks and removes stale managed links.
|
|
131
133
|
|
|
132
|
-
Install a vault Git hook when merges can change `skillmux.toml`:
|
|
134
|
+
Install a vault-checkout Git hook when merges can change `skillmux.toml`:
|
|
133
135
|
|
|
134
136
|
```sh
|
|
135
137
|
skillmux sync --install-hook
|
|
136
138
|
```
|
|
137
139
|
|
|
138
|
-
The hook lives in the
|
|
140
|
+
The hook lives in the configured vault checkout and runs `skillmux sync` after
|
|
141
|
+
a merge. Git and your deployment process, not Skillmux, keep separate
|
|
142
|
+
checkouts replicated and fresh.
|
|
139
143
|
|
|
140
144
|
## Inspect active state
|
|
141
145
|
|
|
@@ -145,7 +149,8 @@ Find which vault root serves a skill:
|
|
|
145
149
|
skillmux skill which code-context
|
|
146
150
|
```
|
|
147
151
|
|
|
148
|
-
If a local overlay shadows the
|
|
152
|
+
If a local overlay shadows the configured checkout's copy, the output lists
|
|
153
|
+
both paths.
|
|
149
154
|
|
|
150
155
|
Inspect configuration and readiness:
|
|
151
156
|
|