Type
array[ToolEntry]
Required
No. Omittools: if you don’t depend on any external CLIs. When absent everywhere, gaal doctor renders no Tools section and gaal sync prints no banner.
Where it can appear
tools: is valid in two places:
Both forms accept the same schema. At check time, gaal unions the two lists and deduplicates by
name; a top-level entry wins over a per-skill entry with the same name. See Behaviour below.
Entry fields
name
The executable name to look up on
PATH. Uses Go’s exec.LookPath, so Windows .exe resolution is handled automatically.
hint
Free-form install instruction shown when the tool is missing. Typically a one-liner like
brew install tree-sitter or a URL. gaal does not parse or execute the hint; it’s displayed as-is.
Bare-string shorthand
A plain string is equivalent to an object with onlyname set:
Example
gaal.yaml
Behaviour
- Presence only. gaal runs
exec.LookPath(name)for each entry. No version parsing, no execution of the tool. - Dedup by name. Top-level and per-skill
tools:are unioned; the first occurrence wins. Top-level is collected before per-skill, so a workspace-level entry with a hint overrides a bare per-skill mention of the same name. - Merge across scopes.
tools:follows the standard config merge chain (system → user → workspace). A higher-priority scope replaces lower-priority entries with the samename. gaal doctor. Adds atools:section to the output. Found tools render✓ <name> (on PATH: <resolved>). Missing tools render! <name> — missing from PATH (required by: <source>; hint: <hint>)and bump the exit code to1(warning).gaal sync. Prints a compact one-time banner to stderr at the start of sync listing any missing tools, then proceeds normally. Exit code is unaffected; sync never blocks on missing tools.
Out of scope
The following are intentionally not supported today:- Version checks.
--versionparsing varies too much across tools. - Installation. gaal does not install tools.
hintis display-only. - Skill-repo-declared tools. Tools must be declared in your own
gaal.yaml; gaal does not read tool requirements from inside skill source repos.