Agent skills for Zig projects and CLI tools. A package declares
skills/<name>/SKILL.md; zymposium links it into every agent that should
see it — and never touches the ones you wrote yourself. Install it with
zest, or build it yourself.
I’m building a small ecosystem of focused Zig tools: zest builds and updates CLI tools; zymposium provisions the agent skills those tools and Zig packages provide. Each works on its own; the integration is optional.
zest install JustinWoodring/zymposium
PATH, and upgrades it with zest update zymposium — the same as every other tool you manage.git clone https://github.com/JustinWoodring/zymposium
cd zymposium && zig build
zymposium add both work without it.With zest you get one extra source — the tools it manages — whose skills
refresh automatically whenever you update the tool. Config lives in
$XDG_CONFIG_HOME/zymposium/config.json, state and clones in
$XDG_DATA_HOME/zymposium.
Run zymposium sync from anywhere. Inside a Zig project it walks that
project's dependency graph; outside one it still provisions packages you added with
zymposium add.
$ zymposium init $ zymposium sync linked 6, updated 0, unchanged 0, removed 0 $ zymposium list # SKILL PROVIDER VERSION AGENTS DESCRIPTION # dep-a-skill dep-a 1220-000 claude,codex,agent Skill shipped by dep-a $ zymposium doctor all provisioned skills are healthy
Every immediate subdirectory of a package's skills/ that contains a
SKILL.md is one skill, named after the directory. Nothing else is required, so any
repository can ship skills by adding one directory.
my-package/
├── build.zig.zon
└── skills/
├── deploy/
│ └── SKILL.md → linked as ~/.claude/skills/my-package/deploy
└── review/
└── SKILL.md → linked as ~/.claude/skills/my-package/review
| Source | Where it comes from |
|---|---|
| project_dep | Dependencies of the current build.zig.zon graph, followed transitively. Git dependencies are cloned into the cache; path dependencies are read in place. No zest needed. |
| package | Anything you registered yourself with zymposium add <path|url>. No zest needed. |
| zest_tool | A CLI tool managed by zest whose staged clone ships a skills/ directory. The only source that requires zest: there is no manifest of installed CLI tools without a tool manager. |
zymposium works on its own. Project dependencies and added packages are the whole job, and neither involves another tool. Installing zest adds one more source: the tools it manages, whose skills refresh automatically when you update them. Everything else behaves the same either way.
| Command | What it does |
|---|---|
| zymposium init | Writes a default config.json and prepares the global skill directories. |
| zymposium sync | Discovers every source and reconciles the links. --tool scopes a run to one provider, --force takes over a path zymposium does not own, --offline uses only what is cached. |
| zymposium list | Every provisioned skill, where it came from, and the command that refreshes it. |
| zymposium sources | Every package that ships skills, how many it offers, and how many are already provisioned. |
| zymposium add / remove | Register a package, or unlink one provisioned skill. |
| zymposium update [skill] | Re-fetch the sources zymposium owns and sync again. |
| zymposium doctor | Check every recorded link against the filesystem. Exits non-zero when something needs repair. |
| zymposium agents | List the known agents and their skill directories. |
Every command takes --json where it makes sense (list,
sources, doctor, sync), so a package manager can consume the
result instead of scraping text.
An agent is just a directory that holds skills. Narrow the set in
config.json, or run zymposium agents to see what is enabled right now.
| Agent | Where its skills live |
|---|---|
| Claude Code | ~/.claude/skills and <project>/.claude/skills |
| Codex (OpenAI) | ~/.codex/skills and <project>/.codex/skills |
| Generic .agent | ~/.agent/skills and <project>/.agent/skills |
Project scope is only used when there is a project: run sync from a
directory with a build.zig.zon, or point at one with --project <dir>.
Pruning is scoped too, so a run that touches one project leaves every other project's links
alone.
state.json and deletes nothing that is not in there. A hand-written skill beside a provisioned one is never touched.SKILL.md is visible to the agent immediately. Where symlinks are refused, it falls back to a copy.<skills>/<provider>/<skill>. Two packages may ship the same skill name without colliding; use provider/skill to update or remove one when a bare name is ambiguous.Never deletes a path it did not create. If a link goes missing or points at
the wrong place, zymposium doctor names it and zymposium sync repairs it.
The repository has the
README with the full
command reference, a CONTRIBUTING
guide, and an end-to-end harness (scripts/mock-e2e.sh) that runs with no network at
all. MIT licensed.
zymposium is a separate project from zest, by the same author, and depends on nothing. zymposium provisions the skills your dependencies and added packages ship; if you also use zest, it provisions the skills of the CLI tools zest manages, straight from that tool's staged clone.
The dependency-aware agent-skills idea was inspired by Symposium, which matches agent extensions to Rust workspace dependencies. zymposium adapts that idea to Zig packages and zest-managed tools.
Enjoying zymposium? Consider sponsoring its development.