You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Add -u/--upgrade flag to install command for skill upgrades
- Add thv skill validate command for pre-build validation
- Expand client support table with all Skillet clients (Claude, Codex, Copilot, OpenCode)
- Clarify OCI artifact format (not runnable containers, uses OCI for distribution)
- Explain deterministic packaging rationale for supply chain security
- Expand Alternative 5 rationale for requiring explicit --client selection
- Note that plugins cache is out of scope (managed by Claude's plugin system)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Or skill name when using -u with an already-installed skill
144
145
145
146
Flags:
146
147
--client string Target AI client (required)
147
148
--global Install globally (user-wide) (default)
148
149
--local Install locally (project-specific)
149
150
--group string Add skill to specified group
150
151
--force Overwrite existing unmanaged skill
152
+
-u, --upgrade Upgrade an already-installed skill
151
153
```
152
154
153
155
**Behavior:**
154
-
- Requires explicit `--client` selection (no default)
156
+
- Requires explicit `--client` selection (see rationale in Alternatives Considered)
155
157
- Pulls OCI artifact from registry
156
158
- Extracts skill files to client directory
157
159
- Creates `.thv-skill.json` metadata file
158
160
- Updates skill index
159
161
- If `--group` specified, adds skill to group state
160
162
- Reports status: `installed`, `upgraded`, or `unchanged`
161
163
164
+
**Upgrade Behavior (`-u` flag):**
165
+
- When reference is a skill name (not full OCI reference): resolves the original registry reference from `.thv-skill.json` metadata and pulls the latest tag
166
+
- When reference is a full OCI reference: installs the specified version as an upgrade
167
+
- Fails if skill is not already installed (use install without `-u` for new installations)
**Note:** Skills installed via Claude's plugin system (`~/.claude/plugins/cache/.../skills/`) are outside the scope of thv management. Those are managed by Claude's plugin infrastructure, not thv.
307
342
308
343
#### SkillManager Interface
309
344
@@ -339,6 +374,21 @@ Skills integrate with ToolHive's existing groups system:
339
374
340
375
### OCI Artifact Format
341
376
377
+
Skills are distributed as **OCI artifacts** stored in standard container registries (GHCR, ECR, Docker Hub, etc.). These are **not runnable containers** - they use OCI as a packaging and distribution format, similar to how Helm charts can be stored in OCI registries.
378
+
379
+
**Artifact Structure:**
380
+
```
381
+
OCI Image Artifact
382
+
├── Image Index (multi-platform: linux/amd64, linux/arm64)
383
+
├── Image Manifest
384
+
├── Config Blob (skill metadata stored in OCI labels)
385
+
└── Content Layer (tar.gz)
386
+
├── SKILL.md
387
+
├── scripts/
388
+
├── references/
389
+
└── assets/
390
+
```
391
+
342
392
Maintains compatibility with existing Skillet format:
343
393
344
394
**Media Types:**
@@ -352,9 +402,12 @@ Maintains compatibility with existing Skillet format:
352
402
-`org.stacklok.skillet.skill.version`
353
403
354
404
**Reproducible Packaging:**
355
-
- Deterministic tar (sorted entries, normalized timestamps via SOURCE_DATE_EPOCH)
356
-
- Deterministic gzip (no ModTime, OS=255)
357
-
- Same content always produces identical digest
405
+
406
+
OCI uses content-addressable storage where every blob is identified by its SHA256 digest. For verification and supply chain security to work, the same skill content must always produce an identical digest. This requires deterministic packaging:
407
+
408
+
- Deterministic tar: sorted file entries, normalized timestamps (via `SOURCE_DATE_EPOCH`), UID/GID set to 0
409
+
- Deterministic gzip: fixed compression level, no variable header fields
410
+
- Same content always produces identical digest, enabling anyone to rebuild and verify
358
411
359
412
## Security Considerations
360
413
@@ -453,10 +506,10 @@ Skills are client-only constructs (files in `~/.claude/skills/`) that don't flow
453
506
454
507
### Alternative 5: Default to All Clients
455
508
456
-
-**Description**: Install to all detected clients when `--client` not specified
509
+
-**Description**: Install to all detected clients when `--client` not specified, or auto-detect when only one client is present
457
510
-**Pros**: Simpler UX for single-client users
458
-
-**Cons**: Unexpected behavior for multi-client setups, potential for mistakes
459
-
-**Why not chosen**: Explicit selection is safer and clearer
511
+
-**Cons**: Unexpected behavior for multi-client setups, potential for mistakes, different clients may have different skill conventions
512
+
-**Why not chosen**: Explicit selection is safer and clearer. Users working with multiple AI clients (increasingly common) benefit from explicit targeting. This follows the principle of least surprise - the command does exactly what was requested, nothing more. Skillet uses this same approach. We may reconsider this in the future based on user feedback (e.g., auto-detect when only one skill-supporting client is installed).
0 commit comments