{"id":37975662,"url":"https://github.com/dallay/agentsync","last_synced_at":"2026-04-17T21:02:35.676Z","repository":{"id":332792954,"uuid":"1135025647","full_name":"dallay/agentsync","owner":"dallay","description":"A fast, portable CLI tool for synchronizing AI agent configurations across multiple AI coding assistants using symbolic links.","archived":false,"fork":false,"pushed_at":"2026-04-13T20:57:47.000Z","size":16147,"stargazers_count":27,"open_issues_count":9,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T22:35:50.855Z","etag":null,"topics":["agents","ai","cli","mcp"],"latest_commit_sha":null,"homepage":"https://dallay.github.io/agentsync/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dallay.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-15T14:37:51.000Z","updated_at":"2026-04-13T20:55:33.000Z","dependencies_parsed_at":"2026-03-15T07:07:13.072Z","dependency_job_id":null,"html_url":"https://github.com/dallay/agentsync","commit_stats":null,"previous_names":["dallay/agentsync"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/dallay/agentsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dallay%2Fagentsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dallay%2Fagentsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dallay%2Fagentsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dallay%2Fagentsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dallay","download_url":"https://codeload.github.com/dallay/agentsync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dallay%2Fagentsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31793225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","ai","cli","mcp"],"created_at":"2026-01-16T18:30:06.233Z","updated_at":"2026-04-14T11:01:02.655Z","avatar_url":"https://github.com/dallay.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AgentSync\n\n[![CI](https://github.com/dallay/agentsync/actions/workflows/ci.yml/badge.svg)](https://github.com/dallay/agentsync/actions/workflows/ci.yml)\n[![Release](https://github.com/dallay/agentsync/actions/workflows/release.yml/badge.svg)](https://github.com/dallay/agentsync/actions/workflows/release.yml)\n[![Catalog E2E](https://github.com/dallay/agentsync/actions/workflows/catalog-e2e.yml/badge.svg)](https://github.com/dallay/agentsync/actions/workflows/catalog-e2e.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![GitHub release](https://img.shields.io/github/v/release/dallay/agentsync)](https://github.com/dallay/agentsync/releases)\n[![Codecov](https://codecov.io/gh/dallay/agentsync/graph/badge.svg)](https://codecov.io/gh/dallay/agentsync)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=dallay_agentsync\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=dallay_agentsync)\n\nA fast, portable CLI tool for synchronizing AI agent configurations and MCP servers across multiple\nAI coding assistants using symbolic links.\n![synchro.webp | 256](website/docs/src/assets/synchro.webp)\n\n**How AgentSync works at a glance:** many AI tools expect different config locations, so AgentSync turns `.agents/` into one source of truth and syncs it everywhere.\n\n```mermaid\nflowchart LR\n    subgraph Problem[Problem: fragmented AI tool setup]\n        Claude[Claude Code]\n        Gemini[Gemini CLI]\n        Cursor[Cursor]\n        Copilot[GitHub Copilot]\n        Codex[OpenAI Codex]\n        OpenCode[OpenCode]\n    end\n\n    Chaos[Scattered config files\u003cbr/\u003eDuplication and drift]\n    Source[.agents/\u003cbr/\u003eSingle source of truth]\n    Sync[AgentSync\u003cbr/\u003eRust CLI + npm wrapper]\n    Output[Symlinks + MCP config\u003cbr/\u003efor each assistant]\n    Result[Update once\u003cbr/\u003eSync everywhere]\n\n    Claude --\u003e Chaos\n    Gemini --\u003e Chaos\n    Cursor --\u003e Chaos\n    Copilot --\u003e Chaos\n    Codex --\u003e Chaos\n    OpenCode --\u003e Chaos\n\n    Chaos --\u003e|replace with| Source\n    Source --\u003e Sync\n    Sync --\u003e Output\n    Output --\u003e Result\n\n    classDef tools fill:#fff7ed,stroke:#f97316,color:#7c2d12,stroke-width:1px;\n    classDef pain fill:#fef2f2,stroke:#ef4444,color:#7f1d1d,stroke-width:1px;\n    classDef core fill:#eff6ff,stroke:#2563eb,color:#1e3a8a,stroke-width:1px;\n    classDef success fill:#ecfdf5,stroke:#22c55e,color:#14532d,stroke-width:1px;\n\n    class Claude,Gemini,Cursor,Copilot,Codex,OpenCode tools;\n    class Chaos pain;\n    class Source,Sync,Output core;\n    class Result success;\n```\n\n### Typical workflow\n\n```mermaid\nflowchart LR\n    Init[agentsync init\u003cbr/\u003eCreate or migrate config] --\u003e Apply[agentsync apply\u003cbr/\u003eCreate or refresh symlinks]\n    Apply --\u003e Status[agentsync status\u003cbr/\u003eInspect sync state]\n    Status --\u003e Skill[agentsync skill ...\u003cbr/\u003eManage installed skills]\n\n    classDef action fill:#f8fafc,stroke:#475569,color:#0f172a,stroke-width:1px;\n    class Init,Apply,Status,Skill action;\n```\n\n## Why AgentSync?\n\nDifferent AI coding tools expect configuration files in various locations:\n\n| Tool               | Instructions                      | Commands             | Skills             |\n|--------------------|-----------------------------------|----------------------|--------------------|\n| **Claude Code**    | `CLAUDE.md`                       | `.claude/commands/`  | `.claude/skills/`  |\n| **GitHub Copilot** | `.github/copilot-instructions.md` | -                    | -                  |\n| **Gemini CLI**     | `GEMINI.md`                       | `.gemini/commands/`  | `.gemini/skills/`  |\n| **Cursor**         | `.cursor/rules/agentsync.mdc`     | -                    | `.cursor/skills/`  |\n| **VS Code**        | -                                 | -                    | -                  |\n| **OpenCode**       | `OPENCODE.md`                     | `.opencode/command/` | `.opencode/skills/` |\n| **OpenAI Codex**   | `AGENTS.md`                       | -                    | `.codex/skills/`   |\n\nAgentSync maintains a **single source of truth** in `.agents/` and creates symlinks to all required\nlocations.\n\n## Features\n\n- 🔗 **Symlinks over copies** - Changes propagate instantly\n- 📝 **TOML configuration** - Human-readable, easy to maintain\n- 📋 **Gitignore management** - Automatically updates `.gitignore`\n- 🛡️ **Safe** - Automatically backs up existing files before replacing them\n- 🖥️ **Cross-platform** - Linux, macOS, Windows\n- 🚀 **CI-friendly** - Gracefully skips when binary unavailable\n- ⚡ **Fast** - Single static binary, no runtime dependencies\n- 🧩 **Curated skills** - Install from the [dallay/agents-skills](https://github.com/dallay/agents-skills) collection or external providers\n\n### Catalog validation\n\nAgentSync ships a full catalog installation E2E check that validates every skill entry can still be\nresolved, installed, and registered correctly.\n\n- GitHub Actions workflow: `Catalog E2E`\n- Manual run: Actions → **Catalog E2E** → **Run workflow**\n- Scheduled run: every Monday at 08:00 UTC\n- Local run:\n\n```bash\ngit clone https://github.com/dallay/agents-skills ../agents-skills\nexport AGENTSYNC_LOCAL_SKILLS_REPO=\"$(pwd)/../agents-skills\"\nRUN_E2E=1 cargo test --test test_catalog_integration -- --ignored --nocapture\n```\n\nIf you already keep `agents-skills` as a sibling checkout next to this repository, you can skip the\nenvironment variable and let the test auto-discover that sibling path instead.\n\nThis check is intentionally separate from normal CI because it depends on external networks and\nthird-party skill repositories.\n\n## Installation\n\n### Node.js Package Managers (Recommended)\n\nIf you have Node.js (\u003e=18) installed, the easiest way to install AgentSync is through a package manager.\n\n#### Global Installation\n\n```bash\n# Using npm\nnpm install -g @dallay/agentsync\n\n# Using pnpm\npnpm add -g @dallay/agentsync\n\n# Using yarn (Classic v1)\nyarn global add @dallay/agentsync\n\n# Using bun\nbun i -g @dallay/agentsync\n```\n\n#### One-off Execution\n\nIf you want to run AgentSync without a permanent global installation:\n\n```bash\n# Using npx (npm)\nnpx @dallay/agentsync apply\n\n# Using dlx (pnpm)\npnpm dlx @dallay/agentsync apply\n\n# Using dlx (yarn v2+)\nyarn dlx @dallay/agentsync apply\n\n# Using bunx (bun)\nbunx @dallay/agentsync apply\n```\n\n#### Local Installation (Dev Dependency)\n\n```bash\n# Using npm\nnpm install --save-dev @dallay/agentsync\n\n# Using pnpm\npnpm add -D @dallay/agentsync\n\n# Using yarn\nyarn add -D @dallay/agentsync\n\n# Using bun\nbun add -d @dallay/agentsync\n```\n\n### From crates.io (Rust)\n\nIf you have Rust installed, you can install AgentSync directly from [crates.io](https://crates.io/crates/agentsync):\n\n```bash\ncargo install agentsync\n```\n\n### From GitHub Releases (Pre-built Binaries)\n\nVisit the [GitHub Releases](https://github.com/dallay/agentsync/releases) page to find the latest version number and correct platform identifier for your system.\n\nTo install via terminal, you can use the following script (be sure to replace the `\u003cversion\u003e` placeholder with a real tag, e.g., `1.28.0`):\n\n```bash\n# Define version and platform\nVERSION=\"\u003cversion\u003e\"\n# Detect architecture (macOS)\nPLATFORM=$([ \"$(uname -m)\" = \"arm64\" ] \u0026\u0026 echo \"aarch64-apple-darwin\" || echo \"x86_64-apple-darwin\")\n# Or specify manually for Linux, e.g., x86_64-unknown-linux-gnu\n# PLATFORM=\"x86_64-unknown-linux-gnu\"\nTARBALL=\"agentsync-${VERSION}-${PLATFORM}.tar.gz\"\n\n# Download binary and checksum\ncurl -LO \"https://github.com/dallay/agentsync/releases/download/v${VERSION}/${TARBALL}\"\ncurl -LO \"https://github.com/dallay/agentsync/releases/download/v${VERSION}/${TARBALL}.sha256\"\n\n# Verify integrity\nif command -v sha256sum \u003e/dev/null; then\n  sha256sum --check \"${TARBALL}.sha256\"\nelse\n  shasum -a 256 --check \"${TARBALL}.sha256\"\nfi\n\nif [ $? -ne 0 ]; then\n  echo \"Error: Checksum verification failed!\"\n  exit 1\nfi\n\n# Extract and install\ntar xzf \"${TARBALL}\"\nsudo mv agentsync-*/agentsync /usr/local/bin/\n```\n\n### From Source (Requires Rust 1.89+)\n\nInstall directly from the GitHub repository (requires Node.js 22.22.0+ and Rust 1.89+):\n\n```bash\ncargo install --git https://github.com/dallay/agentsync\n```\n\nOr clone and build manually:\n\n```bash\ngit clone https://github.com/dallay/agentsync\ncd agentsync\ncargo build --release\n\n# The binary will be available at ./target/release/agentsync\n\n```\n\n## Quick Start\n\n### New Projects\n\n1. **Initialize configuration** in your project:\n\n```bash\ncd your-project\nagentsync init\n```\n\nThis creates `.agents/agentsync.toml` with a default configuration.\n\n### Existing Projects with Agent Files\n\nIf you already have agent configuration files scattered across your project (like `CLAUDE.md`, `.cursor/`, or `.github/copilot-instructions.md`), use the interactive wizard:\n\n```bash\ncd your-project\nagentsync init --wizard\n```\n\nThe wizard will scan for existing files, let you select which to migrate, and set up everything automatically.\n\n---\n\n1. **Edit the configuration** to match your needs (see [Configuration](#configuration))\n\n2. **Apply the configuration**:\n\n```bash\nagentsync apply\n```\n\n1. **Add to your project setup** (e.g., `package.json`):\n\n```json\n{\n  \"scripts\": {\n    \"prepare\": \"agentsync apply || true\"\n  }\n}\n```\n\n### Team workflow note\n\nAgentSync defaults to managed `.gitignore` mode (`[gitignore].enabled = true`), which is the recommended starting point for most teams. If your team intentionally wants to commit AgentSync-managed destinations instead, treat `[gitignore].enabled = false` as an explicit opt-out workflow. See the canonical guide: \u003chttps://dallay.github.io/agentsync/guides/gitignore-team-workflows/\u003e\n\nIf you run AgentSync from Windows and need native symlink prerequisites, WSL guidance, or recovery steps, use the dedicated setup guide: \u003chttps://dallay.github.io/agentsync/guides/windows-symlink-setup/\u003e\n\nIf your team wants `agentsync apply` to run after branch switches, merges, or rebases, use the Git hook automation guide for Lefthook, Husky, simple-git-hooks, and native hook examples: \u003chttps://dallay.github.io/agentsync/guides/git-hook-automation/\u003e\n\n## Usage\n\n```bash\n# Initialize a new configuration\nagentsync init\n\n# Initialize with interactive wizard (for existing projects with agent files)\nagentsync init --wizard\n\n# Apply configuration (create symlinks)\nagentsync apply\n\n# Clean existing symlinks before applying\nagentsync apply --clean\n\n# Remove all managed symlinks\nagentsync clean\n\n# Use a custom config file\nagentsync apply --config /path/to/config.toml\n\n# Dry run (show what would be done without making changes)\nagentsync apply --dry-run\n\n# Skip gitignore reconciliation for this run only\nagentsync apply --no-gitignore\n\n# Filter by agent\nagentsync apply --agents claude,copilot\n\n# Verbose output\nagentsync apply --verbose\n\n# Show status of managed symlinks\nagentsync status\n\n# Run diagnostic and health check\nagentsync doctor [--project-root \u003cpath\u003e]\n\n# Manage skills\nagentsync skill install \u003cskill-id\u003e\nagentsync skill update \u003cskill-id\u003e\nagentsync skill uninstall \u003cskill-id\u003e\n```\n\n### Status\n\nVerify the state of AgentSync-managed targets. Useful for local verification and CI.\n\n```bash\nagentsync status [--project-root \u003cpath\u003e] [--json]\n```\n\n- `--project-root \u003cpath\u003e`: Optional. Path to the project root to locate the agentsync config.\n- `--json`: Output machine-readable JSON (pretty-printed).\n\n`status` is sync-type aware:\n\n- `symlink` targets are checked as one managed destination symlink.\n- `symlink-contents` targets are checked as destination directories whose managed child entries are the symlinks.\n- An existing empty `.agents/commands/` source directory is valid, so an empty destination like `.claude/commands/` is not reported as missing or \"not a symlink\" just because it currently has `0` managed entries.\n\nExit codes: 0 = no problems, 1 = problems detected (CI-friendly)\n\n## Configuration\n\nConfiguration is stored in `.agents/agentsync.toml`:\n\n```toml\n# Source directory (relative to this config file)\nsource_dir = \".\"\n\n# Optional: compress AGENTS.md and point symlinks to the compressed file\n# compress_agents_md = false\n\n# Default agents to run when --agents is not specified.\n# If empty, all enabled agents will be processed.\ndefault_agents = [\"claude\", \"copilot\"]\n\n# Gitignore management\n[gitignore]\nenabled = true\nmarker = \"AI Agent Symlinks\"\n# Additional entries to add to .gitignore (target destinations are added automatically)\nentries = []\n\n# Agent definitions\n[agents.claude]\nenabled = true\ndescription = \"Claude Code - Anthropic's AI coding assistant\"\n\n[agents.claude.targets.instructions]\nsource = \"AGENTS.md\"\ndestination = \"CLAUDE.md\"\ntype = \"symlink\"\n\n[agents.claude.targets.commands]\nsource = \"commands\"\ndestination = \".claude/commands\"\ntype = \"symlink-contents\"\npattern = \"*.agent.md\"\n```\n\n### MCP Support (Model Context Protocol)\n\nAgentSync can automatically generate MCP configuration files for supported agents (Claude Code,\nGitHub Copilot, OpenAI Codex CLI, Gemini CLI, Cursor, VS Code, OpenCode).\n\nThis allows you to define MCP servers once in `agentsync.toml` and have them synchronized to all\nagent-specific config files.\n\n```toml\n[mcp]\nenabled = true\n\n# Strategy for existing files: \"merge\" (default) or \"overwrite\"\n# \"merge\" preserves existing servers but overwrites conflicts with TOML config\nmerge_strategy = \"merge\"\n\n# Define servers once\n[mcp_servers.filesystem]\ncommand = \"npx\"\nargs = [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"]\n\n[mcp_servers.git]\ncommand = \"npx\"\nargs = [\"-y\", \"@modelcontextprotocol/server-git\", \"--repository\", \".\"]\n\n# Optional fields:\n# env = { \"KEY\" = \"VALUE\" }\n# disabled = false\n```\n\n#### Supported Agents (canonical)\n\nAgentSync supports the following agents and will synchronize corresponding files/locations. This list is canonical — keep it in sync with `src/mcp.rs` (authoritative).\n\n- **Claude Code** — `.mcp.json` (agent id: `claude`)\n- **GitHub Copilot** — `.vscode/mcp.json` (agent id: `copilot`)\n- **OpenAI Codex CLI** — `.codex/config.toml` (agent id: `codex`) — TOML format with `[mcp_servers.\u003cname\u003e]` tables. AgentSync maps `headers` to Codex `http_headers`.\n- **Gemini CLI** — `.gemini/settings.json` (agent id: `gemini`) — AgentSync will add `trust: true` when generating Gemini configs.\n- **Cursor** — `.cursor/mcp.json` (agent id: `cursor`)\n- **VS Code** — `.vscode/mcp.json` (agent id: `vscode`)\n- **OpenCode** — `opencode.json` (agent id: `opencode`)\n\nAgentSync also supports 32+ agents (7 native MCP agents and 25+ configurable agents) including Windsurf, Cline, Amazon Q, Aider, RooCode, Trae, and more. See the [full list in the documentation](https://dallay.github.io/agentsync/reference/configuration/).\n\nSee the [MCP Integration Guide](https://dallay.github.io/agentsync/guides/mcp/) for formatter details and merge behavior.\n\n#### Merge Behavior\n\nWhen `merge_strategy = \"merge\"`:\n\n1. AgentSync reads the existing config file (if it exists).\n2. It adds servers defined in `agentsync.toml`.\n3. **Conflict Resolution**: If a server name exists in both, the definition in `agentsync.toml` **wins** and overwrites the existing one.\n4. Existing servers NOT in `agentsync.toml` are preserved.\n\n### Target Types\n\n| Type               | Description                                                   |\n|--------------------|---------------------------------------------------------------|\n| `symlink`          | Create a symlink to the source file/directory                 |\n| `symlink-contents` | Create symlinks for each item in the source directory         |\n| `nested-glob`      | Recursively discover files and create symlinks for each match |\n| `module-map`       | Map centrally-managed source files to module directories      |\n\nThe `symlink-contents` type optionally supports a `pattern` field (glob pattern like `*.md`) to\nfilter which items to link. AgentSync treats the destination as a managed directory container, so\n`agentsync status` validates the child links inside that directory instead of expecting the\ndirectory itself to be a symlink.\n\n#### Nested Glob Target (`nested-glob`)\n\nThe `nested-glob` type discovers files matching a recursive glob pattern and creates a symlink\nfor each discovered file.  This is ideal for **monorepos and multi-module projects** where\ndifferent subdirectories contain their own `AGENTS.md` files.\n\n```toml\n[agents.claude.targets.nested]\n# Root directory to search (relative to the project root)\nsource = \".\"\n\n# Glob pattern – supports ** for multi-level directory matching\npattern = \"**/AGENTS.md\"\n\n# Paths to exclude (matched against each file's path relative to source)\nexclude = [\n    \".agents/**\",\n    \"node_modules/**\",\n    \"**/target/**\",\n    \"**/build/**\",\n    \"**/dist/**\",\n    \"**/.git/**\",\n]\n\n# Destination template – placeholders replaced for each discovered file:\n#   {relative_path}  parent directory relative to `source`  (e.g. clients/agent-runtime)\n#                    For files at the root of `source`, this is \".\" (not empty)\n#   {file_name}      file name                               (e.g. AGENTS.md)\n#   {stem}           file name without extension             (e.g. AGENTS)\n#   {ext}            file extension without leading dot      (e.g. md)\ndestination = \"{relative_path}/CLAUDE.md\"\n\ntype = \"nested-glob\"\n```\n\nGiven the structure:\n\n```\nproject-root/\n├── .agents/\n│   └── AGENTS.md          # excluded by .agents/**\n├── clients/\n│   └── agent-runtime/\n│       └── AGENTS.md      # → clients/agent-runtime/CLAUDE.md\n└── modules/\n    └── core-kmp/\n        └── AGENTS.md      # → modules/core-kmp/CLAUDE.md\n```\n\nAgentSync would create:\n\n- `clients/agent-runtime/CLAUDE.md` → symlink to `clients/agent-runtime/AGENTS.md`\n- `modules/core-kmp/CLAUDE.md` → symlink to `modules/core-kmp/AGENTS.md`\n\n## Project Structure\n\n```\n.agents/\n├── agentsync.toml      # Configuration file (source of truth for MCP)\n├── AGENTS.md           # Main agent instructions (single source)\n├── commands/           # Canonical agent commands source\n│   ├── review.agent.md\n│   └── test.agent.md\n├── skills/             # Shared knowledge/skills\n│   └── kotlin/\n│       └── SKILL.md\n└── prompts/            # Reusable prompts\n    └── code-review.prompt.md\n```\n\nAfter running `agentsync apply`:\n\n```\nproject-root/\n├── CLAUDE.md           → .agents/AGENTS.md\n├── GEMINI.md           → .agents/AGENTS.md\n├── AGENTS.md           → .agents/AGENTS.md\n├── .mcp.json           (Generated from agentsync.toml)\n├── .claude/\n│   ├── commands/       → managed directory with symlinks to .agents/commands/*.agent.md\n│   └── skills/         → symlinks to .agents/skills/*\n├── .gemini/\n│   ├── settings.json   (Generated from agentsync.toml)\n│   ├── commands/       → managed directory with symlinks to .agents/commands/*.agent.md\n│   └── skills/         → symlinks to .agents/skills/*\n└── .github/\n    ├── copilot-instructions.md → .agents/AGENTS.md\n    └── agents/         → symlinks to .agents/commands/*.agent.md\n```\n\n## CI/CD Integration\n\nAgentSync gracefully handles CI environments where the binary isn't available:\n\n```json\n{\n  \"scripts\": {\n    \"agents:sync\": \"pnpm exec agentsync apply\",\n    \"prepare\": \"lefthook install \u0026\u0026 pnpm run agents:sync\"\n  }\n}\n```\n\nThe symlinks are primarily for local development. CI builds typically don't need them.\n\n### Installing in CI\n\nIf you need agentsync in CI, you can download the latest version automatically using `jq` for robust parsing:\n\n```yaml\n- name: Install agentsync\n  env:\n    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  run: |\n    # Fetch latest version using GitHub API and jq\n    LATEST_TAG=$(curl -s -H \"Authorization: Bearer $GH_TOKEN\" \\\n      https://api.github.com/repos/dallay/agentsync/releases/latest | jq -r '.tag_name')\n    \n    if [ \"$LATEST_TAG\" == \"null\" ] || [ -z \"$LATEST_TAG\" ]; then\n      echo \"Error: Failed to fetch latest release tag\"\n      exit 1\n    fi\n    \n    VERSION=${LATEST_TAG#v}\n    PLATFORM=\"x86_64-unknown-linux-gnu\"\n    \n    curl -LO \"https://github.com/dallay/agentsync/releases/download/${LATEST_TAG}/agentsync-${VERSION}-${PLATFORM}.tar.gz\"\n    tar xzf agentsync-${VERSION}-${PLATFORM}.tar.gz\n    sudo mv agentsync-*/agentsync /usr/local/bin/\n```\n\n## Skills\n\nAgentSync includes a curated skill catalog with 100+ skills across 40+ technologies. Skills are small bundles of AI-agent instructions that can be installed into your project.\n\n- **[dallay/agents-skills](https://github.com/dallay/agents-skills)** — Canonical home for all dallay-maintained skills. Community contributions welcome via PR.\n- **External providers** — Skills from Angular, Vercel, Cloudflare, Expo, Stripe, and many more are resolved from their respective repositories.\n\n```bash\n# Detect project technologies and get skill recommendations\nagentsync skill suggest\n\n# Install a skill\nagentsync skill install docker-expert\n\n# Install all recommended skills non-interactively\nagentsync skill suggest --install --all\n```\n\nSee the [Skills Guide](https://dallay.github.io/agentsync/guides/skills/) for full documentation.\n\n## Getting Started (Development)\n\nThis project is a monorepo containing a Rust core and a JavaScript/TypeScript wrapper.\n\n### Repository Structure\n\n- `src/`: Core logic and CLI implementation in **Rust**.\n- `npm/agentsync/`: **TypeScript** wrapper used for NPM distribution.\n- `website/docs/`: Documentation site built with **Starlight**.\n- `tests/`: Integration tests for the CLI.\n\n### Prerequisites\n\n- [**Rust**](https://www.rust-lang.org/tools/install) (1.89+ recommended)\n- [**Node.js**](https://nodejs.org/) (v22.22.0+ recommended for development)\n- [**pnpm**](https://pnpm.io/installation)\n\n### Setup\n\n1. **Install JavaScript dependencies:**\n\n    ```bash\n    pnpm install\n    ```\n\n2. **Build the Rust binary:**\n\n    ```bash\n    cargo build\n    ```\n\n### Common Commands\n\nThis project uses a `Makefile` to orchestrate common tasks.\n\n- **Run Rust tests:**\n\n    ```bash\n    make rust-test\n    ```\n\n- **Run JavaScript tests:**\n\n    ```bash\n    make js-test\n    ```\n\n- **Build all components:**\n\n    ```bash\n    make all\n    ```\n\n- **Run full verification (lint + build + test):**\n\n    ```bash\n    make verify-all\n    ```\n\n- **Lint the code:**\n\n    ```bash\n    # Rust\n    cargo clippy\n    # JavaScript/TypeScript\n    pnpm run biome:check\n    ```\n\n- **Format the code:**\n\n    ```bash\n    make fmt\n    ```\n\n### Release Process\n\nReleases are managed via `semantic-release` and GitHub Actions. To trigger a dry run locally:\n\n```bash\npnpm run release:dry-run\n```\n\n## Troubleshooting\n\n### `PNPM_NO_MATURE_MATCHING_VERSION`\n\nIf `pnpm install` fails with this error, it's likely due to a strict package release age policy. You can try installing with `--ignore-scripts` or wait for the package to \"mature\" in the registry.\n\n### Lefthook installation failure\n\nIf `pnpm install` fails during the `lefthook` setup, you can try:\n\n```bash\npnpm install --ignore-scripts\n```\n\n### Build failures (Rust)\n\nEnsure you have the latest stable Rust toolchain installed. You can update with `rustup update stable`.\n\n### Symlink creation fails on Windows\n\nUse the dedicated Windows setup guide for native prerequisites, WSL positioning, verification, and recovery steps: \u003chttps://dallay.github.io/agentsync/guides/windows-symlink-setup/\u003e\n\n## Inspiration\n\n- [Ruler](https://github.com/intellectronica/ruler) - Similar concept but copies files instead of\n  using symlinks\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to get started.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdallay%2Fagentsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdallay%2Fagentsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdallay%2Fagentsync/lists"}