[FEATURE] Add Goose as a consumer target for APM packages
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 3.8k
- Forks
- 362
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 132
Description
Is your feature request related to a problem? Please describe.
Goose is a commonly used harness. A user who wants to consume an APM package in Goose currently has to wire some primitives by hand:
- MCP servers (the main gap): Goose calls MCP servers "extensions" and stores them only in a single home config,
~/.config/goose/config.yaml, in YAML, using a Goose-native per-server schema (type: stdio/cmd/args/envs/timeout; remote servers usetype: streamable_http+uri). No existing APM adapter writes this format, somcp:dependencies from an APM package must be transcribed intoconfig.yamlmanually. - Agents: there is no goose-specific destination for the APM
agentsprimitive today. - Instructions and skills are largely covered already: Goose reads
AGENTS.mdnatively (context files are.goosehintsandAGENTS.mdby default), and it reads the cross-tool.agents/skills/standard, which the existingagent-skillstarget deploys. A goose target should reuse these rather than duplicate them.
Describe the solution you'd like
Add goose as a consumer target behind the existing experimental-flag lifecycle (apm experimental enable goose), matching how other frontier targets ship (hermes, openclaw, copilot-app): never auto-detected, excluded from --target all, inert until enabled.
Proposed surface mapping, with open design questions flagged:
| APM primitive | Proposed Goose surface | Notes |
|---|---|---|
| MCP servers | extensions: block of ~/.config/goose/config.yaml (honouring $XDG_CONFIG_HOME) |
Merge into the existing block, preserve all other top-level keys, write atomically with 0o600 (file carries credentials), and refuse — never clobber — a malformed existing file. |
| instructions | AGENTS.md |
Goose already reads AGENTS.md natively. Open question: is any goose-specific output (e.g. a .goosehints stub) needed, or is AGENTS.md alone sufficient? |
| skills | .agents/skills/<name>/SKILL.md |
Reuse the existing agent-skills behavior rather than duplicating a second skills path. |
| agents | Open question — see below. |
Agents mapping — open design question for maintainers:
- Option A: Goose's own agent/subagent surface (agents invocable through delegation). This is the closest primitive-to-primitive match for an always-available, described agent.
- Option B: Goose recipes at
.goose/recipes/<name>.yaml, run viagoose run --recipe. Recipes are parameterized, prompt-driven workflows; they resemble workflows/skills more than agents, so this fit is debatable and worth maintainer direction.
Success criteria:
apm install --target goose --globalwritesmcp:dependencies into theextensions:block without clobbering an existingconfig.yaml.- Instruction and skill primitives reach Goose through the surfaces it already reads (
AGENTS.md,.agents/skills/), without redundant copies. - The target stays inert and invisible until the experimental flag is enabled.
Describe alternatives you've considered
- Status quo: hand-transcribing MCP servers into
~/.config/goose/config.yamlwhenever an APM package declares them. - Relying only on the existing
agent-skillstarget plusAGENTS.md, leaving MCP — the one truly Goose-specific surface — unmanaged. - Mapping APM agents to recipes (as the draft implementation in #1833 does): recipes are headless-runnable and parameterizable, but as workflows they may be the wrong analogue for the
agentsprimitive; maintainer guidance on the right surface is requested before settling this. - Not adding a target at all, on the theory that the cross-tool standards partially cover Goose; this leaves the YAML
extensions:config as a permanent manual step.
Additional context
- An implementation exists in #1833 ("feat(goose): add experimental Goose (Block) harness"), which was closed for inactivity without a backing issue; this issue provides that backing. It chose Option B (recipes) and additionally emitted a
.goosehintsstub — both points worth revisiting per the open questions above. I'm happy to help with design, implementation, and testing, e.g. rebasing/reopening #1833 against this issue and adjusting the mapping. - That PR also fixes a pre-existing crash where
apm install --target <experimental-target>aborted whenever the package declared anmcp:dependency, and adds Goose to the MCP runtime-discovery list. - References: Goose docs at https://goose-docs.ai; experimental-flag lifecycle in CONTRIBUTING.md.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with CONTRIBUTING.md's experimental-feature-flag lifecycle and inspect the closed implementation in #1833. Review Goose's configuration documentation, then exercise apm install --target goose --global with existing MCP settings. Done means the maintainer-approved agent mapping works, existing configuration is preserved safely, shared instruction and skill surfaces are reused, and the target remains inert until enabled.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python, yaml
- Domain
- cli, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100