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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

csaw-0.3.0-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.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

Hashes for csaw-0.3.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 6ae428488fddf47f8ffb5441157f198efa785f3bfc924c94d90aa89d305374c5
MD5 a6ba092b57b8f1d365839bffde3fd953
BLAKE2b-256 4c9caec1650d237a7d0cd73a0d597f58fc88e2be62a8f60e4361c640b54d7e3a

See more details on using hashes here.

Provenance

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

Hashes for csaw-0.3.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f6b9853e415096350dec7153146d62fb32bc4463ae17e08a327d3c60545b9283
MD5 b27545e6e31b4c00bb32238cf47f6476
BLAKE2b-256 55bb11fd361d05c1ec749e0e26e08261364c2f7fec97c74a42570b31f38307e9

See more details on using hashes here.

Provenance

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

Hashes for csaw-0.3.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1d4a5df6e6c0c228bb3a883e48a771d802862621ddc6d5a436ea8a8b55ee4bc0
MD5 866a79d1a3c267db227a4fd94165bf6d
BLAKE2b-256 6fc73dffaf2361157f9363ed8892fd38ad830f466bda7c17b541d1fece4f47da

See more details on using hashes here.

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

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.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

Hashes for csaw-0.3.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e2ccb3e188d9eba39c718d830ae7877e2d743649805c95f930d31d5074e83a59
MD5 6a7f2e1647429dafba836165b5209777
BLAKE2b-256 d32c32a07d98a17566ffc4a5e066067fbfde292d7eaf5bca2286552b3d676377

See more details on using hashes here.

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

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.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

Hashes for csaw-0.3.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c21abe279cb76169d7d21ed8751262c4ca5e8707263c60ed09d4ba27286377e2
MD5 f8e2f1485798b8aa3b2dd3780f33e363
BLAKE2b-256 eb34a059a83d6236d5c8a6ddbfa58448c606d17b613a8fb817c3426bb6a8e194

See more details on using hashes here.

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

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.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.3.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 15cfd76b50ef2e629edf2bc3d0b6b48a4f2029c784d83a7ee75af98e1a0fabb3
MD5 c66d2aa045e6e658a394e7ca13671632
BLAKE2b-256 74eb32840908b2eb77db5e343eb8b10929d014855978567adfb04e296d3bdce3

See more details on using hashes here.

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

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.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

Hashes for csaw-0.3.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 61644328dde3e635a732c3520444f7dae0724a04d582aca5adc8743c3a6b7f99
MD5 8c9c90b5a125a79e85583f6680826cfb
BLAKE2b-256 56bfbcde1a81efad39da0b6a04aab2885ba0c0b61e34d1a8592d308af987577c

See more details on using hashes here.

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

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.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

Hashes for csaw-0.3.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6557674b20d81041875f538e839aedf72db33884b10f0b4e7beef7225ac2bd9c
MD5 6a730e652002962cf9857ff95948b966
BLAKE2b-256 a65a443759b17458ede7f95a4bf6375f4f8e4a0ecd9a72dfcfa29a6bda8ce226

See more details on using hashes here.

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

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