Reference
What it changes on your machine
Every file Repolane creates or edits, inside the workspace and outside it, and how to remove all of it.
On this page
In brief. This page lists every file Repolane creates or edits, inside the workspace and outside it, and how to remove all of it. The package lives where pipx or uv put it. Outside the workspace Repolane writes only to
~/.local/share/laneand~/.claude/projects, and it asks before it changes anything under~/.claude. It never touches your shell profile, global git config or global Claude settings. There is nolane uninstall; Undoing it is the manual sequence.
Repolane sits between you and every repo you own, so the whole list of what it touches fits on one page. The list is read from the scripts and checked by running them against a scratch home directory.
There are three places to know about: the package (Repolane’s own files, installed once per
machine), the workspace (your folder, where nearly everything is written), and two folders in
your home directory: ~/.local/share/lane and ~/.claude/projects. The last one is Claude Code’s
own data folder, and several commands add to, link into or delete from it.
The package
pipx install repolane (or uv tool install repolane) puts the package in its own virtual
environment and links its commands into ~/.local/bin: lane, the long names (lane-start,
lane-run, lane-memory, …) and guard-check, 28 in all. That is pipx’s or uv’s doing, and
pipx uninstall repolane (or uv tool uninstall repolane) removes it. Repolane never writes into
the package’s folder at run time; lane upgrade replaces it.
Commands run through the lane scripts (including anything you start with lane run) inherit three
environment variables from .repolane/env.sh: WS_HOME (the workspace’s path),
NX_CACHE_DIRECTORY ($WS_HOME/.repolane/cache/nx) and NX_DAEMON=false. They only matter to Nx
projects. env.sh is yours: Repolane writes it once, when the workspace is made.
Outside the workspace
| Command | Where | What |
|---|---|---|
lane init, lane upgrade | ~/.local/share/lane/planes.json | the list of workspaces on this machine, which is how lane upgrade finds them all |
lane init | ~/.claude/projects/<slug-of-the-workspace>/memory | a symlink to the workspace’s .repolane/memory, after you say yes (or with --yes) |
lane add | ~/.claude/projects/<slug-of-.repolane/repos/name>/memory | one symlink per repo, to .repolane/memory/<name>/, after you say yes (or with --yes) |
lane done | ~/.claude/projects/<slug-of-a-worktree>/ | deletes that folder (Claude’s saved conversations for that worktree) if you answer yes. It asks in a terminal; with no terminal it touches nothing unless you passed --delete-sessions |
lane import | ~/.claude/projects/<slug-of-a-lane>/ | copies conversation files in; the originals stay where they were |
SessionEnd hook | ~/.claude/projects/ | when the same session id exists under both the workspace root and a repo’s folder, renames the older one to *.superseded and moves the newer into the repo’s folder; logged in .repolane/cache/transcript-moves.log |
lane migrate | ~/.local/share/lane/backups/ | the backup of everything a migration changes or removes (see Moving from a git-clone install) |
lane ref … add <path> | wherever <path> is | nothing is written there; a symlink appears inside the lane |
The slug is the absolute path with every character other than a letter, digit or - turned into -.
lane init --claude-home <dir> (or CLAUDE_HOME) changes where the symlinks are made. With no
terminal and no --yes, lane init and lane add change nothing under ~/.claude and print the
commands instead. A link you said no to is recorded in .repolane/declined.json and not offered
again; lane doctor --fix offers it once more.
Keep the workspace at a plain path. Claude Code applies the same rule: for a folder named
.boardshot, its own project folder is named …--boardshot…. A path with unusual characters is the
likeliest place for a computed name to differ from Claude Code’s, which leaves a memory symlink pointing at
a folder Claude Code is not using. Use letters and digits, with - or _ between words.
Two details that surprise people.
- If a real
memory/folder already existed at one of those~/.claude/projects/…paths,lane initandlane addcopy its notes into the workspace (nothing is overwritten), and then put the symlink in its place. lane init,lane add,lane doneand theSessionEndhook are the only things here that remove or rename anything in Claude Code’s own data.
What Repolane does not touch: your shell profile, your global ~/.claude/settings.json, your
global git config, anything in /usr/local, and any checkout you adopted with lane add <path>.
It does mark an adopted checkout as an “old checkout” in .repolane/registry/old-checkouts.json,
which makes the guard refuse sessions access to that path. See
Install.
lane init
Inside the folder it creates what is missing and keeps what is there.
| Created inside the workspace | What it is |
|---|---|
.repolane/registry/lanes/, .repolane/memory/, .repolane/knowledge/, .repolane/repos/, .repolane/cache/, lanes/ | the empty skeleton |
.repolane/config.yml | owner name, ticket URL pattern, stale_days, delete_sessions_on_done, sync_days. Yours to edit; never rewritten |
.repolane/registry/repos.yaml | the list of managed repos, empty to start |
.repolane/memory/MEMORY.md | the cross-repo memory index |
.repolane/knowledge/preferences.md | a starting set of preferences, yours to edit |
.repolane/env.sh | shared build caches (see The package) |
.repolane/REPOLANE.md, .repolane/LANE.md, .repolane/version | Repolane’s rule files and the version that wrote them. Written again after an upgrade; do not edit |
CLAUDE.md | a short file that imports .repolane/REPOLANE.md, when there is no CLAUDE.md. An existing one gets the import line only after you say yes |
.claude/settings.json | Repolane’s lane hook … commands, added to what is there; your own keys and hooks are kept. Also statusLine: lane statusline when no status line is set |
.claude/commands/, .claude/agents/ | Repolane’s eight slash commands and three agents, copied by name. A file of yours with the same name is never replaced, and neither is one of Repolane’s you edited; .repolane/claude-files.json records which files Repolane wrote. lane upgrade brings them up to date the same way |
.gitignore and a git repo | only with --git: the machine-local parts are ignored (see Install) |
Outside the workspace: the planes.json entry and the memory symlink (above).
lane add
Inside: .repolane/repos/<name>/ (a clone, or a copy of an existing checkout’s .git plus a few
ignored files, see Install), an entry in
.repolane/registry/repos.yaml, .repolane/registry/old-checkouts.json when you adopt a checkout,
and .repolane/memory/<name>/MEMORY.md. If you ask it to deny candidate secret files, it also writes
deny rules into .repolane/registry/rules.yaml. Outside: the memory symlink above.
lane start, lane with and lane resume
All three write the same set of things, inside the workspace:
lanes/<id>/<repo>/: a git worktree per repo, on branch<id>(or the branch you named). The branch is created in.repolane/repos/<repo>, and its.git/worktrees/records the worktree..repolane/registry/lanes/<id>.md: the lane file.- At the lane root: an empty anchor
.git(so git does not claim the folder for a repo above it; it setscore.hooksPathto/dev/nullandlane.anchorin that anchor repo only), a.gitignoreof*, aCLAUDE.mdthat points at the lane file and memory, and<id>.code-workspace. .claude/settings.local.jsonin the lane root and in each worktree. They hold deny rules (the common secret file names, such as.env*,*.pem,*.key,*.p12,id_rsa,.netrc,.npmrcandservice-account*.json;*credentials*.jsonandsecrets.*are covered by the guard but not by this list), a short list of pre-approved read-only commands,additionalDirectories,autoMemoryDirectoryand thelane hook …wiring. The workspace root gets one too, holding onlyadditionalDirectories; its hooks are in.claude/settings.json.- One line,
.claude/settings.local.json, appended to the base clone’s.git/info/exclude(git’s shared exclude file for that repo), so the file never shows ingit status. - Symlinks for env files from the base clone into each worktree.
lane.code-workspaceat the workspace root, listing every active lane.
lane resume <id> also runs git worktree prune in every base clone before recreating anything.
What the hooks write inside the workspace
All under .repolane/cache/: last-session-start.json (the raw SessionStart input, overwritten
each time), sessions/<id>.json (per-session state the guard reads back), transcript-moves.log
(the SessionEnd rename log) and memory-inbox/ (drafts waiting for lane note file). In a lane,
.touched is appended to by the PostToolUse hook. The first lane command or hook after the
installed version changes writes .repolane/REPOLANE.md, LANE.md and version again. A session
can write to the cache itself; see the security model.
lane park and lane done
lane park commits every dirty worktree of the lane and edits the lane
file. It stages by explicit literal path and leaves out files whose name says secret (the guard’s list), which
stay on disk and are named in its output; everything else that is not git-ignored is committed, including a
credential under an ordinary name. lane done removes each
worktree and then the lane folder (so files git ignores, such as build output, go with it; a real
ignored or untracked secret-named file blocks the finish unless you pass --discard-ignored), optionally deletes branches (--delete-branches), optionally deletes Claude’s
saved sessions for each worktree, and moves the lane file to .repolane/registry/lanes/done/.
Undoing it
There is no lane uninstall command. Run these in order.
1. Get your work out first. The worktrees under lanes/ are real git worktrees with real
branches. Push anything you care about, or lane done <id> each lane. lane done refuses to
archive one that is dirty, unpushed, or holds a secret-named file the deletion would destroy; a local-only repo (no origin) counts as having nothing to push (see
Troubleshooting).
2. Unlink the memory folders. From inside the workspace. Each is a symlink, so removing it never
deletes what it points at. Copy .repolane/memory/ somewhere first if you want the notes:
cp -R .repolane/memory ~/memory-backup # optional
for l in ~/.claude/projects/*/memory; do
[ -L "$l" ] || continue
case "$(readlink "$l")" in "$PWD"/.repolane/memory|"$PWD"/.repolane/memory/*) rm "$l" ;; esac
done
This leaves the ~/.claude/projects/<slug>/ folders themselves, which hold your Claude Code
conversations. They are Claude Code’s data and yours to keep or delete, and some of them may be
empty.
The case compares each link’s target with $PWD, as a string. If you reach the folder through a
symlinked path (macOS’s /tmp is one, and so is anything under a symlinked home), the link target and
$PWD can spell the same place differently and the loop silently matches nothing. Run cd "$(pwd -P)"
first, or print readlink ~/.claude/projects/*/memory and remove the ones that point into this folder
by hand.
3. Delete the workspace, or keep it. rm -rf on it takes the base clones, the worktrees, the
lane files and the hook configuration with it. If you made it a git repo of your own and pushed it,
that remote is not touched. To keep your notes but stop using Repolane in that folder, delete only
lanes/ and .repolane/repos/ and take the lane hook entries out of .claude/settings.json and
the import line out of CLAUDE.md.
4. Remove the package and the registry.
pipx uninstall repolane # or: uv tool uninstall repolane
rm -rf ~/.local/share/lane # the list of workspaces, and any lane migrate backups
Deleting ~/.local/share/lane forgets every workspace on the machine (they stay on disk) and
deletes the backups lane migrate wrote, so keep a backup you may still want to undo from. To forget
just one workspace, run lane upgrade after deleting that folder: it reports the missing folder and
asks whether to drop it from the registry.
If you remove the package but keep a workspace, Claude Code sessions started there have hooks that
call a lane that is no longer on your PATH: every hook fails, and Claude Code runs the tools
unguarded. Take the lane hook entries out of .claude/settings.json (step 3), or reinstall.
Repos you adopted from a checkout you already had are unaffected: lane add <path> copies the git
database and never writes to the original.
If you only want the rules off and everything else left alone, you do not need to uninstall anything. See what to do when a rule blocks you.