It follows OpenCode's "Migrate from V1" guide: grouped permission + tools become one ordered permissions array (the V1 * fallback goes first, exceptions after it; bash -> shell, task -> subagent, write/patch -> edit), agent/mode -> agents (prompt -> system, variant joined as model#variant, maxSteps -> steps), command -> commands (subtask -> subagent), MCP servers move under mcp.servers (enabled -> disabled, one timeout -> catalog + execution, OAuth keys to snake_case), providers (npm -> package with aisdk:, api -> settings.baseURL, models and variants), compaction, skills, snapshot, attachment, reference, plugin, autoupdate, small_model. Agent and command files move from agent/, mode/, command/ to agents/ and commands/ with V2 frontmatter (old files become *.md.v1.bak, which OpenCode does not load). Because V1 asked before touching paths outside the project and V2 does not, it adds external_directory: ask unless you pass --no-external-ask. Anything it can't carry over (agent temperature, V1 plugin code) is listed in the report with what to do.
V2 still reads V1 config, so migrating is optional. Do it when you're ready, and don't point a V1 install at converted files.