@bybrawe/opencode-loop 0.5.15 → 0.5.17
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 +17 -0
- package/README.md +34 -13
- package/agents/opencode-loop-local.md +10 -0
- package/commands/loop-ask.md +1 -0
- package/commands/loop-clear.md +1 -0
- package/commands/loop-cmd.md +1 -0
- package/commands/loop-command.md +1 -0
- package/commands/loop-compact.md +1 -0
- package/commands/loop-dev.md +1 -0
- package/commands/loop-doctor.md +1 -0
- package/commands/loop-export.md +1 -0
- package/commands/loop-goal-blocked.md +1 -0
- package/commands/loop-goal-clear.md +1 -0
- package/commands/loop-goal-done.md +1 -0
- package/commands/loop-goal-pause.md +1 -0
- package/commands/loop-goal-resume.md +1 -0
- package/commands/loop-goal-status.md +1 -0
- package/commands/loop-goal.md +1 -0
- package/commands/loop-help.md +1 -0
- package/commands/loop-init.md +1 -0
- package/commands/loop-logs.md +1 -0
- package/commands/loop-now.md +1 -0
- package/commands/loop-pause.md +1 -0
- package/commands/loop-progress.md +1 -0
- package/commands/loop-prompt.md +1 -0
- package/commands/loop-remove.md +1 -0
- package/commands/loop-resume.md +1 -0
- package/commands/loop-safe-dev.md +1 -0
- package/commands/loop-shell.md +1 -0
- package/commands/loop-status.md +1 -0
- package/commands/loop-stop.md +1 -0
- package/commands/loop-testfix.md +1 -0
- package/commands/loop.md +1 -0
- package/package.json +6 -5
- package/scripts/comprehensive-test.mjs +455 -0
- package/scripts/install-node.mjs +100 -4
- package/scripts/install-test.mjs +86 -0
- package/scripts/install.ps1 +6 -32
- package/scripts/install.sh +6 -34
- package/scripts/smoke-test.mjs +45 -2
- package/src/index.js +297 -41
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.17
|
|
4
|
+
|
|
5
|
+
- Prevented OpenCode project bootstrap deadlocks by deferring local SDK logging and session discovery until after plugin hooks are returned.
|
|
6
|
+
- Added a tool-denied `opencode-loop-local` command agent for all 30 slash commands, preventing local status/control commands from spawning tools or background subagents; scheduled work restores the normal agent/model context.
|
|
7
|
+
- Made the installer detect package-based plugin configuration in JSON or JSONC and remove duplicate local plugin copies instead of loading two schedulers.
|
|
8
|
+
- Fixed watched jobs so file changes actually trigger them, while unchanged paths remain dormant.
|
|
9
|
+
- Fixed preset parsing for explicit `0s`, flag-only presets, and custom `/loop-testfix` commands.
|
|
10
|
+
- Fixed command-event deduplication so compatibility events are suppressed without swallowing intentional repeated commands.
|
|
11
|
+
- Hardened safe shell detection for PowerShell and `rm` variants, removed the `npm run format` false positive, and paused invalid synchronous actions instead of retrying them indefinitely.
|
|
12
|
+
- Added comprehensive parser, preset, lifecycle, watch, safety, routing, goal, installer, JSONC, and initialization regression coverage.
|
|
13
|
+
|
|
14
|
+
## 0.5.16
|
|
15
|
+
|
|
16
|
+
- Treat active OpenCode tools, shell calls, and foreground or background subtasks as busy even if the parent session receives an idle/status event while they are still running.
|
|
17
|
+
- Prevent stale active-run recovery from finalizing a loop turn while any tracked tool call remains active.
|
|
18
|
+
- Added regression coverage proving that a due loop waits for long-running tools and background child sessions, then resumes only after that work finishes and the parent session becomes idle.
|
|
19
|
+
|
|
3
20
|
## 0.5.15
|
|
4
21
|
|
|
5
22
|
- Hardened experimental Goal Mode completion: agent tool completion now requires concrete evidence instead of accepting empty or generic claims.
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ v0.5.11 includes a referenced heartbeat scheduler. This is important in OpenCode
|
|
|
16
16
|
|
|
17
17
|
## Current status
|
|
18
18
|
|
|
19
|
-
**v0.5.
|
|
19
|
+
**v0.5.17 hardens command, installer, and scheduler behavior around the v0.5.16 busy-detection fix.** Long-running tools and child sessions remain authoritative busy signals. Local `/loop-*` commands now use a tool-denied acknowledgement agent, scheduled work restores the normal agent/model context, package/local duplicate loading is prevented, watched jobs fire correctly, and preset/safe-shell edge cases have regression coverage.
|
|
20
20
|
|
|
21
21
|
The known update-related symptoms from older builds are fixed:
|
|
22
22
|
|
|
@@ -32,14 +32,14 @@ The known update-related symptoms from older builds are fixed:
|
|
|
32
32
|
|
|
33
33
|
The TUI loop is still intentionally session-bound: it runs while OpenCode is open and the current session emits status/idle events. For long-running background work after closing the terminal or OpenCode, use `opencode-loopd`.
|
|
34
34
|
|
|
35
|
-
## v0.5.
|
|
35
|
+
## v0.5.17 quick behavior guide
|
|
36
36
|
|
|
37
37
|
OpenCode Loop has two triggers now:
|
|
38
38
|
|
|
39
39
|
1. **Idle/status events** from OpenCode. These are used when OpenCode finishes a turn.
|
|
40
40
|
2. **A real due timer** inside the plugin. This wakes delayed jobs even when no new OpenCode event happens.
|
|
41
41
|
|
|
42
|
-
All TUI jobs are still idle-safe. If the timer expires while OpenCode is busy, the job does not interrupt the active turn. It waits and retries until the session becomes idle.
|
|
42
|
+
All TUI jobs are still idle-safe. If the timer expires while OpenCode is busy, or while a tool/background child session is still executing, the job does not interrupt the active turn. It waits and retries until that work finishes and the parent session becomes idle.
|
|
43
43
|
|
|
44
44
|
Simple examples:
|
|
45
45
|
|
|
@@ -79,7 +79,7 @@ Run a shell command every 10 minutes when idle.
|
|
|
79
79
|
|
|
80
80
|
Experimental persistent goal mode: keep working until the goal is complete, blocked, paused, cleared, or a safety limit is reached.
|
|
81
81
|
|
|
82
|
-
> Note: OpenCode custom command markdown still creates
|
|
82
|
+
> Note: OpenCode custom command markdown still creates an assistant turn for slash commands. v0.5.17 routes that acknowledgement through the installed `opencode-loop-local` agent, which denies tools and subagents. The real scheduled iteration explicitly restores the normal coding agent/model, so a status or control command cannot launch background exploration or leave later loop work tool-disabled.
|
|
83
83
|
|
|
84
84
|
## Why this exists
|
|
85
85
|
|
|
@@ -157,14 +157,14 @@ Use the npm installer from any shell: Windows PowerShell, Windows CMD, macOS, or
|
|
|
157
157
|
npx -y @bybrawe/opencode-loop@latest
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
The installer copies the
|
|
161
|
-
It also removes the old local `opencode-loop.js` copy from earlier releases so only the current local `opencode-loop.ts` plugin remains.
|
|
160
|
+
The installer copies the slash command files and the tool-denied local command agent into your OpenCode config directory. If `@bybrawe/opencode-loop` is already present in the OpenCode `plugin` array, that package entry remains authoritative and the installer removes duplicate local plugin copies. Otherwise it installs `opencode-loop.ts` locally and ensures the config directory has the `@opencode-ai/plugin` dependency required by `tool()`.
|
|
162
161
|
|
|
163
162
|
Windows target paths:
|
|
164
163
|
|
|
165
164
|
```text
|
|
166
165
|
%USERPROFILE%\.config\opencode\plugins\opencode-loop.ts
|
|
167
166
|
%USERPROFILE%\.config\opencode\commands\loop*.md
|
|
167
|
+
%USERPROFILE%\.config\opencode\agents\opencode-loop-local.md
|
|
168
168
|
```
|
|
169
169
|
|
|
170
170
|
macOS / Linux target paths:
|
|
@@ -172,6 +172,7 @@ macOS / Linux target paths:
|
|
|
172
172
|
```text
|
|
173
173
|
~/.config/opencode/plugins/opencode-loop.ts
|
|
174
174
|
~/.config/opencode/commands/loop*.md
|
|
175
|
+
~/.config/opencode/agents/opencode-loop-local.md
|
|
175
176
|
```
|
|
176
177
|
|
|
177
178
|
Then fully restart OpenCode and run:
|
|
@@ -195,9 +196,9 @@ The `npx` installer installs both parts:
|
|
|
195
196
|
|
|
196
197
|
- the OpenCode plugin file
|
|
197
198
|
- the `/loop-*` command markdown files
|
|
199
|
+
- the tool-denied `opencode-loop-local` acknowledgement agent
|
|
198
200
|
|
|
199
|
-
|
|
200
|
-
Do not use the config package entry and the local `npx`-installed plugin at the same time unless you intentionally want to test duplicate plugin loading.
|
|
201
|
+
The installer automatically avoids loading both the package entry and a local plugin copy. It can therefore be rerun safely after switching installation styles.
|
|
201
202
|
|
|
202
203
|
### Optional: OpenCode config package entry
|
|
203
204
|
|
|
@@ -220,7 +221,7 @@ If `/loop` does not appear after using only the config method, run the installer
|
|
|
220
221
|
npx -y @bybrawe/opencode-loop
|
|
221
222
|
```
|
|
222
223
|
|
|
223
|
-
If you later
|
|
224
|
+
If you later remove `@bybrawe/opencode-loop` from the `plugin` array, rerun the installer so it restores the local plugin copy.
|
|
224
225
|
|
|
225
226
|
### Install from GitHub
|
|
226
227
|
|
|
@@ -257,16 +258,19 @@ Windows PowerShell:
|
|
|
257
258
|
```powershell
|
|
258
259
|
mkdir "$env:USERPROFILE\.config\opencode\plugins" -Force
|
|
259
260
|
mkdir "$env:USERPROFILE\.config\opencode\commands" -Force
|
|
261
|
+
mkdir "$env:USERPROFILE\.config\opencode\agents" -Force
|
|
260
262
|
copy .\src\index.js "$env:USERPROFILE\.config\opencode\plugins\opencode-loop.ts"
|
|
261
263
|
copy .\commands\*.md "$env:USERPROFILE\.config\opencode\commands\"
|
|
264
|
+
copy .\agents\*.md "$env:USERPROFILE\.config\opencode\agents\"
|
|
262
265
|
```
|
|
263
266
|
|
|
264
267
|
macOS / Linux:
|
|
265
268
|
|
|
266
269
|
```bash
|
|
267
|
-
mkdir -p ~/.config/opencode/plugins ~/.config/opencode/commands
|
|
270
|
+
mkdir -p ~/.config/opencode/plugins ~/.config/opencode/commands ~/.config/opencode/agents
|
|
268
271
|
cp ./src/index.js ~/.config/opencode/plugins/opencode-loop.ts
|
|
269
272
|
cp ./commands/*.md ~/.config/opencode/commands/
|
|
273
|
+
cp ./agents/*.md ~/.config/opencode/agents/
|
|
270
274
|
```
|
|
271
275
|
|
|
272
276
|
### Project-local install
|
|
@@ -274,9 +278,10 @@ cp ./commands/*.md ~/.config/opencode/commands/
|
|
|
274
278
|
Use this when you want the plugin to be available only inside one repository.
|
|
275
279
|
|
|
276
280
|
```bash
|
|
277
|
-
mkdir -p .opencode/plugins .opencode/commands
|
|
281
|
+
mkdir -p .opencode/plugins .opencode/commands .opencode/agents
|
|
278
282
|
cp ./src/index.js .opencode/plugins/opencode-loop.ts
|
|
279
283
|
cp ./commands/*.md .opencode/commands/
|
|
284
|
+
cp ./agents/*.md .opencode/agents/
|
|
280
285
|
```
|
|
281
286
|
|
|
282
287
|
On Windows PowerShell:
|
|
@@ -284,8 +289,10 @@ On Windows PowerShell:
|
|
|
284
289
|
```powershell
|
|
285
290
|
mkdir .opencode\plugins -Force
|
|
286
291
|
mkdir .opencode\commands -Force
|
|
292
|
+
mkdir .opencode\agents -Force
|
|
287
293
|
copy .\src\index.js .opencode\plugins\opencode-loop.ts
|
|
288
294
|
copy .\commands\*.md .opencode\commands\
|
|
295
|
+
copy .\agents\*.md .opencode\agents\
|
|
289
296
|
```
|
|
290
297
|
|
|
291
298
|
### Verify installation
|
|
@@ -302,7 +309,8 @@ If the commands do not appear:
|
|
|
302
309
|
1. Make sure OpenCode was fully restarted.
|
|
303
310
|
2. Check that `opencode-loop.ts` exists in the OpenCode plugin directory.
|
|
304
311
|
3. Check that `loop.md`, `loop-help.md`, and the other command files exist in the OpenCode commands directory.
|
|
305
|
-
4.
|
|
312
|
+
4. Check that `opencode-loop-local.md` exists in the OpenCode agents directory.
|
|
313
|
+
5. Run `npx -y @bybrawe/opencode-loop` again to reinstall the command and agent files.
|
|
306
314
|
|
|
307
315
|
## Quick start
|
|
308
316
|
|
|
@@ -352,7 +360,7 @@ Experimental goal mode: keep working until the objective is actually done, block
|
|
|
352
360
|
|
|
353
361
|
### What “when idle” means
|
|
354
362
|
|
|
355
|
-
OpenCode Loop is idle-safe. It does **not** intentionally start a new agent turn while OpenCode is already busy.
|
|
363
|
+
OpenCode Loop is idle-safe. It does **not** intentionally start a new agent turn while OpenCode is already busy. Active tool calls and running child sessions also count as busy, even if OpenCode emits a premature idle/status signal for the parent during long-running background work.
|
|
356
364
|
|
|
357
365
|
Example:
|
|
358
366
|
|
|
@@ -1112,6 +1120,19 @@ Improve the application in small safe steps.
|
|
|
1112
1120
|
|
|
1113
1121
|
## Changelog highlights
|
|
1114
1122
|
|
|
1123
|
+
### v0.5.17
|
|
1124
|
+
|
|
1125
|
+
- Added a tool-denied local command agent and restored the normal coding agent/model for scheduled iterations.
|
|
1126
|
+
- Prevented package/local duplicate plugin loading and deferred bootstrap SDK calls to avoid project startup deadlocks.
|
|
1127
|
+
- Fixed watched jobs, preset parsing, repeated-command deduplication, safe-shell patterns, and invalid-action retry storms.
|
|
1128
|
+
- Added comprehensive command, lifecycle, installer, JSONC, scheduler, and safety regression tests.
|
|
1129
|
+
|
|
1130
|
+
### v0.5.16
|
|
1131
|
+
|
|
1132
|
+
- Treat active tools, shell calls, and running foreground/background child sessions as busy even when the parent session appears idle.
|
|
1133
|
+
- Prevent stale-run recovery from enqueueing another continuation while tracked background work is still active.
|
|
1134
|
+
- Added regression tests for long-running tool calls and background child sessions.
|
|
1135
|
+
|
|
1115
1136
|
### v0.5.15
|
|
1116
1137
|
|
|
1117
1138
|
- Hardened experimental Goal Mode completion with concrete evidence, passing-check requirements, no-progress pausing, and user-message interruption.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Handles OpenCode Loop slash-command acknowledgements without tools.
|
|
3
|
+
mode: primary
|
|
4
|
+
permission:
|
|
5
|
+
"*": deny
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The OpenCode Loop plugin has already handled the slash command locally.
|
|
9
|
+
Never call tools, spawn subagents, inspect files, or perform additional work.
|
|
10
|
+
Reply exactly: OK
|
package/commands/loop-ask.md
CHANGED
package/commands/loop-clear.md
CHANGED
package/commands/loop-cmd.md
CHANGED
package/commands/loop-command.md
CHANGED
package/commands/loop-compact.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-dev.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-doctor.md
CHANGED
package/commands/loop-export.md
CHANGED
package/commands/loop-goal.md
CHANGED
package/commands/loop-help.md
CHANGED
package/commands/loop-init.md
CHANGED
package/commands/loop-logs.md
CHANGED
package/commands/loop-now.md
CHANGED
package/commands/loop-pause.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-prompt.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Schedule a recurring prompt loop. Usage: /loop-prompt 1h continue the project
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop prompt scheduler received. The OpenCode Loop plugin handles this recurring prompt locally. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-remove.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-resume.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop-shell.md
CHANGED
package/commands/loop-status.md
CHANGED
package/commands/loop-stop.md
CHANGED
package/commands/loop-testfix.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: OpenCode Loop plugin command.
|
|
3
|
+
agent: opencode-loop-local
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
Loop command received. The OpenCode Loop plugin handles this command. Do not explain this command, do not search the web, do not create scheduler files, and do not run extra shell commands because of this command.
|
package/commands/loop.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bybrawe/opencode-loop",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.17",
|
|
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/index.js",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"src",
|
|
12
12
|
"commands",
|
|
13
|
+
"agents",
|
|
13
14
|
"scripts",
|
|
14
15
|
"examples",
|
|
15
16
|
"README.md",
|
|
@@ -17,8 +18,8 @@
|
|
|
17
18
|
"CHANGELOG.md"
|
|
18
19
|
],
|
|
19
20
|
"scripts": {
|
|
20
|
-
"check": "node --check src/index.js && node --check scripts/install-node.mjs && node --check scripts/loopd.mjs && node --check scripts/smoke-test.mjs",
|
|
21
|
-
"test": "node scripts/smoke-test.mjs",
|
|
21
|
+
"check": "node --check src/index.js && node --check scripts/install-node.mjs && node --check scripts/loopd.mjs && node --check scripts/install-test.mjs && node --check scripts/smoke-test.mjs && node --check scripts/comprehensive-test.mjs",
|
|
22
|
+
"test": "node scripts/install-test.mjs && node scripts/smoke-test.mjs && node scripts/comprehensive-test.mjs",
|
|
22
23
|
"install:global": "node scripts/install-node.mjs",
|
|
23
24
|
"pack:zip": "node scripts/make-zip.mjs"
|
|
24
25
|
},
|
|
@@ -59,8 +60,8 @@
|
|
|
59
60
|
"@opencode-ai/plugin": "^1.4.0"
|
|
60
61
|
},
|
|
61
62
|
"bin": {
|
|
62
|
-
"opencode-loop": "
|
|
63
|
-
"opencode-loopd": "
|
|
63
|
+
"opencode-loop": "scripts/install-node.mjs",
|
|
64
|
+
"opencode-loopd": "scripts/loopd.mjs"
|
|
64
65
|
},
|
|
65
66
|
"publishConfig": {
|
|
66
67
|
"access": "public"
|