@klhapp/skillmux 1.2.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.
@@ -1,7 +1,8 @@
1
- # This entire file is optional. Skill Router indexes an externally managed
2
- # agentskills.io-compatible vault and uses local GTE-small semantic retrieval.
3
- # vault_path is a neutral path, never a harness's static-loading scan
4
- # surface (e.g. ~/.agents/skills) see docs/sdd/skr-cli/think.md.
1
+ # This file is optional. It configures the Skillmux CLI or the full Skillmux
2
+ # server image with local inference. Skillmux manages and indexes an
3
+ # agentskills.io-compatible canonical vault. Keep the vault separate from
4
+ # client skill directories such as ~/.agents/skills; skillmux sync selects
5
+ # which core and project skills appear in those directories.
5
6
  vault_path = "~/skills"
6
7
 
7
8
  # Optional, default []: machine-local override-only vaults, checked before
@@ -1,5 +1,8 @@
1
- # Connect stronger inference endpoints. The reranker section is optional.
2
- vault_path = "~/.agents/skills"
1
+ # Configure remote inference endpoints. This describes where inference runs,
2
+ # not where Skillmux runs; local stdio and shared HTTP deployments can both use
3
+ # this file. The reranker section is optional.
4
+ # Keep the canonical vault separate from client skill directories.
5
+ vault_path = "~/skills"
3
6
 
4
7
  [inference]
5
8
  mode = "remote"
