Skip to content

[ Concepts / adapters ]

Runtime Adapters ​

Claude Code is the primary runtime. Codex, OpenCode, and Pi receive shared skills and instructions from one devkit release through optional adapters; this page says how to switch them on and what they write.

Activate ​

bash
bash
devkit config codex auto|on|off       # default auto: active while `codex` is installed
devkit config opencode auto|on|off    # default off
devkit config pi auto|on|off          # default off

A mode change takes effect on the next devkit apply or devkit sync. devkit config show prints the modes; devkit doctor checks the written files.

What each adapter writes ​

RuntimeShared sourceFormDestination
CodexPortable skillsod-<name> skills~/.agents/skills/
CodexAgentsTOML definitions~/.codex/agents/
CodexShared and Codex guard hooksNative hook config~/.codex/hooks.json
CodexGuardrailsRule files~/.codex/rules/
CodexGlobal instructionsManaged block~/.codex/AGENTS.md
OpenCodeTool accesstools, permission and subagent_depth keys, added only, never removed; permission."*": "allow" sits first, so opencode starts without permission prompts and a personal ask/deny still wins~/.config/opencode/opencode.json
OpenCodeGlobal instructionsManaged block~/.config/opencode/AGENTS.md
PiGlobal instructionsManaged block marked od managed (onedot-devkit pi)~/.pi/agent/AGENTS.md
PiShared hooksCompiled event, matcher, command manifest~/.pi/agent/extensions/devkit-hooks.manifest.json
PiHook bridgeManaged TypeScript adapter~/.pi/agent/extensions/devkit-hooks.ts

The adapters leave same-named personal entries and everything outside a managed block untouched; keeping a personal rule is reported as a warning, not a failure.

Pi loads devkit-hooks.ts as a native extension and reads the compiled manifest at session start. Delegates keep --no-extensions; write-capable Pi delegates load only Devkit's hook bridge, and a missing bridge refuses the dispatch. Turning Pi off removes its managed hook paths and, when Codex is disabled, the shared skill links Pi needed. Unlinking devkit removes only devkit-owned links.

Skill names ​

Devkit materializes shared skills as od-<name> under ~/.agents/skills/ when Codex or Pi is enabled. Pi discovers those directories under the same od- names without a second mirror; disabling Codex does not remove Pi's skills. OpenCode uses its native shared-skill discovery. devkit path skill <name> stays prefix-free in every runtime; devkit run starts shared scripts.

Pi MCP connections are configured separately through pi-mcp-adapter; this instructions adapter does not provision them. An imports: ["codex"] entry in Pi's adapter config reuses Codex MCP server definitions without starting Codex. Set lifecycle: "eager" (or "keep-alive" for a persistent remote server) in a Pi adapter override when those servers must connect at session start.

Models and permissions ​

Each agent gets the same model class as in Claude Code, mapped to the runtime's model names. Read-only agents cannot write; agents that edit get write and shell access.

/delegate can send review, research or implementation to Codex or another installed runtime; see initiative. devkit path resume [project-dir] resolves Codex's pre-compact snapshot for a project.

OpenCode prerequisites ​

A shared skill in OpenCode needs the built-ins read, glob, grep, list and bash. Without them the agent still answers, but as a chatbot: no repository search, no devkit run, and /friction-feedback cannot even report it. lsp and websearch are optional.

OpenCode removes a built-in from the toolset when any merged config layer denies it — permission.read: "deny", or tools.read: false without a permission override. Layers merge global → OPENCODE_CONFIG → project opencode.json/opencode.jsonc → .opencode/; a global deny stays in force until that file changes or a project layer sets the same key to "allow".

Two more places hide a deny: a per-agent permission block overrides the top level, so agent.explore.permission.bash: "deny" blinds that subagent even when the top level allows it, and experimental.primary_tools lists tools that only primary agents keep — a built-in named there is denied to every subagent.

devkit apply writes this into ~/.config/opencode/opencode.json and leaves a differing personal value alone:

json
json
{
  "$schema": "https://opencode.ai/config.json",
  "subagent_depth": 2,
  "permission": { "read": "allow", "glob": "allow", "grep": "allow", "list": "allow", "bash": "allow" }
}

bash can stay granular ("bash": { "git *": "allow", "*": "ask" }); only an all-deny rule counts as missing. subagent_depth is a top-level key (not under experimental): shared skills delegate to subagents that delegate again, and OpenCode's default of 1 stops the second hop with Subagent depth limit reached (1).

bash
bash
devkit doctor --target opencode   # only OpenCode checks, exit 1 on a finding
devkit doctor --target pi         # only Pi managed-block and hook-bridge checks

The report names each missing built-in, the file that denies it, each agent with its own deny, every required tool in experimental.primary_tools, and a subagent_depth below 2. The same checks run inside a plain devkit doctor whenever the adapter is on or a project ships its own opencode.json.

OpenCode reads config, agents, skills and plugins once at start; restart it after every change. If a broken config prevents the start: OPENCODE_DISABLE_PROJECT_CONFIG=1 skips the project layer, OPENCODE_CONFIG=/path/file.json loads one more file, OPENCODE_CONFIG_CONTENT='{"$schema":"https://opencode.ai/config.json"}' injects inline JSON.

Internal docs — onedot-devkit · devkit

devkitdevkit syncdevkit statusdevkit doctordevkit helpInternal docs · ONEDOT digital crew