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.

# 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/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 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


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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

csaw-0.2.5-py3-none-macosx_10_9_x86_64.whl (12.4 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 e7c5e070296511ce77e59c468d965643f061601489a02723bcf607746cbb553d
MD5 457285f4acf86d41f3f5f1644bb25ce5
BLAKE2b-256 09243b82dbcf60440978e6420b5ef7c11fd93f622d89fb5308eae22291154d41

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-win_amd64.whl.

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 84a4e2ea5e2befbb59492d6dbe3629f675c33eeffa98af47cf1511a8c70036ec
MD5 cb8c4ea3978d1ae99870b2e327b20932
BLAKE2b-256 9cf88a3d3b02ace2bdf6708b82c02fca932daa6d5fbcaf09e75b351428b5ad09

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c39b8de20b060f5a50afec68d98e22e84252b239a230d72d731e911104e747ff
MD5 fa1be8a892908be442a2e704bf9b7b0e
BLAKE2b-256 1af1a628f2c3c67394d356a754794ddc0ebeda6dc0f599ab0bb49151662cdbe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1cc15a90fe5e0d80f5191ff3e3153070bee18a15ee6984ca7b9aecb9d854ef03
MD5 f84df0da6059a74f70b1b85a6fdd5dec
BLAKE2b-256 d2f4a1863c146ec2395784a2fe68d22ffe492cddea88bca03acdd2bc6417ef28

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-manylinux_2_17_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 abd0103941935090cb71e1cfaa7706d950f2a131662e32d16b19bf2d8addc1ec
MD5 a53b28288298b6bdb7bf93216cb62e8e
BLAKE2b-256 0f73605223709eaed9465a207442935bd926354de8dd8a4282ea59f04f846e46

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.2.5-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 b018aca90492a68812dc9c48dc14c6259b1f2045849dbf6a3d16916a33eb85e4
MD5 9e26bed9afe9499dbe8fbd942978486c
BLAKE2b-256 763e4ed96c37cbb7072e247a596089db3f7875aa72337023b8fdc9757a14d062

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: csaw-0.2.5-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.2.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a68fd123fa6da0fe3bb6c17ce53015f321daf337c52f0f3525594d8517afc4e9
MD5 ab4d145a004556c0b4b3109947f903f5
BLAKE2b-256 56c1dd17bb7f82e88d1c6af2d55d2c489eba0c9e92f00caa2ca5fa88e585e433

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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.5-py3-none-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: csaw-0.2.5-py3-none-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 12.4 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.5-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 53a887c9053e4c58f473efb88f8cfdd68e679a827d18d1187569c1706ddd3a92
MD5 7cd0cec9de09a92ca9b3267b4c474e57
BLAKE2b-256 526d1e3d1d7afd4d7fa297fc6d75a75866f0e1dcc18f7ff95dee98229b7f4283

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.2.5-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