mcp-config: sync shared opencode skills from the repo

Models and MCP servers are discovered from the LiteLLM gateway at sync time
(/v1/models, and the aggregate /mcp/ endpoint). Skills have no gateway side to
query: LiteLLM's /v1/skills is a passthrough to Anthropic's Skills API, which
lists skills on an Anthropic account rather than serving skill files, and
/public/skill_hub is a marketplace catalog. So the repo is the source of truth
and the tree is fetched whole, from the repo tarball.

Deploy to ~/.config/mcp-sync/skills rather than ~/.config/opencode/skills so
the atomic replace can never delete a skill the user wrote by hand; opencode
picks the tree up via skills.paths, which expands {env:HOME} — verified — so
the shared config stays identical for every user.

Same throttle and non-fatal discipline as the config sync: a fetch that yields
no skills/ leaves the last-good tree in place instead of emptying it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 12:26:17 -04:00
co-authored by Claude Opus 4.8
parent c0df3a1596
commit c0d67f023a
5 changed files with 164 additions and 10 deletions
+57
View File
@@ -0,0 +1,57 @@
# skills — shared opencode skills
Skills every covert-gpt user gets. `mcp-config/sync.sh` deploys this directory
to `~/.config/mcp-sync/skills` on each box; the shared `opencode.gateway.json`
points opencode at it via `skills.paths`.
Unlike models and MCP servers — which are discovered from the LiteLLM gateway
at sync time — skills are plain files with nothing on the gateway to query, so
**this repo is the source of truth**. Add a skill here, push to `main`, and it
lands everywhere within the sync TTL (~1h, or immediately on a new shell).
> LiteLLM's `/v1/skills` is *not* an alternative: it is a passthrough to
> Anthropic's Skills API (`?beta=true`), which lists skills on an Anthropic
> account. It does not serve skill files to a client, and opencode cannot read
> it. `/public/skill_hub` is a marketplace catalog, also not a skill source.
## Layout
One folder per skill, each with a `SKILL.md`:
```
skills/
my-skill/
SKILL.md # required
reference.md # optional supporting files
```
`SKILL.md` needs YAML frontmatter with `name` and `description`. `name` must be
1–64 chars, lowercase alphanumeric with single-hyphen separators, and match the
folder name. `description` is 1–1024 chars and is what the model reads to decide
whether to pull the skill in — write it to say *when to use this*, not just what
it is.
```markdown
---
name: my-skill
description: Use when doing X. Covers Y and Z.
---
Body: the instructions the model follows once the skill is loaded.
```
## Don't put per-user things here
Same rule as the MCP gateway: this tree is **identical for every user**. Skills
that depend on one person's credentials, kubeconfig, or local paths belong in
that user's own `~/.config/opencode/skills/`, which sync never touches.
## Verifying
```sh
opencode debug skill # lists every skill opencode can see, with its path
```
If a skill you added here is missing, check that the sync ran (`ls
~/.config/mcp-sync/skills`) and that the folder name matches the frontmatter
`name`.