A declarative AI agent environment manager, written in Rust.
Name comes from the Japanese word γ«γ»γγ (kasetto) - cassette. Think of Skills and MCPs as cassettes you plug in, swap out, and share across machines.
There are good tools in this space already - Vercel Skills installs skills from a curated catalog, and Claude Plugins offer runtime integrations. Both work well for one-off installs, but neither gives you a declarative, version-controlled config.
Kasetto is a community-first project that solves a different problem: declarative, reproducible skill management across machines and agents.
- Declarative β one YAML file, your whole setup: skills, commands, MCPs, and agents. Apply globally or scope to a project; configs compose with
extends, so org, team, and project stay in sync. - Enterprise & private repositories β pull from anywhere: GitHub, GitLab, Bitbucket, Codeberg, Gitea, and self-hosted instances, public or private. Onboard a new engineer with one command; everyone gets the same environment, zero drift.
- Multi-agent β write once, ship everywhere. Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, and many more β one sync keeps them all current.
- Skills, Commands & MCPs β all three asset kinds, one source: skills, commands, and MCPs. Everything is transformed into each agent's native format, and auto-merged. Distribute rules, tools, and prompts as easily as sharing a repository link.
- Speed β instant by design. Built in Rust, it hashes content and diffs a lock file so only what changed gets touched β full syncs finish in seconds.
- Universal β one static binary for macOS, Linux, and Windows. Install as
kasetto, run askst. CI-friendly with--jsonoutput and real exit codes.
Inspired by uv - what uv did for Python packages, Kasetto aims to do for AI skills.
macOS and Linux:
curl -fsSL kasetto.dev/install | shWindows:
powershell -ExecutionPolicy Bypass -c "irm kasetto.dev/install.ps1 | iex"brew install pivoshenko/tap/kasettoscoop bucket add kasetto https://github.com/pivoshenko/scoop-bucket
scoop install kasettocargo install kasetto1. Scaffold a config:
kst init # creates ./kasetto.yaml in the current directory
kst init --global # or a global one at ~/.config/kasetto/kasetto.yamlEdit the generated kasetto.yaml β pick an agent, add a skills: source, and you're ready to sync.
2. Sync skills into your agents:
# uses ./kasetto.yaml in the current directory
kst sync
# or point at a shared team config over HTTPS
kst sync --config https://example.com/team-skills.yamlWant bare kst sync to always pull from a remote URL? Persist it in ~/.config/kasetto/config.yaml:
source: https://github.com/pivoshenko/pivoshenko.ai/blob/main/kasetto.yamlAfter that, kst sync resolves the URL automatically β no --config flag needed.
That's it. Kasetto pulls the skills and installs them into the right agent directory. The next time you run sync, only what changed gets updated.
See pivoshenko/pivoshenko.ai for a community example pulling skills from multiple packs for Claude Code and OpenCode.
3. See what's installed:
kst list # interactive browser with vim-style navigation
kst doctor # version, paths, last sync statusOne-line synopsis below. Full flags and examples in the commands reference.
kst initβ generate a starterkasetto.yaml(local or--global).kst syncβ read config, fetch sources, install skills + MCPs into agent dirs.kst listβ interactive TUI (or plain/JSON) of installed skills and MCPs from the lock file.kst doctorβ local diagnostics: version, paths, last sync status, broken skills.kst cleanβ remove tracked skills and MCP configs for the given scope.kst self updateβ fetch latest release, verify SHA256, replace binary in place.kst self uninstallβ remove installed assets, data, and the binary.kst completions <shell>β emit shell completion script (bash/zsh/fish/powershell).
Most commands accept --json, --plain, --quiet, and --project | --global.
When --config is omitted, Kasetto looks for config in this order:
$KASETTO_CONFIGenv varsource:key in$XDG_CONFIG_HOME/kasetto/config.yaml./kasetto.yaml$XDG_CONFIG_HOME/kasetto/kasetto.yaml(or~/.config/kasetto/kasetto.yaml)
Run kst init to scaffold a local config, or kst init --global for the global one.
# Option A: preset destination by agent (see README for supported agent values)
agent:
- codex
- claude-code
# Option B: manual destination (takes precedence if both are set)
# destination: ./.agents/skills
skills:
# "*" syncs every skill in the source β each is a directory with a SKILL.md,
# discovered in the source root or its skills/ subdirectory
- source: https://github.com/vercel-labs/next-skills
# ref: v1.0.0 # pin to a tag or commit; omit to track the default branch
skills: "*"
# or list skills by name
- source: https://github.com/anthropics/skills
skills:
- doc-coauthoring
- frontend-design
- pptx
# sub-dir: resolve the named skills under this path, e.g. skills/productivity/grill-me/
- source: https://github.com/mattpocock/skills
sub-dir: skills/productivity
skills:
- grill-me
- caveman
# path: a skill in a non-standard location β <path>/<name>/, here skills/engineering/improve-codebase-architecture/
- source: https://github.com/mattpocock/skills
skills:
- name: improve-codebase-architecture
path: skills/engineering
commands:
# names resolve to commands/<name>.md in the source (nested dirs namespace, e.g. git:commit)
- source: https://github.com/gsd-build/get-shit-done
commands:
- gsd:explore
- gsd:fast
mcps:
# names resolve to mcps/<name>.json in the source
- source: https://github.com/pivoshenko/pivoshenko.ai
branch: main # track a specific branch (use ref: to pin a tag or commit)
mcps:
- github
- vercel
- kaggleFull key reference, merge rules, and extends: inheritance live in the configuration docs.
Set the agent field and Kasetto figures out where to put things.
Full list of supported agents
| Agent | Config value | Install path |
|---|---|---|
| Amp | amp |
~/.config/agents/skills/ |
| Antigravity | antigravity |
~/.gemini/antigravity/skills/ |
| Augment | augment |
~/.augment/skills/ |
| Claude Code | claude-code |
~/.claude/skills/ |
| Cline | cline |
~/.agents/skills/ |
| Codex | codex |
~/.codex/skills/ |
| Continue | continue |
~/.continue/skills/ |
| Cursor | cursor |
~/.cursor/skills/ |
| Gemini CLI | gemini-cli |
~/.gemini/skills/ |
| GitHub Copilot | github-copilot |
~/.copilot/skills/ |
| Goose | goose |
~/.config/goose/skills/ |
| Junie | junie |
~/.junie/skills/ |
| Kiro CLI | kiro-cli |
~/.kiro/skills/ |
| OpenClaw | openclaw |
~/.openclaw/skills/ |
| OpenCode | opencode |
~/.config/opencode/skills/ |
| OpenHands | openhands |
~/.openhands/skills/ |
| Replit | replit |
~/.config/agents/skills/ |
| Roo Code | roo |
~/.roo/skills/ |
| Trae | trae |
~/.trae/skills/ |
| Warp | warp |
~/.agents/skills/ |
| Windsurf | windsurf |
~/.codeium/windsurf/skills/ |
Don't see your agent? Use the destination field to point at any path.
Private GitHub, GitLab, Bitbucket, Codeberg, Gitea, and self-hosted instances work via env-var tokens (GITHUB_TOKEN, GITLAB_TOKEN, BITBUCKET_TOKEN, GITEA_TOKEN, etc.) β no login command, no credentials file. The same tokens apply to remote --config URLs.
Full host table and auth resolution rules in the authentication docs.
See CONTRIBUTING.md for development setup and guidelines.
Licensed under either MIT or Apache-2.0, at your option.