AgentSync
A fast, portable CLI tool for synchronizing AI agent configurations across multiple AI coding
assistants using symbolic links.

Why AgentSync?
Different AI coding tools expect configuration files in various locations:
| Tool | Instructions | Commands | Skills |
|---|---|---|---|
| Claude Code | CLAUDE.md |
.claude/commands/ |
.claude/skills/ |
| GitHub Copilot | .github/copilot-instructions.md |
.github/agents/ |
- |
| Cursor | .cursor/rules/ |
- | - |
| Codex CLI | AGENTS.md |
- | .codex/skills/ |
| Gemini CLI | GEMINI.md |
.gemini/commands/ |
.gemini/skills/ |
| OpenCode | AGENTS.md |
.opencode/command/ |
.opencode/skill/ |
AgentSync maintains a single source of truth in .agents/ and creates symlinks to all required
locations.
Features
- 🔗 Symlinks over copies - Changes propagate instantly
- 📝 TOML configuration - Human-readable, easy to maintain
- 📋 Gitignore management - Automatically updates
.gitignore - 🖥️ Cross-platform - Linux, macOS, Windows
- 🚀 CI-friendly - Gracefully skips when binary unavailable
- ⚡ Fast - Single static binary, no runtime dependencies
Installation
From GitHub Releases (Recommended)
Download the latest release for your platform:
# macOS (Apple Silicon)
# macOS (Intel)
# Linux (x86_64)
# Linux (ARM64)
From Source (requires Rust 1.85+)
Or clone and build:
# Binary at ./target/release/agentsync
From crates.io
Quick Start
- Initialize configuration in your project:
This creates .agents/agentsync.toml with a default configuration.
-
Edit the configuration to match your needs (see Configuration)
-
Apply the configuration:
- Add to your project setup (e.g.,
package.json):
Usage
# Initialize a new configuration
# Apply configuration (create symlinks)
# Clean existing symlinks before applying
# Remove all managed symlinks
# Use a custom config file
# Dry run (show what would be done without making changes)
# Show version
Configuration
Configuration is stored in .agents/agentsync.toml:
# Source directory (relative to this config file)
= "."
# Gitignore management
[]
= true
= "AI Agent Symlinks"
= [
"CLAUDE.md",
"GEMINI.md",
".github/copilot-instructions.md",
]
# Agent definitions
[]
= true
= "Claude Code - Anthropic's AI coding assistant"
[]
= "AGENTS.md"
= "CLAUDE.md"
= "symlink"
[]
= "command"
= ".claude/commands"
= "symlink-contents"
= "*.agent.md"
MCP Support (Model Context Protocol)
AgentSync can automatically generate MCP configuration files for supported agents (Claude Code, GitHub Copilot, Gemini CLI, VS Code).
This allows you to define MCP servers once in agentsync.toml and have them synchronized to all
agent-specific config files.
[]
= true
# Strategy for existing files: "merge" (default) or "overwrite"
# "merge" preserves existing servers but overwrites conflicts with TOML config
= "merge"
# Define servers once
[]
= "npx"
= ["-y", "@modelcontextprotocol/server-filesystem", "."]
[]
= "npx"
= ["-y", "@modelcontextprotocol/server-git", "--repository", "."]
# Optional fields:
# env = { "KEY" = "VALUE" }
# disabled = false
Supported Agents & File Locations
- Claude Code:
.mcp.json - GitHub Copilot:
.copilot/mcp-config.json - Gemini CLI:
.gemini/settings.json(automatically addstrust: true) - VS Code:
.vscode/mcp.json - OpenCode:
.opencode/mcp.json
Merge Behavior
When merge_strategy = "merge":
- AgentSync reads the existing config file (if it exists).
- It adds servers defined in
agentsync.toml. - Conflict Resolution: If a server name exists in both, the definition in
agentsync.tomlwins and overwrites the existing one. - Existing servers NOT in
agentsync.tomlare preserved.
Target Types
| Type | Description |
|---|---|
symlink |
Create a symlink to the source file/directory |
symlink-contents |
Create symlinks for each file in the source directory |
The symlink-contents type optionally supports a pattern field (glob pattern like *.md) to
filter which files to link.
Project Structure
.agents/
├── agentsync.toml # Configuration file
├── AGENTS.md # Main agent instructions (single source)
├── .mcp.json # MCP server configurations
├── command/ # Agent commands
│ ├── review.agent.md
│ └── test.agent.md
├── skills/ # Shared knowledge/skills
│ └── kotlin/
│ └── SKILL.md
└── prompts/ # Reusable prompts
└── code-review.prompt.md
After running agentsync apply:
project-root/
├── CLAUDE.md → .agents/AGENTS.md
├── GEMINI.md → .agents/AGENTS.md
├── AGENTS.md → .agents/AGENTS.md
├── .mcp.json → .agents/.mcp.json
├── .claude/
│ └── commands/ → symlinks to .agents/command/*.agent.md
├── .gemini/
│ └── commands/ → symlinks to .agents/command/*.agent.md
└── .github/
├── copilot-instructions.md → .agents/AGENTS.md
└── agents/ → symlinks to .agents/command/*.agent.md
CI/CD Integration
AgentSync gracefully handles CI environments where the binary isn't available:
The symlinks are primarily for local development. CI builds typically don't need them.
Installing in CI
If you need agentsync in CI, add it to your workflow:
- name: Install agentsync
run: |
curl -LO https://github.com/dallay/agentsync/releases/latest/download/agentsync-x86_64-unknown-linux-gnu.tar.gz
tar xzf agentsync-x86_64-unknown-linux-gnu.tar.gz
sudo mv agentsync-*/agentsync /usr/local/bin/
Getting Started (Development)
This project is a monorepo containing a Rust core and a JavaScript/TypeScript wrapper.
Prerequisites
Setup
-
Install JavaScript dependencies:
-
Build the Rust binary:
Common Commands
This project uses a Makefile to orchestrate common tasks.
- Run Rust tests:
- Run JavaScript tests:
- Build all components:
- Format the code:
Inspiration
- Ruler - Similar concept but copies files instead of using symlinks
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feat/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feat/amazing-feature) - Open a Pull Request
License
MIT License - see LICENSE for details.