A reusable, server-agnostic skill-distribution library for MCP servers (Shoka and future server). It syncs a skill set from a git source into a local cache (narrow fetch, no history), installs the whole set into an agent runtime's convention directory, detects drift, verifies ownership/integrity, and safely prunes skills deleted upstream.
It was extracted from Shoka's internal/skillcache + cmd/shoka-cli/skill.go so
the machinery is shared rather than re-implemented per server. The product-specific
values — source repo, cache app name, convention path, distributor signature — are
injected via Config; the library bakes none of them.
| Path | Purpose |
|---|---|
skilldist.go (package skilldist) |
the distribution library: Sync/SyncIfStale/Refresh, InstallSet/Install, Verify, Outdated/Upgrade/MakeCurrent, Prune |
skillmeta/ |
the .skill-meta.yaml format (signature + source provenance + per-file sha256 map) |
cmd/skill-meta/ |
the authoring CLI: stamp .skill-meta.yaml into a skill directory |
docs/skill-meta-format.md |
the language-independent format spec |
archlint/ |
the no-go-git invariant, enforced by test |
- Lowest layer: imports only the Go standard library, a YAML/JSON codec, and shells out to the git binary. It NEVER imports go-git and NEVER a server/data package — skills are not data. It depends on no MCP server, so it creates no edge between the servers that depend on it.
- Injected, not baked: see
Config{Source, AppName, ConventionPath, Signature, SkillsSubdir, SkillMarker}.
cfg := skilldist.Config{
Source: "https://github.com/sopranoworks/shoka.git",
AppName: "shoka",
ConventionPath: ".claude/skills",
Signature: "shoka",
}
_, _ = cfg.Sync("")
_, _ = cfg.InstallSet()MIT — see LICENSE. Copyright (c) 2026 Sopranoworks, Osamu Takahashi.