You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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/goose → full_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.
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
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.
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.
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.
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.
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 manifest — plugin.json is not required for discovery: crates/goose/src/plugins/discovery.rsdiscover_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.yamlextensions: (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 .gooseignorecode 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.
Summary
Goose has three surfaces rulesync has not followed: the
goose reviewchecks 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/goosenow redirects toaaif-goose/goose(gh api repos/block/goose→full_name: aaif-goose/goose), and the canonical docs host is nowhttps://goose-docs.ai(GOOSE_DOCS_ROOTdefault indocumentation/docs/guides/config-files.md);https://block.github.io/goose/docs/still serves the same content.Recent Releases
working_dir; hooks docs formalize the deny contract / matcher regex /tool_inputkeys; stale.gooseignorereferences removed from docs (#10359);goose reviewsecurity fix (GHSA-r5pp-p5r8-466r).~/.agents/AGENTS.md(already followed, Follow up Goose upstream updates: global hints from ~/.agents/AGENTS.md (v1.41.0) #2207)..agents/plugins/<name>/.mcp.json(already followed, Follow up Goose upstream updates: project-scoped MCP via open plugins (.agents/plugins/<name>/.mcp.json, v1.39.0) #2078).~/.agents/plugins(#9088).goose reviewlocal code-review command first released (PR #9114, merged 2026-05-18).Gaps
1. checks —
goose reviewwith.agents/checks/*.mdis unsupportedgoose reviewruns per-check review subagents discovered from Markdown check files. Source of truth iscrates/goose/src/checks/mod.rs, whose module doc reads "Discovery and parsing for review checks (.agents/checks/*.mdand**/.agents/REVIEW.md)". PR #9114 (merged 2026-05-18), first released in v1.35.0 (2026-05-22).discover_with_globals):<repo>/.agents/checks/*.md(strict —namemust equal the file stem), nested<scope>/.agents/checks/*.mdfor touched dirs, plus<repo>/.agents/REVIEW.mdand nestedREVIEW.mdsynthesized into virtualrepo-rules[:scope]checks.README.mdis skipped.global_checks_dirs()):~/.config/goose/checks/then~/.config/agents/checks/(lenient parsing).CheckFrontmatter):name,description,model,turn-limit,tools,severity-default. The source comments state thattoolsandseverity-defaultexist "for parity with Amp's" fields and that.agents/checks/*.mdis explicitly the shared cross-tool location.unsupported.pnpm run dev generate --targets goose --features "*" --global --dry-runprintsTarget 'goose' does not support the feature 'checks'. Skipping.Onlysrc/features/checks/amp-check.tsandsrc/features/checks/hermesagent-check.tsexist; there is nogoose-check.ts.goose review/ checks yet — the merged PR and the crate source are the primary sources.2. ignore —
.gooseignorehas been retired upstream, rulesync still emits it.gooseignoreno longer exists in Goose.documentation/docs/guides/using-gooseignore.mdand 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).gh api repos/aaif-goose/goose/git/trees/main?recursive=1has nogooseignorepath, and a code search forgooseignorereturns nothing..gitignoreplus tool permissions; there is no new Goose-specific ignore file.project, writing.gooseignoreat the project root (src/features/ignore/goose-ignore.ts,GOOSE_IGNORE_FILE_NAMEinsrc/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.gooseignorehandling that is now moot.3. subagents — custom agents (
.agents/agents/*.md) are not emitted; rulesync writes inert sub-recipescrates/goose/src/sources.rs(agent_base_dir) andcrates/goose/src/agents/platform_extensions/summon.rs(discover_filesystem_sources).<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.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.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 relativepath; rulesync emits no parent recipe, anddiscover_filesystem_sourcesscans.goose/recipes/.agents/recipes(not thesubagents/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.tswrites.agents/subagents/, a different directory from.agents/agents/.4. skills — goose-specific global skills dir not covered (low priority, needs a decision)
crates/goose/src/skills/mod.rsdiscovery 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.projectonly.GOOSE_SKILLS_DIR_PATH = .goose/skills(src/constants/goose-paths.ts), and the global dry-run printsTarget '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 theagentsskillstarget — which is reasonable, but the goose-specific~/.config/goose/skills/is not covered byagentsskills(that target owns.agents/skills).Proposed Follow-up
GooseCheckadapter emitting.agents/checks/<name>.md(project) and~/.config/goose/checks/<name>.md(global), registered inchecks-processor.ts. The frontmatter is a superset of Amp's (name,description,severity-default,tools) plusmodelandturn-limit, soAmpCheckis the closest template.namemust match the file stem for project-scope checks or Goose errors out.REVIEW.mdis auto-derived by Goose and needs no rulesync surface.ignorefrom the goose target'sgetToolTargets(the matrix cell becomes blank), removeGooseIgnore/GOOSE_IGNORE_FILE_NAME, and drop the.gooseignoregitignore entry derived fromgetSettablePaths. 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..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, optionalmodel.--global --targets gooseshould be self-contained for skills; if so, add~/.config/goose/skills/<name>/SKILL.mdas the global settable path. Flagged for a decision rather than asserted as a required change.Checked and NOT a gap
.goosehints(project +~/.config/goose/.goosehintsglobal),AGENTS.md, nested hints, and~/.agents/AGENTS.mdglobal hints (v1.41.0) are all already followed (Follow up Goose upstream updates:AGENTS.mdcontext file and global.gooseignore#1691, Follow up Goose upstream updates: global hints from ~/.agents/AGENTS.md (v1.41.0) #2207).SessionStart,SessionEnd,Stop,UserPromptSubmit,PreToolUse,PostToolUse,PostToolUseFailure,BeforeReadFile,AfterFileEdit,BeforeShellExecution,AfterShellExecution) matchGOOSE_HOOK_EVENTS(src/types/hooks.ts) exactly, including theSubagentStart/SubagentStopexclusion (Follow up Goose upstream updates: hooks emit unsupported SubagentStart/SubagentStop events (and global .gooseignore) #2149). v1.44.0's Stop-hookworking_diris a runtime payload field, not a config surface.plugin.jsonis not required for discovery:crates/goose/src/plugins/discovery.rsdiscover_enabled_pluginsenumerates<project>/.agents/plugins/*and~/.agents/plugins/*directly; the manifest is only used bygoose plugin install. rulesync's manifest-less.agents/plugins/rulesync/tree is fine.config.yamlextensions:(stdio / streamable_http / sse / builtin,uri/headers/envs/timeout) and project open-plugin.agents/plugins/rulesync/.mcp.jsonare both handled.available_tools,bundledanddisplay_nameare dropped on import but have no canonical rulesync equivalent..goose/recipes/(project) and~/.config/goose/recipes/(global) are still the discovery paths. Theslash_commands:config.yaml key requires an absoluterecipe_pathper command and is unchanged; plugincommands/dirs are install-detection markers only.crates/goose/src/config/permission.rsbuildsPermissionManager::new(Paths::config_dir())→~/.config/goose/permission.yaml. No project scope added.disabledPlugins/ projectsettings.json— an enable/disable switch for plugins, not a rulesync feature surface.Open questions / unconfirmed
.gooseignorecode 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
.gooseignoredocs and hardenedgoose review(gaps 1–2).goose reviewlocal code review command aaif-goose/goose#9114 — thegoose review/ checks PR, first released in v1.35.0 (gap 1)..gooseignorereference (gap 2)..gooseignorewas removed (gap 2).~/.config/goose/skills/(gap 4).