Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions shared/.claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ fall back to, so they have to be in context before the mistake, not after.

| Rule | Applies when |
|------|--------------|
| [Where the repos live](rules/where-repos-live.md) | finding a repo on disk, and which ones may be named in public |
| [Reporting data and metrics](rules/reporting-data.md) | a number gets reported — a query, a benchmark, a count |
| [Localisation](rules/localisation.md) | user-facing text gets written — a label, an error, an email |
| [Attribution](rules/attribution.md) | anything leaves the machine or gets committed |
Expand Down
43 changes: 43 additions & 0 deletions shared/.claude/rules/where-repos-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Where the repos live

Every checkout on every machine sits under `~/projects/`. That is
`/Users/landsman/projects` on macOS and `/home/landsman/projects` on Kubuntu —
`~` covers both, and nothing outside it is a repo.

The level below is the owner, not the forge, so `landsman/config` is

~/projects/landsman/config

A client with more than one product gets one level more. `github/` and
`codeberg/` are filed differently on purpose: they hold other people's repos,
cloned to read, sorted by forge because there is no relationship to sort them
under.

A name like `landsman/config` is therefore already most of a path. Resolve it
with `ls`; if the guess misses, `ls ~/projects` lists every owner in one screen.

## Only `~/projects/landsman/*` may be named

The rest of that folder is client and employer work, and my own repos are
public. No other owner folder, repo name, product, domain or client name goes
into anything that leaves the machine — a commit message, a PR title or body, an
issue, a code comment, a doc, a screenshot — in this repo or any other.

There is always a version that carries the same information without the name: *a
work Go repo*, *a monorepo several agents were working in*, *a client's backend*.
What makes the note worth writing is the shape of the problem, never whose it
is. If only the real path would make the point, drop the point.

This is not the same rule as pasting a secret. A repo name leaks who I work for
and what they are building, which is theirs to disclose and not mine.

## Do not sweep `$HOME` with `find`

It is slow, it walks `Library/`, caches and every `node_modules`, and it answers
wrong: git worktrees live under `.claude/worktrees/` and in `/private/tmp`, so a
search matching on directory name reaches a detached copy of a repo before the
real checkout — and editing a stale worktree that looks right is worse than not
finding it at all.

It also prints every client folder in `~/projects` into the transcript, which is
what the section above is about. Read the path, do not hunt for it.
Loading