Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.getgaal.com/llms.txt

Use this file to discover all available pages before exploring further.

Reproducibility is one of the main reasons to use gaal in the first place. Pinning every external source to a specific revision turns “it worked on my machine” into “it worked on every machine.”

Pinning repositories

The version: field accepts the right pin format for each VCS type:
repositories:
  src/branch-pin:
    type: git
    url: https://github.com/example/proj.git
    version: main             # branch, moves with the remote

  src/tag-pin:
    type: git
    url: https://github.com/example/proj.git
    version: v2.1.0           # tag, immutable

  src/commit-pin:
    type: git
    url: https://github.com/example/proj.git
    version: a1b2c3d4e5f6789  # commit, immutable, fully reproducible

  src/svn-pin:
    type: svn
    url: https://svn.example.com/repos/proj/trunk
    version: "1234"           # SVN revision

  src/tar-pin:
    type: tar
    url: https://example.com/proj-2024.tar.gz
    version: proj-2024        # strip-prefix; effectively pins to the URL
For maximum reproducibility, prefer tags or commits over branch names.

Pinning skill sources

Skill sources don’t have a version: field, they always track the source’s default branch. Two ways to pin:

1. Mirror the source as a repository, then point at it locally

repositories:
  vendor/anthropics-skills:
    type: git
    url: https://github.com/anthropics/skills.git
    version: v1.4.0           # tag pin

skills:
  - source: ./vendor/anthropics-skills
    agents: ["*"]
    select: [frontend-design, skill-creator]
The skills now come from a pinned local directory, and the repository pin governs the version.

2. Use a tag-pinned tarball

repositories:
  vendor/skills-v140:
    type: tar
    url: https://github.com/anthropics/skills/archive/refs/tags/v1.4.0.tar.gz
    version: skills-1.4.0

skills:
  - source: ./vendor/skills-v140
    agents: ["*"]

Pinning MCP servers

MCP entries written inline: are pinned by definition, the command and arguments you wrote are exactly what runs:
mcps:
  - name: filesystem
    agents: [claude-code]
    global: true
    inline:
      command: npx
      args: ["-y", "@modelcontextprotocol/server-filesystem@1.4.0", "~/projects"]
For npx-launched servers, pin the package version in the args (@1.4.0). For uvx, use uvx package==1.4.0. For binaries, point at a specific path. When using source: to pull a remote MCP config, host the JSON yourself or pin to a tagged URL, never trust an HTTPS URL whose contents can change.

Reading current pins

$ gaal status
repositories
  src/gaal               git · main · clean
  src/anthropics-skills  git · v1.4.0 · clean
skills
  frontend-design        from src/anthropics-skills
mcps
  filesystem             ~/.claude.json
gaal status reports the actual revision present on disk.

Configure repositories

Configure skills

gaal status