Your AI environment, under control

Declarative AI agent environment manager, written in Rust.

curl -fsSL kasetto.dev/install | sh
Akasetto.yamlLOCKEDSKILLS / COMMANDS / MCPs / INSTRUCTIONS
  • Claude Code
  • Cursor
  • Codex
  • Antigravity
  • Amp
  • Augment
  • Cline
  • Continue
  • Gemini CLI
  • GitHub Copilot
  • Goose
  • Junie
  • Kiro CLI
  • OpenClaw
  • OpenCode
  • OpenHands
  • Pi
  • Replit
  • Roo Code
  • Trae
  • Warp
  • Windsurf
  • ZCode
See all

See everything in one file

kasetto.yaml lists every skill, command, MCP, and instruction you use, and the repository each one comes from. kst sync fetches those repositories and writes each asset where your agent looks for it. Run it again on another machine and you get the same setup; run it after a change and only that change is touched.

Configuration reference
kasetto.yaml
# 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: 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: 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: 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: 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: github.com/gsd-build/get-shit-done
commands:
- gsd: explore
- gsd: fast
instructions:
# instructions wire CLAUDE.md / .cursor/rules / AGENTS.md etc. from instructions/<name>.{md,mdc}
# "*" syncs every instruction; aggregate files (CLAUDE.md, AGENTS.md) get managed blocks
- source: github.com/pivoshenko/pivoshenko.ai
instructions:
- docs-autoupdate
- multi-agent-dispatch
mcps:
# names resolve to mcps/<name>.json in the source
- source: github.com/pivoshenko/pivoshenko.ai
branch: main # track a specific branch (use ref: to pin a tag or commit)
mcps:
- github
- vercel
- kaggle
~/dev/kasetto
❯kst

From any source to your agent

  • SkillsA directory with a SKILL.md, copied as is
  • CommandsMarkdown files, rewritten into each agent's format
  • MCPsServer definitions merged into the agent's settings
  • InstructionsRules written as files, or as managed blocks in shared ones
  • GitHubGITHUB_TOKEN # private repository
  • GitLabGITLAB_TOKEN # private repository
  • BitbucketBITBUCKET_TOKEN # private repository
  • CodebergCODEBERG_TOKEN # private repository
  • GiteaGITEA_TOKEN # private repository
  • ForgejoFORGEJO_TOKEN # private repository
  • Self-hostedGitHub Enterprise, GitLab, Gitea
  • Local pathno network needed

Tokens never touch git

Put a ${kst_...} placeholder where the token would go. When you sync, Kasetto reads the real value from your environment, a credentials file, or the vault CLI you are already signed in to, and writes it into the agent's config. The lock file only ever sees the placeholder.

Secrets guide
Secrets injection
mcps/vercel.jsonin git
"env": { "VERCEL_TOKEN": "${kst:op:Private/Vercel/token}" }
1Password via op
~/.claude.jsonlocal only
"VERCEL_TOKEN": "vcp_7Qx••••••••••"
kasetto.lockin git
hash: 9b2e41e0...# of the placeholder
  • 1Password
  • Environment
  • credentials.yaml
  • HashiCorp Vault
  • KeePass
  • AWS Secrets Manager
  • Google Secret Manager
  • Azure Key Vault
  • pass / gopass
  • macOS Keychain

A security and audit layer for your agent

kst audit checks every installed skill and MCP. Skills get the verdicts skills.sh partners publish. MCPs get an offline look at how they launch, then OSV advisories and deps.dev health for the package they run. Turn it on as a sync gate and anything at or above your threshold fails the run, so the problem stops in CI rather than in your agent.

Security model
~/dev/team-appaudit gate
❯
Auditing 5 assetsskills.sh · OSV · deps.dev
  1. pdfskill3 partnerssafepass
  2. frontend-designskill3 partnerslowpass
  3. vercelmcpfloating npx versionmediumpass
  4. team-playbookskillnot on skills.shunverifiedwarn
  5. db-adminmcp2 OSV advisoriescriticalblock
kasetto.yamlpolicy
audit:
fail-on: high
fail-on-unverified: true
$ kst sync --audit highthe same gate for one run, no config

Every install, pinned in a lock file

Each sync writes the source, resolved revision, destination, and content hash of what it installed to kasetto.lock. Commit the file and changes to your setup show up in code review like any other diff. --locked installs from the lock alone, without the network, and fails if the config has drifted from it.

How sync works
kasetto.lockcommitted
version: 3
skills:
github.com/anthropics/skills::pdf:
destination: .claude/skills/pdf,.cursor/skills/pdf
hash: 9b2e41c07d5fa8e3...
skill: pdf
description: Read, fill, and merge PDF files
source: github.com/anthropics/skills
source_revision: ref:v1.2.0
scope: project
assets:
mcp::github.com/pivoshenko/pivoshenko.ai::github.json:
kind: mcp
name: github.json
hash: 31f0c8ae52b97d14...
source: github.com/pivoshenko/pivoshenko.ai
destination: github
source_revision: branch:main
has_secrets: true
$ kst sync --lockedno network, fails if the lock drifts from the config
kasetto.lockpull request
github.com/anthropics/skills::pdf:
source: github.com/anthropics/skills
source_revision: ref:v1.2.0
source_revision: ref:v1.3.0
hash: 9b2e41c07d5fa8e3...
hash: 4c71d02be9a0f6d1...
$ kst sync --update pdfre-resolve one asset, or every moving branch

Works with the agent you use

  • Claude Code
  • Cursor
  • Codex
  • Antigravity
  • Amp
  • Augment
  • Cline
  • Continue
  • Gemini CLI
  • GitHub Copilot
  • Goose
  • Junie
  • Kiro CLI
  • OpenClaw
  • OpenCode
  • OpenHands
  • Pi
  • Replit
  • Roo Code
  • Trae
  • Warp
  • Windsurf
  • ZCode
  • Add yours

One binary, any machine

One static binary for macOS, Linux, and Windows, with JSON output and exit codes you can build CI on. It installs as kasetto and as the short alias kst.

  • macOS / Linux
    curl -fsSL kasetto.dev/install | sh
  • Windows (PowerShell)
    powershell -ExecutionPolicy Bypass -c "irm kasetto.dev/install.ps1 | iex"
  • Homebrew
    brew tap pivoshenko/tap
    brew trust pivoshenko/tap
    brew install kasetto
  • Cargo
    cargo install kasetto