From 4414a3751adb4b662fd364e267688082baf97b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20TEKTA=C5=9E?= Date: Sat, 22 Aug 2026 12:47:40 +0300 Subject: [PATCH 1/3] ci: add one-shot 0.5.34 release metadata prep --- .github/workflows/prepare-0.5.34-once.yml | 72 +++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/prepare-0.5.34-once.yml diff --git a/.github/workflows/prepare-0.5.34-once.yml b/.github/workflows/prepare-0.5.34-once.yml new file mode 100644 index 0000000..4febc75 --- /dev/null +++ b/.github/workflows/prepare-0.5.34-once.yml @@ -0,0 +1,72 @@ +name: One-shot 0.5.34 release metadata prep + +on: + push: + branches: + - release/0.5.34-prep + paths: + - .github/workflows/prepare-0.5.34-once.yml + +permissions: + contents: write + +jobs: + prepare: + if: github.repository == 'ByBrawe/opencode-loop' && github.ref == 'refs/heads/release/0.5.34-prep' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + with: + persist-credentials: true + - name: Update release metadata and docs + shell: bash + run: | + node <<'NODE' + const fs = require('fs') + const version = '0.5.34' + + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')) + pkg.version = version + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n') + + const lock = JSON.parse(fs.readFileSync('package-lock.json', 'utf8')) + lock.version = version + if (lock.packages && lock.packages['']) lock.packages[''].version = version + fs.writeFileSync('package-lock.json', JSON.stringify(lock, null, 2) + '\n') + + let readme = fs.readFileSync('README.md', 'utf8') + const stableLine = /\*\*Current stable release: `0\.5\.33`\.\*\*[^\n]*/ + if (!stableLine.test(readme)) throw new Error('README stable-version marker not found') + readme = readme.replace(stableLine, '**Current stable release: `0.5.34`.**') + fs.writeFileSync('README.md', readme) + + let changelog = fs.readFileSync('CHANGELOG.md', 'utf8') + if (!changelog.includes('## 0.5.34')) { + const marker = '# Changelog\n\n' + if (!changelog.startsWith(marker)) throw new Error('CHANGELOG header not found') + const entry = `## 0.5.34\n\n- Make plain \`/loop \` the ergonomic unlimited idle-continuation form: when the assistant stops and the session is safely idle, Loop sends the prompt again. Add explicit \`idle\`, recurring \`every \`, and one-shot \`after/in \` schedule grammar while preserving legacy duration-first commands.\n- Treat short continuation prompts such as \`continue\`, \`keep going\`, and \`devam et\` as continuation of the current repository/conversation, with guidance to inspect relevant files, TODO/progress state, recent changes, and git status before choosing the next unfinished step.\n- Fix the pre-first-run stale OpenCode \`busy/retry\` failure mode that could leave an enabled immediate Loop at \`runCount=0\`: recover only when the latest assistant tail is actually completed and no active tool or busy child session exists.\n- Add throttled busy-deferral logging, schedule/state detail in \`/loop-status\`, and cross-session persisted-job diagnostics in \`/loop-doctor\` so due work explains why it is waiting instead of leaving only an \`add\` log record.\n- Prevent prompt-producing Loop jobs from competing with an active dedicated \`/goal\` continuation owner in the same session by default; advanced users can opt in explicitly with \`--allow-goal-overlap\`.\n- Centralize due/admission semantics in a shared schedule-policy runtime and split schedule syntax, continuation guidance, scheduler diagnostics, companion-Goal detection, and Loop diagnostics into focused modules. Keep the committed single-file stable bundle synchronized and add a permanent Bundle Gate check that fails when \`src/index.js\` is stale.\n- Rewrite the scheduling documentation, add \`docs/SCHEDULING.md\`, and extend real OpenCode host coverage so Ubuntu and Windows prove a durationless \`/loop --max-runs 3 devam et\` performs exactly three autonomous turns and stops at the configured limit.\n\n` + changelog = marker + entry + changelog.slice(marker.length) + fs.writeFileSync('CHANGELOG.md', changelog) + } + NODE + - name: Require release-only diff + shell: bash + run: | + CHANGED="$(git diff --name-only | sort)" + EXPECTED="CHANGELOG.md + README.md + package-lock.json + package.json" + if [ "$CHANGED" != "$EXPECTED" ]; then + echo "Unexpected release metadata diff:" + printf '%s\n' "$CHANGED" + exit 1 + fi + - name: Commit release metadata + shell: bash + run: | + git config user.name "OpenCode Loop CI" + git config user.email "opencode-loop-ci@example.invalid" + git add CHANGELOG.md README.md package.json package-lock.json + git commit -m "chore: prepare 0.5.34 release metadata" + git push origin HEAD:release/0.5.34-prep From 799e8d6c40457ba7f69b8a60d0677f54da277c83 Mon Sep 17 00:00:00 2001 From: OpenCode Loop CI Date: Sat, 22 Aug 2026 09:47:51 +0000 Subject: [PATCH 2/3] chore: prepare 0.5.34 release metadata --- CHANGELOG.md | 10 ++++++++++ README.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ce8940..25bb2dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.5.34 + +- Make plain `/loop ` the ergonomic unlimited idle-continuation form: when the assistant stops and the session is safely idle, Loop sends the prompt again. Add explicit `idle`, recurring `every `, and one-shot `after/in ` schedule grammar while preserving legacy duration-first commands. +- Treat short continuation prompts such as `continue`, `keep going`, and `devam et` as continuation of the current repository/conversation, with guidance to inspect relevant files, TODO/progress state, recent changes, and git status before choosing the next unfinished step. +- Fix the pre-first-run stale OpenCode `busy/retry` failure mode that could leave an enabled immediate Loop at `runCount=0`: recover only when the latest assistant tail is actually completed and no active tool or busy child session exists. +- Add throttled busy-deferral logging, schedule/state detail in `/loop-status`, and cross-session persisted-job diagnostics in `/loop-doctor` so due work explains why it is waiting instead of leaving only an `add` log record. +- Prevent prompt-producing Loop jobs from competing with an active dedicated `/goal` continuation owner in the same session by default; advanced users can opt in explicitly with `--allow-goal-overlap`. +- Centralize due/admission semantics in a shared schedule-policy runtime and split schedule syntax, continuation guidance, scheduler diagnostics, companion-Goal detection, and Loop diagnostics into focused modules. Keep the committed single-file stable bundle synchronized and add a permanent Bundle Gate check that fails when `src/index.js` is stale. +- Rewrite the scheduling documentation, add `docs/SCHEDULING.md`, and extend real OpenCode host coverage so Ubuntu and Windows prove a durationless `/loop --max-runs 3 devam et` performs exactly three autonomous turns and stops at the configured limit. + ## 0.5.33 - Complete the post-0.5.32 stable V1 source decomposition by extracting action dispatch, run admission, and post-turn finalization from the executor into focused runtime modules while preserving scheduler behavior and dependency-injection compatibility. diff --git a/README.md b/README.md index 298ddb0..9cde09c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ OpenCode Loop adds `/loop`, scheduled prompt/command/shell jobs, compact scheduling, verification/checkpoints, and the `opencode-loopd` background daemon. -> **Current stable release: `0.5.33`.** The scheduling changes documented on this branch are planned for the next release. Loop still includes an older experimental `/loop-goal` mode for compatibility; for strong persistent Goal contracts and host-verified completion, use the separate **OpenCode Goals** plugin. +> **Current stable release: `0.5.34`.** ## Install or update diff --git a/package-lock.json b/package-lock.json index 117829c..fc0ae4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bybrawe/opencode-loop", - "version": "0.5.33", + "version": "0.5.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bybrawe/opencode-loop", - "version": "0.5.33", + "version": "0.5.34", "license": "MIT", "bin": { "opencode-loop": "scripts/install-with-goals.mjs", diff --git a/package.json b/package.json index 78549db..4a3df0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bybrawe/opencode-loop", - "version": "0.5.33", + "version": "0.5.34", "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.", "type": "module", "main": "src/index.js", From 28e548278031a28c385f4a8b9552c63e008b49e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20TEKTA=C5=9E?= Date: Sat, 22 Aug 2026 12:48:17 +0300 Subject: [PATCH 3/3] ci: remove one-shot 0.5.34 release prep --- .github/workflows/prepare-0.5.34-once.yml | 72 ----------------------- 1 file changed, 72 deletions(-) delete mode 100644 .github/workflows/prepare-0.5.34-once.yml diff --git a/.github/workflows/prepare-0.5.34-once.yml b/.github/workflows/prepare-0.5.34-once.yml deleted file mode 100644 index 4febc75..0000000 --- a/.github/workflows/prepare-0.5.34-once.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: One-shot 0.5.34 release metadata prep - -on: - push: - branches: - - release/0.5.34-prep - paths: - - .github/workflows/prepare-0.5.34-once.yml - -permissions: - contents: write - -jobs: - prepare: - if: github.repository == 'ByBrawe/opencode-loop' && github.ref == 'refs/heads/release/0.5.34-prep' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - with: - persist-credentials: true - - name: Update release metadata and docs - shell: bash - run: | - node <<'NODE' - const fs = require('fs') - const version = '0.5.34' - - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')) - pkg.version = version - fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n') - - const lock = JSON.parse(fs.readFileSync('package-lock.json', 'utf8')) - lock.version = version - if (lock.packages && lock.packages['']) lock.packages[''].version = version - fs.writeFileSync('package-lock.json', JSON.stringify(lock, null, 2) + '\n') - - let readme = fs.readFileSync('README.md', 'utf8') - const stableLine = /\*\*Current stable release: `0\.5\.33`\.\*\*[^\n]*/ - if (!stableLine.test(readme)) throw new Error('README stable-version marker not found') - readme = readme.replace(stableLine, '**Current stable release: `0.5.34`.**') - fs.writeFileSync('README.md', readme) - - let changelog = fs.readFileSync('CHANGELOG.md', 'utf8') - if (!changelog.includes('## 0.5.34')) { - const marker = '# Changelog\n\n' - if (!changelog.startsWith(marker)) throw new Error('CHANGELOG header not found') - const entry = `## 0.5.34\n\n- Make plain \`/loop \` the ergonomic unlimited idle-continuation form: when the assistant stops and the session is safely idle, Loop sends the prompt again. Add explicit \`idle\`, recurring \`every \`, and one-shot \`after/in \` schedule grammar while preserving legacy duration-first commands.\n- Treat short continuation prompts such as \`continue\`, \`keep going\`, and \`devam et\` as continuation of the current repository/conversation, with guidance to inspect relevant files, TODO/progress state, recent changes, and git status before choosing the next unfinished step.\n- Fix the pre-first-run stale OpenCode \`busy/retry\` failure mode that could leave an enabled immediate Loop at \`runCount=0\`: recover only when the latest assistant tail is actually completed and no active tool or busy child session exists.\n- Add throttled busy-deferral logging, schedule/state detail in \`/loop-status\`, and cross-session persisted-job diagnostics in \`/loop-doctor\` so due work explains why it is waiting instead of leaving only an \`add\` log record.\n- Prevent prompt-producing Loop jobs from competing with an active dedicated \`/goal\` continuation owner in the same session by default; advanced users can opt in explicitly with \`--allow-goal-overlap\`.\n- Centralize due/admission semantics in a shared schedule-policy runtime and split schedule syntax, continuation guidance, scheduler diagnostics, companion-Goal detection, and Loop diagnostics into focused modules. Keep the committed single-file stable bundle synchronized and add a permanent Bundle Gate check that fails when \`src/index.js\` is stale.\n- Rewrite the scheduling documentation, add \`docs/SCHEDULING.md\`, and extend real OpenCode host coverage so Ubuntu and Windows prove a durationless \`/loop --max-runs 3 devam et\` performs exactly three autonomous turns and stops at the configured limit.\n\n` - changelog = marker + entry + changelog.slice(marker.length) - fs.writeFileSync('CHANGELOG.md', changelog) - } - NODE - - name: Require release-only diff - shell: bash - run: | - CHANGED="$(git diff --name-only | sort)" - EXPECTED="CHANGELOG.md - README.md - package-lock.json - package.json" - if [ "$CHANGED" != "$EXPECTED" ]; then - echo "Unexpected release metadata diff:" - printf '%s\n' "$CHANGED" - exit 1 - fi - - name: Commit release metadata - shell: bash - run: | - git config user.name "OpenCode Loop CI" - git config user.email "opencode-loop-ci@example.invalid" - git add CHANGELOG.md README.md package.json package-lock.json - git commit -m "chore: prepare 0.5.34 release metadata" - git push origin HEAD:release/0.5.34-prep