Goose (goose)
Set up this tool
Block Goose reads the root AGENTS.md and a .goosehints file. Goose is opt-in. See Selecting targets.
First rule
Select goose in agnostic-ai.yaml, then follow First rule to add the shared commit-prefix rule and sync it. With the default paths, it reaches AGENTS.md.
Project MCP specs have no output for Goose. Configure servers in Goose itself.
For existing files, check what import goose reads before syncing.
Verify
Run agnostic-ai sync --check and inspect AGENTS.md for the commit-prefix rule. Launch goose from the project and ask for a commit subject for a small fix; it should use fix:.
Next, add a skill.
Output
AGENTS.md # entry-point pointer body + inlined rules (shared path)
.agents/agents/<name>.md # one project agent (shared with OpenHands)
.agents/skills/<name>/SKILL.md # one folder per skill (shared tree)
.agents/plugins/agnostic-ai/plugin.json # plugin manifest, whenever a component lands in the plugin
.agents/plugins/agnostic-ai/hooks/hooks.json
.agents/plugins/agnostic-ai/skills/<name>/SKILL.md # only with skills-dir pointed at the plugin
.goosehints # opt-in concatenated rules, only when rules-file is set
.agents/REVIEW.md # root review instructions
<scope>/.agents/REVIEW.md # directory-specific review instructions
Native mappings
Field mappings, discovery, and compatibility
- Rules: are included in the
## Rulesblock ofAGENTS.md.outputs.goose.rules-file: .goosehintsalso writes all rules into one.goosehints, which Goose reads only with theDeveloperextension enabled (using goosehints). - Scoped rules: Goose reads context files (
CONTEXT_FILE_NAMES, defaultAGENTS.mdand.goosehints) in the subdirectories it works in. Scoped rules go to a nestedAGENTS.md, or withrules-fileset, tobackend/.goosehintsfor abackend/scope. Rules with the same scope share one file. - Agents: each file has
name,description, an optional free-formmodel, and the prompt body. OpenHands reads the same path and fields, so the file is written once. A generictoolslist is dropped with a sync note, because Goose does not document it.x-goosefields work. If they make the file differ from what another tool gets, set a differentoutputs.goose.agents-dir. - Skills:
.agents/skills/is Goose's recommended path, read ahead of.goose/skills/and.claude/skills/. The other.agents/skills/tools, including Crush, get the same files, so the shared folder is written once. Shared rendering drops Crush invocation fields; separate itsskills-dirto retain them.- Goose documents no field that keeps a skill user-only: it lists every skill for the model, and
/<skill-name>loads one by hand (using skills). Sodisable-model-invocationis dropped with a note, and commands are skipped.
- Goose documents no field that keeps a skill user-only: it lists every skill for the model, and
- Hooks: an Open Plugins package (
.agents/plugins/agnostic-ai/plugin.jsonplushooks/hooks.json). All 12 documented events are supported.matcheris a regular expression.timeoutis in seconds (default 30).x-goose.on_failuretakesalloworblockforPreToolUsefailures.agnostic-ai hook runtests these hooks before a session, using Goose's event data, shell, and timeout. - Plugin skills: set
outputs.goose.skills-dir: .agents/plugins/<name>/skillsto bundle skills as a plugin (plugins), with or without hooks. Skills and hooks share one manifest. Goose prefixes names with the plugin name, soreviewinagnostic-ailoads asagnostic-ai:review. - Reviews:
goose reviewreads.agents/REVIEW.mdand<scope>/.agents/REVIEW.mdfrom every directory with changed files and every parent directory, so root and scoped guidance combine (v1.50.0 CLI reference). Specs with the same scope are joined into one file, without frontmatter, because Goose reads plain text. Agent-style check files are not written. - MCP: skipped with a warning.
Skills dir outside skills/
A skills directory inside a plugin folder but outside its skills/ folder is not a Goose component and gets no manifest.
Sync keeps an existing plugin.json it did not write and prints a note. Manifests recorded by an earlier sync remain managed.
Config keys
| Key | Default | Notes |
|---|---|---|
outputs.goose.agents-dir | .agents/agents | |
outputs.goose.rules-file | unset | opt-in, writes all rules into one .goosehints file |
outputs.goose.skills-dir | .agents/skills | point it at .agents/plugins/<name>/skills to bundle skills as a plugin; the manifest follows |
outputs.goose.hooks-file | .agents/plugins/agnostic-ai/hooks/hooks.json | overrides must keep the <plugin>/hooks/hooks.json suffix |
outputs.goose.review-file | .agents/REVIEW.md | relative to each scope |
Import
agnostic-ai import goose reads the Goose files back into specs. Rules come from the inline block in AGENTS.md:
| Source | Becomes |
|---|---|
AGENTS.md embedded ## Rules block (### <name> children) | <rules>/<name>.md per rule |
.goosehints | the same, read only when AGENTS.md carried no rules |
.agents/agents/<name>.md | <agents>/<name>.md, unchanged except for the generated-file header |
.agents/skills/<name>/SKILL.md (+ bundled files) | <skills>/<name>/SKILL.md (folder copied unchanged) |
.agents/plugins/<name>/skills/<skill>/SKILL.md | the same, for every plugin in the project |
.agents/plugins/<name>/hooks/hooks.json | one hook spec per matcher group, on_failure under x-goose |
.agents/REVIEW.md | <reviews>/review.md |
AGENTS.md | .agnostic-ai/AGNOSTIC_AI.md |
.goosehints is a fallback. With rules-file set, both files hold the same rules.
Import reads every plugin, including hand-installed ones.
agnostic-ai import all detects Goose only from .goosehints, .agents/REVIEW.md, or a plugin with hooks/hooks.json under .agents/plugins/. Antigravity plugins share .agents/plugins/, and OpenHands, Antigravity, and others share .agents/agents/ and .agents/skills/, so those alone do not count. For a Goose project with only rules or plugin skills, run agnostic-ai import goose directly.
Import loses the following, but the next sync still writes the same Goose files:
- Only the rules block in the root file is read back, as with
import claudeand nestedCLAUDE.mdfiles. - Review specs with the same scope come back as one spec.
- Scoped
<scope>/.agents/REVIEW.mdfiles are not read back.
See scoped context.
Protected paths
Not enforced. This target takes no settings specs, so sync reports a spec with a protected block as unsupported. See protected-path alternatives.