Skip to main content
A repository in gaal is any external source, Git remote, Mercurial repo, tarball, zip, that you want present at a known path inside your workspace. gaal owns the contents at that path.

Why repositories live in gaal.yaml

Most coding agents work inside a project, not a single file. Skills and MCP servers often come from repositories you’d otherwise clone by hand. By declaring repos in gaal.yaml you get:
  • Reproducibility, the same gaal sync produces the same checked-out tree on every machine.
  • Pinning, every entry can pin to a tag, branch, or commit.
  • Multi-protocol, Git is the common case, but tar and zip work for releases that aren’t on a forge.

Supported types

Shape

The map key is the destination path, relative to the workspace root (or absolute if you really mean it).

Examples

gaal.yaml

Behaviour during sync

  • First sync, the repo is cloned (or extracted) into the configured path.
  • Subsequent syncs, git fetch + checkout for VCS types; re-download + re-extract for archive types when the URL or version changes.
  • --dry-run prints + clone, ~ update, or = unchanged for every entry.
  • --prune does not delete repository directories. Removing a repo from gaal.yaml simply leaves it on disk; remove it manually if you don’t want it.
gaal owns the contents of each repository directory it manages. Local edits inside a managed path are at risk of being overwritten on the next sync. Treat managed paths as read-only checkouts.

Authentication

Authentication is delegated to the underlying VCS:
  • HTTPS Git, credentials come from your ~/.netrc or your Git credential helper.
  • SSH Git, your SSH agent and ~/.ssh/config are used as-is.
  • Hg/SVN/Bzr, same as if you ran hg clone, svn checkout, or bzr branch yourself.
  • tar/zip, gaal sends a plain GET. Use a pre-signed URL or a ~/.netrc entry for the host.
gaal never stores credentials.

Configure repositories

Pinning versions

Schema: repositories

gaal sync