Cross-project conventions for Zomp engineers - git workflow, documentation style, CI, versioning, branding. The shipped file is home/AGENTS.md. It's named AGENTS.md because that's the cross-tool convention all major AI coding agents (Claude Code, Antigravity, Codex, Cursor, Aider) walk up the directory tree to find.
These are one company's opinions, published because they may be useful to others setting up the same thing. Fork and adapt; nothing here needs to be agreed with.
Conventions that apply to only one stack, or only to one kind of task, live in home/.claude/skills/ instead. home/AGENTS.md is loaded into every session regardless of language, so putting .NET rules there charged a Rust session roughly 2,000 tokens for advice it could not use - and, worse, stated rules like "never WPF" as if they were unconditional. A skill loads on demand: only its name and one-line description sit in context until something makes it relevant.
This repo is meant to be cloned to a stable location and symlinked into your home directory so every project's AI agent picks it up automatically. Updates flow with git pull.
# Run from any directory. Requires Developer Mode enabled (Settings -> Privacy & Security -> For developers -> Developer Mode), OR run as admin.
git clone git@github.com:zompinc/agent-conventions.git $HOME\agent-conventions
& $HOME\agent-conventions\bootstrap.ps1git clone git@github.com:zompinc/agent-conventions.git ~/agent-conventions
~/agent-conventions/bootstrap.shNo SSH key set up? Swap either clone URL for https://github.com/zompinc/agent-conventions.git. Everything below works the same; you only need SSH, or a credential helper, to push a change back.
That's it. Verify with cat ~/AGENTS.md - it should show this repo's content - and ls ~/.claude/skills, which should list a link per skill in this repo.
Both scripts are idempotent, so re-run them any time. They only ever create links; nothing is copied into your home directory unless symlink creation fails. Everything of value stays in this repo, so a dead machine costs you a git clone and one bootstrap run.
cd ~/agent-conventions && git pullIf you symlinked, the change is live immediately. If you copied (no Dev Mode on Windows), re-run the bootstrap to refresh the copy.
The bootstrap sets up scripts/update-conventions.sh (.ps1 on Windows) to run on its own, from two triggers:
- Claude session start, through a
SessionStarthook, so the machine you are actually working on is current when it matters. - A daily job - cron on macOS and Linux, a scheduled task on Windows - for machines where no Claude session starts for a while. Set
ZOMP_NO_SCHEDULE=1before bootstrapping to skip it.
The updater is deliberately timid. It fast-forwards only, and gives up quietly if the working tree is dirty, the branch is ahead of its remote, the branch is not master, it already ran in the last six hours (ZOMP_UPDATE_MAX_AGE_HOURS), or the network is down. It never merges, never rebases, and never touches local work. After a successful pull it re-runs the bootstrap, so a newly added skill gets linked with nobody doing anything.
Force a check with scripts/update-conventions.sh --now. What it did is in .git/zomp-update.log, which sits outside the work tree and so can never be committed.
home/- mirrors your home directory; every file under it is symlinked to the matching path in$HOME, so new files need no change to the bootstrap scriptshome/AGENTS.md- always-resident conventions (git, docs and prose style, versioning principle, branding), symlinked to~/AGENTS.mdhome/.gitignore- global gitignore (OS files, editor artifacts, agent scratch), set ascore.excludesfileunless one is already in usehome/.claude/skills/<name>/SKILL.md- stack- or activity-specific conventions, loaded on demandzomp-dotnet- .NET/C# stack defaults, architecture, packaging, build qualityzomp-new-repo- first-commit files, pnpm, the husky pre-commit hook (templates included), shared.vscodefileszomp-ci- GitHub Actions runners, localactruns, artifact retention, build version stampingzomp-jetkvm- driving a remote machine through a JetKVM: Paste text and key quirks, Virtual Media, SSH jump host, firmware screens
home/.gemini/config/skills.json- bridgeshome/.claude/skillsinto Google Antigravity (agy)AGENTS.md- instructions for editing this repo, not shipped anywherebootstrap.ps1/bootstrap.sh- create the symlinks, enable this repo's hooks, and wirecore.excludesfile.githooks/andscripts/check-private-content.sh- keep client names and machine paths out of a public repo
Future additions worth seeding here:
- Prettier / ESLint base configs
- VSCode
settings.jsondefaults
Edit the file, commit, push. Everyone picks up the change on their next git pull; symlinks mean there is nothing to re-run unless you added a new skill.
This repo is public and gets edited while working inside private repos, so a pre-commit hook scans for client names, machine paths, IP addresses and session links before anything is committed. Client names go in ~/.config/zomp/private-words.txt, which is never committed - see AGENTS.md.
Which file: if violating the rule causes harm, it goes in home/AGENTS.md. Guardrails have to be in context before the mistake, and a skill only loads once the model already knows it needs it - which is never the case for the rule you are about to break. If the rule is something you look up while doing a task you know you are doing, it goes in that task's skill. Language-specific reference is the common case of the second, but it is the consequence of getting it wrong, not the language, that decides.
home/AGENTS.md is charged to every session of every language, so keep it to rules that earn that. Everything else is a skill.
Keep both terse. Agents process every byte of context.