Mount, not install. AI workspace configuration from git-backed registries.
Project description
csaw
Mount, not install. Your AI workspace — symlinked from registries, reversible, inspectable.
Works with: Claude Code · OpenCode · Codex · Cursor · Windsurf · Gemini CLI
csaw manages agent instructions, skills, and configs from git-backed registries — symlinked into your projects, mounted into tool-native directories, and removed without a trace.
csaw mount # pick a profile interactively
csaw mount --profile team/backend # or specify directly
csaw inspect # see everything that's active
csaw unmount # clean removal, no trace
Why csaw?
Your AI coding tools (Claude Code, OpenCode, Codex, Cursor) need configuration files — AGENTS.md, skills, rules. Today you copy them between projects, they drift, and switching between setups means manually swapping files.
csaw mounts these files from a central registry using symlinks. When you're done, unmount. When you switch tasks, switch profiles. Your project's git history stays clean.
| Copy & paste | csaw | |
|---|---|---|
| Install | Copy files into repo | Symlink from registry |
| Update | Re-copy, hope nothing drifted | Pull registry, links update live |
| Undo | Delete files, hope you got them all | csaw unmount — originals restored |
| Switch | Manual file swapping | csaw mount --profile frontend |
| Git | Config files in your history | Hidden from git automatically |
| Tools | Manually place in each tool's dir | Auto-detected, auto-mounted |
Install
# Recommended (any platform)
uv tool install csaw
# macOS / Linux
brew install --cask csaw-ai/tap/csaw
# Windows
scoop bucket add csaw-ai https://github.com/csaw-ai/scoop-bucket
scoop install csaw
macOS note (Homebrew): If you see "Apple could not verify", run:
xattr -d com.apple.quarantine "$(which csaw)"This is normal for unsigned CLI tools distributed via Homebrew casks.
Other install methods
# pipx
pipx install csaw
# Go from source (requires Go 1.22+)
go install github.com/csaw-ai/csaw/cmd/csaw@latest
Quick Start
1. Create or add a source
A source is any git repo (or local directory) containing agent files and skills.
# Add a team registry (auto-clones)
csaw source add team git@github.com:your-org/ai-config.git
# Or create your own
csaw init ~/my-ai-config
csaw source add personal ~/my-ai-config --priority 10
2. Mount a profile
Profiles are named sets of files defined in a csaw.yml in the source:
# csaw.yml
backend:
include:
- agents/base.md
- agents/go.md
- skills/code-review/**
- skills/testing/**
frontend:
extends: backend
include:
- agents/react.md
- skills/react-patterns/**
Mount one:
csaw mount --profile team/backend
Or just run csaw mount — you'll get an interactive picker showing all available profiles with descriptions.
3. Inspect what's active
csaw inspect
csaw inspect
project: /home/you/api-server
csaw home: /home/you/.csaw
sources: 1
mounted: 12
Sources
team (remote) → /home/you/.csaw/sources/team
Mounted files
team
✔ .claude/skills/code-review/SKILL.md
✔ .claude/skills/testing/SKILL.md
✔ .agents/skills/code-review/SKILL.md
✔ .agents/skills/testing/SKILL.md
✔ AGENTS.md
✔ agents/base.md
✔ agents/go.md
...
4. Work normally
Open your AI tool. Skills are mounted into tool-native directories (.claude/skills/, .opencode/skills/, .agents/skills/) where they're automatically discovered. AGENTS.md is at your project root.
5. Clean up
csaw unmount # remove everything, restore originals
csaw mount --restore # re-mount what was there before
How It Works
csaw uses symlinks, not file copies. Your registry is the source of truth:
your-project/
.claude/skills/code-review/SKILL.md → ~/.csaw/sources/team/skills/code-review/SKILL.md
.agents/skills/code-review/SKILL.md → ~/.csaw/sources/team/skills/code-review/SKILL.md
AGENTS.md → ~/.csaw/sources/team/AGENTS.md
- Skills mount into tool-native directories (
.claude/skills/,.opencode/skills/,.agents/skills/). These are typically gitignored, so git stays clean. - AGENTS.md and other non-skill files mount at the project root, with entries in
.git/info/excludeto keep them out of git status. - csaw checks
.gitignorefirst — if a path is already covered, no extra exclude is needed.
Git visibility
By default, mounted files are hidden from git. To make a file visible:
csaw show AGENTS.md # remove from git exclude → visible to git
csaw hide AGENTS.md # add back → hidden from git
Commands
| Command | What it does |
|---|---|
csaw init [dir] |
Scaffold a new registry with csaw.yml, agents/, skills/. |
csaw mount [patterns] |
Mount files. Replaces any previous mount. Interactive picker if no args. |
csaw mount --profile name |
Mount a named profile. |
csaw mount --restore |
Re-mount the previous selection. |
csaw unmount [patterns] |
Remove mounted files, restore originals. |
csaw inspect |
Show full state: sources, mounted files, health. |
csaw inspect --source name |
Browse a source's contents. |
csaw check |
Detect broken or drifted symlinks. |
csaw update |
Repair drifted links. |
csaw diff path |
Show diff between mounted file and its source. |
csaw pull [source] |
Pull latest from remote sources. |
csaw push [source] -m "msg" |
Commit and push source changes. |
csaw pin source@ref |
Pin a source to a branch or tag for this project. |
csaw unpin source |
Unpin, return to default branch. |
csaw fork source/path |
Copy a file into another source for personal editing. |
csaw show path |
Make a mounted file visible to git. |
csaw hide path |
Hide a mounted file from git. |
csaw source add name url |
Add a source (auto-clones remote). |
csaw source remove name |
Remove a source. |
csaw source clone name dir |
Clone a remote source locally for contributing. |
csaw source list |
List configured sources. |
csaw status |
Show mounted files, sources, stashed originals. |
csaw version |
Print version. |
Flags
| Flag | Commands | What it does |
|---|---|---|
--profile name |
mount | Use a named profile for file selection. |
--exclude glob |
mount | Exclude files matching a pattern. |
--include-ignored |
mount | Include files hidden by .csawignore. |
--force |
mount | Overwrite conflicts, stash originals. |
--skip-conflicts |
mount | Skip files that conflict. |
--restore |
mount | Re-mount the previous selection. |
--keep |
mount | Keep existing mounts instead of replacing them. |
--tools list |
mount | Target tools (e.g., --tools claude,cursor). |
--source name |
inspect | Show details for a specific source. |
--into source |
fork | Target source to fork into. |
--name name |
init | Registry name (defaults to directory name). |
--priority n |
source add | Source priority (higher wins on conflict). |
Profiles
Profiles live in csaw.yml at the root of any source. They support glob patterns and inheritance:
base:
description: Shared foundation for all profiles
include:
- AGENTS.md
- skills/code-review/**
backend:
description: Go backend development
extends: base
include:
- agents/go.md
- skills/go-patterns/**
- skills/testing/**
security:
extends: base
include:
- skills/security-review/**
exclude:
- skills/testing/**
Profiles from different sources can reference each other: extends: team/base.
Registry Structure
A csaw source is just a directory (usually a git repo) with agent files and an optional csaw.yml:
my-ai-config/
csaw.yml # profiles (optional)
.csawignore # files hidden from default mounts (optional)
AGENTS.md # root agent instructions
agents/
base.md
go.md
react.md
skills/
code-review/
SKILL.md
testing/
SKILL.md
go-patterns/
SKILL.md
Every file is standard markdown — usable without csaw.
Contributing
See CONTRIBUTING.md for workflow, validation, and repo standards.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file csaw-0.3.0-py3-none-win_arm64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-win_arm64.whl
- Upload date:
- Size: 11.8 MB
- Tags: Python 3, Windows ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ae428488fddf47f8ffb5441157f198efa785f3bfc924c94d90aa89d305374c5
|
|
| MD5 |
a6ba092b57b8f1d365839bffde3fd953
|
|
| BLAKE2b-256 |
4c9caec1650d237a7d0cd73a0d597f58fc88e2be62a8f60e4361c640b54d7e3a
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-win_arm64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-win_arm64.whl -
Subject digest:
6ae428488fddf47f8ffb5441157f198efa785f3bfc924c94d90aa89d305374c5 - Sigstore transparency entry: 1275637886
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-win_amd64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-win_amd64.whl
- Upload date:
- Size: 12.7 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6b9853e415096350dec7153146d62fb32bc4463ae17e08a327d3c60545b9283
|
|
| MD5 |
b27545e6e31b4c00bb32238cf47f6476
|
|
| BLAKE2b-256 |
55bb11fd361d05c1ec749e0e26e08261364c2f7fec97c74a42570b31f38307e9
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-win_amd64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-win_amd64.whl -
Subject digest:
f6b9853e415096350dec7153146d62fb32bc4463ae17e08a327d3c60545b9283 - Sigstore transparency entry: 1275637296
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 12.2 MB
- Tags: Python 3, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d4a5df6e6c0c228bb3a883e48a771d802862621ddc6d5a436ea8a8b55ee4bc0
|
|
| MD5 |
866a79d1a3c267db227a4fd94165bf6d
|
|
| BLAKE2b-256 |
6fc73dffaf2361157f9363ed8892fd38ad830f466bda7c17b541d1fece4f47da
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-musllinux_1_2_x86_64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-musllinux_1_2_x86_64.whl -
Subject digest:
1d4a5df6e6c0c228bb3a883e48a771d802862621ddc6d5a436ea8a8b55ee4bc0 - Sigstore transparency entry: 1275637752
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 11.5 MB
- Tags: Python 3, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2ccb3e188d9eba39c718d830ae7877e2d743649805c95f930d31d5074e83a59
|
|
| MD5 |
6a7f2e1647429dafba836165b5209777
|
|
| BLAKE2b-256 |
d32c32a07d98a17566ffc4a5e066067fbfde292d7eaf5bca2286552b3d676377
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-musllinux_1_2_aarch64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-musllinux_1_2_aarch64.whl -
Subject digest:
e2ccb3e188d9eba39c718d830ae7877e2d743649805c95f930d31d5074e83a59 - Sigstore transparency entry: 1275637169
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 12.2 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c21abe279cb76169d7d21ed8751262c4ca5e8707263c60ed09d4ba27286377e2
|
|
| MD5 |
f8e2f1485798b8aa3b2dd3780f33e363
|
|
| BLAKE2b-256 |
eb34a059a83d6236d5c8a6ddbfa58448c606d17b613a8fb817c3426bb6a8e194
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-manylinux_2_17_x86_64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-manylinux_2_17_x86_64.whl -
Subject digest:
c21abe279cb76169d7d21ed8751262c4ca5e8707263c60ed09d4ba27286377e2 - Sigstore transparency entry: 1275638127
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-manylinux_2_17_aarch64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-manylinux_2_17_aarch64.whl
- Upload date:
- Size: 11.5 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15cfd76b50ef2e629edf2bc3d0b6b48a4f2029c784d83a7ee75af98e1a0fabb3
|
|
| MD5 |
c66d2aa045e6e658a394e7ca13671632
|
|
| BLAKE2b-256 |
74eb32840908b2eb77db5e343eb8b10929d014855978567adfb04e296d3bdce3
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-manylinux_2_17_aarch64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-manylinux_2_17_aarch64.whl -
Subject digest:
15cfd76b50ef2e629edf2bc3d0b6b48a4f2029c784d83a7ee75af98e1a0fabb3 - Sigstore transparency entry: 1275638018
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 11.8 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61644328dde3e635a732c3520444f7dae0724a04d582aca5adc8743c3a6b7f99
|
|
| MD5 |
8c9c90b5a125a79e85583f6680826cfb
|
|
| BLAKE2b-256 |
56bfbcde1a81efad39da0b6a04aab2885ba0c0b61e34d1a8592d308af987577c
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-macosx_11_0_arm64.whl -
Subject digest:
61644328dde3e635a732c3520444f7dae0724a04d582aca5adc8743c3a6b7f99 - Sigstore transparency entry: 1275637420
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.0-py3-none-macosx_10_9_x86_64.whl.
File metadata
- Download URL: csaw-0.3.0-py3-none-macosx_10_9_x86_64.whl
- Upload date:
- Size: 12.5 MB
- Tags: Python 3, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6557674b20d81041875f538e839aedf72db33884b10f0b4e7beef7225ac2bd9c
|
|
| MD5 |
6a730e652002962cf9857ff95948b966
|
|
| BLAKE2b-256 |
a65a443759b17458ede7f95a4bf6375f4f8e4a0ecd9a72dfcfa29a6bda8ce226
|
Provenance
The following attestation bundles were made for csaw-0.3.0-py3-none-macosx_10_9_x86_64.whl:
Publisher:
release.yml on csaw-ai/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.0-py3-none-macosx_10_9_x86_64.whl -
Subject digest:
6557674b20d81041875f538e839aedf72db33884b10f0b4e7beef7225ac2bd9c - Sigstore transparency entry: 1275637579
- Sigstore integration time:
-
Permalink:
csaw-ai/csaw@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/csaw-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ffd4af02616b8ff9301ecbc7eccd25cebe32ce44 -
Trigger Event:
push
-
Statement type: