v1.4.0 — linked sources shipped

One set of agent rules
to rule them all.

A package manager and sync engine for AI-agent context. Keep rules, skills, and workflows in a single .agents/ tree — pull them from upstream with a lockfile, scan the untrusted ones, and sync everything to Claude, Windsurf, Cursor, and Copilot.

$ npm install -g @brickhouse-tech/sync-agents
also: brew install brickhouse-tech/tap/sync-agents · go install github.com/brickhouse-tech/sync-agents@latest

// live session

Pull it. Scan it. Trust it. Sync it.

Remote agent context is a supply chain. sync-agents treats it like one — every fetch is SHA-verified, statically scanned, and quarantined until you approve it.

// capabilities

Built like a package manager, because it is one.

Lockfiles, provenance, integrity hashes, editable installs — the tooling discipline your dependencies get, applied to your agents' brains.

.yml

Declarative sources + lockfile

Declare upstream skills, rules, workflows — or whole .agents/ trees — in sources.yaml. pull installs them reproducibly and records every resolution in sources.lock. Commit both; clones rebuild byte-for-byte.

#

SHA pinning & integrity

Every ref resolves to a commit SHA via the GitHub API, and a deterministic sha256 content hash is verified before anything touches disk. A tampered tarball or corrupted cache aborts the install — no partial writes, ever.

[!]

Quarantine + static scanning

Remote content is treated as a hostile supply chain. Fetches land in .quarantine/ after a scan for curl | bash patterns, credential access + network calls, obfuscation, and prompt injection. Critical findings block approve; overrides are recorded in the lock.

->

Linked (editable) sources v1.4.0

The npm link of agent context. source add --link=../foo-skill symlinks a live local checkout instead of a snapshot — edits flow both ways, no commit→push→update loop. Recorded declaratively, always as relative paths.

OS

OS-scoped routing

Drop artifacts into macos/, linux/, unix/, or windows/ subdirectories and they sync only where the host matches. Your brew rules stop polluting the Linux homelab, and vice versa.

idx

AGENTS.md auto-index

One generated index of everything in .agents/, symlinked to CLAUDE.md so Claude reads it natively. watch keeps it fresh, inheritance links chain project → team → org → global.

{ }

Multi-bucket layout

Rules, skills, workflows, subagents, plans, specs, hooks, and ADRs — each with its own lifecycle. Optional buckets activate on demand, and ADR status lives in the directory tree: proposed/, accepted/, denied/.

~>

Semantic routing

A Claude skill is invocable; a Windsurf workflow is a slash command. sync-agents routes on behavioral semantics, not directory names — so nothing gets dumped into another tool's always-on context by accident.

Syncs to .claude/ .windsurf/ .cursor/ .github/copilot/ ~/.agents/ (global)

// how it works

Three moves. Every repo. Every machine.

A single Go binary (shipped via npm, Homebrew, or go install) with no runtime dependencies — it doesn't even need git to pull.

01 · declare

Declare your sources

Write what your agents should know in sources.yaml — a skill, a rule, or an entire upstream tree.

sources:
  - skill:anthropic/skill-pack@v1.2.0
  - rule:my-org/norms@main/rules/sec.md
  - tree:my-org/team-agents@v2.0.0
02 · pull & scan

Pull, verify, review

Fetch everything, verify hashes against the lockfile, and review whatever the scanner flags before it can reach an agent.

$ sync-agents pull
 2 installed · 1 quarantined
$ sync-agents approve code-review
03 · index & sync

Index and fan out

Regenerate AGENTS.md and symlink every artifact into each tool's directory. Change once, updated everywhere.

$ sync-agents sync
 4 targets linked
 AGENTS.md → CLAUDE.md