Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
9b9ff7e
fix(v2): probe built-in OpenCode Goal ownership via read-only RPC (#195)
ByBrawe Oct 30, 2026
c61bddc
fix(v2): gate every Loop admission on native and ByBrawe Goal session…
ByBrawe Oct 30, 2026
0f66fa4
fix(v2): wire native OpenCode Goal RPC into standalone Loop setup (#195)
ByBrawe Oct 30, 2026
f0505ec
test(v2): native Goal RPC ownership, disabled host, pause and admissi…
ByBrawe Oct 30, 2026
658bf96
build(v2): sync deterministic Bun src/native.js bundle for native Goa…
ByBrawe Oct 30, 2026
62d8162
build(v2): sync deterministic Bun src/server.js bundle for native Goa…
ByBrawe Oct 30, 2026
c572892
fix(v2): ignore orphaned ByBrawe Goal files after verified standalone…
ByBrawe Oct 30, 2026
0adbd18
fix(v2): only reserve legacy Goal sessions while its plugin is instal…
ByBrawe Oct 30, 2026
6f6be7c
fix(v2): only reserve legacy Goal sessions while its plugin is instal…
ByBrawe Oct 30, 2026
2716174
test(v2): removed Goal's orphaned shard cannot block standalone Loop …
ByBrawe Oct 30, 2026
db81498
build(v2): update reproducible native Goal ownership bundles (#195)
ByBrawe Oct 30, 2026
dfb33b0
build(v2): update reproducible native Goal ownership bundles (#195)
ByBrawe Oct 30, 2026
4070bf5
docs(v2): document read-only built-in Goal ownership and standalone o…
ByBrawe Oct 30, 2026
939926b
release(loop): authorize independently verifiable v0.6.10 (package.json)
ByBrawe Oct 30, 2026
0688a7d
release: request independent Loop 0.6.10
ByBrawe Oct 30, 2026
14011f7
release(loop): authorize 0.6.10 scripts/native-release.mjs
ByBrawe Oct 30, 2026
6a1a014
release(loop): authorize 0.6.10 scripts/publish-workflow-test.mjs
ByBrawe Oct 30, 2026
14d35ed
release(loop): authorize 0.6.10 .github/workflows/publish-npm.yml
ByBrawe Oct 30, 2026
09dc787
docs(release): record standalone Loop 0.6.10 and thank @zhek
ByBrawe Oct 30, 2026
4df6004
docs(release): ship 0.6.10 independent Loop notes and contributor credit
ByBrawe Oct 30, 2026
bc24bbb
fix(release): retain old-OpenCode native-Goal compatibility regressio…
ByBrawe Oct 30, 2026
ac8f7cf
fix(release): retain old-OpenCode native-Goal compatibility regressio…
ByBrawe Oct 30, 2026
531b77b
build(v2): sync verified Bun native Goal host-compat bundles (#195)
ByBrawe Oct 30, 2026
cf8682d
build(v2): sync verified Bun native Goal host-compat bundles (#195)
ByBrawe Oct 30, 2026
df0cd8d
docs(release): remove lingering mandatory Goal companion wording (#178)
ByBrawe Oct 30, 2026
89d4980
fix(release): restore assertion syntax in 0.6.10 release gate test
ByBrawe Oct 30, 2026
2353ac3
fix(v2): decode public OpenCode plugin.list wrapped data response (#195)
ByBrawe Oct 30, 2026
cc28b23
fix(v2): decode public OpenCode plugin.list wrapped data response (#195)
ByBrawe Oct 30, 2026
91e7696
fix(v2): decode public OpenCode plugin.list wrapped data response (#195)
ByBrawe Oct 30, 2026
473a218
fix(v2): decode public OpenCode plugin.list wrapped data response (#195)
ByBrawe Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions .github/npm-release.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
{
"name": "@bybrawe/opencode-loop",
"version": "0.6.9",
"predecessor": "0.6.8",
"goal": {
"version": "1.3.49",
"sha": "0c834b06843d4f55aa3c6a1489d992adc70a5be4"
},
"requestedAt": "2026-10-27",
"reason": "Host-verified Markdown checklist completion on native OpenCode 2 and V1 compatibility, source/build parity, Goal 1.3.49 independently installed, strict Windows/Linux and real-host consumer gates. Preserve existing unlimited defaults, completion evidence integrity, plugin ownership and Desktop GUI uncertainty. Verified Windows strict package consumer retry on a fresh tree after ETIMEDOUT (#189) and bounded async stop-file test (#188) are on main; release remains blocked unless all exact-main gates succeed. Experimental @zhek TUI sidebar remains in PR #190 for the next release."
"version": "0.6.10",
"predecessor": "0.6.9",
"requestedAt": "2026-10-30",
"reason": "Final standalone Loop stability release after #194, #195/#196, with native read-only TUI contributed by @zhek (#165/#190). Keep Goal separately managed; require source/bundle parity, exact-main CI, Windows/Linux/macOS and clean npm consumer gates. Windows Desktop GUI and remote split-cache TUI discovery remain unverified (#169/#191)."
}
14 changes: 7 additions & 7 deletions .github/workflows/publish-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
run: |
mkdir -p "$RUNNER_TEMP/packed" "$RUNNER_TEMP/consumer"
npm pack --pack-destination "$RUNNER_TEMP/packed"
(cd "$RUNNER_TEMP/consumer" && npm init -y >/dev/null && npm install --omit=dev --omit=peer --ignore-scripts --no-audit --no-fund "$RUNNER_TEMP/packed/bybrawe-opencode-loop-0.6.9.tgz")
(cd "$RUNNER_TEMP/consumer" && npm init -y >/dev/null && npm install --omit=dev --omit=peer --ignore-scripts --no-audit --no-fund "$RUNNER_TEMP/packed/bybrawe-opencode-loop-0.6.10.tgz")
npm install --prefix "$RUNNER_TEMP/native-host" --package-lock=false @opencode/cli@2.0.18
- name: Real OpenCode with standalone Loop commands and daemon
shell: bash
Expand Down Expand Up @@ -133,7 +133,7 @@ jobs:
(cd "$VERIFY_DIR" && npm init -y >/dev/null)
# A released version may reach registry metadata before tarballs converge.
for attempt in {1..12}; do
if (cd "$VERIFY_DIR" && npm install --omit=dev --omit=peer --ignore-scripts --no-audit --no-fund --prefer-online --cache "$VERIFY_DIR/npm-cache-$attempt" @bybrawe/opencode-loop@0.6.9); then
if (cd "$VERIFY_DIR" && npm install --omit=dev --omit=peer --ignore-scripts --no-audit --no-fund --prefer-online --cache "$VERIFY_DIR/npm-cache-$attempt" @bybrawe/opencode-loop@0.6.10); then
break
fi
if [ "$attempt" -eq 12 ]; then
Expand All @@ -148,7 +148,7 @@ jobs:
export OPENCODE2_CURRENT_COMMAND_FIELDS=1 OPENCODE2_NATIVE_REQUIRED=1
node "$VERIFY_DIR/node_modules/@bybrawe/opencode-loop/scripts/opencode2-loop-canary.mjs"
node "$VERIFY_DIR/node_modules/@bybrawe/opencode-loop/scripts/native-cli-host-canary.mjs"
echo 'PUBLISHED_NATIVE_LOOP_PASS Loop 0.6.9 on OpenCode 2.0.18'
echo 'PUBLISHED_NATIVE_LOOP_PASS Loop 0.6.10 on OpenCode 2.0.18'

github-release:
name: Create tag and GitHub release
Expand All @@ -173,7 +173,7 @@ jobs:
import assert from 'node:assert/strict'
const base = 'https://api.github.com/repos/' + process.env.GITHUB_REPOSITORY
const headers = { Authorization: `Bearer ${process.env.GH_TOKEN}`, Accept: 'application/vnd.github+json', 'Content-Type': 'application/json' }
const response = await fetch(base + '/git/ref/tags/v0.6.9', { headers })
const response = await fetch(base + '/git/ref/tags/v0.6.10', { headers })
if (response.ok) {
let object = (await response.json()).object
if (object.type === 'tag') {
Expand All @@ -184,11 +184,11 @@ jobs:
assert.equal(object.sha, process.env.GITHUB_SHA, 'Existing release tag belongs to another source')
} else {
assert.equal(response.status, 404)
const created = await fetch(base + '/git/refs', { method: 'POST', headers, body: JSON.stringify({ ref: 'refs/tags/v0.6.9', sha: process.env.GITHUB_SHA }) })
const created = await fetch(base + '/git/refs', { method: 'POST', headers, body: JSON.stringify({ ref: 'refs/tags/v0.6.10', sha: process.env.GITHUB_SHA }) })
assert.equal(created.status, 201)
}
JS
if ! gh release view v0.6.9 >/dev/null 2>&1; then
if ! gh release view v0.6.10 >/dev/null 2>&1; then
git archive --format=zip --output=opencode-loop.zip "$COMMIT_SHA"
gh release create v0.6.9 opencode-loop.zip --title v0.6.9 --notes-file examples/OPENCODE2-0.6.9.md --verify-tag
gh release create v0.6.10 opencode-loop.zip --title v0.6.10 --notes-file examples/OPENCODE2-0.6.10.md --verify-tag
fi
11 changes: 8 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# Changelog

## Unreleased (main only)

- Integrate native OpenCode 2 Loop TUI sidebar and read-only status RPC (contributed by [@zhek](https://github.com/zhek), [PR #165](https://github.com/ByBrawe/opencode-loop/pull/165)); source-only until OpenTUI 0.5/0.7 and Loop+Goal paired consumer CI pass. This is not part of npm 0.6.9.
## 0.6.10 — 2026-10-30

- Ship the read-only native OpenCode 2 Loop **TUI sidebar** and status RPC, originally contributed by [@zhek](https://github.com/zhek) ([#165](https://github.com/ByBrawe/opencode-loop/pull/165)), integrated with attribution in [#190](https://github.com/ByBrawe/opencode-loop/pull/190). Tests cover OpenTUI 0.5.14 and 0.7.0 rendering, session isolation and cleanup. Real remote/split-cache TUI auto-discovery remains unverified ([#191](https://github.com/ByBrawe/opencode-loop/issues/191)).
- Make Loop **independently installable and releasable**: remove the old `--with-goals` and `--with-loop-goals` coupled modes; leave separately installed ByBrawe Goal untouched; eliminate Goal package dependency from Loop's npm release gates ([#194](https://github.com/ByBrawe/opencode-loop/pull/194)).
- Fix Loop uninstallation for explicitly selected `OPENCODE_CONFIG` files, preserve unrelated plugins/JSONC comments and keep project Loop history. Validate the actual shipped npm CLI's `--uninstall` behavior.
- On OpenCode 2.2+, use the built-in native Goal's read-only `opencode.goal` RPC to reserve active/paused sessions before Loop prompt admission. Preserve safety on unreadable Goal state; ignore orphaned ByBrawe Goal history when its plugin is confirmed absent ([#195](https://github.com/ByBrawe/opencode-loop/issues/195), [#196](https://github.com/ByBrawe/opencode-loop/pull/196)). Continue to recommend separate sessions for concurrent workflows.
- Remove unneeded V1 SDK *npm peer* from the standalone native V2 package, preventing dependency-resolution conflicts in clean npm installs; V1 compatibility remains explicitly tested through dev dependencies.
- **Scope:** Windows Desktop/Web GUI slash-command discovery ([#169](https://github.com/ByBrawe/opencode-loop/issues/169)), remote OpenTUI split-cache discovery (#191), and fully atomic native Goal/Loop scheduling are **not claimed resolved**.

## 0.6.9 - 2026-10-27

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ For work that must continue after the TUI/session closes, use `opencode-loopd`.

## Loop and optional Goal features

Loop works by itself. It does not install or manage other Goal plugins. **Do not run OpenCode 2.2.x's built-in `/goal` and a prompt-producing `/loop` in the same session yet.** The existing Loop reservation guard covers the separately installed ByBrawe Goal's on-disk state, **not** native OpenCode Goal's private storage/RPC. Native Goal overlap protection is tracked in [#195](https://github.com/ByBrawe/opencode-loop/issues/195). Recommended split:
Loop works by itself. It does not install or manage other Goal plugins. **Use separate sessions for native `/goal` and prompt-producing `/loop` whenever practical.** On OpenCode 2.2.x, Loop checks the built-in Goal's **public, read-only `opencode.goal` RPC** before admitting an autonomous turn and again immediately before dispatch; an active/paused native Goal reserves the session. A separately installed ByBrawe Goal keeps its own guard, but orphaned ByBrawe Goal files no longer block Loop when that package is confirmed uninstalled. Unavailable/unrecognized ownership states fail closed. This is a safety guard, not a claim that two independently scheduled agents can run atomically without races; host-level integration remains tracked in [#195](https://github.com/ByBrawe/opencode-loop/issues/195). Recommended split:

- use OpenCode's native **`/goal`** for a built-in objective workflow, or install ByBrawe Goal separately if its stronger evidence contracts are needed;
- use **`/loop`**, `/loop-command`, `/loop-shell`, and `opencode-loopd` for scheduling/repetition/background infrastructure.
Expand Down Expand Up @@ -467,7 +467,7 @@ For unattended work, avoid permanently allowing every shell command. Grant routi

Native OpenCode 2 is the default supported package path for `0.6.9`. The production dependency is pinned to `@opencode/plugin@2.0.22`; the explicit legacy V1 compatibility path retains `@opencode-ai/plugin >=1.4.0 <2`. Do **not** mistake the legacy V1 peer range for the V2 runtime API version.

Automated release gates cover native V2 packages, Windows/Linux regressions and real OpenCode 2 host command registration/coexistence with the separately installed Goal plugin. **Windows Desktop GUI slash-command discovery is not yet proven equivalent to CLI TUI**; see [#169](https://github.com/ByBrawe/opencode-loop/issues/169) and the [diagnostic guide](docs/OPENCODE2-DESKTOP-WINDOWS.md). Platform gaps are tracked in [#177](https://github.com/ByBrawe/opencode-loop/issues/177).
Automated release gates cover standalone native V2 packaging, Windows/Linux regressions, and real OpenCode 2 host command registration. Separate legacy ByBrawe Goal coexistence remains an optional compatibility test: it is **not** a Loop runtime, installation, update, or npm publication dependency. Native OpenCode 2.2+ `/goal` is checked read-only via the public Goal RPC immediately before autonomous Loop admission. **Windows Desktop GUI slash-command discovery is not yet proven equivalent to CLI TUI**; see [#169](https://github.com/ByBrawe/opencode-loop/issues/169) and the [diagnostic guide](docs/OPENCODE2-DESKTOP-WINDOWS.md). Platform gaps are tracked in [#177](https://github.com/ByBrawe/opencode-loop/issues/177).

See [docs/SCHEDULING.md](./docs/SCHEDULING.md) for the scheduling contract and [CHANGELOG.md](./CHANGELOG.md) for release history.

Expand Down
28 changes: 28 additions & 0 deletions examples/OPENCODE2-0.6.10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# OpenCode Loop 0.6.10 — standalone native OpenCode 2 release

Released after exact-main CI and registry verification only. Source merge or a passing PR is **not** proof that npm publication completed.

## What's new
- **Independent Loop**: `npx -y @bybrawe/opencode-loop@0.6.10` installs Loop only, and `--uninstall` unregisters Loop only. `--with-goals` and `--with-loop-goals` now return an error before changing config. The separate `@bybrawe/opencode-goal` package is not installed, updated or removed by Loop.
- **Native OpenCode Goal 2.2.x safety**: when a built-in `/goal` is active or paused, Loop uses the host's public, read-only `opencode.goal` RPC to defer autonomous Loop admission in that session. Unknown states fail closed. The previous ByBrawe Goal's on-disk guard remains for installed clients; old files do not reserve sessions after that package is confirmed absent. These checks mitigate overlap but do not constitute an atomic scheduling guarantee; use separate sessions for separate autonomous jobs.
- **Native read-only TUI sidebar**: status RPC, session switching, safe read-only status rendering. Thanks to **[@zhek](https://github.com/zhek)** for the original [#165](https://github.com/ByBrawe/opencode-loop/pull/165) contribution, integrated as [#190](https://github.com/ByBrawe/opencode-loop/pull/190).
- **Cleaner installation**: explicit `OPENCODE_CONFIG` override recognized on removal; JSONC user comments and unrelated plugins preserved; dropped unnecessary V1-SDK npm peer to prevent clean consumer resolver conflicts.

## Install or remove

```powershell
npx -y @bybrawe/opencode-loop@0.6.10
# Later, if desired:
npx -y @bybrawe/opencode-loop@0.6.10 --uninstall
```

Quit and reopen the OpenCode backend, then check `/loop-doctor` and `/loop-status` in the same project/workspace. If an explicit config is used, set `OPENCODE_CONFIG` or `OPENCODE_CONFIG_DIR` accordingly when removing. Project history under `.opencode/opencode-loop` is preserved.

OpenCode 2.2.x has a built-in `/goal`; seeing it after uninstalling our third-party Goal is expected and does not mean the removed package is still present.

## Explicit limitations
- The Loop TUI sidebar has OpenTUI 0.5.14/0.7.0 render tests, but **remote/split-cache CLI auto-discovery** is still tracked upstream and in [#191](https://github.com/ByBrawe/opencode-loop/issues/191). Its absence must never stop the scheduler.
- Windows Desktop/Web GUI native slash-command discovery is **not proven** ([#169](https://github.com/ByBrawe/opencode-loop/issues/169)); the OpenTUI renderer is not the Desktop GUI.
- Multi-agent Goal/Loop scheduling is not atomic across independent plugins; avoid running both autonomous engines in the same session.
- Historical `v0.6.6` tag permission issue [#168](https://github.com/ByBrawe/opencode-loop/issues/168) is separate release bookkeeping and is not silently claimed fixed.
- Publication must pass strict clean npm consumer, package manifest, source-to-Bun-bundle parity, Windows/Linux/macOS host test and immutable npm registry identity gates.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@bybrawe/opencode-loop",
"version": "0.6.9",
"version": "0.6.10",
"description": "Idle-safe /loop scheduling and background automation for OpenCode; standalone installation without Goal package dependencies.",
"type": "module",
"main": "src/plugin.js",
Expand Down
Loading
Loading