loopflow 0.8.3__tar.gz → 0.8.4__tar.gz

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.
Files changed (413) hide show
  1. {loopflow-0.8.3 → loopflow-0.8.4}/Cargo.lock +18 -161
  2. {loopflow-0.8.3 → loopflow-0.8.4}/PKG-INFO +4 -3
  3. {loopflow-0.8.3 → loopflow-0.8.4}/README.md +3 -2
  4. {loopflow-0.8.3 → loopflow-0.8.4}/docs/config.md +10 -2
  5. {loopflow-0.8.3 → loopflow-0.8.4}/docs/getting-started.md +1 -1
  6. {loopflow-0.8.3 → loopflow-0.8.4}/docs/lf.md +2 -2
  7. {loopflow-0.8.3 → loopflow-0.8.4}/docs/lfops.md +1 -1
  8. {loopflow-0.8.3 → loopflow-0.8.4}/docs/troubleshooting.md +1 -1
  9. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/api.py +14 -2
  10. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/client.py +17 -4
  11. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/models.py +3 -1
  12. {loopflow-0.8.3 → loopflow-0.8.4}/python/tests/conftest.py +3 -20
  13. {loopflow-0.8.3 → loopflow-0.8.4}/python/tests/test_models.py +5 -2
  14. loopflow-0.8.4/roadmap/mobile/README.md +89 -0
  15. loopflow-0.8.4/roadmap/remote/01-sandboxed-agents.md +234 -0
  16. loopflow-0.8.4/roadmap/remote/02-compose-stack.md +145 -0
  17. loopflow-0.8.4/roadmap/remote/03-pre-shared-auth.md +126 -0
  18. loopflow-0.8.4/roadmap/remote/04-ec2.md +161 -0
  19. loopflow-0.8.4/roadmap/remote/05-concerto-remote.md +170 -0
  20. loopflow-0.8.4/roadmap/remote/06-remote-file-access.md +125 -0
  21. loopflow-0.8.4/roadmap/remote/07-studio-auth.md +124 -0
  22. loopflow-0.8.4/roadmap/remote/08-api-expansion.md +207 -0
  23. loopflow-0.8.4/roadmap/remote/09-hosted.md +63 -0
  24. loopflow-0.8.4/roadmap/remote/README.md +63 -0
  25. loopflow-0.8.4/roadmap/rust/README.md +44 -0
  26. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/Cargo.toml +0 -1
  27. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/bin/lf.rs +9 -4
  28. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/agent.rs +136 -19
  29. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/ops/summarize.md +3 -1
  30. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/config.rs +14 -0
  31. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/git.rs +55 -0
  32. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/platform.rs +8 -0
  33. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/stream.rs +88 -0
  34. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/ops/mod.rs +2 -9
  35. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/mod.rs +0 -2
  36. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/executor.rs +385 -26
  37. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/dto.rs +39 -25
  38. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/mod.rs +10 -1
  39. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/flows.rs +1 -1
  40. loopflow-0.8.4/rust/loopflow/src/lfd/http/routes/mod.rs +346 -0
  41. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/waves.rs +169 -64
  42. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/ws.rs +30 -2
  43. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/scheduler.rs +3 -2
  44. {loopflow-0.8.3/rust/loopflow/src/lfd/store/migrations/postgres → loopflow-0.8.4/rust/loopflow/src/lfd/store/migrations}/001_initial.sql +24 -27
  45. loopflow-0.8.4/rust/loopflow/src/lfd/store/migrations.rs +181 -0
  46. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/store/mod.rs +40 -62
  47. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/store/postgres.rs +179 -593
  48. loopflow-0.8.4/rust/loopflow/src/lfd/store/rows.rs +236 -0
  49. loopflow-0.8.4/rust/loopflow/src/lfd/store/sqlite.rs +787 -0
  50. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/common.rs +6 -2
  51. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/cron.rs +1 -1
  52. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/loop_ticker.rs +0 -4
  53. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/mod.rs +3 -0
  54. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/recovery.rs +8 -3
  55. loopflow-0.8.4/rust/loopflow/src/lfd/triggers/summary_refresh.rs +95 -0
  56. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/triggers/watch.rs +0 -4
  57. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/types/event.rs +36 -0
  58. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/types/mod.rs +2 -0
  59. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/types/stimulus.rs +0 -2
  60. loopflow-0.8.4/rust/loopflow/src/lfd/types/summary.rs +16 -0
  61. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/mod.rs +1 -1
  62. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/next.rs +3 -76
  63. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/pr.rs +1 -1
  64. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/rebase.rs +2 -2
  65. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/next_tests.rs +0 -4
  66. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/State/RepoState.swift +158 -61
  67. loopflow-0.8.4/swift/Concerto/State/RunStore.swift +24 -0
  68. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/State/WaveStore.swift +69 -2
  69. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/ContentView.swift +1 -0
  70. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/NextActionsBar.swift +1 -2
  71. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/ScreenshotWindow.swift +1 -0
  72. loopflow-0.8.4/swift/Concerto/Views/StepRunner.swift +342 -0
  73. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WaveDetailPanel.swift +66 -77
  74. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WaveRow.swift +43 -24
  75. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WaveRunsTab.swift +33 -1
  76. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WaveSidebar.swift +1 -1
  77. loopflow-0.8.4/swift/ConcertoTests/RunStoreTests.swift +80 -0
  78. {loopflow-0.8.3 → loopflow-0.8.4}/swift/ConcertoTests/WaveRowTests.swift +4 -4
  79. loopflow-0.8.4/swift/ConcertoTests/WaveStoreTests.swift +424 -0
  80. {loopflow-0.8.3 → loopflow-0.8.4}/swift/ConcertoTests/WaveTests.swift +200 -29
  81. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/Wave.swift +32 -20
  82. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/WaveViewModel.swift +16 -14
  83. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/LocalEventService.swift +9 -54
  84. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/LocalWaveService.swift +70 -39
  85. loopflow-0.8.4/swift/LoopflowCore/Services/WaveServiceProtocol.swift +29 -0
  86. loopflow-0.8.3/roadmap/concerto/02-studio-auth-v0.md +0 -142
  87. loopflow-0.8.3/roadmap/concerto/03-mobile-client-v0.md +0 -238
  88. loopflow-0.8.3/roadmap/concerto/README.md +0 -88
  89. loopflow-0.8.3/roadmap/opencode/02-stream-parser.md +0 -194
  90. loopflow-0.8.3/roadmap/opencode/03-context-injection.md +0 -88
  91. loopflow-0.8.3/roadmap/opencode/04-tests-and-docs.md +0 -66
  92. loopflow-0.8.3/roadmap/opencode/README.md +0 -52
  93. loopflow-0.8.3/roadmap/rust/02b-summarize.md +0 -107
  94. loopflow-0.8.3/roadmap/rust/04-auth.md +0 -98
  95. loopflow-0.8.3/roadmap/rust/05-infrastructure.md +0 -122
  96. loopflow-0.8.3/roadmap/rust/06-hosted.md +0 -68
  97. loopflow-0.8.3/roadmap/rust/README.md +0 -91
  98. loopflow-0.8.3/roadmap/ux/02-optimistic-data-mutations.md +0 -74
  99. loopflow-0.8.3/roadmap/ux/03-event-driven-sync.md +0 -95
  100. loopflow-0.8.3/roadmap/ux/04-optimistic-create-delete.md +0 -110
  101. loopflow-0.8.3/roadmap/ux/05-responsive-actions.md +0 -83
  102. loopflow-0.8.3/roadmap/ux/06-run-store.md +0 -77
  103. loopflow-0.8.3/rust/loopflow/src/lfd/http/routes/mod.rs +0 -179
  104. loopflow-0.8.3/rust/loopflow/src/lfd/store/migrations/postgres/002_flow_parents.sql +0 -4
  105. loopflow-0.8.3/rust/loopflow/src/lfd/store/migrations/postgres/003_run_snapshots.sql +0 -27
  106. loopflow-0.8.3/rust/loopflow/src/lfd/store/schema.rs +0 -3
  107. loopflow-0.8.3/rust/loopflow/src/lfd/store/sqlite.rs +0 -1226
  108. loopflow-0.8.3/scripts/collapse_migrations.py +0 -87
  109. loopflow-0.8.3/swift/Concerto/Views/StepRunner.swift +0 -288
  110. {loopflow-0.8.3 → loopflow-0.8.4}/.claude/commands/ux-review.md +0 -0
  111. {loopflow-0.8.3 → loopflow-0.8.4}/.claude/commands/ux-synthesize-concerto.md +0 -0
  112. {loopflow-0.8.3 → loopflow-0.8.4}/.github/workflows/ci.yml +0 -0
  113. {loopflow-0.8.3 → loopflow-0.8.4}/.github/workflows/clear-scratch.yml +0 -0
  114. {loopflow-0.8.3 → loopflow-0.8.4}/.github/workflows/release.yml +0 -0
  115. {loopflow-0.8.3 → loopflow-0.8.4}/.gitignore +0 -0
  116. {loopflow-0.8.3 → loopflow-0.8.4}/.lf/SUMMARIZE.md +0 -0
  117. {loopflow-0.8.3 → loopflow-0.8.4}/.lf/config.yaml +0 -0
  118. {loopflow-0.8.3 → loopflow-0.8.4}/.lf/directions/conductor.md +0 -0
  119. {loopflow-0.8.3 → loopflow-0.8.4}/.lf/directions/improviser.md +0 -0
  120. {loopflow-0.8.3 → loopflow-0.8.4}/.lf/directions/listener.md +0 -0
  121. {loopflow-0.8.3 → loopflow-0.8.4}/AGENTS.md +0 -0
  122. {loopflow-0.8.3 → loopflow-0.8.4}/CLAUDE.md +0 -0
  123. {loopflow-0.8.3 → loopflow-0.8.4}/Cargo.toml +0 -0
  124. {loopflow-0.8.3 → loopflow-0.8.4}/PROMPT_STYLE.md +0 -0
  125. {loopflow-0.8.3 → loopflow-0.8.4}/RELEASE_NOTES.md +0 -0
  126. {loopflow-0.8.3 → loopflow-0.8.4}/STYLE.md +0 -0
  127. {loopflow-0.8.3 → loopflow-0.8.4}/TESTING.md +0 -0
  128. {loopflow-0.8.3 → loopflow-0.8.4}/VISUAL_DESIGN.md +0 -0
  129. {loopflow-0.8.3 → loopflow-0.8.4}/bin/test-summaries +0 -0
  130. {loopflow-0.8.3 → loopflow-0.8.4}/bin/waves-start +0 -0
  131. {loopflow-0.8.3 → loopflow-0.8.4}/bin/waves-stop +0 -0
  132. {loopflow-0.8.3 → loopflow-0.8.4}/docs/_config.yml +0 -0
  133. {loopflow-0.8.3 → loopflow-0.8.4}/docs/index.md +0 -0
  134. {loopflow-0.8.3 → loopflow-0.8.4}/docs/lfd.md +0 -0
  135. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-main-uitest.png +0 -0
  136. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-main.png +0 -0
  137. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-wave-running-uitest.png +0 -0
  138. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-wave-running.png +0 -0
  139. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-wave-waiting-uitest.png +0 -0
  140. {loopflow-0.8.3 → loopflow-0.8.4}/docs/screenshots/concerto-wave-waiting.png +0 -0
  141. {loopflow-0.8.3 → loopflow-0.8.4}/docs/stubs/lf-context +0 -0
  142. {loopflow-0.8.3 → loopflow-0.8.4}/docs/waves.md +0 -0
  143. {loopflow-0.8.3 → loopflow-0.8.4}/loopflow.code-workspace +0 -0
  144. {loopflow-0.8.3 → loopflow-0.8.4}/proto/README.md +0 -0
  145. {loopflow-0.8.3 → loopflow-0.8.4}/proto/VERSIONING.md +0 -0
  146. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/output_line.json +0 -0
  147. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/scheduler_slot_acquired.json +0 -0
  148. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/scheduler_slot_released.json +0 -0
  149. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/session_ended.json +0 -0
  150. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/session_started.json +0 -0
  151. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/wave_activated.json +0 -0
  152. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/wave_created.json +0 -0
  153. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/wave_started.json +0 -0
  154. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/wave_stopped.json +0 -0
  155. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/wave_waiting.json +0 -0
  156. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/worktree_pruned.json +0 -0
  157. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/events/worktree_updated.json +0 -0
  158. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/requests/connect_wave.json +0 -0
  159. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/requests/create_wave.json +0 -0
  160. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/requests/gather_context.json +0 -0
  161. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/analyze_tokens.json +0 -0
  162. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/connect_wave.json +0 -0
  163. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/create_wave.json +0 -0
  164. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/error_detail.json +0 -0
  165. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/gather_context.json +0 -0
  166. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/get_health.json +0 -0
  167. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/get_status.json +0 -0
  168. {loopflow-0.8.3 → loopflow-0.8.4}/proto/fixtures/responses/list_worktrees.json +0 -0
  169. {loopflow-0.8.3 → loopflow-0.8.4}/proto/loopflow/control/v1/control.proto +0 -0
  170. {loopflow-0.8.3 → loopflow-0.8.4}/proto/loopflow/engine/v1/engine.proto +0 -0
  171. {loopflow-0.8.3 → loopflow-0.8.4}/pyproject.toml +0 -0
  172. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/__init__.py +0 -0
  173. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/cli.py +0 -0
  174. {loopflow-0.8.3 → loopflow-0.8.4}/python/loopflow/errors.py +0 -0
  175. {loopflow-0.8.3 → loopflow-0.8.4}/python/tests/test_cli.py +0 -0
  176. {loopflow-0.8.3 → loopflow-0.8.4}/python/tests/test_client.py +0 -0
  177. {loopflow-0.8.3 → loopflow-0.8.4}/reports/cli/ux-polish.md +0 -0
  178. {loopflow-0.8.3 → loopflow-0.8.4}/reports/code-quality.md +0 -0
  179. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/00-overview.md +0 -0
  180. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/01-platform.md +0 -0
  181. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/02-auth.md +0 -0
  182. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/03-conduct-ux.md +0 -0
  183. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/04-improvise-ux.md +0 -0
  184. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/05-remote-terminal.md +0 -0
  185. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/06-data-structures.md +0 -0
  186. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/07-ux-experiments.md +0 -0
  187. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/08-notifications.md +0 -0
  188. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/09-phasing.md +0 -0
  189. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto/README.md +0 -0
  190. {loopflow-0.8.3 → loopflow-0.8.4}/reports/concerto-vision.md +0 -0
  191. {loopflow-0.8.3 → loopflow-0.8.4}/reports/landscape.md +0 -0
  192. {loopflow-0.8.3 → loopflow-0.8.4}/reports/lfd-reliability.md +0 -0
  193. {loopflow-0.8.3 → loopflow-0.8.4}/reports/rust-lfd.md +0 -0
  194. {loopflow-0.8.3 → loopflow-0.8.4}/reports/target-customer.md +0 -0
  195. {loopflow-0.8.3 → loopflow-0.8.4}/reports/teams-vision.md +0 -0
  196. {loopflow-0.8.3 → loopflow-0.8.4}/reports/terminal-reference.md +0 -0
  197. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/agent-harness.md +0 -0
  198. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/chat-experience.md +0 -0
  199. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/ios-conduct-ui.md +0 -0
  200. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/ios-improvise-ui.md +0 -0
  201. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/push-notifications.md +0 -0
  202. {loopflow-0.8.3/roadmap/concerto → loopflow-0.8.4/roadmap/mobile}/remote-terminal-view.md +0 -0
  203. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/rust/03-service.md +0 -0
  204. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/ux/README.md +0 -0
  205. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/01-decouple-screenshots.md +0 -0
  206. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/02-screenshot-coverage.md +0 -0
  207. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/03-visual-research.md +0 -0
  208. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/04-design-audit.md +0 -0
  209. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/05-docs-inventory.md +0 -0
  210. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/06-theming-system.md +0 -0
  211. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/07-polish.md +0 -0
  212. {loopflow-0.8.3 → loopflow-0.8.4}/roadmap/viz/README.md +0 -0
  213. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/bin/lf-prompt.rs +0 -0
  214. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/bin/lfd.rs +0 -0
  215. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/LOOPFLOW.md +0 -0
  216. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/roles/ceo.md +0 -0
  217. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/roles/designer.md +0 -0
  218. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/roles/infra-engineer.md +0 -0
  219. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/roles/product-engineer.md +0 -0
  220. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/values/craft.md +0 -0
  221. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/values/flow.md +0 -0
  222. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/directions/values/scale.md +0 -0
  223. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/README.md +0 -0
  224. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/design-and-ship.yaml +0 -0
  225. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/grind.yaml +0 -0
  226. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/incident.yaml +0 -0
  227. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/pair.yaml +0 -0
  228. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/ship-roadmap.yaml +0 -0
  229. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/ship.yaml +0 -0
  230. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/code/start.yaml +0 -0
  231. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/plan/publish.yaml +0 -0
  232. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/plan/research.yaml +0 -0
  233. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/plan/roadmap-expand.yaml +0 -0
  234. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/plan/roadmap-polish.yaml +0 -0
  235. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/flows/plan/roadmap-reduce.yaml +0 -0
  236. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/ops/commit_message.md +0 -0
  237. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/ops/pr_message.md +0 -0
  238. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/ops/release_notes.md +0 -0
  239. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/code/compress.md +0 -0
  240. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/code/debug.md +0 -0
  241. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/code/gate.md +0 -0
  242. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/code/implement.md +0 -0
  243. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/interactive/design.md +0 -0
  244. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/interactive/explore.md +0 -0
  245. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/interactive/refine.md +0 -0
  246. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/add-to-roadmap.md +0 -0
  247. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/commit.md +0 -0
  248. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/consolidate.md +0 -0
  249. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/init.md +0 -0
  250. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/lint.md +0 -0
  251. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/rebase.md +0 -0
  252. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/synthesize.md +0 -0
  253. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/ops/validate.md +0 -0
  254. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/5whys.md +0 -0
  255. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/expand.md +0 -0
  256. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/ingest.md +0 -0
  257. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/iterate.md +0 -0
  258. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/kickoff.md +0 -0
  259. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/polish.md +0 -0
  260. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/reduce.md +0 -0
  261. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/review.md +0 -0
  262. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins/steps/plan/roadmap.md +0 -0
  263. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/builtins.rs +0 -0
  264. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/clipboard.rs +0 -0
  265. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/command.rs +0 -0
  266. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/error.rs +0 -0
  267. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/event.rs +0 -0
  268. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/flow.rs +0 -0
  269. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/mod.rs +0 -0
  270. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/naming.rs +0 -0
  271. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/prompt.rs +0 -0
  272. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/worktree.rs +0 -0
  273. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/engine/worktrees.rs +0 -0
  274. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/flow.rs +0 -0
  275. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/list.rs +0 -0
  276. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/mod.rs +0 -0
  277. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/run.rs +0 -0
  278. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/commands/util.rs +0 -0
  279. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/discovery.rs +0 -0
  280. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lf/output.rs +0 -0
  281. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/auth.rs +0 -0
  282. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/config.rs +0 -0
  283. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/credentials.rs +0 -0
  284. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/events.rs +0 -0
  285. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/hooks.rs +0 -0
  286. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/system.rs +0 -0
  287. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/routes/wave_runs.rs +0 -0
  288. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/http/state.rs +0 -0
  289. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/id.rs +0 -0
  290. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/machine_id.rs +0 -0
  291. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/mod.rs +0 -0
  292. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/obs.rs +0 -0
  293. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/output.rs +0 -0
  294. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/registration.rs +0 -0
  295. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/sessions.rs +0 -0
  296. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/types/agent.rs +0 -0
  297. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lfd/types/wave.rs +0 -0
  298. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/lib.rs +0 -0
  299. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/abandon.rs +0 -0
  300. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/collapse.rs +0 -0
  301. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/commit.rs +0 -0
  302. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/error.rs +0 -0
  303. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/land.rs +0 -0
  304. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/lint.rs +0 -0
  305. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/messages.rs +0 -0
  306. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/progress.rs +0 -0
  307. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/trace.rs +0 -0
  308. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/src/ops/util.rs +0 -0
  309. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/agent_tests.rs +0 -0
  310. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/collapse_tests.rs +0 -0
  311. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/commit_tests.rs +0 -0
  312. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/config_tests.rs +0 -0
  313. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/context_tests.rs +0 -0
  314. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/discovery_tests.rs +0 -0
  315. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/flow_tests.rs +0 -0
  316. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/git_tests.rs +0 -0
  317. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/golden_prompt.rs +0 -0
  318. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/land_tests.rs +0 -0
  319. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/pr_tests.rs +0 -0
  320. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/rebase_tests.rs +0 -0
  321. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/support/mod.rs +0 -0
  322. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/token_tests.rs +0 -0
  323. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/wave_worktree_tests.rs +0 -0
  324. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow/tests/worktree_tests.rs +0 -0
  325. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow-test-support/Cargo.toml +0 -0
  326. {loopflow-0.8.3 → loopflow-0.8.4}/rust/loopflow-test-support/src/lib.rs +0 -0
  327. {loopflow-0.8.3 → loopflow-0.8.4}/scripts/dev-lf +0 -0
  328. {loopflow-0.8.3 → loopflow-0.8.4}/scripts/dev.py +0 -0
  329. {loopflow-0.8.3 → loopflow-0.8.4}/scripts/generate_screenshots.py +0 -0
  330. {loopflow-0.8.3 → loopflow-0.8.4}/scripts/publish.py +0 -0
  331. {loopflow-0.8.3 → loopflow-0.8.4}/scripts/screenshots.yaml +0 -0
  332. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/AppIcon.icns +0 -0
  333. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/BrandColors.swift +0 -0
  334. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Concerto.sdef +0 -0
  335. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/ConcertoApp.swift +0 -0
  336. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/DesignSystem.swift +0 -0
  337. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Flags.swift +0 -0
  338. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Info.plist +0 -0
  339. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Models/RecentRepo.swift +0 -0
  340. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/ScriptCommands.swift +0 -0
  341. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/AppIconProvider.swift +0 -0
  342. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/Ghostty/GhosttyManager.swift +0 -0
  343. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/Ghostty/GhosttyTerminalView.swift +0 -0
  344. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/Ghostty/GhosttyTypes.swift +0 -0
  345. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/Ghostty/README.md +0 -0
  346. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/NameGenerator.swift +0 -0
  347. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/RecentAreasService.swift +0 -0
  348. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/RecentsService.swift +0 -0
  349. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/SetupService.swift +0 -0
  350. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/SnapshotService.swift +0 -0
  351. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Services/TerminalLauncher.swift +0 -0
  352. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/State/OutputBuffer.swift +0 -0
  353. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/UX_DESIGN.md +0 -0
  354. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/AreaTypeahead.swift +0 -0
  355. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/CommandPalette.swift +0 -0
  356. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/DiagnosticsView.swift +0 -0
  357. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/DirectionTypeahead.swift +0 -0
  358. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/EmbeddedTerminalPanel.swift +0 -0
  359. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/FlowProgressPills.swift +0 -0
  360. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/FlowTypeahead.swift +0 -0
  361. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/InteractiveSessionView.swift +0 -0
  362. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/IterationTimeline.swift +0 -0
  363. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/LiveOutput.swift +0 -0
  364. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/QuickExperimentView.swift +0 -0
  365. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/RepoWindow.swift +0 -0
  366. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/SetupView.swift +0 -0
  367. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/TerminalTestWindow.swift +0 -0
  368. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/TypeaheadComponents.swift +0 -0
  369. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WaitingStateCard.swift +0 -0
  370. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Concerto/Views/WelcomeWindow.swift +0 -0
  371. {loopflow-0.8.3 → loopflow-0.8.4}/swift/ConcertoTests/AuthServiceTests.swift +0 -0
  372. {loopflow-0.8.3 → loopflow-0.8.4}/swift/ConcertoTests/GhosttyTests.swift +0 -0
  373. {loopflow-0.8.3 → loopflow-0.8.4}/swift/ConcertoUITests/ScreenshotPipelineTests.swift +0 -0
  374. {loopflow-0.8.3 → loopflow-0.8.4}/swift/DESIGN.md +0 -0
  375. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Info.plist +0 -0
  376. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/LoopflowCore.swift +0 -0
  377. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/AppPreferences.swift +0 -0
  378. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/AppearanceMode.swift +0 -0
  379. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/Flow.swift +0 -0
  380. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/PullRequest.swift +0 -0
  381. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/StatusColors.swift +0 -0
  382. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/Step.swift +0 -0
  383. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Models/WaveRun.swift +0 -0
  384. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/AuthError.swift +0 -0
  385. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/AuthService.swift +0 -0
  386. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/AuthState.swift +0 -0
  387. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/LoggingService.swift +0 -0
  388. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/NotificationService.swift +0 -0
  389. {loopflow-0.8.3 → loopflow-0.8.4}/swift/LoopflowCore/Services/TokenProvider.swift +0 -0
  390. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Package.resolved +0 -0
  391. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Package.swift +0 -0
  392. {loopflow-0.8.3 → loopflow-0.8.4}/swift/README.md +0 -0
  393. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Symphonia/SymphoniaApp.swift +0 -0
  394. {loopflow-0.8.3 → loopflow-0.8.4}/swift/Symphonia/Views/PlaceholderView.swift +0 -0
  395. {loopflow-0.8.3 → loopflow-0.8.4}/swift/SymphoniaTests/SymphoniaTests.swift +0 -0
  396. {loopflow-0.8.3 → loopflow-0.8.4}/swift/project.yml +0 -0
  397. {loopflow-0.8.3 → loopflow-0.8.4}/tests/e2e/test_full_cycle.sh +0 -0
  398. {loopflow-0.8.3 → loopflow-0.8.4}/tests/e2e/test_rebase_conflict.sh +0 -0
  399. {loopflow-0.8.3 → loopflow-0.8.4}/tests/e2e/test_smoke.sh +0 -0
  400. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/basic.md +0 -0
  401. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/basic.yaml +0 -0
  402. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/with_direction.md +0 -0
  403. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/with_direction.yaml +0 -0
  404. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/with_lfdocs.md +0 -0
  405. {loopflow-0.8.3 → loopflow-0.8.4}/tests/goldens/with_lfdocs.yaml +0 -0
  406. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/basic/.lf/steps/test.md +0 -0
  407. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_direction/.lf/directions/thorough.md +0 -0
  408. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_direction/.lf/steps/test.md +0 -0
  409. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_lfdocs/.lf/steps/test.md +0 -0
  410. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_lfdocs/README.md +0 -0
  411. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_lfdocs/roadmap/rust/README.md +0 -0
  412. {loopflow-0.8.3 → loopflow-0.8.4}/tests/parity/fixtures/with_lfdocs/scratch/design.md +0 -0
  413. {loopflow-0.8.3 → loopflow-0.8.4}/uv.lock +0 -0
