A CLI for managing AI agent config files without committing them to the repo.
Project description
lac
A CLI for managing AI agent config files (CLAUDE.md, AGENTS.md, .cursorrules, .mcp.json, …) without committing them to the repo.
~/repo/CLAUDE.md ──→ ~/.local/share/lac/<repo>/CLAUDE.md
(symlink) (the actual file)
Files live outside the repo, are symlinked in, and excluded from git via .git/info/exclude. That directory is itself a git repo, so the same configs can be reused on another machine.
Use cases
- AI configs that differ from team defaults.
- Personal tweaks that don't belong in shared history.
- Same configs across multiple machines.
Install
# Homebrew
brew install 2ykwang/2ykwang/lac-py
# pipx
pipx install lac-py
lac --version
Quick Start
In any git repo:
cd ~/projects/my-project
lac register
# ✓ registered
lac link --all
# ✓ CLAUDE.md linked
# ✓ AGENTS.md linked
# ✓ .claude linked
# ✓ .agents linked
# ✓ .cursorrules linked
# ✓ .mcp.json linked
Edit any of these files in your repo as usual — they're symlinks, so changes go to the stored copy too. To stop using lac in this repo, run lac unregister.
How it works
Three pieces:
- Symlinks — each linked file in the repo is a symlink to its copy in lac's storage directory.
- Git exclusion — every linked filename is appended to
.git/info/excludebetween# === lac:start ===and# === lac:end ===markers. Git ignores them without touching.gitignore. - Repo identity — each repo is matched by its git remote URL when available, otherwise by absolute path. The same repo on two machines maps to the same storage subdirectory.
Default files
- CLAUDE.md
- AGENTS.md
- .claude/
- .agents/
- .cursorrules
- .mcp.json
Add others with lac link <filename>.
Sync across machines
The storage directory (printed by lac home) is itself a git repo:
# on machine A — initial push
cd "$(lac home)"
git remote add origin <your-private-remote-url>
git add . && git commit -m "initial" && git push -u origin main
# on machine B — clone BEFORE any lac command runs on this machine
# (lac auto-creates the storage directory on first command, which would block git clone)
git clone <your-private-remote-url> ~/.local/share/lac
# or, if $LAC_HOME is set:
git clone <your-private-remote-url> "$LAC_HOME"
cd ~/projects/repo
lac register
lac link --all
# afterwards, on any machine: pull updates (fast-forward only, never pushes)
lac sync
Commands
Basic
| Command | What it does |
|---|---|
lac register |
Register the current repo with lac. |
lac link |
Interactive checkbox — pick which files to link. |
lac link --all |
Link all default files at once. |
lac link <file> |
Link a single file by name. |
lac status |
Show registration state of the current repo. |
lac unregister |
Restore files in the repo and back up this repo's storage subdirectory. |
Diagnostic & management
| Command | What it does |
|---|---|
lac doctor |
Check for broken symlinks, orphaned entries, missing targets. |
lac list |
List all registered repos. |
lac home |
Print the storage directory. |
lac path [file] |
Print this repo's storage path (or a file inside it). |
lac rename <name> |
Rename this repo's storage subdirectory. |
lac sync |
Fast-forward the storage directory from its remote (pull-only; never pushes). |
Limits
- macOS and Linux only. Windows is not supported.
- Python ≥3.11.
- Single-user. Sharing the storage directory between people isn't supported.
- Pull updates with
lac sync; pushing is manual (git push) by design.
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 Distribution
Built Distribution
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 lac_py-2026.6.24.tar.gz.
File metadata
- Download URL: lac_py-2026.6.24.tar.gz
- Upload date:
- Size: 34.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3ed8f7304ee3fa17b40886027207861226df63eed1d1ad87acc5076318642bb
|
|
| MD5 |
85270a9568e28153fc68b779fab31b1b
|
|
| BLAKE2b-256 |
d7117256dcae47ae58f5cac5b73aae565699632877f7b31a7238717453dc2a28
|
File details
Details for the file lac_py-2026.6.24-py3-none-any.whl.
File metadata
- Download URL: lac_py-2026.6.24-py3-none-any.whl
- Upload date:
- Size: 26.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c448256f01d51233462dfbd3f6409692725ccded8c9d0add8a433f9227b22a4
|
|
| MD5 |
69628e10d532a65917d831db04aa672b
|
|
| BLAKE2b-256 |
7d1624784807321ff5be036d05ab3a30c059c7a3780a34eabb9e3ea2f9d80149
|