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:
| Location | Meaning |
|---|---|
Top level of gaal.yaml | Tools required by the workspace as a whole. |
Inside a skills[] entry | Tools required specifically by that skill collection. |
name; a top-level entry wins over a per-skill entry with the same name. See Behaviour below.
Entry fields
name
| Field | Type | Required |
|---|---|---|
name | string | yes |
PATH. Uses Go’s exec.LookPath, so Windows .exe resolution is handled automatically.
hint
| Field | Type | Required |
|---|---|---|
hint | string | no |
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.