@@ -96,7 +96,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
96
96
  dependencies = [
97
97
  "proc-macro2",
98
98
  "quote",
99
- "syn 2.0.114",
99
+ "syn",
100
100
  ]
101
101
 
102
102
  [[package]]
@@ -237,16 +237,6 @@ dependencies = [
237
237
  "objc2",
238
238
  ]
239
239
 
240
- [[package]]
241
- name = "bollard-stubs"
242
- version = "1.42.0-rc.3"
243
- source = "registry+https://github.com/rust-lang/crates.io-index"
244
- checksum = "ed59b5c00048f48d7af971b71f800fdf23e858844a6f9e4d32ca72e9399e7864"
245
- dependencies = [
246
- "serde",
247
- "serde_with",
248
- ]
249
-
250
240
  [[package]]
251
241
  name = "bstr"
252
242
  version = "1.12.1"
@@ -331,7 +321,7 @@ dependencies = [
331
321
  "anstream",
332
322
  "anstyle",
333
323
  "clap_lex",
334
- "strsim 0.11.1",
324
+ "strsim",
335
325
  ]
336
326
 
337
327
  [[package]]
@@ -343,7 +333,7 @@ dependencies = [
343
333
  "heck",
344
334
  "proc-macro2",
345
335
  "quote",
346
- "syn 2.0.114",
336
+ "syn",
347
337
  ]
