@klhapp/skillmux 1.1.0 → 1.3.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 +22 -0
- package/README.md +155 -516
- package/config.example.toml +5 -4
- package/config.remote.example.toml +8 -3
- package/docs/README.md +52 -0
- package/docs/assets/architecture.svg +156 -0
- package/docs/assets/logo.png +0 -0
- package/docs/calibration.md +111 -0
- package/docs/cli.md +350 -0
- package/docs/concepts.md +165 -0
- package/docs/configuration.md +41 -8
- package/docs/deployment.md +250 -0
- package/docs/getting-started.md +239 -0
- package/docs/mcp-routing.md +172 -0
- package/docs/releasing.md +4 -3
- package/docs/skill-management.md +209 -0
- package/docs/troubleshooting.md +199 -0
- package/package.json +3 -5
- package/src/adapters.ts +33 -40
- package/src/calibrate.ts +165 -9
- package/src/cli.ts +51 -6
- package/src/config-watcher.ts +5 -1
- package/src/dataset-generator.ts +75 -96
- package/src/server.ts +10 -70
package/docs/cli.md
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# CLI reference and automation
|
|
2
|
+
|
|
3
|
+
The Bun package and standalone Linux executable expose the same CLI. Native
|
|
4
|
+
management belongs on the machine that owns the client skill directories:
|
|
5
|
+
use the built-in `local` target for `init`, `install`, pinning, and `sync`.
|
|
6
|
+
Named remote contexts administer shared-server configuration through its
|
|
7
|
+
administrative API only; they do not install, pin, or synchronize skills in
|
|
8
|
+
client directories.
|
|
9
|
+
|
|
10
|
+
In this guide, **local target** means the filesystem and process selected by
|
|
11
|
+
the built-in CLI context. It does not describe local inference. A local target
|
|
12
|
+
can call remote inference endpoints.
|
|
13
|
+
|
|
14
|
+
For task-oriented workflows, start with [Getting started](getting-started.md)
|
|
15
|
+
or [Managing skills](skill-management.md).
|
|
16
|
+
|
|
17
|
+
## Global options and target resolution
|
|
18
|
+
|
|
19
|
+
Every target-aware command resolves its execution target deterministically in this order:
|
|
20
|
+
|
|
21
|
+
1. Explicit flags: `--context <name>` or `--server <url>`
|
|
22
|
+
2. Environment variables: `SKILLMUX_CONTEXT` or `SKILLMUX_SERVER`
|
|
23
|
+
3. Default context configured in `~/.config/skillmux/contexts.toml`
|
|
24
|
+
4. Built-in `local` context
|
|
25
|
+
|
|
26
|
+
> [!IMPORTANT]
|
|
27
|
+
> Supplying both `--context` and `--server` (or both `SKILLMUX_CONTEXT` and `SKILLMUX_SERVER`) is rejected as ambiguous. Plaintext HTTP admin targets on non-loopback addresses are rejected unless `--allow-insecure` is supplied.
|
|
28
|
+
|
|
29
|
+
| Flag | Description |
|
|
30
|
+
|------|-------------|
|
|
31
|
+
| `--context <name>` | Select a target context stored in `contexts.toml` |
|
|
32
|
+
| `--server <url>` | Select an explicit remote server URL |
|
|
33
|
+
| `--json` | Emit line-stable JSON envelopes (schema version 1) to stdout |
|
|
34
|
+
| `--allow-insecure` | Allow plaintext HTTP admin requests to non-loopback addresses |
|
|
35
|
+
| `--verbose` | Output diagnostic stack traces for errors |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Context management (`skillmux context`)
|
|
40
|
+
|
|
41
|
+
Contexts store named server targets without embedding raw credentials. Token environment variable names (`token_env`) may be associated with a context.
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
# List all configured contexts (includes reserved 'local' context)
|
|
45
|
+
skillmux context list
|
|
46
|
+
|
|
47
|
+
# View the currently active context
|
|
48
|
+
skillmux context current
|
|
49
|
+
|
|
50
|
+
# Add a remote context
|
|
51
|
+
skillmux context add prod --server https://skillmux.internal:3000 --token-env PROD_ADMIN_TOKEN
|
|
52
|
+
|
|
53
|
+
# Switch default context
|
|
54
|
+
skillmux context use prod
|
|
55
|
+
|
|
56
|
+
# Remove a context (reserved 'local' context cannot be removed)
|
|
57
|
+
skillmux context remove prod
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Configuration management (`skillmux config`)
|
|
63
|
+
|
|
64
|
+
Local and remote targets share the server configuration read and status
|
|
65
|
+
subcommands. `config init` is local-only because it creates machine
|
|
66
|
+
configuration and selects a local vault.
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
# Create the machine config after validating a populated vault
|
|
70
|
+
skillmux config init --vault ~/skills --yes
|
|
71
|
+
|
|
72
|
+
# View current configuration and source attribution (default, toml, environment)
|
|
73
|
+
skillmux config show
|
|
74
|
+
|
|
75
|
+
# Get a specific schema-known dotted key value
|
|
76
|
+
skillmux config get recall.k_lexical
|
|
77
|
+
|
|
78
|
+
# Validate effective configuration schema and runtime readiness
|
|
79
|
+
skillmux config validate
|
|
80
|
+
|
|
81
|
+
# View effective configuration diff against defaults
|
|
82
|
+
skillmux config diff
|
|
83
|
+
|
|
84
|
+
# Set a dotted key value (previews diff and validates before saving)
|
|
85
|
+
skillmux config set recall.k_lexical 30
|
|
86
|
+
|
|
87
|
+
# Perform dry-run validation without writing or activating changes
|
|
88
|
+
skillmux config set recall.k_lexical 30 --dry-run
|
|
89
|
+
|
|
90
|
+
# Inspect runtime status, revision hashes, and readiness
|
|
91
|
+
skillmux config status
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`config init` writes only `vault_path`. It leaves an existing config unchanged
|
|
95
|
+
and does not add `local_vault_paths`. Remote contexts administer the deployed
|
|
96
|
+
server configuration; they never administer client skill installation, pins,
|
|
97
|
+
or sync.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Setup planner (`skillmux init`)
|
|
102
|
+
|
|
103
|
+
Run `skillmux init` with no arguments in a terminal to start guided setup.
|
|
104
|
+
Skillmux preselects clients it can detect from filesystem evidence, asks for
|
|
105
|
+
core skills, prints one complete review, and applies after one confirmation.
|
|
106
|
+
The prompt stays line-oriented and does not use an alternate terminal screen.
|
|
107
|
+
|
|
108
|
+
Select clients by product name:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
skillmux init --client claude-code --client codex --core csv-formatter --dry-run
|
|
112
|
+
skillmux init --client claude-code --client codex --core csv-formatter --yes
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Skillmux supports these client IDs:
|
|
116
|
+
|
|
117
|
+
| Client | Skill delivery |
|
|
118
|
+
|--------|----------------|
|
|
119
|
+
| `claude-code` | `~/.claude/skills` |
|
|
120
|
+
| `codex` | `$CODEX_HOME/skills`, falling back to `~/.codex/skills` |
|
|
121
|
+
| `gemini-cli`, `opencode`, `github-copilot`, `windsurf` | Shared `~/.agents/skills` surface |
|
|
122
|
+
| `antigravity` | `~/.gemini/config/skills` |
|
|
123
|
+
| `goose`, `hermes` | Manual full-vault configuration |
|
|
124
|
+
| `skillmux-mcp` | Manual MCP registration |
|
|
125
|
+
|
|
126
|
+
Direct target IDs are `agent-skills`, `claude-code`, `codex`, and `custom`.
|
|
127
|
+
Custom targets require `--dir <dir>`. The legacy `agents` and `claude` IDs
|
|
128
|
+
print deprecation warnings and retain their manifest names.
|
|
129
|
+
|
|
130
|
+
`--dry-run` prints the config, target, instruction, and core plan without
|
|
131
|
+
prompting or writing. `--json` emits one schema-versioned plan or result
|
|
132
|
+
object. Noninteractive writes require `--yes`. `--interactive` forces the
|
|
133
|
+
wizard and seeds it with supplied flags. `--no-instructions` skips managed
|
|
134
|
+
instruction files; `--no-sync` saves setup without materializing links.
|
|
135
|
+
|
|
136
|
+
Skillmux rejects a target that currently links to the whole vault. Convert it
|
|
137
|
+
only after reviewing the smaller post-sync skill set:
|
|
138
|
+
|
|
139
|
+
```sh
|
|
140
|
+
skillmux init --client claude-code --migrate-full-vault \
|
|
141
|
+
--core csv-formatter --dry-run
|
|
142
|
+
skillmux init --client claude-code --migrate-full-vault \
|
|
143
|
+
--core csv-formatter --yes
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Client instruction adapters append one managed discovery block and preserve
|
|
147
|
+
the rest of each file. Skillmux uses `.hermes.md` for Hermes and refuses
|
|
148
|
+
`SOUL.md` or Hermes's installed-source `AGENTS.md`. A client without a safe
|
|
149
|
+
user-level convention reports manual setup.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Project setup (`skillmux project init`)
|
|
154
|
+
|
|
155
|
+
Run the guided flow from a project directory:
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
skillmux project init
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Skillmux resolves the project directory from an explicit positional path, then
|
|
162
|
+
the current Git root, then the current directory. It suggests the directory
|
|
163
|
+
basename as the project-group name.
|
|
164
|
+
|
|
165
|
+
The noninteractive form accepts repeatable client and skill flags:
|
|
166
|
+
|
|
167
|
+
```sh
|
|
168
|
+
skillmux project init ~/code/skillmux \
|
|
169
|
+
--name skillmux \
|
|
170
|
+
--client claude-code \
|
|
171
|
+
--client codex \
|
|
172
|
+
--skill sdd-tdd \
|
|
173
|
+
--skill code-context \
|
|
174
|
+
--yes
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
`--client` maps product names to configured, deduplicated targets. Advanced
|
|
178
|
+
callers can attach a configured target with repeated `--target <name>`.
|
|
179
|
+
Re-running the command merges missing paths, skills, and target attachments.
|
|
180
|
+
It validates the complete manifest before an atomic write and runs `sync` by
|
|
181
|
+
default. Use `--no-sync` when another process will materialize the links.
|
|
182
|
+
|
|
183
|
+
Direct project commands support later maintenance:
|
|
184
|
+
|
|
185
|
+
```sh
|
|
186
|
+
skillmux project list
|
|
187
|
+
skillmux project show skillmux
|
|
188
|
+
skillmux project add-path skillmux ~/code/skillmux --yes
|
|
189
|
+
skillmux project remove-path skillmux ~/old/skillmux --yes
|
|
190
|
+
skillmux project pin skillmux sdd-tdd code-context --yes
|
|
191
|
+
skillmux project unpin skillmux old-skill --yes
|
|
192
|
+
skillmux project attach skillmux --client claude-code --client codex --yes
|
|
193
|
+
skillmux project detach skillmux --target codex --yes
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
`add-path` and `remove-path` detect the current Git root when the path is
|
|
197
|
+
omitted. Client attachments map to configured physical targets and deduplicate
|
|
198
|
+
clients that share `~/.agents/skills`. Mutating commands validate the complete
|
|
199
|
+
manifest and replace it atomically. Run `skillmux sync` after direct
|
|
200
|
+
maintenance commands to materialize the new state.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Advanced targets (`skillmux target`)
|
|
205
|
+
|
|
206
|
+
Most users should select products with `init --client`. Use `target` commands
|
|
207
|
+
for custom delivery directories and manifest inspection:
|
|
208
|
+
|
|
209
|
+
```sh
|
|
210
|
+
skillmux target list
|
|
211
|
+
skillmux target show claude-code
|
|
212
|
+
skillmux target add custom-agent --dir /srv/custom-agent/skills --yes
|
|
213
|
+
skillmux target remove custom-agent --yes
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
`target add` uses the same ownership, symlink, full-vault, rollback, and
|
|
217
|
+
current-host scoping checks as `skillmux init`. `target remove` removes the
|
|
218
|
+
manifest entry and preserves the directory, marker, and skill files. The
|
|
219
|
+
command prints the preserved path so cleanup remains an explicit user action.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Core skills (`skillmux core`)
|
|
224
|
+
|
|
225
|
+
Pin or unpin skills into `[core]` — the tier every target receives by
|
|
226
|
+
default, capped at 25 skills:
|
|
227
|
+
|
|
228
|
+
```sh
|
|
229
|
+
skillmux core pin csv-formatter --yes
|
|
230
|
+
skillmux core pin csv-formatter pdf-extractor terraform-plans --yes
|
|
231
|
+
skillmux core unpin csv-formatter --yes
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
One or more `skill_id` arguments are accepted per call and applied
|
|
235
|
+
atomically against a single in-memory manifest: if any one of them is
|
|
236
|
+
already pinned elsewhere (or, for `unpin`, not currently pinned), the
|
|
237
|
+
whole call fails and the manifest file is left untouched. To pin into a
|
|
238
|
+
`[project.<group>]` tier instead, use `skillmux project pin` (see
|
|
239
|
+
[Project Setup](#project-setup-skillmux-project-init)).
|
|
240
|
+
|
|
241
|
+
### Reloadable and restart-required keys
|
|
242
|
+
|
|
243
|
+
Config changes are categorized into live-reloadable and restart-required settings:
|
|
244
|
+
|
|
245
|
+
- **Reloadable**: `vault_path`, `recall.*`, `thresholds.*`, `inference.embedding.*`, `server.rate_limit.*`
|
|
246
|
+
- **Restart Required**: `server.hostname`, `server.auth_enabled`, `server.auth_token_env`, `server.admin.enabled`, `server.admin.token_env`, `inference.mode`, `state_dir`
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Skill introspection (`skillmux skill which`)
|
|
251
|
+
|
|
252
|
+
Show which root actually serves a skill_id, and every root it shadows:
|
|
253
|
+
|
|
254
|
+
```sh
|
|
255
|
+
skillmux skill which csv-formatter
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Policy calibration (`skillmux calibrate`)
|
|
261
|
+
|
|
262
|
+
Calibrate decision thresholds (`match_score`, `match_margin`, `candidate_floor`) against synthetic or labeled query datasets.
|
|
263
|
+
Calibration is local-only in this release. Remote targets advertise the
|
|
264
|
+
capability as unavailable and return `not_implemented`; a local dataset path is
|
|
265
|
+
never uploaded or represented as remotely executed. See
|
|
266
|
+
[`docs/calibration.md`](calibration.md) for dataset responsibilities,
|
|
267
|
+
certification gates, run evidence, reference values, and the complete operator
|
|
268
|
+
lifecycle.
|
|
269
|
+
|
|
270
|
+
```sh
|
|
271
|
+
# Run calibration on a dataset
|
|
272
|
+
skillmux calibrate run --dataset ./eval/queries.json
|
|
273
|
+
|
|
274
|
+
# List stored calibration runs in the evidence store
|
|
275
|
+
skillmux calibrate list
|
|
276
|
+
|
|
277
|
+
# Inspect detailed metrics and confusion matrix for a run
|
|
278
|
+
skillmux calibrate show <run_id>
|
|
279
|
+
|
|
280
|
+
# Apply calibrated thresholds to configuration (with fingerprint validation)
|
|
281
|
+
skillmux calibrate apply <run_id>
|
|
282
|
+
|
|
283
|
+
# Generate a synthetic decision dataset from vault skills
|
|
284
|
+
skillmux calibrate generate-dataset --out ./eval/queries.json
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Administrative HTTP API (`/admin/v1/*`)
|
|
290
|
+
|
|
291
|
+
Remote servers expose administrative control endpoints under `/admin/v1/*` when enabled in configuration:
|
|
292
|
+
|
|
293
|
+
```toml
|
|
294
|
+
[server.admin]
|
|
295
|
+
enabled = true
|
|
296
|
+
token_env = "SKILLMUX_ADMIN_TOKEN"
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Requests require `Authorization: Bearer <token>` where `<token>` matches the environment variable named by `server.admin.token_env`.
|
|
300
|
+
|
|
301
|
+
| Endpoint | Method | Description |
|
|
302
|
+
|----------|--------|-------------|
|
|
303
|
+
| `/admin/v1/capabilities` | `GET` | Advertises server features (`config_read`, `config_write`, `calibration`, `persistence`) |
|
|
304
|
+
| `/admin/v1/config` | `GET` | Returns desired/effective config, sources, and `ETag` revision hash |
|
|
305
|
+
| `/admin/v1/config` | `PATCH` | Applies dotted-key updates; requires matching `If-Match` header |
|
|
306
|
+
| `/admin/v1/calibrations` | `GET`, `POST` | Returns `501 not_implemented` (calibration is local-only) |
|
|
307
|
+
| `/admin/v1/calibrations/{run_id}` | `GET` | Returns `501 not_implemented`; raw evaluation queries are not exposed |
|
|
308
|
+
| `/admin/v1/calibrations/{run_id}/apply` | `POST` | Returns `501 not_implemented` |
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Automation and JSON output (`--json`)
|
|
313
|
+
|
|
314
|
+
When `--json` or `SKILLMUX_JSON=true` is set, all output is emitted to `stdout` in a stable envelope:
|
|
315
|
+
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"schema_version": 1,
|
|
319
|
+
"ok": true,
|
|
320
|
+
"target": "local",
|
|
321
|
+
"data": { ... },
|
|
322
|
+
"error": null
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Exit codes
|
|
327
|
+
|
|
328
|
+
| Code | Meaning | Examples |
|
|
329
|
+
|------|---------|----------|
|
|
330
|
+
| `0` | Success | Command completed cleanly |
|
|
331
|
+
| `2` | Usage / Validation Error | Unknown key, malformed value, missing option, invalid command |
|
|
332
|
+
| `3` | Target Unreachable / Unauthenticated | Connection refused, HTTP 401 Unauthorized, HTTP 403 Forbidden |
|
|
333
|
+
| `4` | Conflict / Governance Gate | HTTP 409 `CONFIG_REVISION_CONFLICT` or `CONFIG_EXTERNALLY_MANAGED` |
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Shell completions (`skillmux completions`)
|
|
338
|
+
|
|
339
|
+
Generate tab-completions for `bash`, `zsh`, or `fish`:
|
|
340
|
+
|
|
341
|
+
```sh
|
|
342
|
+
# Bash
|
|
343
|
+
skillmux completions bash > ~/.local/share/bash-completion/completions/skillmux
|
|
344
|
+
|
|
345
|
+
# Zsh
|
|
346
|
+
skillmux completions zsh > ~/.zsh/completion/_skillmux
|
|
347
|
+
|
|
348
|
+
# Fish
|
|
349
|
+
skillmux completions fish > ~/.config/fish/completions/skillmux.fish
|
|
350
|
+
```
|
package/docs/concepts.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Concepts
|
|
2
|
+
|
|
3
|
+
Skillmux separates three decisions:
|
|
4
|
+
|
|
5
|
+
| Decision | Choices |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| Skill delivery | Native core/project pins or routed MCP retrieval |
|
|
8
|
+
| Process location | On the client machine or as a shared HTTP service |
|
|
9
|
+
| Packaging | Skillmux CLI installation or Skillmux server deployment |
|
|
10
|
+
|
|
11
|
+
Retrieval capability is a fourth, independent concern: lexical, hybrid,
|
|
12
|
+
reranked, or exact retrieval.
|
|
13
|
+
|
|
14
|
+
These decisions are independent. A local CLI can manage native pins and serve
|
|
15
|
+
stdio MCP at the same time. A shared service uses HTTP MCP and can run local or
|
|
16
|
+
remote inference.
|
|
17
|
+
|
|
18
|
+
## Canonical vault
|
|
19
|
+
|
|
20
|
+
The vault is the source collection for Skillmux. Each direct child directory
|
|
21
|
+
represents one skill and contains a `SKILL.md`.
|
|
22
|
+
|
|
23
|
+
The default path is `~/skills`. Set `vault_path` in
|
|
24
|
+
`~/.config/skillmux/config.toml` when you keep the collection elsewhere.
|
|
25
|
+
|
|
26
|
+
Skillmux commands interact with the vault in two ways:
|
|
27
|
+
|
|
28
|
+
- management commands such as `install` and explicit config operations write
|
|
29
|
+
to documented paths;
|
|
30
|
+
- MCP retrieval reads skill content and stores indexes and audit records under
|
|
31
|
+
`state_dir`.
|
|
32
|
+
|
|
33
|
+
MCP delivery reads the current file bytes. It does not copy an indexed
|
|
34
|
+
`SKILL.md` body from the state database.
|
|
35
|
+
|
|
36
|
+
## Delivery tiers
|
|
37
|
+
|
|
38
|
+
Skillmux applies three policies to one vault:
|
|
39
|
+
|
|
40
|
+
| Tier | Scope | Delivery |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| Core | Each configured target | Native client skill directory |
|
|
43
|
+
| Project | Selected project paths and targets | Project-local native skill directory |
|
|
44
|
+
| Routed | Full indexed vault | MCP on demand |
|
|
45
|
+
|
|
46
|
+
Core and project skills are **pinned**. `skillmux sync` creates managed
|
|
47
|
+
symlinks for them. Routed skills stay in the vault until an MCP client asks for
|
|
48
|
+
one.
|
|
49
|
+
|
|
50
|
+
One skill can serve different roles across machines or projects, but the
|
|
51
|
+
shared manifest prevents conflicting core and project assignments. Core stays
|
|
52
|
+
capped at 25 skills to protect client startup context.
|
|
53
|
+
|
|
54
|
+
Delivery tiers do not select a deployment. A local Skillmux process can serve
|
|
55
|
+
routed skills over stdio, while a shared Skillmux process can serve the same
|
|
56
|
+
vault over HTTP.
|
|
57
|
+
|
|
58
|
+
## Deployment topologies
|
|
59
|
+
|
|
60
|
+
| Topology | Process location | Transport | Typical installation |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| Native management | Client machine | Filesystem links | Skillmux CLI |
|
|
63
|
+
| Local MCP | Beside one client | stdio | Skillmux CLI |
|
|
64
|
+
| Shared MCP | Server or container host | Streamable HTTP | Full Skillmux server image |
|
|
65
|
+
|
|
66
|
+
The **Skillmux CLI** is available as either the Bun package or the standalone
|
|
67
|
+
Linux executable; both expose the same commands. The **full Skillmux server
|
|
68
|
+
image** is the default shared-service deployment. The **slim image** is an
|
|
69
|
+
advanced variant for configured remote embeddings or intentional lexical-only
|
|
70
|
+
retrieval. The CLI can also serve HTTP, and Docker can serve stdio for clients
|
|
71
|
+
that support a container command. Those combinations use the same MCP tools;
|
|
72
|
+
the table lists the shortest setup for each use case.
|
|
73
|
+
|
|
74
|
+
The full Docker image bundles GTE-small. The slim image contains no model
|
|
75
|
+
files, so it uses configured remote embeddings or lexical fallback. The Bun
|
|
76
|
+
CLI distributions download and cache GTE-small when local inference
|
|
77
|
+
first loads it; `skillmux models download` prefetches it. Neither Docker image
|
|
78
|
+
bundles a local reranker; configure one remotely when needed.
|
|
79
|
+
|
|
80
|
+
## Clients and targets
|
|
81
|
+
|
|
82
|
+
A **client** is a supported product name such as `claude-code` or `codex`.
|
|
83
|
+
Skillmux maps it to the product's skill directory and safe instruction-file
|
|
84
|
+
conventions.
|
|
85
|
+
|
|
86
|
+
A **target** is a physical directory managed by sync. Several clients can map
|
|
87
|
+
to one target. Gemini CLI, OpenCode, GitHub Copilot, and Windsurf share
|
|
88
|
+
`~/.agents/skills`, so Skillmux deduplicates that directory.
|
|
89
|
+
|
|
90
|
+
Custom targets let you manage another directory without adding a product
|
|
91
|
+
adapter:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
skillmux target add custom-agent --dir /srv/custom-agent/skills --yes
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Ownership markers
|
|
98
|
+
|
|
99
|
+
Each managed target contains a `.skillmux` marker. The marker records the
|
|
100
|
+
target name, vault, schema version, and entries created by Skillmux.
|
|
101
|
+
|
|
102
|
+
Sync removes only recorded entries. It refuses to adopt an unmarked directory,
|
|
103
|
+
overwrite unmanaged collisions, or treat a local overlay marker as a target
|
|
104
|
+
marker.
|
|
105
|
+
|
|
106
|
+
Run `skillmux init --dry-run` before changing a target. Read
|
|
107
|
+
[Managing skills](skill-management.md#target-ownership-and-recovery) before
|
|
108
|
+
undoing an adopted target.
|
|
109
|
+
|
|
110
|
+
## Project groups
|
|
111
|
+
|
|
112
|
+
A project group connects:
|
|
113
|
+
|
|
114
|
+
- one or more local project paths;
|
|
115
|
+
- a set of skill IDs;
|
|
116
|
+
- selected targets.
|
|
117
|
+
|
|
118
|
+
Skillmux materializes each group inside the project using the target's path
|
|
119
|
+
relative to the user's home directory. A shared `skillmux.toml` can list
|
|
120
|
+
checkout paths from several machines. Sync skips paths that do not exist on
|
|
121
|
+
the current machine.
|
|
122
|
+
|
|
123
|
+
## Local vault overlays
|
|
124
|
+
|
|
125
|
+
`local_vault_paths` layer machine-specific skill copies over the canonical
|
|
126
|
+
vault. Skillmux checks overlay paths in order, then falls back to `vault_path`.
|
|
127
|
+
|
|
128
|
+
Use overlays for work in progress or machine-specific variants. Keep portable
|
|
129
|
+
core and project pins in the canonical vault because another machine may not
|
|
130
|
+
have the overlay.
|
|
131
|
+
|
|
132
|
+
## Inference and retrieval capabilities
|
|
133
|
+
|
|
134
|
+
Inference location and deployment location use separate settings. Local
|
|
135
|
+
inference runs GTE-small inside the Skillmux process. Remote inference calls
|
|
136
|
+
configured embedding and reranker endpoints. Either inference choice can back
|
|
137
|
+
an HTTP MCP deployment.
|
|
138
|
+
|
|
139
|
+
Skillmux reports the active retrieval capability:
|
|
140
|
+
|
|
141
|
+
| Capability | Behavior |
|
|
142
|
+
| --- | --- |
|
|
143
|
+
| `lexical` | SQLite FTS5 and BM25 produce an ordered shortlist |
|
|
144
|
+
| `hybrid` | Reciprocal-rank fusion combines lexical and embedding results |
|
|
145
|
+
| `reranked` | A configured reranker reorders the fused candidates |
|
|
146
|
+
| `exact` | An exact skill ID resolves directly |
|
|
147
|
+
|
|
148
|
+
A reranker does not enable automatic matches by itself. Skillmux needs
|
|
149
|
+
calibrated `match_score`, `match_margin`, and `candidate_floor` thresholds
|
|
150
|
+
before it returns a semantic result as `matched`.
|
|
151
|
+
|
|
152
|
+
## Retrieval outcomes
|
|
153
|
+
|
|
154
|
+
`resolve_skill` returns one of three outcomes:
|
|
155
|
+
|
|
156
|
+
- `matched`: one skill passed the calibrated policy, so Skillmux delivers its
|
|
157
|
+
`SKILL.md` body inline;
|
|
158
|
+
- `ambiguous`: Skillmux returns an ordered candidate list and the calling model
|
|
159
|
+
chooses one with `fetch_skill`;
|
|
160
|
+
- `no_match`: no candidate passed the policy and the agent continues without a
|
|
161
|
+
skill.
|
|
162
|
+
|
|
163
|
+
Embedding or reranker failures reduce the active capability. Vault and index
|
|
164
|
+
failures make the server unready because Skillmux can no longer guarantee
|
|
165
|
+
valid retrieval.
|
package/docs/configuration.md
CHANGED
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
# Configuration
|
|
2
2
|
|
|
3
|
-
Skillmux defaults to FTS5 plus
|
|
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.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
Deployment and inference use separate terms:
|
|
7
|
+
|
|
8
|
+
- **local deployment**: Skillmux runs beside a client, usually over stdio;
|
|
9
|
+
- **shared deployment**: Skillmux serves clients over HTTP;
|
|
10
|
+
- **local inference**: the Skillmux process runs the embedding model;
|
|
11
|
+
- **remote inference**: Skillmux calls configured inference endpoints.
|
|
12
|
+
|
|
13
|
+
A shared HTTP deployment can use local inference. A local stdio deployment can
|
|
14
|
+
use remote inference.
|
|
15
|
+
|
|
16
|
+
Read [Concepts](concepts.md) for the vault and delivery model. For detailed CLI
|
|
17
|
+
commands, target resolution, and automation envelopes, see
|
|
18
|
+
[CLI reference](cli.md). For labelled datasets, threshold certification,
|
|
19
|
+
reference values, and the apply lifecycle, see
|
|
20
|
+
[Policy calibration](calibration.md).
|
|
6
21
|
|
|
7
22
|
## Machine config bootstrap
|
|
8
23
|
|
|
@@ -23,14 +38,21 @@ It validates that the path resolves to a directory with at least one
|
|
|
23
38
|
`local_vault_paths` unset. `skillmux init --vault ~/skills --yes` uses the
|
|
24
39
|
same bootstrap when the machine config does not exist.
|
|
25
40
|
|
|
26
|
-
## Local
|
|
41
|
+
## Local inference
|
|
27
42
|
|
|
28
43
|
```toml
|
|
29
44
|
[inference]
|
|
30
45
|
mode = "local"
|
|
31
46
|
```
|
|
32
47
|
|
|
33
|
-
The versioned `gte-small-v1`
|
|
48
|
+
The versioned `gte-small-v1` configuration uses normalized, mean-pooled
|
|
49
|
+
`Xenova/gte-small` embeddings with 384 dimensions, quantized to q8 on CPU.
|
|
50
|
+
Skillmux CLI installations download the model when inference first
|
|
51
|
+
loads it and cache it in `~/.cache/skillmux/models`. The full Docker image
|
|
52
|
+
already contains the model.
|
|
53
|
+
|
|
54
|
+
Skillmux combines FTS5 and cosine result lists with reciprocal-rank fusion.
|
|
55
|
+
Without a reranker, the calling model selects from the ordered shortlist.
|
|
34
56
|
|
|
35
57
|
Advanced local overrides:
|
|
36
58
|
|
|
@@ -47,9 +69,10 @@ dtype = "q8"
|
|
|
47
69
|
|
|
48
70
|
```
|
|
49
71
|
|
|
50
|
-
Use `skillmux models download` to prefetch
|
|
72
|
+
Use `skillmux models download` to prefetch the model and `skillmux doctor` to
|
|
73
|
+
verify readiness.
|
|
51
74
|
|
|
52
|
-
## Remote
|
|
75
|
+
## Remote inference
|
|
53
76
|
|
|
54
77
|
See [`config.remote.example.toml`](../config.remote.example.toml). Embeddings
|
|
55
78
|
must implement the OpenAI-compatible `{ model, input }` contract. Configure the
|
|
@@ -105,7 +128,13 @@ candidate list returned to the calling LLM after retrieval, reranking, and
|
|
|
105
128
|
threshold filtering. It does not change retrieval depth or the matched,
|
|
106
129
|
ambiguous, or no-match classification.
|
|
107
130
|
|
|
108
|
-
Reranker thresholds have no universal default because score distributions are
|
|
131
|
+
Reranker thresholds have no universal default because score distributions are
|
|
132
|
+
model-specific. Without `inference.thresholds`, Skillmux still uses the
|
|
133
|
+
reranker to order candidates but keeps outcomes ambiguous rather than
|
|
134
|
+
auto-matching. Use `skillmux calibrate run` to select
|
|
135
|
+
`match_score`, `match_margin`, and `candidate_floor`, then explicitly apply the
|
|
136
|
+
certified run. The [calibration guide](calibration.md) also publishes a
|
|
137
|
+
clearly-scoped BGE reference profile for smoke tests.
|
|
109
138
|
|
|
110
139
|
## HTTP server
|
|
111
140
|
|
|
@@ -128,7 +157,11 @@ Before exposing HTTP beyond localhost, set `hostname` to a reachable interface,
|
|
|
128
157
|
|
|
129
158
|
## Tiers and the manifest
|
|
130
159
|
|
|
131
|
-
`skillmux init
|
|
160
|
+
`skillmux init` and `skillmux sync` manage native delivery by pinning selected
|
|
161
|
+
skills as symlinks inside an agent's skill directory. Routed skills remain
|
|
162
|
+
available through `resolve_skill`. Read [Concepts](concepts.md#delivery-tiers)
|
|
163
|
+
for the model and [Managing skills](skill-management.md) for the workflow.
|
|
164
|
+
This section defines the manifest.
|
|
132
165
|
|
|
133
166
|
### `skillmux.toml`
|
|
134
167
|
|