Skip to content

pivoshenko/kasetto

Kasetto logo

CI Release Rust License Stand with Ukraine

Listed on BacklinkLog

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.

Why Kasetto

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 config describes your entire skill setup. Version it, share it, bootstrap a whole team in seconds. The config is the source of truth β€” readable, auditable, version-controlled.
  • Enterprise & private repos β€” GitHub, GitLab, Bitbucket, Codeberg, Gitea, and self-hosted instances out of the box. Onboard new engineers in one command. Everyone gets the exact same environment β€” zero drift, zero surprises.
  • Multi-agent β€” every major AI agent supported: Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, and many more. One config, every agent updated.
  • Skills & MCP β€” any directory with a SKILL.md is a skill β€” no registry, no boilerplate. MCP server configs are auto-merged into every supported format (Cursor JSON, Claude JSON, Copilot VS Code, Codex TOML).
  • Speed β€” written in Rust. SHA-256 content hashing and lock file diffing mean only what changed gets touched. Full sync across every agent finishes in seconds.
  • Universal β€” single static binary for macOS, Linux, and Windows. Install as kasetto, run as kst. CI-friendly with --json output and proper exit codes.

Inspired by uv - what uv did for Python packages, Kasetto aims to do for AI skills.

Install

Standalone Installer

macOS and Linux:

curl -fsSL kasetto.dev/install | sh

Windows:

powershell -ExecutionPolicy Bypass -c "irm kasetto.dev/install.ps1 | iex"

Homebrew

brew install pivoshenko/tap/kasetto

Scoop (Windows)

scoop bucket add kasetto https://github.com/pivoshenko/scoop-bucket
scoop install kasetto

Cargo

cargo install kasetto

Getting Started

1. Scaffold a config:

kst init            # creates ./kasetto.yaml in the current directory
kst init --global   # or a global one at ~/.config/kasetto/kasetto.yaml

Edit 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.yaml

Want 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.yaml

After 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 status

Commands

One-line synopsis below. Full flags and examples in the commands reference.

  • kst init β€” generate a starter kasetto.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.

Configuration

When --config is omitted, Kasetto looks for config in this order:

  1. $KASETTO_CONFIG env var
  2. source: key in $XDG_CONFIG_HOME/kasetto/config.yaml
  3. ./kasetto.yaml
  4. $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.

# 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

  # Scope discovery to a nested directory inside the source
  - source: https://github.com/acme/agents
    sub-dir: plugins/swift-apple-expert
    skills: "*"

# MCP servers (optional)
mcps:
  # Discover all packs in the repo
  - source: https://github.com/org/mcp-pack
    mcps: "*"

  # Pick specific files from a monorepo (names resolved from mcps/ dir)
  - source: https://github.com/org/monorepo
    ref: v1.4.0
    mcps:
      - github        # β†’ mcps/github.json
      - linear        # β†’ mcps/linear.json

Full key reference, merge rules, and extends: inheritance live in the configuration docs.

Supported Agents

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 Repositories & Enterprise

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.

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

Licensed under either MIT or Apache-2.0, at your option.