Skip to content

Follow up Goose upstream updates: goose review checks surface, retired .gooseignore, custom agents (.agents/agents/*.md) #2404

Description

@dyoshikawa

Summary

Goose has three surfaces rulesync has not followed: the goose review checks surface (.agents/checks/*.md, shipped v1.35.0, 2026-05-22), the first-class Markdown custom-agent format (.agents/agents/*.md, shipped v1.34.0, 2026-05-13) that rulesync's recipe-YAML subagent mapping does not reach, and .gooseignore, which upstream has retired but rulesync still generates.

Note on sources: block/goose now redirects to aaif-goose/goose (gh api repos/block/goosefull_name: aaif-goose/goose), and the canonical docs host is now https://goose-docs.ai (GOOSE_DOCS_ROOT default in documentation/docs/guides/config-files.md); https://block.github.io/goose/docs/ still serves the same content.

Recent Releases

Gaps

1. checks — goose review with .agents/checks/*.md is unsupported

  • Upstream: goose review runs per-check review subagents discovered from Markdown check files. Source of truth is crates/goose/src/checks/mod.rs, whose module doc reads "Discovery and parsing for review checks (.agents/checks/*.md and **/.agents/REVIEW.md)". PR #9114 (merged 2026-05-18), first released in v1.35.0 (2026-05-22).
    • Project discovery (discover_with_globals): <repo>/.agents/checks/*.md (strict — name must equal the file stem), nested <scope>/.agents/checks/*.md for touched dirs, plus <repo>/.agents/REVIEW.md and nested REVIEW.md synthesized into virtual repo-rules[:scope] checks. README.md is skipped.
    • Global discovery (global_checks_dirs()): ~/.config/goose/checks/ then ~/.config/agents/checks/ (lenient parsing).
    • Frontmatter (CheckFrontmatter): name, description, model, turn-limit, tools, severity-default. The source comments state that tools and severity-default exist "for parity with Amp's" fields and that .agents/checks/*.md is explicitly the shared cross-tool location.
  • rulesync: unsupported. pnpm run dev generate --targets goose --features "*" --global --dry-run prints Target 'goose' does not support the feature 'checks'. Skipping. Only src/features/checks/amp-check.ts and src/features/checks/hermesagent-check.ts exist; there is no goose-check.ts.
  • Note: there is no docs page for goose review / checks yet — the merged PR and the crate source are the primary sources.

2. ignore — .gooseignore has been retired upstream, rulesync still emits it

  • Upstream: .gooseignore no longer exists in Goose.
    • The docs page documentation/docs/guides/using-gooseignore.md and every reference to it were deleted by PR #10359 ("docs: remove stale gooseignore references", merged 2026-07-15, shipped v1.44.0 on 2026-07-23).
    • That PR closes issue #10343 ("Has the .gooseignore feature been removed?"), where the maintainer confirms on 2026-07-09: "yeah it was removed some time ago in favour of other ignore things like gitignore etc".
    • The permissions doc diff in that PR removed the ".gooseignore files restrict which files and directories goose can access" bullet, leaving tool permissions as the only file-access control.
    • Confirmed absent from the current tree: gh api repos/aaif-goose/goose/git/trees/main?recursive=1 has no gooseignore path, and a code search for gooseignore returns nothing.
    • The replacement guidance is .gitignore plus tool permissions; there is no new Goose-specific ignore file.
  • rulesync: project, writing .gooseignore at the project root (src/features/ignore/goose-ignore.ts, GOOSE_IGNORE_FILE_NAME in src/constants/goose-paths.ts). The dry-run confirms [DRY RUN] Would write: /workspace/.gooseignore. The class doc still describes "Default protection (when no .gooseignore)" and "Global patterns first, then local patterns", which no longer matches upstream. Follow up Goose upstream updates: hooks emit unsupported SubagentStart/SubagentStop events (and global .gooseignore) #2149 previously added global .gooseignore handling that is now moot.

3. subagents — custom agents (.agents/agents/*.md) are not emitted; rulesync writes inert sub-recipes

  • Upstream: Goose has a first-class Markdown custom-agent surface. Docs: custom agents guide, added by PR #9293 (merged 2026-06-22, in v1.39.0+). Filesystem discovery landed with PR #9084 ("Agents crud", merged 2026-05-11, v1.34.0 on 2026-05-13), implemented in crates/goose/src/sources.rs (agent_base_dir) and crates/goose/src/agents/platform_extensions/summon.rs (discover_filesystem_sources).
    • Project dirs: <project>/.agents/agents/, <project>/.goose/agents/, <project>/.claude/agents/. Global dirs: ~/.agents/agents/, ~/.goose/agents/, ~/.config/goose/agents/, ~/.claude/agents/. Docs recommend .agents/agents/ (project) and ~/.agents/agents/ (global); the rest are compatibility paths.
    • Format: Markdown with YAML frontmatter — name (required), description (optional), model (optional); the body is the agent instructions. Agents are invocable via @name, "delegate to <name>", or loaded into the current conversation.
  • rulesync: project + global, but it maps a subagent to a recipe YAML under .goose/recipes/subagents/<name>.yaml / ~/.config/goose/recipes/subagents/<name>.yaml (src/features/subagents/goose-subagent.ts, src/constants/goose-paths.ts). Per the constant's own comment these are sub-recipes intended to be referenced from a parent recipe via a relative path; rulesync emits no parent recipe, and discover_filesystem_sources scans .goose/recipes / .agents/recipes (not the subagents/ subdirectory), so the generated files are not reachable as agents or sources on their own. No rulesync target writes .goose/agents/ or ~/.config/goose/agents/; agentsmd-subagent.ts writes .agents/subagents/, a different directory from .agents/agents/.

4. skills — goose-specific global skills dir not covered (low priority, needs a decision)

  • Upstream: crates/goose/src/skills/mod.rs discovery roots are project <wd>/.agents/skills, <wd>/.goose/skills, <wd>/.claude/skills; global ~/.agents/skills, Paths::config_dir()/skills (i.e. ~/.config/goose/skills/), ~/.claude/skills, ~/.config/agents/skills. Docs: using skills.
  • rulesync: project only. GOOSE_SKILLS_DIR_PATH = .goose/skills (src/constants/goose-paths.ts), and the global dry-run prints Target 'goose' supports the feature 'skills' only in project scope. Re-run without '--global'. Skipping. The constant's comment justifies project-only on the grounds that the recommended portable global location ~/.agents/skills/ is already served by the agentsskills target — which is reasonable, but the goose-specific ~/.config/goose/skills/ is not covered by agentsskills (that target owns .agents/skills).

Proposed Follow-up

  1. Add a GooseCheck adapter emitting .agents/checks/<name>.md (project) and ~/.config/goose/checks/<name>.md (global), registered in checks-processor.ts. The frontmatter is a superset of Amp's (name, description, severity-default, tools) plus model and turn-limit, so AmpCheck is the closest template. name must match the file stem for project-scope checks or Goose errors out. REVIEW.md is auto-derived by Goose and needs no rulesync surface.
  2. Drop ignore from the goose target's getToolTargets (the matrix cell becomes blank), remove GooseIgnore / GOOSE_IGNORE_FILE_NAME, and drop the .gooseignore gitignore entry derived from getSettablePaths. If a deprecation path is preferred, gate it behind a warning first — but generating a file Goose no longer reads gives users a false sense of protection over secrets, so removal is the safer end state.
  3. Switch (or add) the goose subagent surface to the custom-agent Markdown format — .goose/agents/<name>.md (project) and ~/.config/goose/agents/<name>.md (global), keeping the goose-specific compatibility paths so it does not collide with a future shared .agents/agents/ target. Frontmatter maps directly from rulesync subagents: name, description, optional model.
  4. Decide whether --global --targets goose should be self-contained for skills; if so, add ~/.config/goose/skills/<name>/SKILL.md as the global settable path. Flagged for a decision rather than asserted as a required change.

Checked and NOT a gap

  • rules.goosehints (project + ~/.config/goose/.goosehints global), AGENTS.md, nested hints, and ~/.agents/AGENTS.md global hints (v1.41.0) are all already followed (Follow up Goose upstream updates: AGENTS.md context file and global .gooseignore #1691, Follow up Goose upstream updates: global hints from ~/.agents/AGENTS.md (v1.41.0) #2207).
  • hooks — upstream events (SessionStart, SessionEnd, Stop, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, BeforeReadFile, AfterFileEdit, BeforeShellExecution, AfterShellExecution) match GOOSE_HOOK_EVENTS (src/types/hooks.ts) exactly, including the SubagentStart / SubagentStop exclusion (Follow up Goose upstream updates: hooks emit unsupported SubagentStart/SubagentStop events (and global .gooseignore) #2149). v1.44.0's Stop-hook working_dir is a runtime payload field, not a config surface.
  • plugin manifestplugin.json is not required for discovery: crates/goose/src/plugins/discovery.rs discover_enabled_plugins enumerates <project>/.agents/plugins/* and ~/.agents/plugins/* directly; the manifest is only used by goose plugin install. rulesync's manifest-less .agents/plugins/rulesync/ tree is fine.
  • mcp — global config.yaml extensions: (stdio / streamable_http / sse / builtin, uri / headers / envs / timeout) and project open-plugin .agents/plugins/rulesync/.mcp.json are both handled. available_tools, bundled and display_name are dropped on import but have no canonical rulesync equivalent.
  • commands — recipes at .goose/recipes/ (project) and ~/.config/goose/recipes/ (global) are still the discovery paths. The slash_commands: config.yaml key requires an absolute recipe_path per command and is unchanged; plugin commands/ dirs are install-detection markers only.
  • permissions — still global-only upstream: crates/goose/src/config/permission.rs builds PermissionManager::new(Paths::config_dir())~/.config/goose/permission.yaml. No project scope added.
  • disabledPlugins / project settings.json — an enable/disable switch for plugins, not a rulesync feature surface.

Open questions / unconfirmed

  • The exact Goose version in which the .gooseignore code was removed. The docs removal is v1.44.0 and the maintainer says "removed some time ago", but no single removal commit surfaced via commit search — it appears to have been dropped inside a larger developer-extension refactor. Its absence from the current tree and the maintainer's statement are solid; the version number is not.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    consideringenhancementNew feature or requestmaintainer-scrapRough notes for AI implementation. Not for human eyes.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions