Mount, not install. AI workspace configuration from git-backed registries.
Project description
csaw
Mount, not install. One registry of AI rules, skills, and configs — mounted into every project, never committed, never drifted.
Works with: Claude Code · Codex · Cursor · Copilot · Windsurf · OpenCode · Gemini CLI
Your AI tools need configuration — AGENTS.md, skills, rules, MCP configs. Today those files are copy-pasted into every repo, they drift between projects, they clutter your git history, and onboarding a teammate means "copy these files from the wiki."
csaw fixes this. You keep one registry of AI config. csaw symlinks it into your projects. Update the registry, every project sees the change instantly. Unmount, and your repo is clean — no files left behind, no commits to revert.
your-registry/ your-project/
AGENTS.md ──→ AGENTS.md (symlink)
skills/ .claude/skills/
code-review/SKILL.md ──→ code-review/SKILL.md (symlink)
testing/SKILL.md ──→ testing/SKILL.md (symlink)
agents/ .claude/rules/
go.md ──→ go.md (symlink)
Install
uv tool install csaw
Other install methods
# macOS / Linux
brew install --cask NicholasCullenCooper/tap/csaw
# Windows
scoop bucket add csaw https://github.com/NicholasCullenCooper/scoop-bucket
scoop install csaw
# pipx
pipx install csaw
# Go from source
go install github.com/NicholasCullenCooper/csaw/cmd/csaw@latest
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.
Get Started in 60 Seconds
# Add your team's AI config registry
csaw source add team git@github.com:your-org/ai-config.git
# ✔ registered source "team"
# ✔ cloned team
# Mount into your project
cd ~/my-project
csaw mount --profile team/backend
╭──────────────────────────────────────────────╮
│ │
│ mounted │
│ │
│ team │
│ ✔ AGENTS.md │
│ ✔ .claude/skills/code-review/SKILL.md │
│ ✔ .claude/skills/testing/SKILL.md │
│ ✔ .claude/rules/go.md │
│ │
│ 4 files mounted · 2 tool dirs │
│ │
│ Inspect: csaw inspect │
│ Unmount: csaw unmount │
│ │
╰──────────────────────────────────────────────╯
That's it. Your AI tools see the files. Your git history doesn't.
Why Not Just Copy the Files?
They drift. You update your team's AGENTS.md. Now it's different in 12 repos. Which version does each repo have? Nobody knows.
They clutter. Every AI tool wants its own config files — .cursorrules, copilot-instructions.md, AGENTS.md, skills in .claude/skills/. That's 10+ files committed to every repo, creating PR noise and merge conflicts.
They're fragile. New person joins. "Copy these files from the wiki." They miss one. Their AI gives bad advice. Nobody notices for a week.
They're permanent. You tried a new AI config. It didn't work. Now you have to find and delete 6 files across 3 tool directories — and hope you didn't miss one.
csaw solves all of this:
- One source of truth. Update your registry, every project gets the change via symlinks — instantly, no reinstall.
- Nothing in git. Mounted files are hidden from git automatically. No commits, no PRs, no merge conflicts.
- Clean undo.
csaw unmountremoves everything and restores any files that were there before. - Onboard in one command.
csaw source add team <url>— the whole team's config, ready to mount. - Drift detection.
csaw checkfinds broken links and files that don't match their source.
Create Your Own Registry
csaw init ~/my-ai-config
# ✔ initialized registry "my-ai-config"
# Creates: csaw.yml, AGENTS.md, skills/code-review/, skills/commit-message/
A registry is just a git repo with markdown files:
my-ai-config/
csaw.yml ← profiles (which files to mount)
AGENTS.md ← your coding rules and preferences
skills/
code-review/
SKILL.md ← reusable skill
commit-message/
SKILL.md
Every file is standard markdown — usable with or without csaw.
Profiles
Profiles define named sets of files. Put them in csaw.yml:
backend:
description: Go backend development
include:
- AGENTS.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 csaw mount for an interactive picker.
Where Files Get Mounted
csaw automatically mounts files where each AI tool expects them:
Registry path → Project path → Discovered by
─────────────────────────────────────────────────────────────────────────────
AGENTS.md → AGENTS.md → Codex, Cursor, Copilot, Windsurf
CLAUDE.md → CLAUDE.md → Claude Code
agents/go.md → .claude/rules/go.md → Claude Code
.cursor/rules/go.md → Cursor
skills/foo/SKILL.md → .claude/skills/foo/SKILL.md → Claude Code
.agents/skills/foo/SKILL.md → Codex, Copilot
mcp/claude-code.json → .mcp.json → Claude Code
You write files once in registry-standard paths. csaw projects them into every tool's native directory.
Mounted files are automatically hidden from git via .git/info/exclude. Use csaw show <path> to make a file visible, csaw hide <path> to hide it again.
Full command reference
Commands
| Command | What it does |
|---|---|
csaw init [dir] |
Scaffold a new registry. --adopt to import from existing project. |
csaw source add name url |
Add a source (auto-clones remote). --priority n for conflict resolution. |
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 mount [patterns] |
Mount files. Replaces 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, mounts, priorities, pins. |
csaw check |
Detect broken or drifted symlinks. |
csaw update |
Repair drifted links. |
csaw diff path |
Diff a mounted file against its source. |
csaw pull [source] |
Pull latest from remote sources. --stash to handle dirty state. |
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 editing. --into target. |
csaw config set key value |
Set config (tools, default_fork_target). |
csaw config list |
Show all configuration. |
csaw show / hide path |
Control git visibility of mounted files. |
csaw status |
Quick summary of sources and mounts. |
Key Flags
| Flag | Commands | What it does |
|---|---|---|
--profile name |
mount | Named profile to mount. |
--force |
mount | Overwrite conflicts, stash originals. |
--keep |
mount | Add to existing mounts instead of replacing. |
--tools list |
mount | Target tools (e.g., --tools claude,cursor). |
--restore |
mount | Re-mount the previous selection. |
--adopt |
init | Import existing AI config files from current project. |
--stash |
pull | Stash uncommitted changes before pulling. |
--priority n |
source add | Source priority (higher wins on conflict). |
--into source |
fork | Target source to fork into. |
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.1-py3-none-win_arm64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
3daca7935123ad93ae73ca47669223019c8fe955de56aa43481d89ff6fef096c
|
|
| MD5 |
a517584ec1a793c6b7853ca66dca6f6f
|
|
| BLAKE2b-256 |
2f817e2862dd0b55afc5b9890f5ea66988f2b538546dcbd1a549be8ebe075fe8
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-win_arm64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-win_arm64.whl -
Subject digest:
3daca7935123ad93ae73ca47669223019c8fe955de56aa43481d89ff6fef096c - Sigstore transparency entry: 1280890419
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-win_amd64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
55229eb79bb0fcab3505fb2ee9f46878dc2418b6e12d6fd6eac244ed780718dc
|
|
| MD5 |
159e4d2379f81ecdd7e84d3cce366c61
|
|
| BLAKE2b-256 |
029d18cd242ed3c8eff17660074ea4bbbb58f8a17d2df6874d4221b568bbecfa
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-win_amd64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-win_amd64.whl -
Subject digest:
55229eb79bb0fcab3505fb2ee9f46878dc2418b6e12d6fd6eac244ed780718dc - Sigstore transparency entry: 1280890409
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
0bbc0bfa7805ce19614d32bfa772c007bb045c8994292aee6cfeaa702bfa2fb8
|
|
| MD5 |
f56ba1b551b197cc2635534701cfe4d2
|
|
| BLAKE2b-256 |
46e8522cf0bbc2bbde69fbcf4c52bca92f293fb9b3c85adce93478b03382134c
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-musllinux_1_2_x86_64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-musllinux_1_2_x86_64.whl -
Subject digest:
0bbc0bfa7805ce19614d32bfa772c007bb045c8994292aee6cfeaa702bfa2fb8 - Sigstore transparency entry: 1280890413
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
ff99f8811ce10787c783fe250b5a7d3462435571a0353ac22c68bf677de1a1c8
|
|
| MD5 |
bce60df24f1b9d77253f2070da049e50
|
|
| BLAKE2b-256 |
01f97b3c82a22b80c22f6710c86b2b5aee0edf6fdcde85e775b4f95f60183d62
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-musllinux_1_2_aarch64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-musllinux_1_2_aarch64.whl -
Subject digest:
ff99f8811ce10787c783fe250b5a7d3462435571a0353ac22c68bf677de1a1c8 - Sigstore transparency entry: 1280890422
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
3932e7b156069531a48c0c186475b336632f9d7f77d2ff64606292752344dcbc
|
|
| MD5 |
bcf1ca0b0f4e87275f1ad6134c12cd8c
|
|
| BLAKE2b-256 |
a32cc7c1a5e4f07b11f36246da4d3ea3aa3af8e3ce0aa2e361efdc41dea70a8c
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-manylinux_2_17_x86_64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-manylinux_2_17_x86_64.whl -
Subject digest:
3932e7b156069531a48c0c186475b336632f9d7f77d2ff64606292752344dcbc - Sigstore transparency entry: 1280890418
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
e65d4f346f0cf3fbd6ef898df49e13502794f2b50b202a0d615311b0efae4717
|
|
| MD5 |
0d8cc7149b0672a151847745eecb54fe
|
|
| BLAKE2b-256 |
9e0b201f75a8f7dc7177b23f79fe1a5aa0ec24488b0e984950a11de4def1a6bb
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl -
Subject digest:
e65d4f346f0cf3fbd6ef898df49e13502794f2b50b202a0d615311b0efae4717 - Sigstore transparency entry: 1280890410
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
a1c55183109e460fb1aba54585d9bb071db3099219fd05af0d570a046af17825
|
|
| MD5 |
bc0c01e4729ac94f61ac8c6b80a2c1df
|
|
| BLAKE2b-256 |
37ed4fa9a5c67eb20a88d769101b6f82e0bc5d6075975c10d6997e46ccc9f755
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-macosx_11_0_arm64.whl -
Subject digest:
a1c55183109e460fb1aba54585d9bb071db3099219fd05af0d570a046af17825 - Sigstore transparency entry: 1280890407
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type:
File details
Details for the file csaw-0.3.1-py3-none-macosx_10_9_x86_64.whl.
File metadata
- Download URL: csaw-0.3.1-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 |
c8f82ed0bd0d028b87319ca6b556e5bb9b97488ae96dd059b4c07938926b7ec9
|
|
| MD5 |
c07f70209eb768df2d9db3090610d88d
|
|
| BLAKE2b-256 |
e357e9ba502eb71152f97b3162dd8e2f4c0970715f192abbe282f19fc3cfa48b
|
Provenance
The following attestation bundles were made for csaw-0.3.1-py3-none-macosx_10_9_x86_64.whl:
Publisher:
release.yml on NicholasCullenCooper/csaw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
csaw-0.3.1-py3-none-macosx_10_9_x86_64.whl -
Subject digest:
c8f82ed0bd0d028b87319ca6b556e5bb9b97488ae96dd059b4c07938926b7ec9 - Sigstore transparency entry: 1280890429
- Sigstore integration time:
-
Permalink:
NicholasCullenCooper/csaw@c0bef9ce1115db9dd55901647d34306907d1591a -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/NicholasCullenCooper
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0bef9ce1115db9dd55901647d34306907d1591a -
Trigger Event:
push
-
Statement type: