- Creates
~/.agentsif it does not exist and copies in the starter content (two skills, six roles, memory hooks, a minimaldotagents.yaml). - Detects which harnesses are installed and records their native paths.
- Scans each harness for skills, roles, and MCP servers you already have and shows a review screen: one row per item, share/keep/skip per row, items identical across harnesses shared automatically. Copy-only, originals untouched. Non-interactive runs fall back to sequential prompts;
--yesimports everything without prompting,--dry-runprints the candidates and exits without changes,--jsonemits the detection result for scripting and exits. - Before its first sync touches a harness that already has content, shows exactly what would be removed or overwritten there and asks per harness. Declining keeps that harness's files.
- Offers to
git initthe new repository, and runs the first sync.
The review screen in step 3 looks like this — space cycles share/keep/skip per row, enter applies:
dotagents setup — review 3 item(s) (2 identical, shared automatically)
skill grilling claude-code✓ codex✓ droid· [share]
skill my-notes claude-code✓ codex· droid✓ [share] (differ) from claude-code
role reviewer claude-code✓ codex✓ droid✓ [skip]
↑↓ move space cycle action ←→ pick source a share-all s skip-all enter apply q abort
cd ~/.agents
git remote add origin <your-private-repository>
git push -u origin main
# on the next machine: clone it to ~/.agents, install dotagents, run dotagents setupSubsequent syncs: dotagents sync --pull pulls the repo first, then reconciles. Machines without a Go toolchain skip the memory-tools build step; everything else syncs normally.
After setup, use the authoring surface rather than editing native harness files:
dotagents config
dotagents view --no-open --addr 127.0.0.1:8765
dotagents config validate
dotagents config printThe shared file and dotagents.local.yaml remain separate layers. The
effective view is read-only, and saving YAML never runs sync. The web UI
binds to loopback, requires a session cookie and CSRF header, and keeps sync
behind an explicit preview/apply confirmation.
For temporary HTTPS access from a tailnet, the operator owns the route:
dotagents view --no-open --secure-cookie --addr 127.0.0.1:8765
tailscale serve --bg --set-path /dotagents http://127.0.0.1:8765setup copies the starter content into the config root once. The memory code layer under memory/hooks/ and memory/lib/ stays managed afterwards: on every sync, dotagents
- scaffolds files that are missing,
- refreshes files it wrote that you have not modified, so an upgraded CLI does not leave an old hook layer behind,
- removes files a release stopped shipping,
- and reports, without touching, anything you edited yourself.
Ownership is tracked in .dotagents-starter.json at the config root (commit it alongside dotagents.yaml). Only content dotagents wrote is ever refreshed or removed, so a customized layer is safe.
Everything else in the starter set — AGENTS.md, dotagents.yaml, agents/*.md, skills/ — is your content: dotagents only creates those when they are missing.
Choose during setup or reconfigure later:
dotagents setup --memory basic # default
dotagents setup --memory off
dotagents setup --memory memsearch| Tier | Behavior | Dependency |
|---|---|---|
off |
no managed memory hooks | none |
basic |
appends a bounded digest of each session to $KNOWLEDGE_DIR/sessions/YYYY-MM-DD.md and injects recent digests as context at session start |
Python 3 |
memsearch |
full-text indexed search over the knowledge vault | memsearch on PATH (uv tool install memsearch) |
~/.agents/AGENTS.md is your single root instruction file. During sync, dotagents links it into each harness's native memory path — ~/.config/amp/AGENTS.md for Amp, ~/.claude/CLAUDE.md for Claude Code, ~/.codex/AGENTS.md for Codex, ~/.factory/AGENTS.md for Droid, and ~/.qwen/QWEN.md for Qwen Code — so an edit in one place reaches every agent. dotagents status reports drift, and a file that exists but is not a symlink is never touched without your confirmation.