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
compatible hooks -> a Kanon-managed Goose plugin under ~/.agents/plugins/kanon-hooks/ or <project>/.agents/plugins/kanon-hooks/
This should be a render-first adapter named goose. It should not try to manage Goose model/provider defaults, .gooseignore, prompt templates, memory, recipes, slash commands, subagents, or the enterprise extension allowlist in the first increment; those either overlap existing Kanon issues or require new neutral schema.
Why this is strategically valuable
Goose is a strong fit for Kanon because it is file-backed, MCP-native, local/desktop/CLI oriented, and intentionally used across coding plus broader automation workflows. It also bridges editor integrations through ACP, so managing Goose once can influence Goose CLI, Goose Desktop, and ACP clients such as Zed that launch Goose as an agent server.
This gives Kanon a different kind of growth path than another editor-specific adapter. Instead of only rendering settings for one IDE, Kanon could manage a local open-source agent runtime that already exposes providers, extensions, skills, hooks, sandboxing, recipes, and ACP integration.
Evidence from the current codebase
Kanon already has most primitives needed for a Goose MVP:
Config currently has only Instructions, Skills, MCP, Hooks, and Metadata; there is no Goose target or agent-specific extension section (internal/core/types.go:11-18).
The only agent constants are codex, claude, and all (internal/core/types.go:5-8).
adaptersFor dispatches only Codex and Claude; adding Goose requires a new adapter registration and the opt-in/default behavior guard already discussed in adapter-roadmap issues (internal/core/render.go:57-65).
MCPServer already stores the fields Goose extensions need for stdio and remote MCP servers: command, args, env, env_vars, url, timeout fields, and enabled tool filters (internal/core/types.go:66-83).
Hook already stores event, matcher, type, command, and timeout, which maps closely to Goose's Open Plugins hook JSON shape (internal/core/types.go:92-101).
renderSkills already copies complete SKILL.md directories into an adapter-provided target root (internal/core/render.go:88-180). Goose's recommended global/project skill roots are the same .agents/skills paths Kanon already uses for Codex, which makes the adapter low-lift but requires duplicate-path guardrails.
Current merge strategies cover Codex TOML and Claude JSON only (internal/core/merge.go:12-24). Goose config.yaml will need a YAML merge strategy that updates only extensions entries Kanon owns and preserves provider/model/general settings.
PlanFiles does not de-duplicate rendered files by destination path (internal/core/apply.go:42-84). Because Goose and Codex both use .agents/skills, a Goose adapter should either add a same-content de-duplication step or fail clearly on same-path different-content renders.
External signal
Official Goose docs make this a concrete, file-backed target:
Goose's primary config file is ~/.config/goose/config.yaml on macOS/Linux and stores provider/model/general settings plus extensions; it also has permission.yaml, secrets.yaml, prompt templates, and runtime permission files: https://goose-docs.ai/docs/guides/config-files/
Goose skills use the open Agent Skills folder format and are discovered from ~/.agents/skills/ and .agents/skills/; the docs also call out compatibility with Claude Desktop and other Agent Skills consumers: https://goose-docs.ai/docs/guides/context-engineering/using-skills/
Goose hooks follow the Open Plugins hook spec, are discovered from ~/.agents/plugins/<plugin-name>/ or <project>/.agents/plugins/<plugin-name>/, and use a hooks/hooks.json shape that matches Kanon's current hook fields closely: https://goose-docs.ai/docs/guides/context-engineering/hooks/
Goose supports extension allowlists for corporate environments, fetched via GOOSE_ALLOWLIST, which is a useful later integration surface for Kanon-managed MCP policy: https://goose-docs.ai/docs/guides/allowlist/
Goose can run as an ACP agent in clients such as Zed; the docs state ACP sessions use the same configured Goose extensions, so a Goose adapter indirectly improves ACP/editor workflows too: https://goose-docs.ai/docs/guides/acp-clients/
The Goose repository has moved to the Agentic AI Foundation and describes Goose as a desktop app, CLI, and API with 15+ providers and 70+ MCP extensions: https://github.com/aaif-goose/goose
Existing issue overlap check
I reviewed the open generated-by-kelos issues and searched existing issues for goose, ACP, and Zed.
No existing issue proposes a Goose render target. This is intentionally distinct from:
Manage model and provider defaults for agent sessions #59 model/provider defaults: Goose GOOSE_PROVIDER, GOOSE_MODEL, and planner model keys are real, but should be handled by the shared model-defaults feature instead of this adapter MVP.
Do not overwrite all of ~/.config/goose/config.yaml. Add FileMergeGooseConfig that merges only extensions entries named in Kanon and preserves provider, model, telemetry, search paths, slash commands, and other Goose-managed settings.
Do not write secrets into Goose config. Map Kanon env_vars to Goose env_keys where possible; only map env to envs when the Kanon source already deliberately contains an env ref or non-secret literal. Preserve existing secret warnings from import/validation.
For remote MCP servers, confirm Goose's current type: http / url shape before implementation. If uncertainty remains, render stdio extensions first and fail clearly for remote Goose targets.
For enabled_tools, map to Goose available_tools. For disabled_tools, either fail for Goose targets or wait for a confirmed native deny-list equivalent; do not silently drop it.
For timeout fields, map startup_timeout_sec first. If both startup/tool timeouts differ, fail or warn because Goose appears to have a single extension timeout field.
For hooks, generate a dedicated plugin manifest and hooks/hooks.json. Accept Goose-supported events only: SessionStart, SessionEnd, Stop, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, BeforeReadFile, AfterFileEdit, BeforeShellExecution, AfterShellExecution.
For hooks, accept only type: command or empty type. Fail on args and async because Goose's hook schema runs shell commands and does not document those fields.
Add duplicate render-path handling before or inside the adapter because Goose and Codex intentionally share .agents/skills. Identical content can be de-duplicated; different content should fail with both agent names and the path.
Defer import until render behavior settles. Goose config contains provider credentials/settings, secrets, and runtime permission decisions that need careful import policy.
Suggested MVP scope
Add AgentGoose and target validation for goose, gated by the adapter opt-in mechanism.
Implement gooseAdapter.Render for hints, skills, stdio MCP extensions, and compatible hook plugins.
Add FileMergeGooseConfig to preserve unmanaged config.yaml keys while updating Kanon-owned extensions entries.
Add same-path duplicate detection/de-duplication for rendered files, at minimum for identical .agents/skills output shared with Codex.
Open-source local agent fleets: teams using Goose CLI/Desktop can share the same Kanon repo that already feeds Codex and Claude.
MCP-heavy workflows: Kanon can centrally roll out GitHub, Sentry, internal docs, and database MCP extensions into Goose without hand-editing YAML on every machine.
ACP/editor workflows: users running Goose through Zed or other ACP clients inherit the same Goose extensions and skills.
Mixed-agent teams: shared .agents/skills becomes an intentional cross-agent artifact rather than an accidental Codex-only side effect.
Corporate Goose deployments: later, Kanon can generate extension allowlist artifacts from the same MCP source so approved MCP commands and rendered extensions stay aligned.
Backward compatibility
Existing kanon.yaml files are unchanged.
goose is opt-in and should not affect current Codex/Claude output.
Existing Codex use of .agents/skills remains unchanged.
🤖 Kelos Strategist Agent @gjkim42
Area: Integration Opportunities
Summary
Add an opt-in Goose render adapter that compiles Kanon's existing source model into Goose's documented file-backed configuration surfaces:
instructions.files-> global/project.goosehintsfor Goose-specific hints, withAGENTS.mdinteroperability noted but not required for v1skills->~/.agents/skills/<name>/...and<project>/.agents/skills/<name>/...mcp.servers->~/.config/goose/config.yamlextensions:entrieshooks-> a Kanon-managed Goose plugin under~/.agents/plugins/kanon-hooks/or<project>/.agents/plugins/kanon-hooks/This should be a render-first adapter named
goose. It should not try to manage Goose model/provider defaults,.gooseignore, prompt templates, memory, recipes, slash commands, subagents, or the enterprise extension allowlist in the first increment; those either overlap existing Kanon issues or require new neutral schema.Why this is strategically valuable
Goose is a strong fit for Kanon because it is file-backed, MCP-native, local/desktop/CLI oriented, and intentionally used across coding plus broader automation workflows. It also bridges editor integrations through ACP, so managing Goose once can influence Goose CLI, Goose Desktop, and ACP clients such as Zed that launch Goose as an agent server.
This gives Kanon a different kind of growth path than another editor-specific adapter. Instead of only rendering settings for one IDE, Kanon could manage a local open-source agent runtime that already exposes providers, extensions, skills, hooks, sandboxing, recipes, and ACP integration.
Evidence from the current codebase
Kanon already has most primitives needed for a Goose MVP:
Configcurrently has onlyInstructions,Skills,MCP,Hooks, andMetadata; there is no Goose target or agent-specific extension section (internal/core/types.go:11-18).codex,claude, andall(internal/core/types.go:5-8).adaptersFordispatches only Codex and Claude; adding Goose requires a new adapter registration and the opt-in/default behavior guard already discussed in adapter-roadmap issues (internal/core/render.go:57-65).MCPServeralready stores the fields Goose extensions need for stdio and remote MCP servers:command,args,env,env_vars,url, timeout fields, and enabled tool filters (internal/core/types.go:66-83).Hookalready stores event, matcher, type, command, and timeout, which maps closely to Goose's Open Plugins hook JSON shape (internal/core/types.go:92-101).renderSkillsalready copies completeSKILL.mddirectories into an adapter-provided target root (internal/core/render.go:88-180). Goose's recommended global/project skill roots are the same.agents/skillspaths Kanon already uses for Codex, which makes the adapter low-lift but requires duplicate-path guardrails.internal/core/merge.go:12-24). Gooseconfig.yamlwill need a YAML merge strategy that updates onlyextensionsentries Kanon owns and preserves provider/model/general settings.PlanFilesdoes not de-duplicate rendered files by destination path (internal/core/apply.go:42-84). Because Goose and Codex both use.agents/skills, a Goose adapter should either add a same-content de-duplication step or fail clearly on same-path different-content renders.External signal
Official Goose docs make this a concrete, file-backed target:
~/.config/goose/config.yamlon macOS/Linux and stores provider/model/general settings plusextensions; it also haspermission.yaml,secrets.yaml, prompt templates, and runtime permission files: https://goose-docs.ai/docs/guides/config-files/extensions.<name>entries withtype,cmd,args,env_keys,envs,available_tools,enabled, andtimeout: https://goose-docs.ai/docs/guides/config-files/#extensions-configuration~/.agents/skills/and.agents/skills/; the docs also call out compatibility with Claude Desktop and other Agent Skills consumers: https://goose-docs.ai/docs/guides/context-engineering/using-skills/~/.agents/plugins/<plugin-name>/or<project>/.agents/plugins/<plugin-name>/, and use ahooks/hooks.jsonshape that matches Kanon's current hook fields closely: https://goose-docs.ai/docs/guides/context-engineering/hooks/~/.config/goose/.goosehintsand project.goosehints; Goose also supports custom context file names, and AGENTS.md lists Goose among compatible agents: https://goose-docs.ai/docs/guides/context-engineering/using-goosehints/ and https://agents.md/GOOSE_ALLOWLIST, which is a useful later integration surface for Kanon-managed MCP policy: https://goose-docs.ai/docs/guides/allowlist/Existing issue overlap check
I reviewed the open
generated-by-kelosissues and searched existing issues forgoose,ACP, andZed.No existing issue proposes a Goose render target. This is intentionally distinct from:
GOOSE_PROVIDER,GOOSE_MODEL, and planner model keys are real, but should be handled by the shared model-defaults feature instead of this adapter MVP..gooseignoreis relevant, but belongs with the cross-agent context-exclusion model.Proposed target and mapping
Use
gooseas the canonical target:MVP mapping:
instructions.files~/.config/goose/.goosehints<project>/.goosehintsAGENTS.mdwrites when Codex is also enabled. A later option can preferAGENTS.mdfor project scope.skills[]~/.agents/skills/<name>/...<project>/.agents/skills/<name>/...renderSkills; add duplicate-path handling because Codex uses the same root.mcp.servers~/.config/goose/config.yamlextensions:extensionsentries; preserve provider/model/general keys.hooks[]~/.agents/plugins/kanon-hooks/hooks/hooks.jsonplusplugin.json<project>/.agents/plugins/kanon-hooks/hooks/hooks.jsonplusplugin.jsonExample source:
Expected Goose user-scoped render tree:
Rendered
config.yamlextension shape:Guardrails
--agent allbehavior to include Goose until the adapter opt-in semantics from Grow beyond Codex + Claude: prioritized render-adapter roadmap (Gemini CLI, Cursor, opencode, Copilot CLI) #7/Render adapters: Cursor, opencode, Copilot CLI (+ Gemini import parity) #23 are settled.~/.config/goose/config.yaml. AddFileMergeGooseConfigthat merges onlyextensionsentries named in Kanon and preserves provider, model, telemetry, search paths, slash commands, and other Goose-managed settings.env_varsto Gooseenv_keyswhere possible; only mapenvtoenvswhen the Kanon source already deliberately contains an env ref or non-secret literal. Preserve existing secret warnings from import/validation.type: http/urlshape before implementation. If uncertainty remains, render stdio extensions first and fail clearly for remote Goose targets.enabled_tools, map to Gooseavailable_tools. Fordisabled_tools, either fail for Goose targets or wait for a confirmed native deny-list equivalent; do not silently drop it.startup_timeout_secfirst. If both startup/tool timeouts differ, fail or warn because Goose appears to have a single extension timeout field.hooks/hooks.json. Accept Goose-supported events only:SessionStart,SessionEnd,Stop,UserPromptSubmit,PreToolUse,PostToolUse,PostToolUseFailure,BeforeReadFile,AfterFileEdit,BeforeShellExecution,AfterShellExecution.type: commandor empty type. Fail onargsandasyncbecause Goose's hook schema runs shell commands and does not document those fields..agents/skills. Identical content can be de-duplicated; different content should fail with both agent names and the path.Suggested MVP scope
AgentGooseand target validation forgoose, gated by the adapter opt-in mechanism.gooseAdapter.Renderfor hints, skills, stdio MCP extensions, and compatible hook plugins.FileMergeGooseConfigto preserve unmanagedconfig.yamlkeys while updating Kanon-ownedextensionsentries..agents/skillsoutput shared with Codex.--agent goosebehavior.make verify.Use cases unlocked
.agents/skillsbecomes an intentional cross-agent artifact rather than an accidental Codex-only side effect.Backward compatibility
kanon.yamlfiles are unchanged.gooseis opt-in and should not affect current Codex/Claude output..agents/skillsremains unchanged.Non-goals
.gooseignore; Manage context-exclusion patterns for sensitive and noisy files #69 is the shared context-exclusion surface.mcp.serversand any future governance metadata are stable.