Personal dotfiles repository. Shell configs, editor configs, and AI-agent skills are managed as file-level symbolic links driven by a Makefile. Skills are the source of truth under agents/skills/ and are fanned out to multiple AI CLIs (Claude Code, Codex) through a shared ~/.agents/skills/ hub.
dotfiles/
├── agents/
│ ├── AGENTS.md # global rules — linked as ~/.claude/CLAUDE.md and ~/.codex/AGENTS.md
│ └── skills/ # AI skills — source of truth
├── claude/ # Claude-specific config (agents/, etc.)
├── config/ # linked into ~/.config/<tool>/
├── dotfiles-private/ # optional, gitignored, auto-detected
└── <dotfile> # linked as ~/.<dotfile>
Skill symlink chain (important when editing — never edit through a symlink target):
dotfiles/agents/skills/<skill> # edit here
↑
~/.agents/skills/<skill> # shared hub
↑ ↑
~/.claude/skills/<skill> ~/.codex/skills/<skill>
dotfiles-private/agents/skills/ is linked into ~/.agents/skills/ the same way when present.
Global agent rules follow the same fan-out pattern:
dotfiles/agents/AGENTS.md # edit here
↑ ↑
~/.claude/CLAUDE.md ~/.codex/AGENTS.md
Link: make link # create all symlinks
Unlink: make unlink # remove all symlinks
Relink: make relink # unlink && link
List: make list # show [v] linked / [-] unlinked status
Help: make help
Filter any target to a subset of files with F=<substring>:
make link F=vim # only vimrc / nvim config
make unlink F=otel # only otel-related skills
make list F=skills # all skills
Sub-targets exist for each domain and can be run individually: link-dotfiles, link-config, link-agents, link-claude, link-codex (and their unlink-* counterparts). link-claude and link-codex depend on link-agents.
When a skill references a model name explicitly, follow the convention for the target tool. Mismatched names cause the tool to reject or silently mis-route the request.
| Tool / CLI | Naming policy | Examples |
|---|---|---|
| Codex CLI | Explicit model IDs | gpt-5.4, gpt-5.5, gpt-5.4-mini |
| GitHub Copilot CLI | Explicit versioned names | claude-sonnet-4.6, claude-opus-4.7 |
| Gemini CLI | Prefer stable aliases | pro, flash, flash-lite, auto |
| Claude Code CLI | Prefer family aliases | opus, sonnet, haiku |
dotfiles-private/is gitignored. Do not commit its contents or add references that assume it exists.- Edit skills only at
agents/skills/<skill>/...and global rules only atagents/AGENTS.md. The paths under~/.agents/,~/.claude/, and~/.codex/are symlinks — editing through them is fine mechanically but bypasses git. - The
.systemdirectory inside~/.codex/skills/is managed by Codex itself; that's whylink-codexuses individual per-skill symlinks rather than linking the wholeskills/directory.
- After adding or renaming a skill under
agents/skills/, runmake link(ormake link F=<name>) so the new symlinks propagate to~/.agents/,~/.claude/skills/, and~/.codex/skills/. make listis the fastest way to verify link state after changes —[v]is linked,[-]is unlinked.- The Makefile discovers
claude/subdirectories andconfig/tools dynamically viafind, so adding a new subdirectory under either is picked up without editing the Makefile.