Skip to main content

Mount, not install. AI workspace configuration from git-backed registries.

Project description

csaw

Mount, not install. Your AI workspace — symlinked from registries, reversible, inspectable.

CI License: MIT Version PyPI

Works with: Claude Code · OpenCode · Codex · Cursor · Windsurf · Gemini CLI

csaw demo


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.

# Create a new registry
csaw init ~/my-ai-config
csaw source add personal ~/my-ai-config --priority 10

# Or add an existing team registry
csaw source add team git@github.com:your-org/ai-config.git
csaw pull team

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/exclude to keep them out of git status.
  • csaw checks .gitignore first — 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 git or local source.
csaw source remove name Remove a source.
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.
--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


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.2.0-py3-none-win_arm64.whl (11.7 MB view details)

Uploaded Python 3Windows ARM64

csaw-0.2.0-py3-none-win_amd64.whl (12.5 MB view details)

Uploaded Python 3Windows x86-64

csaw-0.2.0-py3-none-musllinux_1_2_x86_64.whl (12.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

csaw-0.2.0-py3-none-musllinux_1_2_aarch64.whl (11.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

csaw-0.2.0-py3-none-manylinux_2_17_x86_64.whl (12.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

csaw-0.2.0-py3-none-manylinux_2_17_aarch64.whl (11.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

csaw-0.2.0-py3-none-macosx_11_0_arm64.whl (11.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

csaw-0.2.0-py3-none-macosx_10_9_x86_64.whl (12.3 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file csaw-0.2.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 11.7 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.2.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 1921aeb271bc295714287ac53db265e4a6bff212cd4f69b19d02a04759690e21
MD5 3d7927f5e8f0d88e34c29557b8b0a45d
BLAKE2b-256 44261aa6f59a9c0eeef6730074feaaa24d842d0a3df2f5ce333d9778b553f99a

See more details on using hashes here.

Provenance

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

Publisher: release.yml on csaw-ai/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.2.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 12.5 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.2.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 578fb06815c4e62be7f8c2054e6281c5a231e2e78932ff3e06660d9c6ebbcdca
MD5 1c8a548ef48a1bf3fffceb515f060d22
BLAKE2b-256 588833c0efb7962ad8338f18cd734fd9dda94c8a9ae32f8d7c0e82307c872150

See more details on using hashes here.

Provenance

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

Publisher: release.yml on csaw-ai/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.2.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 12.1 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.2.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3e028befc8833da517a01c191894d30c4331cb1af026d4a7e431d9b828dc9eef
MD5 06acd5ba13c9c7be05f74c08653c30ca
BLAKE2b-256 1fccd049cb3232fa82119323159ecb7168eb3caed38b84da059ceb104ec1ff0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on csaw-ai/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.2.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.2.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e00ec1f8ae3ddd2d5ae2764fc0dcea43d5565fbe641cb13cf46653d1be64736c
MD5 a48ff73d32a410d3af9a35c528f998e5
BLAKE2b-256 e5823f665f0c3a8aba1bf75a6de2180b3aa975e9a83f7ee38c393a26b5aeece0

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on csaw-ai/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.2.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-manylinux_2_17_x86_64.whl
  • Upload date:
  • Size: 12.1 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.2.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 23b7c1222da344d1ef1fcc190ef1119ef29d0a82793b3fea4b1019cc749259f3
MD5 8fef5f2c5d3651259038b98ba3132929
BLAKE2b-256 424442aca2018ea3387521904e7ebd0334e0794a6b8d1c3753ac029673c75c79

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-manylinux_2_17_x86_64.whl:

Publisher: release.yml on csaw-ai/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.2.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.2.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 a1b8574ce2003b3e8f7a6047312a85043d27684896200fd190d0fdef6506963a
MD5 ab4b7cd1c5ffb48ef832f4b1d1a6c9ca
BLAKE2b-256 a8949fdc1a4d54f29ed72ba4b9e551e69ec5e056fb81e1b675aa512196154921

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-manylinux_2_17_aarch64.whl:

Publisher: release.yml on csaw-ai/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.2.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 11.7 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.2.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9cd3facef66de2a38ba528e1d45d120187232872b3ab59315efbe0d70fa42ff2
MD5 2780094b04ada89d41862e03ef1aaad8
BLAKE2b-256 c5b77578b471a422fc6d083c2f3f49a5ebd89f02f7ae8dcb843f2b543be1f128

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on csaw-ai/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.2.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.0-py3-none-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 12.3 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.2.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d60307322a15a7185ec8144ebc23ac6680ef3b693f0fc5d19eeb174c0d88a2c9
MD5 751a5f3541f73342c2bdefef2618b299
BLAKE2b-256 9485017214c88c7329136d7f51df21eed5f9681fde2d4cb4d365800aa5456256

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.0-py3-none-macosx_10_9_x86_64.whl:

Publisher: release.yml on csaw-ai/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