@bybrawe/opencode-loop 0.5.0 → 0.5.4

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/README.md CHANGED
@@ -1,91 +1,292 @@
1
- # OpenCode Loop
2
-
3
- **Claude Code style auto-continue for OpenCode.**
4
-
5
- OpenCode Loop adds a practical `/loop` command to OpenCode so an agent can keep working after each idle turn instead of waiting for you to type “continue” again. It is useful for long coding sessions, `progress.md` workflows, TODO automation, test-fix loops, periodic `/compact`, checkpoints, and safe autonomous development.
6
-
7
- Repository: **ByBrawe/opencode-loop**
8
- NPM package name: **@bybrawe/opencode-loop**
9
-
10
- ## Why this exists
11
-
12
- Claude Code users often rely on a loop-like workflow where the agent finishes one step, then immediately continues with the next step. OpenCode is powerful, but long-running autonomous workflows usually need extra control around:
13
-
14
- - auto-continue after idle
15
- - compact / summarize scheduling
16
- - `progress.md` and TODO-driven development
17
- - test verification after each turn
18
- - patch checkpoints
19
- - maximum runtime limits
20
- - failure limits
21
- - safety prompts and destructive command guards
22
-
23
- OpenCode Loop is designed for developers searching for:
24
-
25
- - OpenCode loop
26
- - OpenCode Claude Code loop
27
- - OpenCode auto continue
28
- - OpenCode continue automatically
29
- - OpenCode `/loop` command
30
- - OpenCode compact scheduler
31
- - OpenCode Ralph loop alternative
32
- - Claude Code style loop for OpenCode
33
- - autonomous coding loop for OpenCode
34
- - progress.md TODO automation for OpenCode
35
-
36
- ## Features
37
-
38
- > Note: The TUI `/loop` command is session-bound. It runs while OpenCode is open and the session receives idle events. If the terminal closes, the machine sleeps, the process is killed, or the provider connection is lost for a long time, the TUI loop cannot continue in the background. For long-running loops, use `opencode-loopd` daemon mode.
39
-
40
-
1
+ # OpenCode Loop
2
+
3
+ **Claude Code style auto-continue for OpenCode.**
4
+
5
+ OpenCode Loop adds a practical `/loop` command and `opencode-loopd` daemon to OpenCode so an agent can keep working after each idle turn instead of waiting for you to type “continue” again.
6
+
7
+ It is useful for long coding sessions, `progress.md` workflows, TODO automation, test-fix loops, periodic `/compact`, checkpoints, safe autonomous development, and background OpenCode continuation jobs.
8
+
9
+ Repository: **ByBrawe/opencode-loop**
10
+ NPM package name: **@bybrawe/opencode-loop**
11
+
12
+ ## Current status
13
+
14
+ **v0.5.4 fixes the recent OpenCode update compatibility issue.** OpenCode Loop has been updated for the current OpenCode SDK/TUI call shape and idle/status behavior. The TUI loop now waits for the session to become idle, debounces idle events, and avoids starting a new run while OpenCode is still busy or queued.
15
+
16
+ The known update-related symptoms from older builds are fixed:
17
+
18
+ - `/loop` looks queued but the job stays at `runs=0`
19
+ - a loop job is replaced but does not fire after OpenCode becomes idle
20
+ - repeated `/loop` commands create confusing queued turns
21
+ - prompt, shell, or toast calls silently fail after OpenCode SDK changes
22
+ - intermittent `Tool execution aborted` behavior caused by triggering a new turn too early
23
+
24
+ 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`.
25
+
26
+ ## Why this exists
27
+
28
+ Claude Code users often rely on a loop-like workflow where the agent finishes one step, then immediately continues with the next step.
29
+
30
+ OpenCode is powerful, but long-running autonomous workflows usually need extra control around:
31
+
32
+ - auto-continue after idle
33
+ - compact / summarize scheduling
34
+ - `progress.md` and TODO-driven development
35
+ - test verification after each turn
36
+ - patch checkpoints
37
+ - maximum runtime limits
38
+ - failure limits
39
+ - background daemon execution
40
+ - Windows Task Scheduler support
41
+ - safety prompts and destructive command guards
42
+
43
+ OpenCode Loop is designed for developers searching for:
44
+
45
+ - OpenCode loop
46
+ - OpenCode Claude Code loop
47
+ - OpenCode auto continue
48
+ - OpenCode continue automatically
49
+ - OpenCode `/loop` command
50
+ - OpenCode compact scheduler
51
+ - OpenCode Ralph loop alternative
52
+ - Claude Code style loop for OpenCode
53
+ - autonomous coding loop for OpenCode
54
+ - progress.md TODO automation for OpenCode
55
+ - OpenCode background daemon
56
+ - OpenCode loop daemon
57
+ - OpenCode Windows Task Scheduler loop
58
+
59
+ ## Features
60
+
61
+ > The TUI `/loop` command is session-bound. It runs while OpenCode is open and the session receives idle/status events. If the terminal closes, the machine sleeps, the process is killed, or the provider connection is lost for a long time, the TUI loop cannot continue in the background. For long-running loops, use `opencode-loopd` daemon mode.
62
+
41
63
  - **Claude Code style auto-continue** with `/loop 0s ...`.
42
- - **Background daemon mode** with `opencode-loopd` for long-running loops outside the OpenCode TUI.
43
- - **Interval loops** for prompts, slash commands, and shell commands.
44
- - **Prompt-file support** with `--prompt-file loop-prompt.md` for long reusable instructions.
45
- - **Include extra context files** with `--include-file`.
46
- - **progress.md workflow** with `--progress-file progress.md`.
47
- - **Large TODO support** with `--batch`.
48
- - **Compact scheduling** with `/loop 200m /compact` or `--compact-every`.
49
- - **Verification loops** with `--verify "npm test"`.
50
- - **Preflight checks** with `--preflight "npm install"`.
51
- - **Post-run commands** with `--postrun`.
52
- - **Failure control** with `--max-failures` and `--pause-on-verify-fail`.
53
- - **Runtime control** with `--max-runtime 6h`.
54
- - **Checkpoints** with `--checkpoint-only` or `--git-checkpoint`.
55
- - **Safe mode** with `--safe` and prompt-level destructive command warnings.
56
- - **Branch setup** with `--branch ai-loop`.
57
- - **Stop controls** with `--stop-file STOP_LOOP`, `--until`, `/loop-stop`, `/loop-pause`, `/loop-resume`, and `/loop-remove`.
58
- - **Watch mode** with `--watch progress.md`.
59
- - **Diagnostics** with `/loop-doctor`.
60
- - **Starter progress file** with `/loop-init`.
61
- - **State export** with `/loop-export`.
62
-
63
- ## Quick start
64
-
65
- ```text
66
- /loop 0s continue from progress.md and implement the next unfinished TODO
67
- ```
68
-
69
- This is the closest behavior to a Claude Code CLI style loop: every time OpenCode becomes idle, the loop can send the next continuation prompt.
70
-
71
- A safer development loop:
72
-
73
- ```text
74
- /loop 0s --name dev --ask-never --safe --no-overlap --batch 5 --compact-every 200m --checkpoint-only --progress-file progress.md Treat progress.md as the main project state file. Continue with the next unfinished TODO, implement it, mark completed items with [x], add useful follow-up TODOs when you discover them, run tests/lint/build when available, and keep going while work remains.
75
- ```
76
-
77
- Periodic compact:
78
-
79
- ```text
80
- /loop 200m --name compact --no-now /compact
81
- ```
82
-
83
- Test-fix loop:
84
-
85
- ```text
86
- /loop 0s --name testfix --ask-never --safe --verify "npm test" Continue from progress.md. If tests fail, analyze the failure, fix it, and run the tests again.
87
- ```
88
-
64
+ - **TUI loop mode** with `/loop`, active while OpenCode is open.
65
+ - **Background daemon mode** with `opencode-loopd` for long-running loops outside the OpenCode TUI.
66
+ - **Windows Task Scheduler helper** with `opencode-loopd install-task`.
67
+ - **One-shot scheduled runs** for periodic continuation jobs.
68
+ - **Interval loops** for prompts, slash commands, and shell commands.
69
+ - **Prompt-file support** with `--prompt-file loop-prompt.md` for long reusable instructions.
70
+ - **Prompt-file daemon support** with `opencode-loopd --prompt-file loop-prompt.md`.
71
+ - **Include extra context files** with `--include-file`.
72
+ - **progress.md workflow** with `--progress-file progress.md`.
73
+ - **Large TODO support** with `--batch`.
74
+ - **Compact scheduling** with `/loop 200m /compact` or `--compact-every`.
75
+ - **Verification loops** with `--verify "npm test"`.
76
+ - **Preflight checks** with `--preflight "npm install"`.
77
+ - **Post-run commands** with `--postrun`.
78
+ - **Failure control** with `--max-failures` and `--pause-on-verify-fail`.
79
+ - **Runtime control** with `--max-runtime 6h`.
80
+ - **Run limit support** with `--max-runs`.
81
+ - **Sleep-before-first-run support** with `--sleep-first`.
82
+ - **Checkpoints** with `--checkpoint-only` or `--git-checkpoint`.
83
+ - **Safe mode** with `--safe` and prompt-level destructive command warnings.
84
+ - **Branch setup** with `--branch ai-loop`.
85
+ - **Stop controls** with `--stop-file STOP_LOOP`, `--until`, `/loop-stop`, `/loop-pause`, `/loop-resume`, and `/loop-remove`.
86
+ - **Watch mode** with `--watch progress.md`.
87
+ - **Diagnostics** with `/loop-doctor`.
88
+ - **Starter progress file** with `/loop-init`.
89
+ - **State export** with `/loop-export`.
90
+
91
+ ## Installation
92
+
93
+ ### Recommended: install from npm
94
+
95
+ For a clean reinstall or upgrade, use the latest published package:
96
+
97
+ ```bash
98
+ npx -y @bybrawe/opencode-loop@latest
99
+ ```
100
+
101
+ Then fully restart OpenCode.
102
+
103
+ Install from npm with `npx`:
104
+
105
+ ```bash
106
+ npx -y @bybrawe/opencode-loop
107
+ ```
108
+
109
+ On Windows CMD:
110
+
111
+ ```bat
112
+ npx -y @bybrawe/opencode-loop
113
+ ```
114
+
115
+ On Windows PowerShell:
116
+
117
+ ```powershell
118
+ npx -y @bybrawe/opencode-loop
119
+ ```
120
+
121
+ The installer copies the plugin and slash command files into your OpenCode config directory.
122
+
123
+ Windows target paths:
124
+
125
+ ```text
126
+ %USERPROFILE%\.config\opencode\plugins\opencode-loop.js
127
+ %USERPROFILE%\.config\opencode\commands\loop*.md
128
+ ```
129
+
130
+ macOS / Linux target paths:
131
+
132
+ ```text
133
+ ~/.config/opencode/plugins/opencode-loop.js
134
+ ~/.config/opencode/commands/loop*.md
135
+ ```
136
+
137
+ Then fully restart OpenCode and run:
138
+
139
+ ```text
140
+ /loop-help
141
+ /loop-doctor
142
+ ```
143
+
144
+ The npm package also installs the `opencode-loopd` CLI for background loops:
145
+
146
+ ```bash
147
+ opencode-loopd --help
148
+ ```
149
+
150
+ ### Why `npx` is the recommended npm install
151
+
152
+ OpenCode can load npm plugins from the `plugin` array in `opencode.json`, but OpenCode slash commands are discovered from command definitions such as markdown files in a `commands/` directory or command entries in config.
153
+
154
+ The `npx` installer installs both parts:
155
+
156
+ - the OpenCode plugin file
157
+ - the `/loop-*` command markdown files
158
+
159
+ Use the OpenCode config-only method only if you already installed the command files separately or you are only testing plugin loading.
160
+
161
+ ### Optional: OpenCode config package entry
162
+
163
+ If you want OpenCode to load the npm plugin package directly, add the scoped package name to your OpenCode config:
164
+
165
+ ```json
166
+ {
167
+ "$schema": "https://opencode.ai/config.json",
168
+ "plugin": ["@bybrawe/opencode-loop"]
169
+ }
170
+ ```
171
+
172
+ Use the scoped package name exactly as shown.
173
+
174
+ `opencode-loop` without `@bybrawe/` is a different npm package name.
175
+
176
+ If `/loop` does not appear after using only the config method, run the installer once:
177
+
178
+ ```bash
179
+ npx -y @bybrawe/opencode-loop
180
+ ```
181
+
182
+ ### Install from GitHub
183
+
184
+ Use this if you want to install from source instead of npm.
185
+
186
+ Windows PowerShell:
187
+
188
+ ```powershell
189
+ git clone https://github.com/ByBrawe/opencode-loop.git
190
+ cd opencode-loop
191
+ powershell -ExecutionPolicy Bypass -File .\scripts\install.ps1
192
+ ```
193
+
194
+ macOS / Linux / Git Bash:
195
+
196
+ ```bash
197
+ git clone https://github.com/ByBrawe/opencode-loop.git
198
+ cd opencode-loop
199
+ chmod +x ./scripts/install.sh
200
+ ./scripts/install.sh
201
+ ```
202
+
203
+ Then restart OpenCode and run:
204
+
205
+ ```text
206
+ /loop-help
207
+ /loop-doctor
208
+ ```
209
+
210
+ ### Manual global install
211
+
212
+ Windows PowerShell:
213
+
214
+ ```powershell
215
+ mkdir "$env:USERPROFILE\.config\opencode\plugins" -Force
216
+ mkdir "$env:USERPROFILE\.config\opencode\commands" -Force
217
+ copy .\src\index.js "$env:USERPROFILE\.config\opencode\plugins\opencode-loop.js"
218
+ copy .\commands\*.md "$env:USERPROFILE\.config\opencode\commands\"
219
+ ```
220
+
221
+ macOS / Linux:
222
+
223
+ ```bash
224
+ mkdir -p ~/.config/opencode/plugins ~/.config/opencode/commands
225
+ cp ./src/index.js ~/.config/opencode/plugins/opencode-loop.js
226
+ cp ./commands/*.md ~/.config/opencode/commands/
227
+ ```
228
+
229
+ ### Project-local install
230
+
231
+ Use this when you want the plugin to be available only inside one repository.
232
+
233
+ ```bash
234
+ mkdir -p .opencode/plugins .opencode/commands
235
+ cp ./src/index.js .opencode/plugins/opencode-loop.js
236
+ cp ./commands/*.md .opencode/commands/
237
+ ```
238
+
239
+ On Windows PowerShell:
240
+
241
+ ```powershell
242
+ mkdir .opencode\plugins -Force
243
+ mkdir .opencode\commands -Force
244
+ copy .\src\index.js .opencode\plugins\opencode-loop.js
245
+ copy .\commands\*.md .opencode\commands\
246
+ ```
247
+
248
+ ### Verify installation
249
+
250
+ After restarting OpenCode, run:
251
+
252
+ ```text
253
+ /loop-help
254
+ /loop-doctor
255
+ ```
256
+
257
+ If the commands do not appear:
258
+
259
+ 1. Make sure OpenCode was fully restarted.
260
+ 2. Check that `opencode-loop.js` exists in the OpenCode plugin directory.
261
+ 3. Check that `loop.md`, `loop-help.md`, and the other command files exist in the OpenCode commands directory.
262
+ 4. Run `npx -y @bybrawe/opencode-loop` again to reinstall the command files.
263
+
264
+ ## Quick start
265
+
266
+ ```text
267
+ /loop 0s continue from progress.md and implement the next unfinished TODO
268
+ ```
269
+
270
+ This is the closest behavior to a Claude Code CLI style loop: every time OpenCode becomes idle, the loop can send the next continuation prompt.
271
+
272
+ A safer development loop:
273
+
274
+ ```text
275
+ /loop 0s --name dev --ask-never --safe --no-overlap --batch 5 --compact-every 200m --checkpoint-only --progress-file progress.md Treat progress.md as the main project state file. Continue with the next unfinished TODO, implement it, mark completed items with [x], add useful follow-up TODOs when you discover them, run tests/lint/build when available, and keep going while work remains.
276
+ ```
277
+
278
+ Periodic compact:
279
+
280
+ ```text
281
+ /loop 200m --name compact --no-now /compact
282
+ ```
283
+
284
+ Test-fix loop:
285
+
286
+ ```text
287
+ /loop 0s --name testfix --ask-never --safe --verify "npm test" Continue from progress.md. If tests fail, analyze the failure, fix it, and run the tests again.
288
+ ```
289
+
89
290
  Shell command loop:
90
291
 
91
292
  ```text
@@ -116,6 +317,18 @@ Limit runs:
116
317
  opencode-loopd --project . --every 5m --max-runs 20 --prompt-file loop-prompt.md
117
318
  ```
118
319
 
320
+ Wait before the first run:
321
+
322
+ ```bash
323
+ opencode-loopd --project . --every 10m --sleep-first --prompt-file loop-prompt.md
324
+ ```
325
+
326
+ Use an inline prompt:
327
+
328
+ ```bash
329
+ opencode-loopd --project . --every 0s --prompt "continue from progress.md and implement the next unfinished TODO"
330
+ ```
331
+
119
332
  Example `loop-prompt.md`:
120
333
 
121
334
  ```md
@@ -131,9 +344,11 @@ Rules:
131
344
  - Keep going while work remains.
132
345
  ```
133
346
 
134
- ### Windows Task Scheduler
347
+ ## Windows Task Scheduler
135
348
 
136
- You can create a Windows scheduled task that runs a one-shot daemon job every N minutes:
349
+ You can create a Windows scheduled task that runs a one-shot daemon job every N minutes.
350
+
351
+ Install a scheduled task:
137
352
 
138
353
  ```powershell
139
354
  opencode-loopd install-task --project "C:\path\to\project" --every 10m --prompt-file loop-prompt.md --name OpenCodeLoop
@@ -145,674 +360,519 @@ Remove it:
145
360
  opencode-loopd uninstall-task --name OpenCodeLoop
146
361
  ```
147
362
 
148
- For active development, a visible terminal running `opencode-loopd --project . --every 0s ...` is easier to monitor.
149
-
150
-
151
- ## Installation
152
-
153
- ### Recommended: install from npm
154
-
155
- Install from npm with `npx`:
156
-
157
- ```bash
158
- npx -y @bybrawe/opencode-loop
159
- ```
160
-
161
- On Windows CMD:
162
-
163
- ```bat
164
- npx -y @bybrawe/opencode-loop
165
- ```
166
-
167
- On Windows PowerShell:
168
-
169
- ```powershell
170
- npx -y @bybrawe/opencode-loop
171
- ```
172
-
173
- The installer copies the plugin and slash command files into your OpenCode config directory.
174
-
175
- Windows target paths:
176
-
177
- ```text
178
- %USERPROFILE%\.config\opencode\plugins\opencode-loop.js
179
- %USERPROFILE%\.config\opencode\commands\loop*.md
180
- ```
181
-
182
- macOS / Linux target paths:
183
-
184
- ```text
185
- ~/.config/opencode/plugins/opencode-loop.js
186
- ~/.config/opencode/commands/loop*.md
187
- ```
188
-
189
- Then fully restart OpenCode and run:
190
-
191
- ```text
192
- /loop-help
193
- /loop-doctor
363
+ Check existing tasks:
364
+
365
+ ```powershell
366
+ Get-ScheduledTask | Where-Object { $_.TaskName -like "*OpenCode*" }
194
367
  ```
195
368
 
196
- The npm package also installs the `opencode-loopd` CLI for background loops:
369
+ For active development, a visible terminal running daemon mode is usually easier to monitor:
370
+
371
+ ```powershell
372
+ opencode-loopd --project "C:\path\to\project" --every 0s --prompt-file loop-prompt.md
373
+ ```
374
+
375
+ ## Multiple loops and duplicate protection
376
+
377
+ By default, `/loop ...` uses an upsert/replace behavior. Running `/loop 5m ...` again replaces the existing default loop instead of creating duplicate jobs.
378
+
379
+ Use `--name` to manage separate named loops, or `--multi` when you intentionally want multiple loops with the same shape:
380
+
381
+ ```text
382
+ /loop 5m --name dev continue from progress.md
383
+ /loop 200m --name compact /compact
384
+ /loop 10m --multi !npm test
385
+ ```
386
+
387
+ ## Core commands
388
+
389
+ | Command | Purpose |
390
+ |---|---|
391
+ | `/loop <interval> <action>` | Add an idle/interval loop job |
392
+ | `/loop-help` | Show usage help inside OpenCode |
393
+ | `/loop-status` | Show active loop jobs |
394
+ | `/loop-logs` | Show recent loop log entries |
395
+ | `/loop-now [id/name/number/all]` | Run loop job(s) immediately |
396
+ | `/loop-pause [id/name/number/all]` | Pause loop job(s) |
397
+ | `/loop-resume [id/name/number/all]` | Resume loop job(s) |
398
+ | `/loop-remove [id/name/number/all]` | Remove loop job(s) |
399
+ | `/loop-stop [id/name/number/all]` | Alias for remove/stop |
400
+ | `/loop-clear` | Remove all loop jobs for the current session |
401
+ | `/loop-doctor` | Diagnose plugin/session state |
402
+ | `/loop-init [file]` | Create a starter `progress.md` or another progress file |
403
+ | `/loop-export` | Export current loop state as JSON |
404
+
405
+ ## Preset commands
406
+
407
+ | Command | Purpose |
408
+ |---|---|
409
+ | `/loop-dev 0s` | General autonomous OpenCode development loop |
410
+ | `/loop-progress 0s` | Follow `progress.md` and TODOs |
411
+ | `/loop-safe-dev 0s` | Safe dev loop with ask-never, batch 5, and patch checkpoints |
412
+ | `/loop-testfix 0s "npm test"` | Run, fix, and re-run tests |
413
+ | `/loop-compact 200m` | Compact loop shortcut |
414
+
415
+ ## Intervals
416
+
417
+ ```text
418
+ 0s run whenever OpenCode becomes idle, like Claude Code auto-continue
419
+ 5m run every 5 minutes when idle
420
+ 200m run every 200 minutes when idle
421
+ 1h run every hour when idle
422
+ ```
423
+
424
+ The plugin is **idle-driven**. It checks jobs when OpenCode becomes idle, so it avoids intentionally starting a second agent turn on top of an active one.
425
+
426
+ ## Actions
427
+
428
+ ### Prompt action
429
+
430
+ ```text
431
+ /loop 0s continue from progress.md. Work on the next unfinished TODO. Mark completed items with [x].
432
+ ```
433
+
434
+ ### Prompt file action
435
+
436
+ Use this when the prompt is too long for a single command line:
437
+
438
+ ```text
439
+ /loop 0s --prompt-file loop-prompt.md
440
+ ```
441
+
442
+ Example `loop-prompt.md`:
443
+
444
+ ```md
445
+ Continue from progress.md.
446
+ Do not ask questions unless truly blocked.
447
+ Make reasonable assumptions and keep working.
448
+ Complete TODOs in order and mark finished items with [x].
449
+ Add useful follow-up TODOs when you discover them.
450
+ Run tests, lint, or build when available.
451
+ Do not run destructive commands, force pushes, production deploys, or database resets.
452
+ ```
453
+
454
+ ### Include extra context files
455
+
456
+ ```text
457
+ /loop 0s --include-file ARCHITECTURE.md --include-file progress.md continue with the next implementation task
458
+ ```
459
+
460
+ ### Slash command action
461
+
462
+ ```text
463
+ /loop 200m /compact
464
+ /loop 15m /review current changes
465
+ ```
466
+
467
+ `/compact` and `/summarize` map to OpenCode session summarization.
468
+
469
+ ### Shell action
470
+
471
+ ```text
472
+ /loop 10m !npm test
473
+ /loop 30m $pnpm lint
474
+ ```
475
+
476
+ Shell actions starting with `!` or `$` run through the OpenCode shell tool.
477
+
478
+ ## Flags
479
+
480
+ ### `--name <name>`
481
+
482
+ Name a loop so you can manage it later.
483
+
484
+ ```text
485
+ /loop 0s --name dev continue from progress.md
486
+ /loop-pause dev
487
+ /loop-resume dev
488
+ /loop-stop dev
489
+ ```
490
+
491
+ ### `--max-runs <n>`
492
+
493
+ Stop after N runs.
494
+
495
+ ```text
496
+ /loop 5m --max-runs 20 continue from progress.md
497
+ ```
498
+
499
+ ### `--max-runtime <duration>`
500
+
501
+ Stop after total runtime from loop creation.
502
+
503
+ ```text
504
+ /loop 0s --max-runtime 6h continue from progress.md
505
+ ```
506
+
507
+ ### `--timeout <duration>`
508
+
509
+ Best-effort abort after a single run timeout.
510
+
511
+ ```text
512
+ /loop 0s --timeout 30m continue from progress.md
513
+ ```
514
+
515
+ ### `--max-failures <n>`
516
+
517
+ Pause after repeated verify/postrun failures.
518
+
519
+ ```text
520
+ /loop 0s --verify "npm test" --max-failures 3 continue from progress.md and fix test failures
521
+ ```
522
+
523
+ ### `--pause-on-verify-fail`
524
+
525
+ Pause immediately after the first verify failure.
526
+
527
+ ```text
528
+ /loop 0s --verify "npm test" --pause-on-verify-fail continue from progress.md
529
+ ```
530
+
531
+ ### `--until <text>`
532
+
533
+ Stop when a marker appears in common state files such as `progress.md`, `TODO.md`, or `.opencode/opencode-loop/until.txt`.
534
+
535
+ ```text
536
+ /loop 5m --until ALL_DONE continue from progress.md
537
+ ```
538
+
539
+ ### `--stop-file <file>`
540
+
541
+ Stop when a file appears. This is a simple manual kill switch.
542
+
543
+ ```text
544
+ /loop 0s --stop-file STOP_LOOP continue from progress.md
545
+ ```
546
+
547
+ Create `STOP_LOOP` in the project root to stop that job.
548
+
549
+ ### `--no-overlap` and `--allow-overlap`
550
+
551
+ `--no-overlap` is the default. It prevents a new run from being triggered while a previous run is still considered active.
552
+
553
+ ```text
554
+ /loop 5m --no-overlap continue from progress.md
555
+ ```
556
+
557
+ ### `--compact-every <n|duration>`
558
+
559
+ Compact before a run every N runs or every duration.
560
+
561
+ ```text
562
+ /loop 0s --compact-every 20 continue from progress.md
563
+ /loop 0s --compact-every 200m continue from progress.md
564
+ ```
565
+
566
+ ### `--test "<command>"`
567
+
568
+ Adds a test instruction to prompt actions.
569
+
570
+ ```text
571
+ /loop 0s --test "npm test" continue from progress.md
572
+ ```
573
+
574
+ ### `--verify "<command>"`
575
+
576
+ Runs a real shell verification command after each assistant turn. If it fails, the next loop prompt includes the failure summary so the agent can fix it.
577
+
578
+ ```text
579
+ /loop 0s --verify "npm test" continue from progress.md and fix any failing tests
580
+ ```
581
+
582
+ ### `--preflight "<command>"`
583
+
584
+ Runs a real shell command before each loop turn. If it fails, the loop pauses.
585
+
586
+ ```text
587
+ /loop 0s --preflight "npm install" continue from progress.md
588
+ ```
589
+
590
+ ### `--postrun "<command>"`
591
+
592
+ Runs a shell command after each assistant turn and verification.
593
+
594
+ ```text
595
+ /loop 0s --postrun "git status --short" continue from progress.md
596
+ ```
597
+
598
+ ### `--notify "<command>"`
599
+
600
+ Runs a shell command when a loop stops or pauses due to a control condition. The command can use `{job}` and `{reason}` placeholders.
601
+
602
+ ```text
603
+ /loop 0s --max-runtime 6h --notify "echo {job} stopped because {reason}" continue from progress.md
604
+ ```
605
+
606
+ ### `--checkpoint-only`
607
+
608
+ Save `git status` and `git diff --binary` snapshots under:
609
+
610
+ ```text
611
+ .opencode/opencode-loop/checkpoints/<session>/
612
+ ```
613
+
614
+ ### `--git-checkpoint`
615
+
616
+ Save a patch checkpoint and attempt to commit all changes after each completed run.
617
+
618
+ ```text
619
+ /loop 0s --git-checkpoint continue from progress.md
620
+ ```
621
+
622
+ Use carefully. It runs `git add -A` and `git commit` when changes exist.
623
+
624
+ ### `--branch <name>`
625
+
626
+ Switch to a branch before the first run, or create it if it does not exist.
627
+
628
+ ```text
629
+ /loop 0s --branch ai-loop continue from progress.md
630
+ ```
631
+
632
+ ### `--safe`
633
+
634
+ Adds safety instructions to prompt actions and blocks obviously destructive shell actions.
635
+
636
+ ```text
637
+ /loop 0s --safe continue from progress.md
638
+ ```
639
+
640
+ Safe mode warns against or blocks patterns such as `git reset`, `git clean`, `rm -rf`, `git push`, `terraform destroy`, destructive delete commands, and production deploys.
641
+
642
+ ### `--batch <n>`
643
+
644
+ Tell the agent to process at most N TODO items per run.
645
+
646
+ ```text
647
+ /loop 0s --batch 5 continue from progress.md
648
+ ```
649
+
650
+ ### `--quiet`
651
+
652
+ Tell the agent to keep replies short.
653
+
654
+ ```text
655
+ /loop 0s --quiet continue from progress.md
656
+ ```
657
+
658
+ ### `--ask-never`
659
+
660
+ Tell the agent not to ask questions and to make reasonable assumptions.
661
+
662
+ ```text
663
+ /loop 0s --ask-never continue from progress.md
664
+ ```
665
+
666
+ ### `--progress-file <file>`
667
+
668
+ Tell the agent which state file to treat as the main progress/TODO source.
669
+
670
+ ```text
671
+ /loop 0s --progress-file progress.md continue from the progress file
672
+ ```
673
+
674
+ ### `--watch <file>`
675
+
676
+ Run when watched file metadata changes. This is still checked on idle events.
677
+
678
+ ```text
679
+ /loop --watch progress.md continue after progress.md changes
680
+ /loop 5m --watch progress.md continue when progress.md changes or the interval is due
681
+ ```
682
+
683
+ You can pass multiple `--watch` flags.
684
+
685
+ ### `--dry-run`
686
+
687
+ Parse and preview a loop without saving it.
688
+
689
+ ```text
690
+ /loop 0s --dry-run --ask-never continue from progress.md
691
+ ```
692
+
693
+ ### `--now` and `--no-now`
694
+
695
+ By default a new loop is due immediately. Use `--no-now` to wait for the first interval.
696
+
697
+ ```text
698
+ /loop 200m --no-now /compact
699
+ ```
700
+
701
+ ## Recommended recipes
702
+
703
+ ### Claude Code style auto-continue loop
704
+
705
+ ```text
706
+ /loop 0s --name dev --ask-never --safe --no-overlap --batch 5 --compact-every 200m --checkpoint-only --progress-file progress.md Treat progress.md as the main project state file. Continue with the next unfinished TODO, implement it, mark completed items with [x], add useful follow-up TODOs when you discover them, run tests/lint/build when available, and keep going while work remains.
707
+ ```
708
+
709
+ ### Long-running autonomous development loop
710
+
711
+ ```text
712
+ /loop 0s --name dev --ask-never --safe --no-overlap --compact-every 20 --timeout 45m --max-runtime 6h --max-failures 3 --stop-file STOP_LOOP --checkpoint-only Continue from progress.md. Do not ask questions. Make reasonable assumptions. Complete TODOs in order, mark finished items with [x], add useful new ideas to progress.md, and keep going while work remains.
713
+ ```
714
+
715
+ ### Daemon-based long-running development loop
197
716
 
198
717
  ```bash
199
- opencode-loopd --help
200
- ```
201
-
202
- ### Why `npx` is the recommended npm install
203
-
204
- OpenCode can load npm plugins from the `plugin` array in `opencode.json`, but OpenCode slash commands are discovered from command definitions such as markdown files in a `commands/` directory or command entries in config. The `npx` installer installs both parts: the plugin file and the `/loop-*` command files.
205
-
206
- Use the OpenCode config-only method only if you already installed the command files separately or you are only testing plugin loading.
207
-
208
- ### Optional: OpenCode config package entry
209
-
210
- If you want OpenCode to load the npm plugin package directly, add the scoped package name to your OpenCode config:
211
-
212
- ```json
213
- {
214
- "$schema": "https://opencode.ai/config.json",
215
- "plugin": ["@bybrawe/opencode-loop"]
216
- }
217
- ```
218
-
219
- Use the scoped package name exactly as shown. `opencode-loop` without `@bybrawe/` is a different npm package name.
220
-
221
- If `/loop` does not appear after using only the config method, run the installer once:
222
-
223
- ```bash
224
- npx -y @bybrawe/opencode-loop
225
- ```
226
-
227
- ### Install from GitHub
228
-
229
- Use this if you want to install from source instead of npm.
230
-
231
- Windows PowerShell:
232
-
233
- ```powershell
234
- git clone https://github.com/ByBrawe/opencode-loop.git
235
- cd opencode-loop
236
- powershell -ExecutionPolicy Bypass -File .\scripts\install.ps1
237
- ```
238
-
239
- macOS / Linux / Git Bash:
240
-
241
- ```bash
242
- git clone https://github.com/ByBrawe/opencode-loop.git
243
- cd opencode-loop
244
- chmod +x ./scripts/install.sh
245
- ./scripts/install.sh
246
- ```
247
-
248
- Then restart OpenCode and run:
249
-
250
- ```text
251
- /loop-help
252
- /loop-doctor
253
- ```
254
-
255
- ### Manual global install
256
-
257
- Windows PowerShell:
258
-
259
- ```powershell
260
- mkdir "$env:USERPROFILE\.config\opencode\plugins" -Force
261
- mkdir "$env:USERPROFILE\.config\opencode\commands" -Force
262
- copy .\src\index.js "$env:USERPROFILE\.config\opencode\plugins\opencode-loop.js"
263
- copy .\commands\*.md "$env:USERPROFILE\.config\opencode\commands\"
264
- ```
265
-
266
- macOS / Linux:
267
-
268
- ```bash
269
- mkdir -p ~/.config/opencode/plugins ~/.config/opencode/commands
270
- cp ./src/index.js ~/.config/opencode/plugins/opencode-loop.js
271
- cp ./commands/*.md ~/.config/opencode/commands/
272
- ```
273
-
274
- ### Project-local install
275
-
276
- Use this when you want the plugin to be available only inside one repository.
277
-
278
- ```bash
279
- mkdir -p .opencode/plugins .opencode/commands
280
- cp ./src/index.js .opencode/plugins/opencode-loop.js
281
- cp ./commands/*.md .opencode/commands/
282
- ```
283
-
284
- On Windows PowerShell:
285
-
286
- ```powershell
287
- mkdir .opencode\plugins -Force
288
- mkdir .opencode\commands -Force
289
- copy .\src\index.js .opencode\plugins\opencode-loop.js
290
- copy .\commands\*.md .opencode\commands\
291
- ```
292
-
293
- <<<<<<< HEAD
294
- =======
295
- ### npm install - after publishing `@bybrawe/opencode-loop`
296
-
297
- Do **not** use this section for a plain GitHub clone. This is only for the npm package.
298
-
299
- The npm package name is scoped:
300
-
301
- ```text
302
- @bybrawe/opencode-loop
303
- ```
304
-
305
- Recommended npm install command:
306
-
307
- ```bash
308
- npx -y @bybrawe/opencode-loop
309
- ```
310
-
311
- This copies the plugin file and all `/loop-*` markdown command files into your OpenCode config directory, then you restart OpenCode. This is the most reliable install path because OpenCode slash commands are discovered from command files.
312
-
313
- If you only want OpenCode to load the npm plugin package directly, add the scoped package name to your OpenCode config:
314
-
315
- ```json
316
- {
317
- "$schema": "https://opencode.ai/config.json",
318
- "plugin": ["@bybrawe/opencode-loop"]
319
- }
320
- ```
321
-
322
-
323
- >>>>>>> 600c1cf8146d317efd682e20298f53c0cf2bf213
324
- ### Verify installation
325
-
326
- After restarting OpenCode, run:
327
-
328
- ```text
329
- /loop-help
330
- /loop-doctor
331
- ```
332
-
333
- If the commands do not appear:
334
-
335
- 1. Make sure OpenCode was fully restarted.
336
- 2. Check that `opencode-loop.js` exists in the OpenCode plugin directory.
337
- 3. Check that `loop.md`, `loop-help.md`, and the other command files exist in the OpenCode commands directory.
338
- 4. Run `npx -y @bybrawe/opencode-loop` again to reinstall the command files.
339
-
340
- ## Multiple loops and duplicate protection
341
-
342
- By default, `/loop ...` uses an upsert/replace behavior. Running `/loop 5m ...` again replaces the existing default loop instead of creating duplicate jobs.
343
-
344
- Use `--name` to manage separate named loops, or `--multi` when you intentionally want multiple loops with the same shape:
345
-
346
- ```text
347
- /loop 5m --name dev continue from progress.md
348
- /loop 200m --name compact /compact
349
- /loop 10m --multi !npm test
350
- ```
351
-
352
- ## Core commands
353
-
354
- | Command | Purpose |
355
- |---|---|
356
- | `/loop <interval> <action>` | Add an idle/interval loop job |
357
- | `/loop-help` | Show usage help inside OpenCode |
358
- | `/loop-status` | Show active loop jobs |
359
- | `/loop-logs` | Show recent loop log entries |
360
- | `/loop-now [id/name/number/all]` | Run loop job(s) immediately |
361
- | `/loop-pause [id/name/number/all]` | Pause loop job(s) |
362
- | `/loop-resume [id/name/number/all]` | Resume loop job(s) |
363
- | `/loop-remove [id/name/number/all]` | Remove loop job(s) |
364
- | `/loop-stop [id/name/number/all]` | Alias for remove/stop |
365
- | `/loop-clear` | Remove all loop jobs for the current session |
366
- | `/loop-doctor` | Diagnose plugin/session state |
367
- | `/loop-init [file]` | Create a starter `progress.md` or another progress file |
368
- | `/loop-export` | Export current loop state as JSON |
369
-
370
- ## Preset commands
371
-
372
- | Command | Purpose |
373
- |---|---|
374
- | `/loop-dev 0s` | General autonomous OpenCode development loop |
375
- | `/loop-progress 0s` | Follow `progress.md` and TODOs |
376
- | `/loop-safe-dev 0s` | Safe dev loop with ask-never, batch 5, and patch checkpoints |
377
- | `/loop-testfix 0s "npm test"` | Run, fix, and re-run tests |
378
- | `/loop-compact 200m` | Compact loop shortcut |
379
-
380
- ## Intervals
381
-
382
- ```text
383
- 0s run whenever OpenCode becomes idle, like Claude Code auto-continue
384
- 5m run every 5 minutes when idle
385
- 200m run every 200 minutes when idle
386
- 1h run every hour when idle
387
- ```
388
-
389
- The plugin is **idle-driven**. It checks jobs when OpenCode becomes idle, so it avoids intentionally starting a second agent turn on top of an active one.
390
-
391
- ## Actions
392
-
393
- ### Prompt action
394
-
395
- ```text
396
- /loop 0s continue from progress.md. Work on the next unfinished TODO. Mark completed items with [x].
397
- ```
398
-
399
- ### Prompt file action
400
-
401
- Use this when the prompt is too long for a single command line:
402
-
403
- ```text
404
- /loop 0s --prompt-file loop-prompt.md
405
- ```
406
-
407
- Example `loop-prompt.md`:
408
-
409
- ```md
410
- Continue from progress.md.
411
- Do not ask questions unless truly blocked.
412
- Make reasonable assumptions and keep working.
413
- Complete TODOs in order and mark finished items with [x].
414
- Add useful follow-up TODOs when you discover them.
415
- Run tests, lint, or build when available.
416
- Do not run destructive commands, force pushes, production deploys, or database resets.
417
- ```
418
-
419
- ### Include extra context files
420
-
421
- ```text
422
- /loop 0s --include-file ARCHITECTURE.md --include-file progress.md continue with the next implementation task
423
- ```
424
-
425
- ### Slash command action
426
-
427
- ```text
428
- /loop 200m /compact
429
- /loop 15m /review current changes
430
- ```
431
-
432
- `/compact` and `/summarize` map to OpenCode session summarization.
433
-
434
- ### Shell action
435
-
436
- ```text
437
- /loop 10m !npm test
438
- /loop 30m $pnpm lint
439
- ```
440
-
441
- Shell actions starting with `!` or `$` run through the OpenCode shell tool.
442
-
443
- ## Flags
444
-
445
- ### `--name <name>`
446
-
447
- Name a loop so you can manage it later.
448
-
449
- ```text
450
- /loop 0s --name dev continue from progress.md
451
- /loop-pause dev
452
- /loop-resume dev
453
- /loop-stop dev
454
- ```
455
-
456
- ### `--max-runs <n>`
457
-
458
- Stop after N runs.
459
-
460
- ```text
461
- /loop 5m --max-runs 20 continue from progress.md
462
- ```
463
-
464
- ### `--max-runtime <duration>`
465
-
466
- Stop after total runtime from loop creation.
467
-
468
- ```text
469
- /loop 0s --max-runtime 6h continue from progress.md
470
- ```
471
-
472
- ### `--timeout <duration>`
473
-
474
- Best-effort abort after a single run timeout.
475
-
476
- ```text
477
- /loop 0s --timeout 30m continue from progress.md
478
- ```
479
-
480
- ### `--max-failures <n>`
481
-
482
- Pause after repeated verify/postrun failures.
483
-
484
- ```text
485
- /loop 0s --verify "npm test" --max-failures 3 continue from progress.md and fix test failures
486
- ```
487
-
488
- ### `--pause-on-verify-fail`
489
-
490
- Pause immediately after the first verify failure.
491
-
492
- ```text
493
- /loop 0s --verify "npm test" --pause-on-verify-fail continue from progress.md
494
- ```
495
-
496
- ### `--until <text>`
497
-
498
- Stop when a marker appears in common state files such as `progress.md`, `TODO.md`, or `.opencode/opencode-loop/until.txt`.
499
-
500
- ```text
501
- /loop 5m --until ALL_DONE continue from progress.md
502
- ```
503
-
504
- ### `--stop-file <file>`
505
-
506
- Stop when a file appears. This is a simple manual kill switch.
507
-
508
- ```text
509
- /loop 0s --stop-file STOP_LOOP continue from progress.md
510
- ```
511
-
512
- Create `STOP_LOOP` in the project root to stop that job.
513
-
514
- ### `--no-overlap` and `--allow-overlap`
515
-
516
- `--no-overlap` is the default. It prevents a new run from being triggered while a previous run is still considered active.
517
-
518
- ```text
519
- /loop 5m --no-overlap continue from progress.md
520
- ```
521
-
522
- ### `--compact-every <n|duration>`
523
-
524
- Compact before a run every N runs or every duration.
525
-
526
- ```text
527
- /loop 0s --compact-every 20 continue from progress.md
528
- /loop 0s --compact-every 200m continue from progress.md
529
- ```
530
-
531
- ### `--test "<command>"`
532
-
533
- Adds a test instruction to prompt actions.
534
-
535
- ```text
536
- /loop 0s --test "npm test" continue from progress.md
537
- ```
538
-
539
- ### `--verify "<command>"`
540
-
541
- Runs a real shell verification command after each assistant turn. If it fails, the next loop prompt includes the failure summary so the agent can fix it.
542
-
543
- ```text
544
- /loop 0s --verify "npm test" continue from progress.md and fix any failing tests
545
- ```
546
-
547
- ### `--preflight "<command>"`
548
-
549
- Runs a real shell command before each loop turn. If it fails, the loop pauses.
550
-
551
- ```text
552
- /loop 0s --preflight "npm install" continue from progress.md
553
- ```
554
-
555
- ### `--postrun "<command>"`
556
-
557
- Runs a shell command after each assistant turn and verification.
558
-
559
- ```text
560
- /loop 0s --postrun "git status --short" continue from progress.md
561
- ```
562
-
563
- ### `--notify "<command>"`
564
-
565
- Runs a shell command when a loop stops or pauses due to a control condition. The command can use `{job}` and `{reason}` placeholders.
566
-
567
- ```text
568
- /loop 0s --max-runtime 6h --notify "echo {job} stopped because {reason}" continue from progress.md
569
- ```
570
-
571
- ### `--checkpoint-only`
572
-
573
- Save `git status` and `git diff --binary` snapshots under:
574
-
575
- ```text
576
- .opencode/opencode-loop/checkpoints/<session>/
577
- ```
578
-
579
- ### `--git-checkpoint`
580
-
581
- Save a patch checkpoint and attempt to commit all changes after each completed run.
582
-
583
- ```text
584
- /loop 0s --git-checkpoint continue from progress.md
585
- ```
586
-
587
- Use carefully. It runs `git add -A` and `git commit` when changes exist.
588
-
589
- ### `--branch <name>`
590
-
591
- Switch to a branch before the first run, or create it if it does not exist.
592
-
593
- ```text
594
- /loop 0s --branch ai-loop continue from progress.md
595
- ```
596
-
597
- ### `--safe`
598
-
599
- Adds safety instructions to prompt actions and blocks obviously destructive shell actions.
600
-
601
- ```text
602
- /loop 0s --safe continue from progress.md
603
- ```
604
-
605
- Safe mode warns against or blocks patterns such as `git reset`, `git clean`, `rm -rf`, `git push`, `terraform destroy`, destructive delete commands, and production deploys.
606
-
607
- ### `--batch <n>`
608
-
609
- Tell the agent to process at most N TODO items per run.
610
-
611
- ```text
612
- /loop 0s --batch 5 continue from progress.md
613
- ```
614
-
615
- ### `--quiet`
616
-
617
- Tell the agent to keep replies short.
618
-
619
- ```text
620
- /loop 0s --quiet continue from progress.md
621
- ```
622
-
623
- ### `--ask-never`
624
-
625
- Tell the agent not to ask questions and to make reasonable assumptions.
626
-
627
- ```text
628
- /loop 0s --ask-never continue from progress.md
629
- ```
630
-
631
- ### `--progress-file <file>`
632
-
633
- Tell the agent which state file to treat as the main progress/TODO source.
634
-
635
- ```text
636
- /loop 0s --progress-file progress.md continue from the progress file
637
- ```
638
-
639
- ### `--watch <file>`
640
-
641
- Run when watched file metadata changes. This is still checked on idle events.
642
-
643
- ```text
644
- /loop --watch progress.md continue after progress.md changes
645
- /loop 5m --watch progress.md continue when progress.md changes or the interval is due
646
- ```
647
-
648
- You can pass multiple `--watch` flags.
649
-
650
- ### `--dry-run`
651
-
652
- Parse and preview a loop without saving it.
653
-
654
- ```text
655
- /loop 0s --dry-run --ask-never continue from progress.md
656
- ```
657
-
658
- ### `--now` and `--no-now`
659
-
660
- By default a new loop is due immediately. Use `--no-now` to wait for the first interval.
661
-
662
- ```text
663
- /loop 200m --no-now /compact
664
- ```
665
-
666
- ## Recommended recipes
667
-
668
- ### Claude Code style auto-continue loop
669
-
670
- ```text
671
- /loop 0s --name dev --ask-never --safe --no-overlap --batch 5 --compact-every 200m --checkpoint-only --progress-file progress.md Treat progress.md as the main project state file. Continue with the next unfinished TODO, implement it, mark completed items with [x], add useful follow-up TODOs when you discover them, run tests/lint/build when available, and keep going while work remains.
672
- ```
673
-
674
- ### Long-running autonomous development loop
675
-
676
- ```text
677
- /loop 0s --name dev --ask-never --safe --no-overlap --compact-every 20 --timeout 45m --max-runtime 6h --max-failures 3 --stop-file STOP_LOOP --checkpoint-only Continue from progress.md. Do not ask questions. Make reasonable assumptions. Complete TODOs in order, mark finished items with [x], add useful new ideas to progress.md, and keep going while work remains.
678
- ```
679
-
680
- ### Test-fix loop
681
-
682
- ```text
683
- /loop 0s --name testfix --ask-never --safe --verify "npm test" --max-failures 3 Continue from progress.md. If tests fail, analyze the failure, fix it, and run the tests again.
684
- ```
685
-
686
- ### Compact loop
687
-
688
- ```text
689
- /loop 200m --name compact --no-now /compact
690
- ```
691
-
692
- ### Prompt file loop
693
-
694
- ```text
695
- /loop 0s --name dev --prompt-file loop-prompt.md --checkpoint-only --max-runtime 6h
696
- ```
697
-
698
- ## Suggested OpenCode permission config
699
-
700
- Full `permission: "allow"` is convenient but risky. For safer long loops, keep destructive commands as ask/deny.
701
-
702
- ```json
703
- {
704
- "$schema": "https://opencode.ai/config.json",
705
- "permission": {
706
- "read": "allow",
707
- "grep": "allow",
708
- "glob": "allow",
709
- "todowrite": "allow",
710
- "edit": "allow",
711
- "bash": {
712
- "*": "ask",
713
- "git status*": "allow",
714
- "git diff*": "allow",
715
- "npm test*": "allow",
716
- "npm run test*": "allow",
717
- "npm run lint*": "allow",
718
- "pnpm test*": "allow",
719
- "pnpm lint*": "allow",
720
- "git push*": "ask",
721
- "git reset*": "ask",
722
- "git clean*": "deny",
723
- "rm *": "deny",
724
- "del *": "ask",
725
- "rmdir *": "ask"
726
- },
727
- "external_directory": "ask"
728
- }
729
- }
730
- ```
731
-
732
- ## State files
733
-
734
- Session loop state is stored under:
735
-
736
- ```text
737
- .opencode/opencode-loop/
738
- ```
739
-
740
- Patch checkpoints are stored under:
741
-
742
- ```text
743
- .opencode/opencode-loop/checkpoints/
744
- ```
745
-
746
- Recent plugin events are appended to:
747
-
748
- ```text
749
- .opencode/opencode-loop/loop.log
750
- ```
751
-
752
- ## Example progress.md
753
-
754
- Create one with:
755
-
756
- ```text
757
- /loop-init
758
- ```
759
-
760
- Example content:
761
-
762
- ```md
763
- # Progress
764
-
765
- ## Current Goal
766
- Improve the application in small safe steps.
767
-
768
- ## Agent Rules
769
- - Do not ask questions unless truly blocked.
770
- - Make reasonable assumptions and continue.
771
- - Work on unfinished TODOs in order.
772
- - Mark completed TODOs with [x].
773
- - Add new bugs, ideas, or follow-up tasks as TODOs.
774
- - Run tests/lint/build when available.
775
- - Do not run destructive commands, force pushes, production deploys, or database resets.
776
-
777
- ## Active TODO
778
- - [ ] Review the project structure and identify the next safe improvement.
779
- - [ ] Fix the highest-priority failing test.
780
- - [ ] Improve the user-facing error state in the main flow.
781
-
782
- ## Completed
783
- - [x] Added initial project notes.
784
-
785
- ## Backlog Ideas
786
- - [ ] Add a smoke test for the critical path.
787
- - [ ] Improve developer setup documentation.
788
-
789
- ## Blocked
790
- - None.
791
- ```
792
-
793
- ## Bug fixes and hardening in v0.4.0
794
-
795
- - Renamed the public package/repo metadata to `opencode-loop` for `ByBrawe/opencode-loop`.
796
- - Replaced project-specific examples with public, English OpenCode examples.
797
- - Added `--prompt-file` for long prompts instead of huge command lines.
798
- - Added `--include-file` for extra context files.
799
- - Added `--max-runtime` so loops can stop after a total runtime.
800
- - Added `--max-failures` and `--pause-on-verify-fail` for failing verification loops.
801
- - Added `--postrun` and `--notify` hooks.
802
- - Added `/loop-doctor`, `/loop-init`, and `/loop-export`.
803
- - Fixed the max-runs/checkpoint ordering issue so the last run can still finalize and checkpoint.
804
- - Improved no-overlap behavior and state cleanup for non-assistant actions such as `/compact`.
805
- - Kept all README examples in English for public GitHub discovery.
806
-
807
- ## Notes and limits
808
-
809
- - The plugin is idle-driven. It does not run a background daemon while OpenCode is busy.
810
- - `--timeout` is best-effort and relies on OpenCode's abort API.
811
- - `--verify`, `--preflight`, `--postrun`, and `--notify` run shell commands, so configure OpenCode permissions carefully.
812
- - `--until` scans common state files and a limited number of markdown/text/json/yaml files to avoid walking huge projects.
813
- - `--safe` reduces risk but does not replace careful OpenCode permissions.
814
- - For truly unattended multi-hour work, use a disposable branch or worktree and checkpoint patches.
815
-
816
- ## License
817
-
818
- MIT
718
+ opencode-loopd --project . --every 5m --prompt-file loop-prompt.md
719
+ ```
720
+
721
+ ### Test-fix loop
722
+
723
+ ```text
724
+ /loop 0s --name testfix --ask-never --safe --verify "npm test" --max-failures 3 Continue from progress.md. If tests fail, analyze the failure, fix it, and run the tests again.
725
+ ```
726
+
727
+ ### Compact loop
728
+
729
+ ```text
730
+ /loop 200m --name compact --no-now /compact
731
+ ```
732
+
733
+ ### Prompt file loop
734
+
735
+ ```text
736
+ /loop 0s --name dev --prompt-file loop-prompt.md --checkpoint-only --max-runtime 6h
737
+ ```
738
+
739
+ ## Suggested OpenCode permission config
740
+
741
+ Full `permission: "allow"` is convenient but risky. For safer long loops, keep destructive commands as ask/deny.
742
+
743
+ ```json
744
+ {
745
+ "$schema": "https://opencode.ai/config.json",
746
+ "permission": {
747
+ "read": "allow",
748
+ "grep": "allow",
749
+ "glob": "allow",
750
+ "todowrite": "allow",
751
+ "edit": "allow",
752
+ "bash": {
753
+ "*": "ask",
754
+ "git status*": "allow",
755
+ "git diff*": "allow",
756
+ "npm test*": "allow",
757
+ "npm run test*": "allow",
758
+ "npm run lint*": "allow",
759
+ "pnpm test*": "allow",
760
+ "pnpm lint*": "allow",
761
+ "git push*": "ask",
762
+ "git reset*": "ask",
763
+ "git clean*": "deny",
764
+ "rm *": "deny",
765
+ "del *": "ask",
766
+ "rmdir *": "ask"
767
+ },
768
+ "external_directory": "ask"
769
+ }
770
+ }
771
+ ```
772
+
773
+ ## State files
774
+
775
+ Session loop state is stored under:
776
+
777
+ ```text
778
+ .opencode/opencode-loop/
779
+ ```
780
+
781
+ Patch checkpoints are stored under:
782
+
783
+ ```text
784
+ .opencode/opencode-loop/checkpoints/
785
+ ```
786
+
787
+ Recent plugin events are appended to:
788
+
789
+ ```text
790
+ .opencode/opencode-loop/loop.log
791
+ ```
792
+
793
+ ## Example progress.md
794
+
795
+ Create one with:
796
+
797
+ ```text
798
+ /loop-init
799
+ ```
800
+
801
+ Example content:
802
+
803
+ ```md
804
+ # Progress
805
+
806
+ ## Current Goal
807
+ Improve the application in small safe steps.
808
+
809
+ ## Agent Rules
810
+ - Do not ask questions unless truly blocked.
811
+ - Make reasonable assumptions and continue.
812
+ - Work on unfinished TODOs in order.
813
+ - Mark completed TODOs with [x].
814
+ - Add new bugs, ideas, or follow-up tasks as TODOs.
815
+ - Run tests/lint/build when available.
816
+ - Do not run destructive commands, force pushes, production deploys, or database resets.
817
+
818
+ ## Active TODO
819
+ - [ ] Review the project structure and identify the next safe improvement.
820
+ - [ ] Fix the highest-priority failing test.
821
+ - [ ] Improve the user-facing error state in the main flow.
822
+
823
+ ## Completed
824
+ - [x] Added initial project notes.
825
+
826
+ ## Backlog Ideas
827
+ - [ ] Add a smoke test for the critical path.
828
+ - [ ] Improve developer setup documentation.
829
+
830
+ ## Blocked
831
+ - None.
832
+ ```
833
+
834
+ ## Changelog highlights
835
+
836
+ ### v0.5.4
837
+
838
+ - Fixed compatibility with recent OpenCode SDK/TUI call shapes.
839
+ - Updated prompt, shell, and toast calls for current OpenCode while keeping backwards-compatible fallbacks.
840
+ - Added `session.status` idle gating and debounce so loop runs do not stack on top of busy/queued agent turns.
841
+ - Improved logging around prompt/shell/toast failures instead of silently swallowing important runtime errors.
842
+ - Fixed the known update-related symptoms where `/loop` could appear queued, stay at `runs=0`, or only work intermittently.
843
+
844
+ ### v0.5.1
845
+
846
+ - Cleaned up README installation docs.
847
+ - Removed duplicate npm install section.
848
+ - Removed unresolved merge conflict markers.
849
+ - Added clearer daemon mode documentation.
850
+ - Added Windows Task Scheduler examples.
851
+ - Added daemon usage examples for `--every`, `--max-runs`, `--sleep-first`, and `--prompt-file`.
852
+
853
+ ### v0.5.0
854
+
855
+ - Added `opencode-loopd` background daemon.
856
+ - Added Windows Task Scheduler helper.
857
+ - Documented TUI loop vs daemon loop.
858
+ - Added background long-running loop examples.
859
+
860
+ ### v0.4.3
861
+
862
+ - Added duplicate loop protection.
863
+ - Quieted command markdown files.
864
+
865
+ ## Notes and limits
866
+
867
+ - The TUI plugin is idle-driven. It does not run a background daemon while OpenCode is busy.
868
+ - The TUI `/loop` command stops when OpenCode closes, the terminal closes, the machine sleeps, or the session stops emitting idle events.
869
+ - For long-running work outside the TUI, use `opencode-loopd`.
870
+ - `--timeout` is best-effort and relies on OpenCode's abort API.
871
+ - `--verify`, `--preflight`, `--postrun`, and `--notify` run shell commands, so configure OpenCode permissions carefully.
872
+ - `--until` scans common state files and a limited number of markdown/text/json/yaml files to avoid walking huge projects.
873
+ - `--safe` reduces risk but does not replace careful OpenCode permissions.
874
+ - For truly unattended multi-hour work, use a disposable branch or worktree and checkpoint patches.
875
+
876
+ ## License
877
+
878
+ MIT