@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.
@@ -1,7 +1,9 @@
1
1
  # Configuration
2
2
 
3
- Skillmux manages one canonical vault and defaults to FTS5 plus GTE-small
4
- running in the Skillmux process. Most users need no config file.
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
- Read [Concepts](concepts.md) for the vault and delivery model. For detailed CLI
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 labelled datasets, threshold certification,
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 Docker image
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 canonical `vault_path` — pinning a skill that only exists in a `local_vault_paths` entry (see below) fails `sync` with a distinct error, since the manifest is meant to be portable across machines and a machine-local override wouldn't exist elsewhere. `doctor` validates the manifest as part of its checks, surfacing any violation without writing anything back.
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" # unchanged: canonical, owns skillmux.toml and the sync git hook
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
 
@@ -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 | Full Docker image | Streamable HTTP | Bundled GTE-small |
10
- | Shared MCP with remote or lexical retrieval | Slim Docker image (advanced) | Streamable HTTP | Remote endpoint or lexical fallback |
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. Deploy the full Docker
14
- image for a shared service by default. Docker can serve stdio when a client
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
- ## Docker images
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-a-long-random-token"
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-a-long-random-token
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, and active capability |
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, and
211
- rate-limit rejections. Health and metrics do not require bearer authentication,
212
- but `/stats` does when server authentication is enabled. CORS still applies to
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 backup or Git
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: each
247
- machine that manages native skills keeps its own checkout and runs the CLI;
248
- the shared service mounts its own checkout for retrieval. Skillmux does not
249
- pull, push, replicate, or otherwise keep those vault checkouts fresh—Git and
250
- your deployment process own that responsibility.
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.
@@ -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 | Full Docker image |
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 without Bun can install the standalone AMD64 or ARM64 executable
29
- instead:
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
- gh release download --repo klhq/skillmux --pattern 'skillmux-linux-*'
33
- gh attestation verify skillmux-linux-amd64 --repo klhq/skillmux
34
- chmod +x skillmux-linux-amd64
35
- sudo install skillmux-linux-amd64 /usr/local/bin/skillmux
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
- Replace `amd64` with `arm64` on ARM64. The Bun package and standalone Linux
39
- executable expose the same Skillmux CLI commands.
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
- ## Prepare a vault
50
+ ### Install with GitHub CLI attestation
42
51
 
43
- Skillmux defaults to `~/skills`. Each direct child directory represents one
44
- skill:
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 `~/skills/skillmux.toml`, and records its entries in each target's
99
- `.skillmux` marker. It preserves unmanaged files and existing instruction
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 as the source of truth:
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 make those checkouts fresh. Git
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
 
@@ -1,12 +1,13 @@
1
1
  # MCP routing
2
2
 
3
- Skillmux exposes one vault through two Model Context Protocol tools. Choose a
4
- transport based on where the process runs:
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 service | Streamable HTTP | Full Docker image by default; slim for remote or lexical retrieval |
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 Docker image
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
- - Full image to GHCR and Docker Hub: `:<version>`, `:<major>.<minor>`,
42
+ - Skillmux server full image to GHCR and Docker Hub: `:<version>`, `:<major>.<minor>`,
42
43
  and `:latest`; this variant includes GTE-small
43
- - Slim image to GHCR and Docker Hub: `:<version>-slim`,
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 binaries with build provenance attestation:
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
- gh release download v0.1.1 --repo klhq/skillmux --pattern 'skillmux-linux-*'
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
@@ -38,8 +38,7 @@
38
38
  "query": {
39
39
  "type": "string",
40
40
  "description": "Natural-language task description to route. Normalized (NFC) by the server; never semantically rewritten.",
41
- "minLength": 1,
42
- "maxLength": 8192
41
+ "minLength": 1
43
42
  }
44
43
  },
45
44
  "required": ["query"],
@@ -1,12 +1,14 @@
1
1
  # Managing skills
2
2
 
3
- Skillmux keeps skill content in a canonical vault and materializes selected
4
- skills into client directories. This guide covers the commands that change or
5
- inspect that state.
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 directories.
8
- For a retrieval-only Docker service, manage the mounted vault on the host and
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 canonical vault and runs `skillmux sync` after a merge.
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 canonical copy, the output lists both paths.
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