# What in user/ goes where, and in what form. # # [os] # # kind is one of: # link symlink the destination at the source, so editing either edits the # repository. Use this for anything you want to update once and have # change everywhere -- and for anything a tool writes into, because a # skill installed on this machine should land in the checkout. # linkdir symlink each child of the source into the destination, which is # created as a real directory. Use this where the destination holds # more than this one source -- ~/.claude/skills also carries Panama's # own shipped skills -- so it cannot be a symlink to any single place. # copy copy once, and never touch it again if the destination exists. Use # this for files a machine legitimately diverges on. # # os is optional: linux or darwin, matched against `uname -s`. A line naming # one is skipped everywhere else. Leave it off for anything every machine # wants, which is most of this file; the Mac mini only takes the agent half. # # Lines beginning with # are comments and blank lines are ignored. ~ in a # destination is this user's home. # # Nothing here is linked unless this machine said yes to the interview's # question about personal content -- see setup/scripts/link-user. That is what # keeps a repository somebody else can clone from also being one that installs # Gabriel's agent instructions on their machine. # ── Agents ─────────────────────────────────────────────────────────────────── # One file, three names. Claude Code reads CLAUDE.md, Codex and opencode read # AGENTS.md, and before this they were byte-identical copies waiting to disagree. link agents/AGENTS.md ~/.claude/CLAUDE.md link agents/AGENTS.md ~/.codex/AGENTS.md link agents/AGENTS.md ~/.config/opencode/AGENTS.md # Skills, at both paths that look for them. Each tracked skill is linked from # this checkout so edits stay shared and `panama update` offers to commit them. # # Both destinations also hold skills Panama itself ships, put there by the # link-skills stage, so both are real directories with one link per skill. This # stage runs after that one, so a personal skill wins a name collision. linkdir agents/skills ~/.agents/skills linkdir agents/skills ~/.claude/skills link agents/rules ~/.claude/rules # ── SSH ────────────────────────────────────────────────────────────────────── # Host aliases only. Keys are per-machine and are never tracked; this is the # file that makes `ssh server` work the moment a machine is set up, and it is # what the SSH Hosts launcher command reads. Linux only: it names id_ed25519 # and the desktop keyring's agent socket, and the Mac has neither. link ssh/config ~/.ssh/config linux # ── Scripts ────────────────────────────────────────────────────────────────── # Personal commands wanted on every machine, desktop or server. ~/.local/bin is # on PATH in both shell configs. pwswitch toggles passwordless sudo through a # sudoers.d drop-in, so an agent can run sudo and the password comes back after. link bin/pwswitch ~/.local/bin/pwswitch linux # ── Espanso ────────────────────────────────────────────────────────────────── # The personal expansion triggers. Copied rather than linked, because this is a # file each machine may add its own triggers to. It lands before setup-identity # runs, and that stage only seeds a file that does not exist yet, so what is # tracked here wins over the name and email the interview would have written. copy espanso/identity.yml ~/.config/espanso/match/identity.yml linux # ── OpenCode ───────────────────────────────────────────────────────────────── # Claude Code carries its commands and agents as plugins, which opencode cannot # read. These two directories hold the same capabilities in opencode's own # format, so the command I type in one tool exists in the other. linkdir agents/commands ~/.config/opencode/commands linkdir agents/agents ~/.config/opencode/agents