Skip to main content

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.

CI License: MIT Version PyPI

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 unmount removes 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 check finds 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

csaw-0.3.1-py3-none-win_arm64.whl (11.8 MB view details)

Uploaded Python 3Windows ARM64

csaw-0.3.1-py3-none-win_amd64.whl (12.7 MB view details)

Uploaded Python 3Windows x86-64

csaw-0.3.1-py3-none-musllinux_1_2_x86_64.whl (12.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

csaw-0.3.1-py3-none-musllinux_1_2_aarch64.whl (11.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

csaw-0.3.1-py3-none-manylinux_2_17_x86_64.whl (12.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl (11.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

csaw-0.3.1-py3-none-macosx_11_0_arm64.whl (11.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

csaw-0.3.1-py3-none-macosx_10_9_x86_64.whl (12.5 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

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

Hashes for csaw-0.3.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 3daca7935123ad93ae73ca47669223019c8fe955de56aa43481d89ff6fef096c
MD5 a517584ec1a793c6b7853ca66dca6f6f
BLAKE2b-256 2f817e2862dd0b55afc5b9890f5ea66988f2b538546dcbd1a549be8ebe075fe8

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.3.1-py3-none-win_arm64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 55229eb79bb0fcab3505fb2ee9f46878dc2418b6e12d6fd6eac244ed780718dc
MD5 159e4d2379f81ecdd7e84d3cce366c61
BLAKE2b-256 029d18cd242ed3c8eff17660074ea4bbbb58f8a17d2df6874d4221b568bbecfa

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.3.1-py3-none-win_amd64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0bbc0bfa7805ce19614d32bfa772c007bb045c8994292aee6cfeaa702bfa2fb8
MD5 f56ba1b551b197cc2635534701cfe4d2
BLAKE2b-256 46e8522cf0bbc2bbde69fbcf4c52bca92f293fb9b3c85adce93478b03382134c

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ff99f8811ce10787c783fe250b5a7d3462435571a0353ac22c68bf677de1a1c8
MD5 bce60df24f1b9d77253f2070da049e50
BLAKE2b-256 01f97b3c82a22b80c22f6710c86b2b5aee0edf6fdcde85e775b4f95f60183d62

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 3932e7b156069531a48c0c186475b336632f9d7f77d2ff64606292752344dcbc
MD5 bcf1ca0b0f4e87275f1ad6134c12cd8c
BLAKE2b-256 a32cc7c1a5e4f07b11f36246da4d3ea3aa3af8e3ce0aa2e361efdc41dea70a8c

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.3.1-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 e65d4f346f0cf3fbd6ef898df49e13502794f2b50b202a0d615311b0efae4717
MD5 0d8cc7149b0672a151847745eecb54fe
BLAKE2b-256 9e0b201f75a8f7dc7177b23f79fe1a5aa0ec24488b0e984950a11de4def1a6bb

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1c55183109e460fb1aba54585d9bb071db3099219fd05af0d570a046af17825
MD5 bc0c01e4729ac94f61ac8c6b80a2c1df
BLAKE2b-256 37ed4fa9a5c67eb20a88d769101b6f82e0bc5d6075975c10d6997e46ccc9f755

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for csaw-0.3.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c8f82ed0bd0d028b87319ca6b556e5bb9b97488ae96dd059b4c07938926b7ec9
MD5 c07f70209eb768df2d9db3090610d88d
BLAKE2b-256 e357e9ba502eb71152f97b3162dd8e2f4c0970715f192abbe282f19fc3cfa48b

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page