Repository navigation
Open
Labels
effort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)user/escalatedQueue or user escalation stateQueue or user escalation state
Description
Part of the fleet-wide OpenCode 2 migration tracked at developing-today-forks/opencode#374 (origin issue for the whole set).
Upstream migration guide: https://dev.opencode.ai/v2/docs/migrate-v1/
Two workstreams in this repo:
1. Config validation — .opencode/opencode.jsonc against OpenCode v2
- Load the repo config with OpenCode v2 (
@opencode/cli@2.1.4) and record what it accepts and rejects. - Config files, agents, commands, and skills under
.opencode/are intended to be compatible; some v1 fields are accepted but ignored by v2. Hard rejections get fixed (PR); accepted-but-ignored fields get listed here so we can decide whether to keep them while runtimes are still migrating or drop them. - Note:
.opencode/cli.jsonalready targets the v2 CLI schema (https://opencode.ai/v2/cli.json), while.opencode/tui.jsoncstill exists alongside it (v2 auto-migrates tui.json → cli.json).
2. Plugin ports — v1 plugin API → v2 plugin API
v1 plugins do not run in v2 (new plugin API). Ours, in order of how much we depend on them:
- mcpx bridge + mcpx-session —
.opencode/plugin/mcpx-session.tsis the plugin entry (importstoolandPluginfrom@opencode-ai/plugin; default export isasync ({ directory, worktree, project, client }, options) => …), backed by the.opencode/plugin/mcpx/modules (daemon client, ops). First step: inventory the v1 hooks/lifecycle points and SDK calls these use, and diff them against the v2 plugin API in the migration guide; list anything with no v2 equivalent. - subtask2 — third-party npm plugin
@openspoon/subtask2@latestin the configpluginarray, configured by.opencode/subtask2.jsonc. First step: check whether subtask2 ships a v2-compatible release; if not, decide between a fork, vendoring, or replacing it. - The rest of the
pluginarray is also v1-era npm plugins (opencode-working-memory, opencode-scheduler, opencode-pty, opencode-devcontainers, @openchamber/opencode-claude, @pieliesdie/opencode-antigravity-auth, and more). Each needs the same v2-compatibility check; the two items above are the ones we own or depend on most. .opencode/package.jsonpins@opencode-ai/plugin1.18.19 — the plugin SDK bump belongs to this workstream.
Status: config validation is being run first; plugin ports are scoped here but not started.
Acceptance criteria
- Workstream 1 (config validation) is recorded as done:
.opencode/opencode.jsoncloads clean under OpenCode v2 (validation comment, 2026-10-24); any accepted-but-ignored v1 fields are listed on this issue with a keep/drop decision each. - The mcpx bridge + mcpx-session plugin has a v2 port, or a written gap list naming every v1 hook/SDK call with no v2 equivalent and the chosen workaround.
- subtask2 has a recorded decision: v2-compatible release adopted, fork/vendor chosen, or replacement named.
- Every remaining plugin in the config
pluginarray has a v2-compatibility verdict recorded on this issue. -
.opencode/package.jsonpins a v2-era@opencode-ai/pluginSDK and the repo's agents/commands/skills still load under the v2 CLI.
Metadata
Metadata
Assignees
Labels
effort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)user/escalatedQueue or user escalation stateQueue or user escalation state
Activity
dezren39 commentedon Oct 24, 2026
Config validation result — ran 2026-10-24
Verdict:
.opencode/opencode.jsoncloads clean under OpenCode v2. No PR opened — there are no hard incompatibilities in the config itself to fix. Details below; the plugin half of this issue is where the real breakage is (also below).Method
@opencode/cli@2.1.4in an isolated prefix with a scratch HOME (the live v1.18.31 server and its config were not touched)..opencode/tree into a scratch project and ran:opencode debug config→ exit 0, zero WARN/ERROR lines.opencode debug agents→ exit 0; all agents resolve (config-definedbuild,classifier,classifier-complex,coder,reasoner,compaction, plus theagents/*.mdagents Explore/General/Plan and built-ins).What v2 does with the v1-shaped config
The v2 loader normalizes v1 fields itself — these renames happen automatically, no edit needed:
agentagents(all 6 keys preserved)providerproviders(all 14 provider IDs preserved exactly)pluginplugins(all 14 specs preserved)autoupdate: trueupdate: "auto"disabled_providerspolicies(provider.usedeny entries)compactionAccepted but dropped (v2 ignores these — decision needed, not a fix)
default("claude-code/claude-haiku-5-5") — does not appear in v2's resolved config, and v2 does not turn it into amodeleither. On upstream v2 this field is a no-op. Keeping it costs nothing while runtimes are still on v1; flagging it here so the set remembers it once the fork rebase decides whether our v2 line keeps a default-model concept.experimental.model_routes— the model-pool routing table (cheap-pooltargets etc.). Upstream v2 drops the wholeexperimentalblock. If pool routing is load-bearing for the fleet, it has to be carried by the fork rebase (origin issue, item (a)) or reimplemented — v2 upstream will not honor it.Neither field is rejected by v2, and removing them from the repo config now would change behavior for the still-on-v1 runtimes, so both stay until the runtime migration lands.
Plugin load evidence (workstream 2 preview — ports NOT started)
On the fresh v2 server load of the full tree (with
.opencode/package.jsondeps installed,@opencode-ai/plugin1.18.19), 8 plugins were attempted in the capture window and 6 failed with the same v2 module-contract error:Failed:
plugin/mcpx-session.ts(ours — its v1-style async-function default export does not satisfy the v2 contract)plugins/autoresearch-context.ts(ours)@openspoon/subtask2@latest(subtask2's current release is not v2-compatible)opencode-scheduler@latest,opencode-pty@latest,opencode-devcontainers@latestAttempted with no failure recorded in the window:
opencode-working-memory@latest,@mohak34/opencode-notifier@latest. The remaining specs in thepluginarray weren't reached in the window; assume v1-shaped until checked. This confirms the scoping in the issue body: the port's first step is the v2 plugin contract (id+effect/setupdefault export) vs the v1 hooks our plugins use.dezren39 commentedon Oct 26, 2026
Intake review — fleet monitor, 2026-10-26T08:26:24Z.
Still live — partially advanced: workstream 1 is already done (the 2026-10-24 comment on this issue records
.opencode/opencode.jsoncloading clean under OpenCode v2, no PR needed). Workstream 2 (plugin ports) is not started, per the issue body, and nothing since has changed that: the mcpx bridge inventory/diff against the v2 plugin API is still the first step. Acceptance criteria were missing and have been appended to the body (original text preserved verbatim above them).Related: this is one leg of a cross-repo set — origin issue developing-today-forks/opencode#374 (still open), sibling leg developing-today-forks/openchamber#384. Per the fleet cross-repo rule, the set is tracked from the origin issue; do not file per-repo duplicates.
Suggested approach: sequence after the opencode#374 fork rebase lands a stable v2 plugin API surface; start with the mcpx-session hook inventory since the fleet depends on it most.
Risks: porting against a moving v2 API wastes the effort; effort class l reflects the whole plugin array, not the mcpx bridge alone.
dezren39 commentedon Oct 29, 2026
🤖 Agent note · cross-reference from #1858 triage (queue task 2746, 2026-10-29)
pkgs/mcpx/plugin/opencode/) was triaged today: scope confirmed, core rewrite enqueued as queue task 3068. This issue's workstream 2 (the deployed copy at.opencode/plugin/mcpx-session.ts) is a different artifact and stays owned here — noted on mcpx: port the opencode plugin to opencode v2 (a rewrite, and several things get better) #1858 so the two ports follow one shape and do not diverge silently.dezren39 commentedon Nov 1, 2026
🤖 Agent note · picked up
dezren39 commentedon Nov 1, 2026
🤖 Agent note · done
558cc1d23e1d2d90df2a0d36189b5e585f12f99b..opencode/opencode.jsoncloading clean under OpenCode v2; nothing since contradicts it. Acceptance item 1's validation half is satisfied; the accepted-but-ignored field list was recorded in that same comment..opencode/package.jsonstill pins@opencode-ai/plugin1.18.19 — acceptance item 5 (v2-era SDK pin) not done..opencode/opencode.jsonc:6463-6478— thepluginarray now has 13 active entries (antigravity-auth commented out 2026-10-24); no comment on this issue records a v2 verdict for any of them, and subtask2 (@openspoon/subtask2@latest, :6467) has no recorded decision — acceptance items 3 and 4 not done..opencode/plugin/mcpx-session.ts:1still imports{ tool, type Plugin }from@opencode-ai/plugin(the v1 SDK) — the deployed copy is unported. Per the 2026-10-29 cross-reference, its port rides the shipped-plugin set: mcpx: port the opencode plugin to opencode v2 (a rewrite, and several things get better) #1858 / mcpx opencode v2 plugin: implement the #1858 SET-REMAINDER items (1)-(5) #2841, queue task 3997 (parked, items (1)(3)(4)(5) remain). Acceptance item 2 is owned there, not duplicated here.queue/queuedfor the routed remainder.10 remaining items
dezren39 commentedon Nov 1, 2026
Plugin-array V2 compatibility verdicts — checked 2026-11-01
The V2 migration guide says V1 plugin implementations do not run in V2. The V2 loader requires the module's default export to be a definition with a stable
idandsetuporeffect. Verdicts below are based on current upstream package/source evidence, not version recency alone. Config entries are from maindee3cb93d,.opencode/opencode.jsonc:6533-6547; the SDK pin remains@opencode-ai/plugin1.18.19 (.opencode/package.json:4).opencode-working-memory@latest{ id, server, setup }; compatibility notes record verification with CLI/plugin 2.1.4.opencode-scheduler@latest@opencode-ai/plugininterface; no V2 entrypoint is declared.@openspoon/subtask2@latest@mohak34/opencode-notifier@latest{ id, setup }; changelog records V2 support since 0.4.0 and subsequent V2 fixes.opencode-pty@latestopencode-devcontainers@latest{ id, setup/effect }.@franlol/opencode-md-table-formatter@latestexperimental.text.completehook.opencode-cmd-provider@latest{ id: "commandcode", server, setup }; V2 test validates the definition against the V2 loader schema.opencode-cockpit@latestdualServer(...); its helper returns a definition withidandsetup.@openchamber/opencode-claude@1.3.8idand asyncsetup; its manifest uses@opencode/plugin. npm latest observed was 1.7.0, but the configured 1.3.8 pin itself has the V2 shape.opencode-models-discovery@latestcombinedPlugin; its definition has anidandsetupV2.opencode-mem@latestidand asyncsetup.opencode-auto-continue@…/tags/latest.tar.gzlatest(package 1.0.0)aceb217; its entrypoint is a V1 async plugin function returning legacy hooks, not a V2 definition.subtask2 options — decision requested from Drew
No V2-compatible
@openspoon/subtask2release was found: npm dist-tags show onlylatest: 0.3.9, its published source is V1-only, and the repository's current@spoons-and-mirrors/subtask2@0.3.5manifest is also V1-only. Its GitHub releases endpoint is empty.Options: (1) use native V2 commands with
subagent: true(thesubtaskalias is deprecated) if simple background delegation is enough; this is not feature parity for subtask2's chaining, loops, parallel expansion, and turn references; or (2) fork/port or vendor-and-port if those behaviors are required (vendoring alone does not fix the API). I found no evidenced drop-in replacement; Pocket Universe is marked WIP and still declares only the V1 SDK (repo).Recommendation: first confirm which subtask2-specific behaviors are actually used. Prefer native V2 commands if basic child delegation suffices; if chaining/loops/parallel expansion/turn references are required, a maintained V2 fork/port is the clearest route. Drew's decision is needed on that feature trade-off; no replacement or port is being chosen silently. The SDK-pin bump and plugin ports remain separate scoped follow-ups after this verdict pass.
dezren39 commentedon Nov 1, 2026
🤖 Agent note · escalated
@openspoon/subtask2@0.3.9remains V1-only and no V2-compatible release/replacement was evidenced. Native V2subagent: truecommands cover basic background delegation but not subtask2 chaining, loops, parallel expansion, or turn references.dezren39 commentedon Nov 2, 2026
agent-note:v1
task: 5175 (triage, OpenChamber scheduled lane)
state: picked-up
checked_at: 2026-11-02T00:42:47Z
dezren39 commentedon Nov 2, 2026
agent-note:v1
task: 5175 (triage, OpenChamber scheduled lane)
state: superseded
checked_at: 2026-11-02T00:43:31Z
dezren39 commentedon Nov 3, 2026
RULING (Muse, acting for Drew, 2026-11-03): do not adopt subtask2-specific chaining/loops/parallel expansion — no V2-compatible @openspoon/subtask2 release exists and current use cases do not require it (verdicts in comment 6560539252). Revisit only when a V2-compatible release ships. Task 4850 closed.