@bybrawe/opencode-loop 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +2 -2
- package/examples/OPENCODE2-0.6.5.md +42 -0
- package/package.json +2 -2
- package/scripts/native-release.mjs +3 -3
- package/scripts/publish-workflow-test.mjs +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.6.5 - 2026-10-02
|
|
4
|
+
|
|
5
|
+
- Audit the native OpenCode 2 package contract against `@opencode/plugin@2.0.22` and pin the production SDK/runtime dependency to exact 2.0.22.
|
|
6
|
+
- Preserve the exact OpenCode 2.0.18 native pair as a backwards-compatibility gate while also requiring the moving latest-host pair; the real latest gate passes on OpenCode 2.0.22.
|
|
7
|
+
- Keep Ubuntu and Windows native bundle, regression, package-smoke, real-adapter, V1 peer-compatibility, and Loop+Goal coexistence gates green with the 2.0.22 dependency graph.
|
|
8
|
+
- Pair the release with Goal 1.3.44, which carries the same SDK audit plus persisted execution-ownership recovery and current OpenTUI peer alignment.
|
|
9
|
+
|
|
3
10
|
## 0.6.4 - 2026-10-02
|
|
4
11
|
|
|
5
12
|
- Persist OpenCode 2 native plugin configuration as one canonical plural `plugins` list instead of leaving valid legacy `plugin` entries in a parallel top-level block.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# OpenCode Loop
|
|
2
2
|
|
|
3
|
-
## Native OpenCode 2 (0.6.
|
|
3
|
+
## Native OpenCode 2 (0.6.5)
|
|
4
4
|
|
|
5
5
|
The npm and V2 entrypoints use the official `@opencode/plugin` `Plugin.define()` contract. The installer now registers the exact `@bybrawe/opencode-loop` package in OpenCode's plural `plugins` configuration instead of copying a loose global plugin directory. OpenCode therefore resolves `@opencode/plugin` from Loop's own production dependency graph; explicit `--legacy-v1` remains a separate compatibility path.
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@ Prompt/command timers, watch and stop conditions, verification, preflight/postru
|
|
|
17
17
|
|
|
18
18
|
OpenCode Loop adds `/loop`, scheduled prompt/command/shell jobs, compact scheduling, verification/checkpoints, and the `opencode-loopd` background daemon.
|
|
19
19
|
|
|
20
|
-
> **Current stable release: `0.6.
|
|
20
|
+
> **Current stable release: `0.6.5`.**
|
|
21
21
|
|
|
22
22
|
## Install or update
|
|
23
23
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# OpenCode Loop 0.6.5
|
|
2
|
+
|
|
3
|
+
OpenCode 2.0.22 SDK-contract patch, paired with OpenCode Goal 1.3.44.
|
|
4
|
+
|
|
5
|
+
## OpenCode 2.0.22 runtime contract
|
|
6
|
+
|
|
7
|
+
Loop's production `@opencode/plugin` dependency is pinned to exact 2.0.22. The
|
|
8
|
+
lockfile carries the matching `@opencode/{ai,client,protocol,schema,util}` runtime
|
|
9
|
+
closure so clean installs and release builds use the same native contract.
|
|
10
|
+
|
|
11
|
+
The moving real-host gate loads Loop main and the Goal companion together on
|
|
12
|
+
OpenCode 2.0.22. The exact OpenCode 2.0.18 native pair remains in CI as a
|
|
13
|
+
backwards-compatibility contract rather than being replaced by the current-host
|
|
14
|
+
check.
|
|
15
|
+
|
|
16
|
+
## Validation
|
|
17
|
+
|
|
18
|
+
The release candidate is gated by:
|
|
19
|
+
|
|
20
|
+
- Ubuntu and Windows native bundle/regression/package-smoke jobs;
|
|
21
|
+
- the real OpenCode 2 adapter;
|
|
22
|
+
- exact OpenCode 2.0.18 Loop+Goal coexistence;
|
|
23
|
+
- latest OpenCode 2.0.22 Loop+Goal coexistence;
|
|
24
|
+
- OpenCode 1 peer-compatibility tests.
|
|
25
|
+
|
|
26
|
+
## Upgrade
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
npx -y @bybrawe/opencode-goal@1.3.44
|
|
30
|
+
npx -y @bybrawe/opencode-loop@0.6.5 --loop-only --without-loop-goals
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then fully restart OpenCode and verify:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
/goal status
|
|
37
|
+
/loop-help
|
|
38
|
+
/loop-doctor
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Loop state, installer canonicalization, V1 compatibility, and the host-owned
|
|
42
|
+
automatic compaction boundary are unchanged by this SDK patch.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bybrawe/opencode-loop",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "Claude Code/Codex style /loop and experimental goal mode for OpenCode: heartbeat scheduler, idle-safe loops, scheduled commands, compact scheduling, verification, checkpoints, and persistent coding goals.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/plugin.js",
|
|
@@ -75,6 +75,6 @@
|
|
|
75
75
|
"access": "public"
|
|
76
76
|
},
|
|
77
77
|
"dependencies": {
|
|
78
|
-
"@opencode/plugin": "2.0.
|
|
78
|
+
"@opencode/plugin": "2.0.22"
|
|
79
79
|
}
|
|
80
80
|
}
|
|
@@ -7,12 +7,12 @@ export function validateRelease(request, pkg, env) {
|
|
|
7
7
|
assert.equal(env.GITHUB_REPOSITORY, "ByBrawe/opencode-loop", "wrong release repository")
|
|
8
8
|
assert.equal(env.GITHUB_REF, "refs/heads/main", "npm release must come from main")
|
|
9
9
|
assert.match(env.GITHUB_SHA ?? "", /^[a-f0-9]{40}$/, "immutable release SHA required")
|
|
10
|
-
assert.equal(request?.version, "0.6.
|
|
10
|
+
assert.equal(request?.version, "0.6.5", "release version is not authorized")
|
|
11
11
|
assert.equal(request?.name, "@bybrawe/opencode-loop")
|
|
12
12
|
assert.equal(pkg.name, request.name)
|
|
13
13
|
assert.equal(pkg.version, request.version)
|
|
14
|
-
assert.equal(request.predecessor, "0.6.
|
|
15
|
-
assert.equal(request.goal?.version, "1.3.
|
|
14
|
+
assert.equal(request.predecessor, "0.6.4")
|
|
15
|
+
assert.equal(request.goal?.version, "1.3.44")
|
|
16
16
|
assert.match(request.goal?.sha ?? "", /^[a-f0-9]{40}$/)
|
|
17
17
|
return request
|
|
18
18
|
}
|
|
@@ -29,7 +29,7 @@ assert.match(workflow, /native-release\.mjs verify/)
|
|
|
29
29
|
assert.match(workflow, /node_modules\/@bybrawe\/opencode-loop\/scripts\/opencode2-loop-canary.mjs/)
|
|
30
30
|
assert.match(workflow, /node_modules\/@bybrawe\/opencode-goal\/dist\/server.js/)
|
|
31
31
|
assert.match(workflow, /ref: \$\{\{ steps.release.outputs.goal_sha \}\}/)
|
|
32
|
-
assert.match(workflow, /npm install --no-save --legacy-peer-deps @opencode\/plugin@2\.0\.
|
|
32
|
+
assert.match(workflow, /npm install --no-save --legacy-peer-deps @opencode\/plugin@2\.0\.22/, "immutable Goal companion must build against its pinned OpenCode 2.0.22 plugin contract")
|
|
33
33
|
assert.match(nativeV2Workflow, /npm install --no-save --legacy-peer-deps @opencode\/plugin@2\.0\.18/, "Native V2 CI must pin the immutable Goal companion to the same OpenCode 2.0.18 plugin contract")
|
|
34
34
|
assert.doesNotMatch(workflow, /secrets\.NPM_TOKEN/)
|
|
35
35
|
|
|
@@ -44,14 +44,14 @@ const publisher = workflow.slice(workflow.indexOf(" publish:\n"), workflow.inde
|
|
|
44
44
|
assert.doesNotMatch(publisher, /contents:\s*write/, "OIDC publisher must not gain repository mutation privileges")
|
|
45
45
|
|
|
46
46
|
const sha = "a".repeat(40)
|
|
47
|
-
const request = { name: "@bybrawe/opencode-loop", version: "0.6.
|
|
47
|
+
const request = { name: "@bybrawe/opencode-loop", version: "0.6.5", predecessor: "0.6.4", goal: { version: "1.3.44", sha: "b".repeat(40) } }
|
|
48
48
|
const pkg = { name: request.name, version: request.version }
|
|
49
49
|
const env = { GITHUB_REPOSITORY: "ByBrawe/opencode-loop", GITHUB_REF: "refs/heads/main", GITHUB_SHA: sha }
|
|
50
50
|
assert.strictEqual(validateRelease(request, pkg, env), request)
|
|
51
51
|
for (const change of [{ GITHUB_REPOSITORY: "someone/fork" }, { GITHUB_REF: "refs/heads/release" }, { GITHUB_SHA: "main" }]) assert.throws(() => validateRelease(request, pkg, { ...env, ...change }))
|
|
52
52
|
assert.throws(() => validateRelease({ ...request, version: "9.0.0" }, pkg, env))
|
|
53
|
-
assert.throws(() => validateRelease(request, { ...pkg, version: "0.6.
|
|
54
|
-
assert.equal(releaseDecision(404, null, request, sha, "0.6.
|
|
53
|
+
assert.throws(() => validateRelease(request, { ...pkg, version: "0.6.4" }, env))
|
|
54
|
+
assert.equal(releaseDecision(404, null, request, sha, "0.6.4"), true)
|
|
55
55
|
for (const status of [401, 403, 429, 500, 503]) assert.throws(() => releaseDecision(status, null, request, sha, "0.6.0"))
|
|
56
56
|
assert.throws(() => releaseDecision(404, null, request, sha, "0.7.0"))
|
|
57
57
|
const manifest = { ...pkg, gitHead: sha }
|