agent-config-sync
Skill1 starsChanged 37 days agoMITView on GitHub
Use when sharing agent hooks and scheduled jobs between machines.
In this repository34 other files it gives its agents.
- agent-branch-integrationSkill
- blocked-page-recoverySkill
- brand-retrofitSkill
- clickable-concept-prototypeSkill
- codebase-inspectionSkill
- commit-workSkill
- contrastive-refactor-demoSkill
- custom-domain-emailSkill
- delegate-coding-taskSkill
- delegated-agent-supervisionSkill
- delivery-verificationSkill
- domain-dns-cutoverSkill
- first-run-onboardingSkill
- frontend-render-performanceSkill
- github-pages-deploySkill
- hermes-cron-jobsSkill
- hermes-messaging-channelsSkill
- hermes-on-oracle-free-tierSkill
- hermes-provider-credentialsSkill
- isolated-worktree-testingSkill
- measurement-validitySkill
- multi-layout-previewSkill
- new-project-scaffoldingSkill
- parallel-agent-fanoutSkill
- premortemSkill
- recall-and-claim-verificationSkill
- single-source-training-materialsSkill
- stakeholder-decision-elicitationSkill
- static-site-vps-deploySkill
- supabase-auth-debuggingSkill
- windows-background-process-hygieneSkill
- windows-desktop-automationSkill
- windows-performance-tuningSkill
- worktree-analysisSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 3 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 27
Not for: memory/knowledge (different repo, different rules) or runtime state (job queues, sessions, databases — those do not sync, by …
- Distinctive: line 49
Import is a command, never a pull:
- Distinctive: line 94
Export requires an explicit local policy file: No policy, no export. Opt-in per hook (by event, command and files) and per job (by exact …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Sync agent config between machines
Share an agent's hooks and scheduled jobs across the machines you work on, without a pull on one machine silently breaking the other.
The naive version of this is a git repo with a hooks/ folder that every
machine pulls. It breaks immediately and quietly, because absolute paths,
available interpreters and credentials differ per machine. What follows is the
shape that survives.
When to Use
- "the hook/job I made on the other machine didn't show up here"
- installing on machine B something that exists on machine A
- turning on config sync for a new machine
- taking inventory of what each machine has
Not for: memory/knowledge (different repo, different rules) or runtime state (job queues, sessions, databases — those do not sync, by decision).
The shape
One repo, one folder per machine:
config/
devices/
workstation/
hooks/<name>.py
manifest.json
laptop/
hooks/...Each machine writes only its own folder and reads the others. That
single rule removes the entire class of merge conflicts: a conflict under
devices/ means someone edited another machine's folder by hand, which is
always a bug.
Import is a command, never a pull:
agent-config list # every machine
agent-config list laptop # one machine
agent-config show laptop hook stop.py # read before installing
agent-config import laptop hook stop.pyRules that must not be reverted
Each of these is a bug that was paid for once.
Import rewrites paths, and covers all three escapes. A path appears in
config as /, \, and \\. Rewrite each form separately, most specific
first. Do the \ pass before the \\ pass and it eats half of every escaped
backslash, producing a string literal that no longer parses.
A hook is installed at the rewritten source path, not at a fixed
hooks/ directory. File in one place and the registered command pointing at
another gives you a hook that is dead and silent. After importing, verify by
hand that every quoted path in the command actually exists on this machine: a
virtualenv interpreter is not guaranteed anywhere else.
The import preserves every field of the hook, not just type and command. Timeouts, matchers and filters are part of the contract.
Never write to the scheduler's own job file. A running scheduler owns that file and rewrites it wholesale on every tick; an external write is either overwritten or corrupts the schedule. Import should prepare the job and print a spec for the scheduler's own API to consume.
Shell scripts as scheduled jobs fail silently on Windows. The scheduler
spawns with a narrow PATH and cannot find bash: the job reports an error status
and delivers nothing. Write jobs in Python. Warn at import time when the
imported job is a .sh.
The export skips binaries (.exe, .dll, .cmd, .bat) referenced in a
command. A hook command is <interpreter> <script>; only the script is config.
Without the filter, a virtualenv's python.exe goes into the repo as text.
Credentials are redacted on export and the import aborts on the marker. A private repo still leaks through zips, backups and forks. Move the value by another channel and edit the installed file by hand.
Export requires an explicit local policy file. No policy, no export. Opt-in per hook (by event, command and files) and per job (by exact id). An implicit "export everything in this folder" eventually exports something that should never have left the machine.
Import is always explicit, never automatic. A pull that overwrote hooks/
would break the receiving machine in silence. This is the same failure class as
a union merge strategy on a file where deletions are meaningful: the deleted
entry comes back from the other side and nobody notices.
Idempotence, and how you know it broke
Running the sync twice in a row must produce no new commit. Achieve it by
ignoring volatile fields in the comparison: export timestamps, and the
scheduler's runtime fields (next_run_at, last_status, failure_streak,
repeat.completed).
A commit every tick means a new volatile field appeared in the scheduler's output. Add it to the ignore list rather than accepting the noise — otherwise the history becomes unreadable exactly when you need to read it.
Debug
The happy path is silent, which is the problem. To see anything:
python sync.py # run the whole sync by hand
git -C config log --oneline -5A rejected push (fetch first) when two machines export at nearly the same
time is expected and not an error: the next tick pulls, merges and pushes
on its own. Do not fix it by hand.
A real conflict should abort the merge, leave the repo clean, and alert at most once an hour. An alert per tick trains you to ignore alerts.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