348
338
 
349
339
  [[package]]
@@ -440,41 +430,6 @@ dependencies = [
440
430
  "windows-sys 0.61.2",
441
431
  ]
442
432
 
443
- [[package]]
444
- name = "darling"
445
- version = "0.13.4"
446
- source = "registry+https://github.com/rust-lang/crates.io-index"
447
- checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
448
- dependencies = [
449
- "darling_core",
450
- "darling_macro",
451
- ]
452
-
453
- [[package]]
454
- name = "darling_core"
455
- version = "0.13.4"
456
- source = "registry+https://github.com/rust-lang/crates.io-index"
457
- checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
458
- dependencies = [
459
- "fnv",
460
- "ident_case",
461
- "proc-macro2",
462
- "quote",
463
- "strsim 0.10.0",
464
- "syn 1.0.109",
465
- ]
466
-
467
- [[package]]
468
- name = "darling_macro"
469
- version = "0.13.4"
470
- source = "registry+https://github.com/rust-lang/crates.io-index"
471
- checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
472
- dependencies = [
473
- "darling_core",
474
- "quote",
475
- "syn 1.0.109",
476
- ]
477
-
478
433
  [[package]]
479
434
  name = "data-encoding"
480
435
  version = "2.10.0"
@@ -576,7 +531,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
576
531
  dependencies = [
577
532
  "proc-macro2",
578
533
  "quote",
579
- "syn 2.0.114",
534
+ "syn",
580
535
  ]
