@klhapp/skillmux 1.2.0 → 1.3.1
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 +19 -0
- package/README.md +162 -521
- package/config.example.toml +5 -4
- package/config.remote.example.toml +5 -2
- package/docs/README.md +52 -0
- package/docs/assets/architecture.svg +156 -0
- package/docs/assets/logo.png +0 -0
- package/docs/calibration.md +6 -1
- package/docs/cli.md +350 -0
- package/docs/concepts.md +165 -0
- package/docs/configuration.md +34 -10
- 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 -6
- package/src/cli.ts +40 -3
- package/src/config-watcher.ts +5 -1
package/config.example.toml
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
# This
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
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
|
-
#
|
|
2
|
-
|
|
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/<skill-id>/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
|
package/docs/calibration.md
CHANGED
|
@@ -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
|
-
|
|
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
|
+
```
|