Governed Agent Access Layer · v0.3.0

One YAML. Every coding agent. Every machine.

Stop copy-pasting CLAUDE.md into every project, re-registering MCP servers in every agent's JSON, and hoping your laptop and your desktop stay in sync. gaal keeps your skills, content files, MCPs, and repos in one file, then applies them to Claude Code, Cursor, Codex, and 17 other agents with one command.

curl -fsSL https://raw.githubusercontent.com/getgaal/gaal/main/scripts/install.sh | sh

macOS · Linux · Windows · or go install github.com/getgaal/gaal@latest

The problem

Your AI coding setup is scattered across four tools and three machines.

You run Claude Code for long tasks, Cursor for inline edits, maybe Codex or Copilot in a browser. Each one reads config from a different place.

New machine? Re-clone repos, re-install skills, re-wire every MCP server. Tweak a skill on your laptop and your desktop doesn't know.

4 agents × 2 machines is 8 places where one source of truth should live. No way to answer "is my setup in sync right now?"

  • Claude Code

    CLAUDE.md.claude/settings.json.claude/skills/
  • Cursor

    .cursor/rules/
  • Codex

    AGENTS.md
  • MCP servers

    redeclared in each agent’s own JSON

See it run

60 seconds. Two machines. Zero copy-paste.

gaal imports an existing setup on one machine and reproduces it on another. No narration. Just the CLI doing its job.

laptoprunning

Act 1 · Import what you already have

desktopidle

Act 2 · Reproduce on a new machine

waiting…

laptop: gaal discovers skills and MCP across every agent.

No server. No account. No telemetry. A single Go binary and a YAML in your dotfiles.

How it works

One file. Five moving parts. Every agent.

gaal reads a single gaal.yaml. It declares the pieces your agents need:

gaal.yaml
schema: 1

# 1. code repos to keep cloned
repositories:
  src/gaal:
    type: git
    url: https://github.com/getgaal/gaal.git
    version: v0.3.0

# 2. AI agent skills
skills:
  - source: obra/superpowers
    # auto-detect every installed agent
    agents: ["*"]
    # shared across projects
    global: true

# 3. files agents read directly
content:
  - source: ./agent-files
    agents: ["claude-code"]
    paths:
      AGENTS.md: CLAUDE.md

# 4. MCP servers
mcps:
  - name: context7
    agents: ["claude-code", "cursor", "codex"]
    global: true
    inline:
      command: npx
      args: ["-y", "@upstash/context7-mcp"]

# 5. commands around sync
hooks:
  post-sync:
    - command: git
      args: ["-C", "~/docs", "pull"]
1

Repositories

Code repos kept cloned and up-to-date at declared paths. Git, Mercurial, SVN, Bazaar, tar, zip.

2

Skills

SKILL.md collections installed per-project or globally into every agent's skill directory.

3

MCP servers

Upserted into each agent's native config. Non-destructive. Your own entries are preserved.

4

Content

Plain files and directories copied where agents expect them: instructions, rules, commands, hooks, and settings.

5

Sync hooks

Local commands run before and after sync, with planned resource lists exposed in the environment.

Project vs global

Scope skills per-project (versioned alongside your code) or globally for your user (~/.<agent>/skills/). gaal itself reads config from three merged scopes (system, user, and the current project), so team defaults don't fight per-project overrides.

Run gaal sync. gaal figures out what each agent needs and writes it to the right place: CLAUDE.md and .claude/skills/ for Claude Code, .cursor/rules/ for Cursor, AGENTS.md for Codex, the right config file for MCPs. Commit gaal.yaml to a dotfiles repo. On your next machine, gaal sync makes it identical.

Import

Already using coding agents? gaal imports your setup in one command.

You don't start from a blank YAML. The first time you run gaal init --import-all, gaal scans every coding agent on your machine, collects the skills and MCP servers you've already configured, and writes them to gaal.yaml. Your existing setup becomes one file, version-controlled, ready to sync.

    1

    Install gaal

    Single Go binary. curl | sh. No dependencies, no account, no server.

    2

    Run gaal init --import-all

    gaal auto-detects every installed agent and imports each skill and MCP server it finds.

    3

    Commit gaal.yaml

    Review the generated file, tweak scopes if you want, drop it in your dotfiles repo. That's it.

gaal init
$ gaal init --import-all
Scanning installed agents...

Detected: Claude Code, Cursor, Codex
 8 skills imported from Claude Code
 4 skills imported from Cursor
 4 MCP servers imported

✓ gaal.yaml generated (47 lines, 12 skills, 4 MCPs)

Every agent keeps its current behavior. gaal gives you one source of truth without churn.

Install

New in v0.3.0

Sync more than skills and MCPs with one YAML.

v0.3.0 adds generic content sync, skill subdirectories, native HTTP MCP headers, sync hooks, and stricter repository safety checks. The surface is still one file and one command: edit gaal.yaml, then run gaal sync.

From GitHub

source: obra/superpowers

Skills still come from GitHub shorthand, full URLs, SSH paths, or local directories.

Content sync

content: ./agent-files

Copy AGENTS.md, rules, commands, hooks, and settings into each agent's expected path.

Sync hooks

hooks: post-sync

Run local commands around sync with planned resources exposed in the environment.

Repository sync is stricter too: gaal now refuses non-empty clone destinations and reports remote URL mismatches instead of guessing.

Coverage

20 coding agents. Auto-detected.

gaal discovers installed agents automatically. Use agents: ["*"] and you're done. Register custom agents by pointing gaal at their skill and MCP paths.

  • Claude Code
  • Cursor
  • Codex
  • GitHub Copilot
  • Augment
  • Amp
  • Antigravity
  • Cline
  • Roo
  • Continue
  • Gemini CLI
  • Goose
  • Kilo
  • Kiro CLI
  • OpenCode
  • OpenHands
  • Trae
  • Warp
  • Windsurf
  • Zencoder
1

Repositories

Clone and update local code repos. Git, Mercurial, SVN, Bazaar, tar, zip.

2

Skills

Install SKILL.md collections per-project or globally. Stay current automatically.

3

MCP servers

Upsert entries into each agent's native config. Non-destructive. Your own entries are preserved.

4

Content

Copy instruction files, rules, commands, and settings into workspace or agent roots.

5

Hooks

Run local commands before and after sync without putting shell logic inside gaal.

Why trust it

  • Open source

    AGPL-3.0. Code on GitHub. Fork it, patch it, send a PR.

  • Zero telemetry

    Off by default. Opt-in is user-scope only.

  • Single binary

    Go. No runtime deps. No account. No server.

  • 20+ agents

    Auto-detected. Extensible via ~/.config/gaal/agents.yaml.

  • Works everywhere

    macOS · Linux · Windows.

Ready

Install gaal. Star the repo.

curl -fsSL https://raw.githubusercontent.com/getgaal/gaal/main/scripts/install.sh | sh
Star on GitHub

Community Edition

Working on a team? Team sync is next.

Today gaal syncs from a local YAML you commit to your dotfiles. gaal Community Edition adds a server. Point the same gaal CLI at a shared instance and every teammate syncs from the same source. Same binary, same YAML; a server instead of a git repo.

No spam. One email when Community Edition ships. One update per month at most.