Type to search the docs and updates.

Browse documentation

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 ## Rules block of AGENTS.md. outputs.goose.rules-file: .goosehints also writes all rules into one .goosehints, which Goose reads only with the Developer extension enabled (using goosehints).
  • Scoped rules: Goose reads context files (CONTEXT_FILE_NAMES, default AGENTS.md and .goosehints) in the subdirectories it works in. Scoped rules go to a nested AGENTS.md, or with rules-file set, to backend/.goosehints for a backend/ scope. Rules with the same scope share one file.
  • Agents: each file has name, description, an optional free-form model, and the prompt body. OpenHands reads the same path and fields, so the file is written once. A generic tools list is dropped with a sync note, because Goose does not document it. x-goose fields work. If they make the file differ from what another tool gets, set a different outputs.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 its skills-dir to 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). So disable-model-invocation is dropped with a note, and commands are skipped.
  • Hooks: an Open Plugins package (.agents/plugins/agnostic-ai/plugin.json plus hooks/hooks.json). All 12 documented events are supported. matcher is a regular expression. timeout is in seconds (default 30). x-goose.on_failure takes allow or block for PreToolUse failures. agnostic-ai hook run tests these hooks before a session, using Goose's event data, shell, and timeout.
  • Plugin skills: set outputs.goose.skills-dir: .agents/plugins/<name>/skills to bundle skills as a plugin (plugins), with or without hooks. Skills and hooks share one manifest. Goose prefixes names with the plugin name, so review in agnostic-ai loads as agnostic-ai:review.
  • Reviews: goose review reads .agents/REVIEW.md and <scope>/.agents/REVIEW.md from 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

KeyDefaultNotes
outputs.goose.agents-dir.agents/agents
outputs.goose.rules-fileunsetopt-in, writes all rules into one .goosehints file
outputs.goose.skills-dir.agents/skillspoint 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.jsonoverrides must keep the <plugin>/hooks/hooks.json suffix
outputs.goose.review-file.agents/REVIEW.mdrelative to each scope

Import

agnostic-ai import goose reads the Goose files back into specs. Rules come from the inline block in AGENTS.md:

SourceBecomes
AGENTS.md embedded ## Rules block (### <name> children)<rules>/<name>.md per rule
.goosehintsthe 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.mdthe same, for every plugin in the project
.agents/plugins/<name>/hooks/hooks.jsonone 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 claude and nested CLAUDE.md files.
  • Review specs with the same scope come back as one spec.
  • Scoped <scope>/.agents/REVIEW.md files 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.