581
536
 
582
537
  [[package]]
@@ -692,21 +647,6 @@ dependencies = [
692
647
  "percent-encoding",
693
648
  ]
694
649
 
695
- [[package]]
696
- name = "futures"
697
- version = "0.3.31"
698
- source = "registry+https://github.com/rust-lang/crates.io-index"
699
- checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
700
- dependencies = [
701
- "futures-channel",
702
- "futures-core",
703
- "futures-executor",
704
- "futures-io",
705
- "futures-sink",
706
- "futures-task",
707
- "futures-util",
708
- ]
709
-
710
650
  [[package]]
711
651
  name = "futures-channel"
712
652
  version = "0.3.31"
@@ -723,23 +663,6 @@ version = "0.3.31"
723
663
  source = "registry+https://github.com/rust-lang/crates.io-index"
724
664
  checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
725
665
 
726
- [[package]]
727
- name = "futures-executor"
728
- version = "0.3.31"
729
- source = "registry+https://github.com/rust-lang/crates.io-index"
730
- checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
731
- dependencies = [
732
- "futures-core",
733
- "futures-task",
734
- "futures-util",
735
- ]
736
-
737
- [[package]]
738
- name = "futures-io"
739
- version = "0.3.31"
740
- source = "registry+https://github.com/rust-lang/crates.io-index"
741
- checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
742
-
743
666
  [[package]]
