A declarative AI agent environment manager, written in Rust.
Name comes from the Japanese word ใซใปใใ (kasetto) - cassette. Think of skill sources as cassettes you plug in, swap out, and share across machines.
- Declarative - one YAML config describes your entire skill setup. Version it, share it, bootstrap a whole team in seconds.
- Syncs skills from GitHub, GitLab, Bitbucket, Codeberg/Gitea repositories or local directories including GitHub Enterprise and self-hosted GitLab.
- 21 built-in agent presets: Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, and many more.
- MCP server management: declare MCP servers in the same config and Kasetto merges them into each agent's native settings file.
- Tracks every install in a local manifest - knows what changed and why.
--dry-run,--json, and--verboseflags for scripting and CI.- Ships as a single binary - install as
kasetto, run askst.
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.
- Team consistency - commit a YAML file, everyone gets the same skills.
- Multi-source - pull from GitHub, GitLab, Bitbucket, Codeberg/Gitea repositories and local folders in one config.
- Agent-agnostic - one config field switches between 21 agent environments.
- Traceable - every install is tracked, diffable, and inspectable.
- CI-friendly -
--jsonoutput and non-zero exit codes for automation.
Inspired by uv - what uv did for Python packages, Kasetto aims to do for AI skills.
macOS and Linux:
curl -fsSL https://raw.githubusercontent.com/pivoshenko/kasetto/main/scripts/install.sh | shWindows:
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/pivoshenko/kasetto/main/scripts/install.ps1 | iex"By default the binary is placed in ~/.local/bin. You can override this with environment variables:
| Variable | Description | Default |
|---|---|---|
KASETTO_VERSION |
Version tag to install | Latest release |
KASETTO_INSTALL_DIR |
Installation directory | ~/.local/bin (Unix) / %USERPROFILE%\.local\bin (Windows) |
brew install pivoshenko/tap/kasettocargo install kasettogit clone https://github.com/pivoshenko/kasetto && cd kasetto
cargo install --path .1. Sync from a remote config or a local file:
# pull a shared team config from a URL
kst sync --config https://example.com/team-skills.yaml
# or use a local file
kst sync --config kasetto.yamlThat'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.
2. See what's installed:
kst list # interactive browser with vim-style navigation
kst doctor # version, paths, last sync statusGenerates a starter kasetto.yaml in the current directory.
kst init [--force]| Flag | What it does |
|---|---|
--force |
Overwrite an existing kasetto.yaml without asking |
Reads the config, discovers skills, and makes the local destination match.
kst sync [--config <path-or-url>] [--dry-run] [--quiet] [--json] [--plain] [--verbose] [--project | --global]| Flag | What it does |
|---|---|
--config |
Path or HTTPS URL to a YAML config (default: kasetto.yaml) |
--dry-run |
Preview what would change without writing anything |
--quiet |
Suppress non-error output |
--json |
Print the sync report as JSON |
--plain |
Disable colors and spinner animations |
--verbose |
Show per-skill action details |
--project |
Install into the current project directory |
--global |
Install globally (default) |
Missing skills are reported as broken but won't stop the rest of the run. The exit code is non-zero only for source-level failures.
Shows skills and MCP servers from the lock file(s). Without --project or --global, both scopes are merged so you can tell global and project installs apart (scope is shown per row / in JSON).
kst list [--json] [--quiet] [--plain] [--project | --global]In a terminal (and without --plain), this opens an interactive browser โ Skills and MCPs tabs with detail panes. Navigate with j/k, switch tabs with Tab or h/l, scroll with PgUp/PgDn, jump with gg/G. Use --plain, set NO_TUI=1, or pipe stdout for a plain text listing.
Prints local diagnostics: version, lock file path, installation paths, last sync time, and any failed skills from the latest run.
kst doctor [--json] [--quiet] [--plain] [--project | --global]Removes all tracked skills and MCP configs for the given scope.
kst clean [--dry-run] [--json] [--quiet] [--plain] [--project | --global]| Flag | What it does |
|---|---|
--dry-run |
Preview what would be removed (prints paths and MCP packs) |
--json |
Print output as JSON |
--quiet |
Suppress non-error output |
--plain |
Disable colors and banner-style header |
--project |
Clean project-scoped assets |
--global |
Clean globally-scoped assets (default) |
Checks GitHub for the latest release and replaces the current binary in-place.
kst self update [--json]Removes installed skills, MCP configs, Kasetto data, and the binary.
kst self uninstall [--yes]Generates shell completion scripts.
kst completions <shell>Supported shells: bash, zsh, fish, powershell.
Kasetto looks for kasetto.yaml in the current directory by default. Point it at a specific file or URL with --config, or run kst init to generate a starter.
# Choose an agent preset (single or multiple)...
agent: codex
# agent:
# - claude-code
# - cursor
# ...or set an explicit path (overrides agent)
# destination: ./my-skills
# Install scope: "global" (default) or "project"
# scope: project
skills:
# Pull specific skills from a GitHub repo
- source: https://github.com/org/skill-pack
branch: main
skills:
- code-reviewer
- name: design-system
# Sync everything from a local folder
- source: ~/Development/my-skills
skills: "*"
# Pin to a git tag or commit
- source: https://github.com/acme/stable-skills
ref: v1.2.0
skills:
- name: custom-skill
path: tools/skills
# MCP servers (optional)
mcps:
- source: https://github.com/org/mcp-pack
- source: https://github.com/org/monorepo
path: mcps/my-server/pack.json| Key | Required | Description |
|---|---|---|
agent |
no | One or more supported agent presets |
destination |
no | Explicit install path - overrides agent if both are set |
scope |
no | "global" (default) or "project" - where to install |
skills |
yes | List of skill sources |
skills[].source |
yes | Git host URL or local path |
skills[].branch |
no | Branch for remote sources (default: main, falls back to master) |
skills[].ref |
no | Git tag, commit SHA, or ref (takes priority over branch) |
skills[].skills |
yes | "*" for all, or a list of names / { name, path } objects |
mcps |
no | List of MCP server sources |
mcps[].source |
yes | Git host URL or local path containing MCP config |
mcps[].branch |
no | Branch for remote sources |
mcps[].ref |
no | Git tag, commit SHA, or ref |
mcps[].path |
no | Explicit path to MCP JSON file within the source |
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.
Set an environment variable and private sources just work โ no login command, no credentials file:
| Host | Environment variable |
|---|---|
| GitHub / GitHub Enterprise | GITHUB_TOKEN or GH_TOKEN |
| GitLab / GitLab self-hosted | GITLAB_TOKEN or CI_JOB_TOKEN |
| Bitbucket Cloud | BITBUCKET_EMAIL + BITBUCKET_TOKEN |
| Codeberg / Gitea / Forgejo | GITEA_TOKEN, CODEBERG_TOKEN, or FORGEJO_TOKEN |
Kasetto auto-detects GitHub Enterprise for any hostname with an owner/repo path, and GitLab self-hosted when the hostname starts with gitlab..
skills:
# GitHub Enterprise
- source: https://ghe.example.com/acme/skill-pack
skills: "*"
# Self-hosted GitLab (nested groups supported)
- source: https://gitlab.example.com/team/ai/skills
skills:
- code-reviewerThe same tokens apply when you fetch a remote config via --config https://....
- Agents management
- Hooks management
- Your idea? Open an issue
See CONTRIBUTING.md for development setup and guidelines.
Licensed under either MIT or Apache-2.0, at your option.