package/docs/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # Skillmux documentation
2
+
3
+ Skillmux manages one `SKILL.md` vault. Choose a workflow based on where skills
4
+ need to appear and where Skillmux should run.
5
+
6
+ ## Choose a use case
7
+
8
+ | Goal | Start with | Recommended installation |
9
+ | --- | --- | --- |
10
+ | Put a small skill set in native client directories | [Manage native skills](getting-started.md#manage-native-skills) | Skillmux CLI |
11
+ | Let one client search the full vault through MCP | [Add local MCP retrieval](getting-started.md#add-local-mcp-retrieval) | Skillmux CLI |
12
+ | Serve the vault to several MCP clients | [Run a shared MCP service](getting-started.md#run-a-shared-mcp-service) | Full Skillmux server image |
13
+
14
+ You can combine native management and local MCP retrieval on one machine. The
15
+ shared service uses the same MCP tools over HTTP.
16
+
17
+ Install the CLI with the Bun package, or use the standalone Linux executable
18
+ when Bun is unavailable. The full server image is the shared-service default;
19
+ the slim image is an advanced choice for remote embeddings or lexical-only
20
+ retrieval.
21
+
22
+ ## Learn the model
23
+
24
+ - [Getting started](getting-started.md): choose an installation, prepare a
25
+ vault, and follow one of three setup recipes.
26
+ - [Concepts](concepts.md): separate delivery tiers, deployment topology, and
27
+ retrieval capability.
28
+ - [Managing skills](skill-management.md): install, scan, pin, sync, inspect,
29
+ and recover skills.
30
+ - [MCP routing](mcp-routing.md): register stdio or HTTP MCP and understand
31
+ retrieval outcomes.
32
+
33
+ ## Operate Skillmux
34
+
35
+ - [Deployment](deployment.md): deploy the shared server, choose slim only when
36
+ needed, expose HTTP, and operate the service.
37
+ - [Configuration reference](configuration.md): configure inference, manifests,
38
+ server settings, and local overlays.
39
+ - [CLI reference](cli.md): use commands, contexts, JSON output, and exit codes.
40
+ - [Policy calibration](calibration.md): create labelled datasets and certify
41
+ reranker thresholds.
42
+ - [Troubleshooting](troubleshooting.md): diagnose vault, sync, model, and server
43
+ problems.
44
+
45
+ ## Integrate and contribute
46
+
47
+ - [MCP contract](schema.json): JSON Schema 2020-12 definitions for tool inputs
48
+ and results.
49
+ - [Contributing](../CONTRIBUTING.md): development setup, tests, and pull request
50
+ conventions.
51
+ - [Releasing](releasing.md): maintainer release procedure.
52
+ - [Security](../SECURITY.md): vulnerability reporting.
@@ -0,0 +1,156 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
2
+ <title id="title">Three ways to use Skillmux</title>
3
+ <desc id="desc">One canonical skill vault supports native skill management and local MCP retrieval through the Skillmux CLI, plus a shared HTTP MCP service through the full or slim Skillmux server image.</desc>
4
+
5
+ <defs>
6
+ <filter id="shadow" x="-15%" y="-15%" width="130%" height="140%">
7
+ <feDropShadow dx="0" dy="5" stdDeviation="8" flood-color="#0f172a" flood-opacity="0.10"/>
8
+ </filter>
9
+ <marker id="arrow-teal" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
10
+ <path d="M0 0L10 5L0 10Z" fill="#0f766e"/>
11
+ </marker>
12
+ <marker id="arrow-blue" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
13
+ <path d="M0 0L10 5L0 10Z" fill="#2563eb"/>
14
+ </marker>
15
+ <marker id="arrow-violet" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
16
+ <path d="M0 0L10 5L0 10Z" fill="#7c3aed"/>
17
+ </marker>
18
+ <style>
19
+ text {
20
+ font-family: "DejaVu Sans", Arial, sans-serif;
21
+ }
22
+ .title {
23
+ font-size: 27px;
24
+ font-weight: 750;
25
+ fill: #0f172a;
26
+ }
27
+ .subtitle {
28
+ font-size: 16px;
29
+ font-weight: 400;
30
+ fill: #475569;
31
+ }
32
+ .card-title {
33
+ font-size: 21px;
34
+ font-weight: 750;
35
+ fill: #0f172a;
36
+ }
37
+ .label {
38
+ font-size: 15px;
39
+ font-weight: 650;
40
+ fill: #1e293b;
41
+ }
42
+ .body {
43
+ font-size: 14px;
44
+ font-weight: 400;
45
+ fill: #475569;
46
+ }
47
+ .mono {
48
+ font-family: "DejaVu Sans Mono", Consolas, monospace;
49
+ font-size: 14px;
50
+ font-weight: 650;
51
+ fill: #1e293b;
52
+ }
53
+ .mono-light {
54
+ fill: #ffffff;
55
+ }
56
+ .chip {
57
+ font-size: 12px;
58
+ font-weight: 750;
59
+ letter-spacing: .5px;
60
+ }
61
+ </style>
62
+ </defs>
63
+
64
+ <rect width="1200" height="720" rx="24" fill="#f8fafc"/>
65
+ <rect x="1" y="1" width="1198" height="718" rx="23" fill="none" stroke="#e2e8f0" stroke-width="2"/>
66
+
67
+ <text x="48" y="50" class="title">One vault, three ways to use Skillmux</text>
68
+ <text x="48" y="78" class="subtitle">Choose a local workflow or serve the same retrieval contract to several clients.</text>
69
+
70
+ <g filter="url(#shadow)">
71
+ <rect x="330" y="106" width="540" height="118" rx="18" fill="#ffffff" stroke="#cbd5e1" stroke-width="2"/>
72
+ <circle cx="374" cy="147" r="18" fill="#0f172a"/>
73
+ <path d="M364 141H377L383 147L377 153H364M370 135V159" fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
74
+ <text x="408" y="144" class="card-title">Canonical skill vault</text>
75
+ <text x="408" y="172" class="mono">~/skills/&lt;skill-id&gt;/SKILL.md</text>
76
+ <text x="408" y="200" class="body">Install · scan · pin · index · inspect usage</text>
77
+ <rect x="701" y="139" width="137" height="34" rx="9" fill="#f1f5f9" stroke="#cbd5e1"/>
78
+ <text x="769.5" y="161" text-anchor="middle" class="mono">skillmux.toml</text>
79
+ </g>
80
+
81
+ <path d="M480 224V252H220V277" fill="none" stroke="#0f766e" stroke-width="3" marker-end="url(#arrow-teal)"/>
82
+ <path d="M600 224V277" fill="none" stroke="#2563eb" stroke-width="3" marker-end="url(#arrow-blue)"/>
83
+ <path d="M720 224V252H980V277" fill="none" stroke="#7c3aed" stroke-width="3" marker-end="url(#arrow-violet)"/>
84
+
85
+ <g filter="url(#shadow)">
86
+ <rect x="40" y="284" width="360" height="302" rx="18" fill="#ffffff" stroke="#99d5cc" stroke-width="2"/>
87
+ <rect x="62" y="306" width="91" height="26" rx="13" fill="#ccfbf1"/>
88
+ <text x="107.5" y="324" text-anchor="middle" class="chip" fill="#115e59">USE CASE 1</text>
89
+ <text x="62" y="365" class="card-title">Skillmux CLI</text>
90
+ <text x="62" y="390" class="body">Manage native skills on the client machine.</text>
91
+
92
+ <rect x="62" y="414" width="276" height="48" rx="10" fill="#f0fdfa" stroke="#99d5cc"/>
93
+ <text x="200" y="444" text-anchor="middle" class="mono">skillmux init · sync</text>
94
+ <path d="M200 462V487" fill="none" stroke="#0f766e" stroke-width="2.5" marker-end="url(#arrow-teal)"/>
95
+ <rect x="62" y="493" width="276" height="49" rx="10" fill="#f8fafc" stroke="#cbd5e1"/>
96
+ <text x="200" y="514" text-anchor="middle" class="label">Native skill directories</text>
97
+ <text x="200" y="533" text-anchor="middle" class="body">managed core and project links</text>
98
+
99
+ <text x="62" y="570" class="body">Install with</text>
100
+ <rect x="160" y="550" width="85" height="27" rx="8" fill="#0f172a"/>
101
+ <text x="202.5" y="568" text-anchor="middle" class="chip" style="font-size: 10px" fill="#ffffff">BUN PACKAGE</text>
102
+ <rect x="251" y="550" width="87" height="27" rx="8" fill="#f1f5f9" stroke="#cbd5e1"/>
103
+ <text x="294.5" y="561" text-anchor="middle" class="chip" style="font-size: 10px" fill="#334155"><tspan x="294.5">LINUX</tspan><tspan x="294.5" dy="11">EXECUTABLE</tspan></text>
104
+ </g>
105
+
106
+ <g filter="url(#shadow)">
107
+ <rect x="420" y="284" width="360" height="302" rx="18" fill="#ffffff" stroke="#93c5fd" stroke-width="2"/>
108
+ <rect x="442" y="306" width="91" height="26" rx="13" fill="#dbeafe"/>
109
+ <text x="487.5" y="324" text-anchor="middle" class="chip" fill="#1d4ed8">USE CASE 2</text>
110
+ <text x="442" y="365" class="card-title">Add local MCP retrieval</text>
111
+ <text x="442" y="390" class="body">Run Skillmux beside one MCP client.</text>
112
+
113
+ <rect x="442" y="414" width="102" height="48" rx="10" fill="#f8fafc" stroke="#cbd5e1"/>
114
+ <text x="493" y="444" text-anchor="middle" class="label">AI client</text>
115
+ <path d="M544 438H573" fill="none" stroke="#2563eb" stroke-width="2.5" marker-end="url(#arrow-blue)"/>
116
+ <text x="558" y="428" text-anchor="middle" class="body">stdio</text>
117
+ <rect x="579" y="414" width="179" height="48" rx="10" fill="#eff6ff" stroke="#93c5fd"/>
118
+ <text x="668.5" y="444" text-anchor="middle" class="label">Local Skillmux</text>
119
+
120
+ <rect x="442" y="484" width="316" height="58" rx="10" fill="#f8fafc" stroke="#cbd5e1"/>
121
+ <text x="600" y="507" text-anchor="middle" class="label">FTS5 + local GTE-small</text>
122
+ <text x="600" y="530" text-anchor="middle" class="body">downloaded and cached on this machine</text>
123
+
124
+ <text x="442" y="570" class="body">Skillmux CLI: Bun package or Linux executable</text>
125
+ </g>
126
+
127
+ <g filter="url(#shadow)">
128
+ <rect x="800" y="284" width="360" height="302" rx="18" fill="#ffffff" stroke="#c4b5fd" stroke-width="2"/>
129
+ <rect x="822" y="306" width="91" height="26" rx="13" fill="#ede9fe"/>
130
+ <text x="867.5" y="324" text-anchor="middle" class="chip" fill="#6d28d9">USE CASE 3</text>
131
+ <text x="822" y="365" class="card-title">Run a shared MCP service</text>
132
+ <text x="822" y="390" class="body">Serve several clients from one deployment.</text>
133
+
134
+ <rect x="822" y="414" width="102" height="48" rx="10" fill="#f8fafc" stroke="#cbd5e1"/>
135
+ <text x="873" y="435" text-anchor="middle" class="label">AI clients</text>
136
+ <text x="873" y="453" text-anchor="middle" class="body">one or more</text>
137
+ <path d="M924 438H953" fill="none" stroke="#7c3aed" stroke-width="2.5" marker-end="url(#arrow-violet)"/>
138
+ <text x="938" y="428" text-anchor="middle" class="body">HTTP</text>
139
+ <rect x="959" y="414" width="179" height="48" rx="10" fill="#f5f3ff" stroke="#c4b5fd"/>
140
+ <text x="1048.5" y="435" text-anchor="middle" class="label">Skillmux server</text>
141
+ <text x="1048.5" y="453" text-anchor="middle" class="mono">POST /mcp</text>
142
+
143
+ <rect x="822" y="484" width="148" height="58" rx="10" fill="#f5f3ff" stroke="#c4b5fd"/>
144
+ <text x="896" y="507" text-anchor="middle" class="label">Full image</text>
145
+ <text x="896" y="530" text-anchor="middle" class="body">GTE-small included</text>
146
+ <rect x="982" y="484" width="156" height="58" rx="10" fill="#f8fafc" stroke="#cbd5e1"/>
147
+ <text x="1060" y="507" text-anchor="middle" class="label">Slim image</text>
148
+ <text x="1060" y="530" text-anchor="middle" class="body">remote or lexical</text>
149
+
150
+ <text x="822" y="570" class="body">Recommended for a shared HTTP deployment</text>
151
+ </g>
152
+
153
+ <rect x="420" y="616" width="740" height="66" rx="14" fill="#0f172a"/>
154
+ <text x="444" y="643" class="chip" fill="#cbd5e1">SHARED MCP CONTRACT</text>
155
+ <text x="444" y="667" class="mono mono-light">retrieve → rerank → resolve_skill / fetch_skill → verified SKILL.md</text>
156
+ </svg>
Binary file
@@ -5,6 +5,9 @@ shortlist into `matched`, `ambiguous`, or `no_match`. It is an operator action,
5
5
  not background learning, and it currently runs only against a local Skillmux
6
6
  target.
7
7
 
8
+ Read [MCP routing](mcp-routing.md#retrieval-pipeline) before calibrating a new
9
+ retrieval deployment.
10
+
8
11
  ## Lifecycle
9
12
 
10
13
  The complete workflow is:
@@ -75,7 +78,9 @@ a new `run_id`; the active policy remains unchanged until one is applied.
75
78
 
76
79
  ## Local and remote targets
77
80
 
78
- Calibration is local-only in this release. Local commands operate on the
81
+ Here, `local` and `remote` name CLI administration targets, not inference
82
+ locations or MCP transports. Calibration is local-target-only in this release.
83
+ Local commands operate on the
79
84
  configured local vault, index, inference endpoints, dataset path, evidence
80
85
  database, and TOML file. Human output always prints `Target: local`; JSON output
81
86
  uses `"target": "local"`.
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
+ ```