744
667
  name = "futures-macro"
745
668
  version = "0.3.31"
@@ -748,7 +671,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
748
671
  dependencies = [
749
672
  "proc-macro2",
750
673
  "quote",
751
- "syn 2.0.114",
674
+ "syn",
752
675
  ]
753
676
 
754
677
  [[package]]
@@ -769,13 +692,10 @@ version = "0.3.31"
769
692
  source = "registry+https://github.com/rust-lang/crates.io-index"
770
693
  checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
771
694
  dependencies = [
772
- "futures-channel",
773
695
  "futures-core",
774
- "futures-io",
775
696
  "futures-macro",
776
697
  "futures-sink",
777
698
  "futures-task",
778
- "memchr",
779
699
  "pin-project-lite",
780
700
  "pin-utils",
781
701
  "slab",
@@ -1162,12 +1082,6 @@ dependencies = [
1162
1082
  "zerovec",
1163
1083
  ]
1164
1084
 
1165
- [[package]]
1166
- name = "ident_case"
1167
- version = "1.0.1"
1168
- source = "registry+https://github.com/rust-lang/crates.io-index"
1169
- checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
1170
-
1171
1085
  [[package]]
1172
1086
  name = "idna"
1173
1087
  version = "1.1.0"
@@ -1403,7 +1317,6 @@ dependencies = [
1403
1317
  "serde_yaml",
1404
1318
  "sha2",
1405
1319
  "tempfile",
1406
- "testcontainers",
1407
1320
  "thiserror",
1408
1321
  "tiktoken-rs",
1409
1322
  "time",
@@ -1624,7 +1537,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1624
1537
  dependencies = [
1625
1538
  "proc-macro2",
1626
1539
  "quote",
1627
- "syn 2.0.114",
1540
+ "syn",
1628
1541
  ]
1629
1542
 
1630
1543
  [[package]]
@@ -2132,7 +2045,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
2132
2045
  dependencies = [
2133
2046
  "proc-macro2",
2134
2047
  "quote",
2135
- "syn 2.0.114",
2048
+ "syn",
2136
2049
  ]
2137
2050
 
2138
2051
  [[package]]
@@ -2171,28 +2084,6 @@ dependencies = [
2171
2084
  "serde",
2172
2085
  ]
2173
2086
 
2174
- [[package]]
2175
- name = "serde_with"
2176
- version = "1.14.0"
2177
- source = "registry+https://github.com/rust-lang/crates.io-index"
2178
- checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff"
2179
- dependencies = [
2180
- "serde",
2181
- "serde_with_macros",
2182
- ]
2183
-
2184
- [[package]]
2185
- name = "serde_with_macros"
2186
- version = "1.5.2"
2187
- source = "registry+https://github.com/rust-lang/crates.io-index"
2188
- checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082"
2189
- dependencies = [
2190
- "darling",
2191
- "proc-macro2",
2192
- "quote",
2193
- "syn 1.0.109",
2194
- ]
2195
-
2196
2087
  [[package]]
2197
2088
  name = "serde_yaml"
2198
2089
  version = "0.9.34+deprecated"
@@ -2356,12 +2247,6 @@ dependencies = [
2356
2247
  "unicode-properties",
2357
2248
  ]
2358
2249
 
2359
- [[package]]
2360
- name = "strsim"
2361
- version = "0.10.0"
2362
- source = "registry+https://github.com/rust-lang/crates.io-index"
2363
- checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
2364
-
2365
2250
  [[package]]
2366
2251
  name = "strsim"
2367
2252
  version = "0.11.1"
@@ -2374,17 +2259,6 @@ version = "2.6.1"
2374
2259
  source = "registry+https://github.com/rust-lang/crates.io-index"
2375
2260
  checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2376
2261
 
2377
- [[package]]
2378
- name = "syn"
2379
- version = "1.0.109"
2380
- source = "registry+https://github.com/rust-lang/crates.io-index"
2381
- checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
2382
- dependencies = [
2383
- "proc-macro2",
2384
- "quote",
2385
- "unicode-ident",
2386
- ]
2387
-
2388
2262
  [[package]]
2389
2263
  name = "syn"
2390
2264
  version = "2.0.114"
@@ -2413,7 +2287,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
2413
2287
  dependencies = [
2414
2288
  "proc-macro2",
2415
2289
  "quote",
2416
- "syn 2.0.114",
2290
+ "syn",
2417
2291
  ]
2418
2292
 
2419
2293
  [[package]]
@@ -2459,23 +2333,6 @@ dependencies = [
2459
2333
  "libc",
2460
2334
  ]
2461
2335
 
2462
- [[package]]
2463
- name = "testcontainers"
2464
- version = "0.15.0"
2465
- source = "registry+https://github.com/rust-lang/crates.io-index"
2466
- checksum = "f83d2931d7f521af5bae989f716c3fa43a6af9af7ec7a5e21b59ae40878cec00"
2467
- dependencies = [
2468
- "bollard-stubs",
2469
- "futures",
2470
- "hex",
2471
- "hmac",
2472
- "log",
2473
- "rand 0.8.5",
2474
- "serde",
2475
- "serde_json",
2476
- "sha2",
2477
- ]
2478
-
2479
2336
  [[package]]
2480
2337
  name = "thiserror"
2481
2338
  version = "1.0.69"
@@ -2493,7 +2350,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2493
2350
  dependencies = [
2494
2351
  "proc-macro2",
2495
2352
  "quote",
2496
- "syn 2.0.114",
2353
+ "syn",
2497
2354
  ]
2498
2355
 
2499
2356
  [[package]]
@@ -2601,7 +2458,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
2601
2458
  dependencies = [
2602
2459
  "proc-macro2",
2603
2460
  "quote",
2604
- "syn 2.0.114",
2461
+ "syn",
2605
2462
  ]
2606
2463
 
2607
2464
  [[package]]
@@ -2771,7 +2628,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
2771
2628
  dependencies = [
2772
2629
  "proc-macro2",
2773
2630
  "quote",
2774
- "syn 2.0.114",
2631
+ "syn",
2775
2632
  ]
2776
2633
 
2777
2634
  [[package]]
@@ -3039,7 +2896,7 @@ dependencies = [
3039
2896
  "bumpalo",
3040
2897
  "proc-macro2",
3041
2898
  "quote",
3042
- "syn 2.0.114",
2899
+ "syn",
3043
2900
  "wasm-bindgen-shared",
3044
2901
  ]
3045
2902
 
@@ -3125,7 +2982,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
3125
2982
  dependencies = [
3126
2983
  "proc-macro2",
3127
2984
  "quote",
3128
- "syn 2.0.114",
2985
+ "syn",
3129
2986
  ]
3130
2987
 
3131
2988
  [[package]]
@@ -3136,7 +2993,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
3136
2993
  dependencies = [
3137
2994
  "proc-macro2",
3138
2995
  "quote",
3139
- "syn 2.0.114",
2996
+ "syn",
3140
2997
  ]
3141
2998
 
3142
2999
  [[package]]
@@ -3436,7 +3293,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
3436
3293
  dependencies = [
3437
3294
  "proc-macro2",
3438
3295
  "quote",
3439
- "syn 2.0.114",
3296
+ "syn",
3440
3297
  "synstructure",
3441
3298
  ]
3442
3299
 
@@ -3457,7 +3314,7 @@ checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0"
3457
3314
  dependencies = [
3458
3315
  "proc-macro2",
3459
3316
  "quote",
3460
- "syn 2.0.114",
3317
+ "syn",
3461
3318
  ]
3462
3319
 
3463
3320
  [[package]]
@@ -3477,7 +3334,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
3477
3334
  dependencies = [
3478
3335
  "proc-macro2",
3479
3336
  "quote",
3480
- "syn 2.0.114",
3337
+ "syn",
3481
3338
  "synstructure",
3482
3339
  ]
3483
3340
 
@@ -3517,7 +3374,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
3517
3374
  dependencies = [
3518
3375
  "proc-macro2",
3519
3376
  "quote",
3520
- "syn 2.0.114",
3377
+ "syn",
3521
3378
  ]
3522
3379
 
3523
3380
  [[package]]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loopflow
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Summary: Run LLM coding agents from reusable prompt files
5
5
  Project-URL: Homepage, https://loopflowstudio.github.io/loopflow/
6
6
  Project-URL: Repository, https://github.com/loopflowstudio/loopflow
@@ -26,7 +26,7 @@ Description-Content-Type: text/markdown
26
26
 
27
27
  # Loopflow
28
28
 
29
- Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI) at high scale.
29
+ Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI, OpenCode) at high scale.
30
30
 
