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 ingaal.yaml you get:
- Reproducibility, the same
gaal syncproduces 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
tarandzipwork for releases that aren’t on a forge.
Supported types
| Type | Backend | Pin via version: |
|---|---|---|
git | pure-Go (no system git required) | branch, tag, commit |
hg | system hg binary | revision |
svn | system svn binary | revision number |
bzr | system bzr binary | revision |
tar | downloaded archive, extracted in place | strip-prefix string |
zip | downloaded archive, extracted in place | strip-prefix string |
Shape
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-runprints+ clone,~ update, or= unchangedfor every entry.--prunedoes not delete repository directories. Removing a repo fromgaal.yamlsimply leaves it on disk; remove it manually if you don’t want it.
Authentication
Authentication is delegated to the underlying VCS:- HTTPS Git, credentials come from your
~/.netrcor your Git credential helper. - SSH Git, your SSH agent and
~/.ssh/configare used as-is. - Hg/SVN/Bzr, same as if you ran
hg clone,svn checkout, orbzr branchyourself. - tar/zip, gaal sends a plain
GET. Use a pre-signed URL or a~/.netrcentry for the host.