This file said there was no way to create a second account. There is, and has been since 69a31051 — POST /api/users, owner-gated, with a form under Settings. platform/CLAUDE.md and docs/roles-and-teams.md carried the same stale claim and were corrected in the platform repo; this one was missed because I said it was not in a git repository. It is, through the symlink. Also records roles as a table with foreign keys onto roles.name, USER_ROLES gone, and UserRole as a plain string guarded at the write path instead of by the compiler. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
claude-mds
CLAUDE.md files and Claude Code configuration, kept under version control.
Install, on any machine
git clone git@gitea.officer.dev:pastilhas/claude-mds.git ~/projects/claude-mds
~/projects/claude-mds/install.sh
--dry-run first if you want to see it before it happens.
Everything is symlinked, not copied — so editing an installed file edits the repo, and the change
is one git commit away from every other machine. Re-run it after each git pull; a correct link is
a no-op.
It will not overwrite anything in silence. A real file where a link should go is moved to
<name>.bak-<timestamp> and reported, because on a new machine that file may be the only copy of
something written by hand.
What lands where
manifest is the whole answer, and it is the only place paths are declared. Today:
| repo | target | only if |
|---|---|---|
user/CLAUDE.md |
~/.claude/CLAUDE.md |
always |
officer.dev/CLAUDE.md |
~/officer-dev/CLAUDE.md |
~/officer-dev/platform exists |
tools/mask-hooks.d/officer-chat-events |
~/.local/claude-scripts/mask-hooks.d/ |
~/officer-dev/platform exists |
Plus mask-secret on ~/.local/bin, as a command rather than a path.
Adding a file later is one manifest line, not an edit to the shell.
The two kinds of file
user/— who you are working with and how. Loads in every session on every machine.officer.dev/— one workspace on one machine. Conditional, so it never lands where it would be a lie.
mask-secret
Masks a pasted secret everywhere the chat history keeps it:
printf '%s' "$SECRET" | mask-secret
It owns Claude Code's own transcripts. Anywhere else that keeps a second copy of the chat — a
database, a mirror, a log shipper — is a hook: an executable in tools/mask-hooks.d/, listed in
the manifest with the condition that says which machines it belongs on.
The installed mask-secret is a small generated wrapper, and that is deliberate. The script finds its
hooks beside itself and resolves symlinks to do it, so a bare symlink would reach back into the repo
and run every machine's hooks. The wrapper points it at the ones this machine installed.