31
31
  Loopflow helps you create and run **Waves**. Waves are chains of coding agents working together in pre-defined ways.
32
32
 
@@ -209,6 +209,7 @@ loopflow.run_wave("engbot")
209
209
  - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — Anthropic's coding agent (default)
210
210
  - [Codex CLI](https://github.com/openai/codex) — OpenAI's coding agent
211
211
  - [Gemini CLI](https://github.com/google-gemini/gemini-cli) — Google's coding agent
212
+ - [OpenCode](https://github.com/anomalyco/opencode) — Open source coding agent
212
213
 
213
214
  **Skill Libraries**
214
215
  - [superpowers](https://github.com/obra/superpowers) — prompt library (`lf sp:<skill>`)
@@ -218,7 +219,7 @@ loopflow.run_wave("engbot")
218
219
  ## Requirements
219
220
 
220
221
  - macOS
221
- - [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), or [Gemini CLI](https://github.com/google-gemini/gemini-cli)
222
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [Gemini CLI](https://github.com/google-gemini/gemini-cli), or [OpenCode](https://github.com/anomalyco/opencode)
222
223
 
223
224
  ## License
224
225
 
@@ -1,6 +1,6 @@
1
1
  # Loopflow
2
2
 
3
- Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI) at high scale.
3
+ Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI, OpenCode) at high scale.
4
4
 
5
5
  Loopflow helps you create and run **Waves**. Waves are chains of coding agents working together in pre-defined ways.
6
6
 
@@ -183,6 +183,7 @@ loopflow.run_wave("engbot")
183
183
  - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — Anthropic's coding agent (default)
184
184
  - [Codex CLI](https://github.com/openai/codex) — OpenAI's coding agent
185
185
  - [Gemini CLI](https://github.com/google-gemini/gemini-cli) — Google's coding agent
186
+ - [OpenCode](https://github.com/anomalyco/opencode) — Open source coding agent
186
187
 
187
188
  **Skill Libraries**
188
189
  - [superpowers](https://github.com/obra/superpowers) — prompt library (`lf sp:<skill>`)
@@ -192,7 +193,7 @@ loopflow.run_wave("engbot")
192
193
  ## Requirements
193
194
 
194
195
  - macOS
195
- - [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), or [Gemini CLI](https://github.com/google-gemini/gemini-cli)
196
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [Gemini CLI](https://github.com/google-gemini/gemini-cli), or [OpenCode](https://github.com/anomalyco/opencode)
196
197
 
197
198
  ## License
198
199
 
@@ -198,7 +198,15 @@ Default model for all steps.
198
198
  | **Config** | `agent_model: claude:opus` |
199
199
  | **Default** | `claude:opus` |
200
200
 
201
- Backends: `claude`, `codex`, `gemini`. Use `backend:variant` for specific models.
201
+ Backends: `claude`, `codex`, `gemini`, `opencode`. Use `backend:variant` for specific models.
202
+
203
+ OpenCode passes model strings through to its own provider system:
204
+
205
+ ```yaml
206
+ agent_model: opencode # use opencode's default model
207
+ agent_model: opencode:anthropic/claude-sonnet # explicit model
208
+ agent_model: opencode:openai/gpt-4o # any provider opencode supports
209
+ ```
202
210
 
203
211
  ### Run Mode
204
212
 
@@ -261,7 +269,7 @@ Skip permissions. Codex uses the danger-full-access sandbox.
261
269
  | **Config** | `yolo: true` |
262
270
  | **Default** | `false` |
263
271
 
264
- Claude: `--dangerously-skip-permissions`. Codex: `--sandbox danger-full-access` with `approval_policy="never"`. Gemini: `--yolo`.
272
+ Claude: `--dangerously-skip-permissions`. Codex: `--sandbox danger-full-access` with `approval_policy="never"`. Gemini: `--yolo`. OpenCode: `permission: "allow"` via `OPENCODE_CONFIG_CONTENT`.
265
273
 
266
274
  ### Autoprune
267
275
 
@@ -20,7 +20,7 @@ Install the Python CLI/API (lfq + loopflow) separately:
20
20
  uv tool install loopflow
21
21
  ```
22
22
 
23
- Requires macOS and one of: [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), or [Gemini CLI](https://github.com/google-gemini/gemini-cli).
23
+ Requires macOS and one of: [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [Gemini CLI](https://github.com/google-gemini/gemini-cli), or [OpenCode](https://github.com/anomalyco/opencode).
24
24
 
25
25
  ---
26
26
 
@@ -5,7 +5,7 @@ title: lf Command Reference
5
5
 
6
6
  # lf Command Reference
7
7
 
8
- `lf` is a prompt launcher. Every command launches a prompt—assembling context and passing it to Claude, Codex, or Gemini.
8
+ `lf` is a prompt launcher. Every command launches a prompt—assembling context and passing it to Claude, Codex, Gemini, or OpenCode.
9
9
 
10
10
  ## Basic Usage
11
11
 
@@ -81,7 +81,7 @@ Inside step files, `{args}` is replaced with whatever comes after the colon.
81
81
 
82
82
  | Flag | Description |
83
83
  |------|-------------|
84
- | `-m, --model MODEL` | Choose model (e.g., `claude:opus`, `codex`, `gemini`) |
84
+ | `-m, --model MODEL` | Choose model (e.g., `claude:opus`, `codex`, `gemini`, `opencode`) |
85
85
  | `-d, --direction DIRECTION` | Apply direction (comma-separated for multiple) |
86
86
 
87
87
  ## Output Flags
@@ -72,7 +72,7 @@ Preserve the current worktree and create a fresh branch.
72
72
  lf ops next
73
73
  ```
74
74
 
75
- Moves the current worktree to a timestamped path, creates a new branch from the default branch, and recreates the worktree at the original path. Use it to keep moving after a PR without losing the existing worktree.
75
+ Commits and pushes current changes, optionally rebases, then creates and pushes a timestamped successor branch in the same worktree. If the current PR is already merged, it first resets to the default branch and syncs from origin before creating the next branch.
76
76
 
77
77
  ## lf ops commit
78
78
 
@@ -45,7 +45,7 @@ Check if the coding agent is stuck on a permission prompt or clarifying question
45
45
 
46
46
  **Symptom:** Tasks fail with rate limit errors.
47
47
 
48
- Claude, Codex, and Gemini have usage limits. Options:
48
+ Claude, Codex, Gemini, and OpenCode have usage limits. Options:
49
49
 
50
50
  - Wait and retry
51
51
  - Reduce parallel waves
@@ -47,7 +47,6 @@ def update_wave(
47
47
  flow: Optional[str] = None,
48
48
  direction: Optional[list[str]] = None,
49
49
  area: Optional[list[str]] = None,
50
- stimulus: Optional[Stimulus] = None,
51
50
  status: Optional[str] = None,
52
51
  ) -> Wave:
53
52
  return _client().update_wave(
@@ -55,7 +54,6 @@ def update_wave(
55
54
  flow=flow,
56
55
  direction=direction,
57
56
  area=area,
58
- stimulus=stimulus,
59
57
  status=status,
60
58
  )
61
59
 
@@ -78,6 +76,18 @@ def run_wave(
78
76
  )
79
77
 
80
78
 
79
+ def add_stimulus(
80
+ name_or_id: str,
81
+ kind: str,
82
+ cron: Optional[str] = None,
83
+ ) -> dict[str, Any]:
84
+ return _client().add_stimulus(name_or_id, kind, cron=cron)
85
+
86
+
87
+ def remove_stimulus(name_or_id: str, stimulus_id: str) -> dict[str, Any]:
88
+ return _client().remove_stimulus(name_or_id, stimulus_id)
89
+
90
+
81
91
  def stop_wave(name_or_id: str) -> dict[str, Any]:
82
92
  return _client().stop_wave(name_or_id)
83
93
 
@@ -131,6 +141,8 @@ __all__ = [
131
141
  "update_wave",
132
142
  "delete_wave",
133
143
  "run_wave",
144
+ "add_stimulus",
145
+ "remove_stimulus",
134
146
  "stop_wave",
135
147
  "land_wave",
136
148
  "next_wave",
@@ -7,7 +7,7 @@ from typing import Any, Optional
7
7
  import httpx
8
8
 
9
9
  from .errors import LoopflowError, WaveAlreadyRunning
10
- from .models import Stimulus, Wave, WaveRun
10
+ from .models import Wave, WaveRun
11
11
 
12
12
 
13
13
  def _resolve_base_url() -> str:
@@ -77,7 +77,6 @@ class Client:
77
77
  flow: Optional[str] = None,
78
78
  direction: Optional[list[str]] = None,
79
79
  area: Optional[list[str]] = None,
80
- stimulus: Optional[Stimulus] = None,
81
80
  status: Optional[str] = None,
82
81
  ) -> Wave:
83
82
  body: dict[str, Any] = {}
@@ -87,8 +86,6 @@ class Client:
87
86
  body["direction"] = direction
88
87
  if area is not None:
89
88
  body["area"] = area
90
- if stimulus is not None:
91
- body["stimulus"] = stimulus.model_dump(exclude_none=True)
92
89
  if status is not None:
93
90
  body["status"] = status
94
91
  payload = self._request_json("PATCH", f"/v0/waves/{name_or_id}", json=body)
@@ -113,6 +110,22 @@ class Client:
113
110
  body["area"] = area
114
111
  return self._request_json("POST", f"/v0/waves/{name_or_id}/run", json=body)
115
112
 
113
+ def add_stimulus(
114
+ self,
115
+ name_or_id: str,
116
+ kind: str,
117
+ cron: Optional[str] = None,
118
+ ) -> dict[str, Any]:
119
+ body: dict[str, Any] = {"kind": kind}
120
+ if cron is not None:
121
+ body["cron"] = cron
122
+ return self._request_json("POST", f"/v0/waves/{name_or_id}/stimulus", json=body)
123
+
124
+ def remove_stimulus(self, name_or_id: str, stimulus_id: str) -> dict[str, Any]:
125
+ return self._request_json(
126
+ "DELETE", f"/v0/waves/{name_or_id}/stimulus/{stimulus_id}"
127
+ )
128
+
116
129
  def stop_wave(self, name_or_id: str) -> dict[str, Any]:
117
130
  return self._request_json("POST", f"/v0/waves/{name_or_id}/stop")
118
131
 
@@ -7,6 +7,7 @@ from pydantic import BaseModel, Field
7
7
 
8
8
 
9
9
  class Stimulus(BaseModel):
10
+ id: Optional[str] = None
10
11
  kind: str
11
12
  cron: Optional[str] = None
12
13
 
@@ -46,13 +47,14 @@ class Wave(BaseModel):
46
47
  flow: str
47
48
  direction: list[str]
48
49
  area: list[str]
49
- stimulus: Optional[Stimulus] = None
50
+ stimuli: list[Stimulus] = Field(default_factory=list)
50
51
  status: str
51
52
  iteration: int
52
53
  local_worktree: Optional[str] = None
53
54
  remote_branch: Optional[str] = None
54
55
  commits: list[CommitEntry] = Field(default_factory=list)
55
56
  diff_stat: Optional[str] = None
57
+ flow_steps: list[str] = Field(default_factory=list)
56
58
  active_run: Optional[WaveRun] = None
57
59
  created_at: Optional[datetime] = None
58
60
 
@@ -1,10 +1,7 @@
1
- """Shared fixtures for Python tests."""
1
+ """Shared test payloads for Python tests."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import pytest
6
-
7
-
8
5
  WAVE_MINIMAL = {
9
6
  "id": "abc-123",
10
7
  "name": "reduce",
@@ -18,8 +15,9 @@ WAVE_MINIMAL = {
18
15
 
19
16
  WAVE_FULL = {
20
17
  **WAVE_MINIMAL,
21
- "stimulus": {"kind": "manual"},
18
+ "stimuli": [{"id": "stim-1", "kind": "loop"}],
22
19
  "created_at": "2026-02-08T01:56:54Z",
20
+ "flow_steps": ["review", "iterate", "ship", "gate"],
23
21
  "commits": [
24
22
  {"sha": "a1b2c3d", "message": "implement: add retry logic"},
25
23
  {"sha": "e4f5g6h", "message": "design: initial sketch"},
@@ -51,18 +49,3 @@ WAVE_RUN_MINIMAL = {
51
49
  "local_worktree": "/tmp/wt",
52
50
  "remote_branch": "wave/reduce",
53
51
  }
54
-
55
-
56
- @pytest.fixture
57
- def wave_minimal():
58
- return WAVE_MINIMAL.copy()
59
-
60
-
61
- @pytest.fixture
62
- def wave_full():
63
- return WAVE_FULL.copy()
64
-
65
-
66
- @pytest.fixture
67
- def wave_run_minimal():
68
- return WAVE_RUN_MINIMAL.copy()