From a122f462720c1b7193fcbe0dfeb709cb855cd67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20TEKTA=C5=9E?= Date: Fri, 14 Aug 2026 03:09:41 +0300 Subject: [PATCH 1/2] fix: model current OpenCode 2 command contract --- src/source/opencode2/capabilities.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/source/opencode2/capabilities.js b/src/source/opencode2/capabilities.js index 9ec486d..2f3b80f 100644 --- a/src/source/opencode2/capabilities.js +++ b/src/source/opencode2/capabilities.js @@ -7,7 +7,7 @@ function frozenRecord(value) { } export const OPENCODE_LOOP_V2_RUNTIME_REQUIREMENTS = Object.freeze([ - "command.add", + "command.update", "session.events", "session.prompt", ]) @@ -41,7 +41,7 @@ export function openCode2LoopRuntimeStatus(ctx, commandDraft) { const blockers = [] if (!context.commandTransform) blockers.push("command.transform") - if (!command.add) blockers.push("command.add") + if (!command.update) blockers.push("command.update") if (!context.sessionEvents) blockers.push("session.events") if (!context.sessionPrompt) blockers.push("session.prompt") From 719eeccd1c081e685e9aed5c0e2940d13a970142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20TEKTA=C5=9E?= Date: Fri, 14 Aug 2026 03:09:55 +0300 Subject: [PATCH 2/2] test: align V2 sentinel with command update contract --- scripts/v2-plugin-sentinel-test.mjs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/v2-plugin-sentinel-test.mjs b/scripts/v2-plugin-sentinel-test.mjs index a11eb8f..df2cee3 100644 --- a/scripts/v2-plugin-sentinel-test.mjs +++ b/scripts/v2-plugin-sentinel-test.mjs @@ -11,7 +11,7 @@ assert.equal(plugin.id, OPENCODE_LOOP_V2_PLUGIN_ID) assert.equal(plugin.id, "bybrawe.opencode-loop.v2.experimental") assert.equal(typeof plugin.setup, "function") assert.deepEqual(OPENCODE_LOOP_V2_RUNTIME_REQUIREMENTS, [ - "command.add", + "command.update", "session.events", "session.prompt", ]) @@ -52,7 +52,6 @@ assert.deepEqual(inspectOpenCode2CommandDraft(currentDraft), { add: false, }) assert.deepEqual(openCode2LoopRuntimeStatus(currentContext, currentDraft).blockers, [ - "command.add", "session.events", "session.prompt", ]) @@ -63,9 +62,16 @@ const futureContext = { event: { subscribe: async () => ({ dispose: async () => {} }) }, session: { prompt: async () => ({}) }, } -const futureDraft = { ...currentDraft, add: () => {} } -assert.deepEqual(openCode2LoopRuntimeStatus(futureContext, futureDraft).blockers, []) -assert.equal(openCode2LoopRuntimeStatus(futureContext, futureDraft).ready, true) +assert.deepEqual(openCode2LoopRuntimeStatus(futureContext, currentDraft).blockers, []) +assert.equal(openCode2LoopRuntimeStatus(futureContext, currentDraft).ready, true) + +const missingUpdateDraft = { + list: () => [], + get: () => undefined, + remove: () => {}, + add: () => {}, +} +assert.deepEqual(openCode2LoopRuntimeStatus(futureContext, missingUpdateDraft).blockers, ["command.update"]) let missingCapabilityFailed = false try {