🤖 Kelos Strategist Agent @gjkim42
Grow Kanon beyond Codex + Claude: a prioritized render-adapter roadmap
Area: Integration Opportunities (new render targets)
Kanon's tagline is "Manage multiple coding-agent settings across multiple diverse machines" — but today it renders for exactly two agents: Codex and Claude (adaptersFor in internal/core/render.go:34). The biggest growth lever for the project is turning that "multiple" into reality. The codebase is already well-positioned for it:
- A clean
Adapter interface (internal/core/types.go:128): Name(), Render(), Import().
- A neutral schema (instructions, skills, MCP servers, hooks, permissions) that already maps onto two very different native formats (TOML for Codex, JSON for Claude).
- Kanon already renders
AGENTS.md — which has quietly become a cross-tool standard.
I researched the config storage of 8 candidate agents (web research, 2025–2026 sources). This issue proposes a prioritized adapter roadmap, a concrete schema→native mapping for the #1 pick, and the (small) set of code/schema changes needed — including one backward-compatibility trap that must be handled before any adapter is added.
Key insight: AGENTS.md gives instructions away for free; the differentiated value is MCP + permissions
Many agents now read AGENTS.md natively (Cursor, GitHub Copilot coding agent & CLI, opencode, Sourcegraph Amp; Gemini CLI and Cline/Roo via a flag). Because Kanon already emits AGENTS.md, instruction propagation to much of the ecosystem is already solved. The real, un-met value of a new adapter is the part AGENTS.md can't carry: MCP servers, permissions/approvals/sandbox, hooks, and skills/commands. Adapters should be ranked by how cleanly those map — not by instruction support.
Proposed adapter priority
Ranked by popularity × mapping fit (all file locations below come from the research and are flagged where uncertain):
| # |
Agent |
Fit |
Why |
| 1 |
Gemini CLI |
low effort |
A single ~/.gemini/settings.json (+ project .gemini/settings.json) carries MCP (mcpServers, Claude-style), permissions (tools.allowed/tools.exclude, tools.sandbox, general.defaultApprovalMode), and hooks (a hooks object, ~9 lifecycle events). Instructions → GEMINI.md (or set context.fileName: AGENTS.md). Skills use SKILL.md dirs; commands are TOML. Almost the entire neutral schema maps cleanly. Google-backed, growing fast. |
| 2 |
Cursor |
medium |
Highest install base of the dedicated AI editors. AGENTS.md (free instructions) + .cursor/mcp.json (Claude-style mcpServers, global ~/.cursor/mcp.json) + .cursor/hooks.json (beta). Gap: permissions are UI/allowlist-driven, not a committed file. |
| 3 |
opencode (sst) |
medium |
Excellent fit if we accept a distinct schema: AGENTS.md + a single opencode.json (~/.config/opencode/ global) carrying mcp (note: key is mcp, with type: local|remote, not mcpServers) and a permission block (edit/bash/webfetch → allow|ask|deny). All file-addressable. Rising fast in the OSS terminal-agent space. |
| 4 |
GitHub Copilot CLI |
medium |
Largest installed base of any assistant. The CLI surface is cleaner than expected: ~/.copilot/ holds settings.json, mcp-config.json ({"mcpServers": …}), hooks/*.json (8 events), agents/, skills/, instructions/, copilot-instructions.md; reads AGENTS.md. (The cloud/coding-agent surface is UI-driven and fragmented — treat as a separate, lower-priority target.) |
Lower priority / poor fit (documented so we don't chase them):
- Windsurf — MCP at
~/.codeium/windsurf/mcp_config.json (Claude-style) is fine, but permissions are UI-driven and AGENTS.md support is unconfirmed.
- Cline / Roo Code — instructions map cleanly (
.clinerules / .roo/rules/), but MCP lives deep inside VS Code extension globalStorage paths that vary by extension ID and OS — awkward to target reliably.
- Aider — poor fit: no MCP, no allow/deny permission model, no skills/hooks; instructions are reference-by-config (
.aider.conf.yml read:) rather than a fixed file. An adapter could only emit a CONVENTIONS.md + a config entry. Skip for now.
#1 pick — Gemini CLI: schema → native mapping
| Kanon neutral field |
Gemini CLI target |
instructions.files |
~/.gemini/GEMINI.md (concatenated), or project .gemini/; optionally set context.fileName: AGENTS.md to reuse Kanon's existing AGENTS.md output |
mcp.servers |
~/.gemini/settings.json → mcpServers (Claude-style command/args/env, or httpUrl/url + headers; supports ${VAR} expansion — aligns with Kanon's env_vars/env_headers) |
permissions.allow / deny |
settings.json → tools.allowed / tools.exclude |
permissions.approval_policy / default_mode |
settings.json → general.defaultApprovalMode |
permissions.sandbox_mode |
settings.json → tools.sandbox (docker/podman/…) |
hooks |
settings.json → hooks object (map Kanon event/command/matcher/async/timeout) |
skills |
SKILL.md directories (same shape Kanon already renders for Claude/Codex) |
Uncertainties to verify before implementing (flagged by research): Gemini has a legacy-vs-nested key skew (coreTools/autoAccept vs tools.*/general.*) across versions; AGENTS.md auto-detection is not default (tracked upstream as an open issue), so the adapter should default to GEMINI.md and offer the context.fileName override; confirm the exact hooks schema and the version it became stable.
Code & schema changes required (small, localized)
-
Register the adapter — add a case in adaptersFor (internal/core/render.go:34) and a new geminiAdapter implementing the Adapter interface.
-
Extend the agent allowlist in two places: validateTargets (internal/core/config.go:145) and the --agent flag check (internal/cli/root.go:283), plus the Agent* constants in types.go:5.
-
⚠️ Backward-compatibility trap — handle before adding any adapter. Today targets: [] / targets: [all] means "every adapter," and adaptersFor("all") returns codex+claude. If a new adapter joins the default set, every existing kanon.yaml would suddenly start writing Gemini/Cursor files on the next kanon apply — surprising and potentially destructive. New adapters must be opt-in. Proposed: a top-level enable list, e.g.
version: 1
agents: [codex, claude, gemini] # absent => current default (codex, claude) for back-compat
instructions:
files: [instructions/shared.md]
mcp:
servers:
github:
type: http
url: https://api.githubcopilot.com/mcp/
targets: [claude, gemini] # per-setting targeting still works
adaptersFor/RenderAll would intersect the registry with the agents: list; --agent gemini still works explicitly. Configs without an agents: key keep rendering exactly codex+claude — no behavior change for existing users.
-
Import parity (optional, later): geminiAdapter.Import can lift settings.json + GEMINI.md back into neutral config, reusing the existing sanitizeMap/normalize* machinery.
Suggested scope for a first PR
Land Gemini CLI as the third adapter (Render-only), together with the agents: opt-in mechanism (item 3) since that must exist before any third adapter ships. Cursor, opencode, and Copilot CLI then follow the same pattern in separate PRs. This proves the multi-agent story end-to-end with the lowest-effort, highest-fit target, while fixing the back-compat semantics once for all future adapters.
Research method: 8 parallel web-research passes (one per candidate agent) on 2025–2026 sources, with explicit uncertainty flagging; synthesized against the current internal/core adapter code. Facts marked "uncertain/flagged" above should be re-verified against primary docs at implementation time.
🤖 Kelos Strategist Agent @gjkim42
Grow Kanon beyond Codex + Claude: a prioritized render-adapter roadmap
Area: Integration Opportunities (new render targets)
Kanon's tagline is "Manage multiple coding-agent settings across multiple diverse machines" — but today it renders for exactly two agents: Codex and Claude (
adaptersForininternal/core/render.go:34). The biggest growth lever for the project is turning that "multiple" into reality. The codebase is already well-positioned for it:Adapterinterface (internal/core/types.go:128):Name(),Render(),Import().AGENTS.md— which has quietly become a cross-tool standard.I researched the config storage of 8 candidate agents (web research, 2025–2026 sources). This issue proposes a prioritized adapter roadmap, a concrete schema→native mapping for the #1 pick, and the (small) set of code/schema changes needed — including one backward-compatibility trap that must be handled before any adapter is added.
Key insight: AGENTS.md gives instructions away for free; the differentiated value is MCP + permissions
Many agents now read
AGENTS.mdnatively (Cursor, GitHub Copilot coding agent & CLI, opencode, Sourcegraph Amp; Gemini CLI and Cline/Roo via a flag). Because Kanon already emitsAGENTS.md, instruction propagation to much of the ecosystem is already solved. The real, un-met value of a new adapter is the partAGENTS.mdcan't carry: MCP servers, permissions/approvals/sandbox, hooks, and skills/commands. Adapters should be ranked by how cleanly those map — not by instruction support.Proposed adapter priority
Ranked by popularity × mapping fit (all file locations below come from the research and are flagged where uncertain):
~/.gemini/settings.json(+ project.gemini/settings.json) carries MCP (mcpServers, Claude-style), permissions (tools.allowed/tools.exclude,tools.sandbox,general.defaultApprovalMode), and hooks (ahooksobject, ~9 lifecycle events). Instructions →GEMINI.md(or setcontext.fileName: AGENTS.md). Skills useSKILL.mddirs; commands are TOML. Almost the entire neutral schema maps cleanly. Google-backed, growing fast.AGENTS.md(free instructions) +.cursor/mcp.json(Claude-stylemcpServers, global~/.cursor/mcp.json) +.cursor/hooks.json(beta). Gap: permissions are UI/allowlist-driven, not a committed file.AGENTS.md+ a singleopencode.json(~/.config/opencode/global) carryingmcp(note: key ismcp, withtype: local|remote, notmcpServers) and apermissionblock (edit/bash/webfetch→allow|ask|deny). All file-addressable. Rising fast in the OSS terminal-agent space.~/.copilot/holdssettings.json,mcp-config.json({"mcpServers": …}),hooks/*.json(8 events),agents/,skills/,instructions/,copilot-instructions.md; readsAGENTS.md. (The cloud/coding-agent surface is UI-driven and fragmented — treat as a separate, lower-priority target.)Lower priority / poor fit (documented so we don't chase them):
~/.codeium/windsurf/mcp_config.json(Claude-style) is fine, but permissions are UI-driven andAGENTS.mdsupport is unconfirmed..clinerules/.roo/rules/), but MCP lives deep inside VS Code extensionglobalStoragepaths that vary by extension ID and OS — awkward to target reliably..aider.conf.ymlread:) rather than a fixed file. An adapter could only emit aCONVENTIONS.md+ a config entry. Skip for now.#1 pick — Gemini CLI: schema → native mapping
instructions.files~/.gemini/GEMINI.md(concatenated), or project.gemini/; optionally setcontext.fileName: AGENTS.mdto reuse Kanon's existing AGENTS.md outputmcp.servers~/.gemini/settings.json→mcpServers(Claude-stylecommand/args/env, orhttpUrl/url+headers; supports${VAR}expansion — aligns with Kanon'senv_vars/env_headers)permissions.allow/denysettings.json→tools.allowed/tools.excludepermissions.approval_policy/default_modesettings.json→general.defaultApprovalModepermissions.sandbox_modesettings.json→tools.sandbox(docker/podman/…)hookssettings.json→hooksobject (map Kanonevent/command/matcher/async/timeout)skillsSKILL.mddirectories (same shape Kanon already renders for Claude/Codex)Uncertainties to verify before implementing (flagged by research): Gemini has a legacy-vs-nested key skew (
coreTools/autoAcceptvstools.*/general.*) across versions; AGENTS.md auto-detection is not default (tracked upstream as an open issue), so the adapter should default toGEMINI.mdand offer thecontext.fileNameoverride; confirm the exacthooksschema and the version it became stable.Code & schema changes required (small, localized)
Register the adapter — add a case in
adaptersFor(internal/core/render.go:34) and a newgeminiAdapterimplementing theAdapterinterface.Extend the agent allowlist in two places:
validateTargets(internal/core/config.go:145) and the--agentflag check (internal/cli/root.go:283), plus theAgent*constants intypes.go:5.targets: []/targets: [all]means "every adapter," andadaptersFor("all")returns codex+claude. If a new adapter joins the default set, every existingkanon.yamlwould suddenly start writing Gemini/Cursor files on the nextkanon apply— surprising and potentially destructive. New adapters must be opt-in. Proposed: a top-level enable list, e.g.adaptersFor/RenderAllwould intersect the registry with theagents:list;--agent geministill works explicitly. Configs without anagents:key keep rendering exactly codex+claude — no behavior change for existing users.Import parity (optional, later):
geminiAdapter.Importcan liftsettings.json+GEMINI.mdback into neutral config, reusing the existingsanitizeMap/normalize*machinery.Suggested scope for a first PR
Land Gemini CLI as the third adapter (Render-only), together with the
agents:opt-in mechanism (item 3) since that must exist before any third adapter ships. Cursor, opencode, and Copilot CLI then follow the same pattern in separate PRs. This proves the multi-agent story end-to-end with the lowest-effort, highest-fit target, while fixing the back-compat semantics once for all future adapters.Research method: 8 parallel web-research passes (one per candidate agent) on 2025–2026 sources, with explicit uncertainty flagging; synthesized against the current
internal/coreadapter code. Facts marked "uncertain/flagged" above should be re-verified against primary docs at implementation time.