loopflow 0.7.2__tar.gz → 0.8.2__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 (474) hide show
  1. loopflow-0.8.2/.claude/commands/ux-review.md +75 -0
  2. loopflow-0.8.2/.claude/commands/ux-synthesize-concerto.md +78 -0
  3. loopflow-0.8.2/.github/workflows/ci.yml +56 -0
  4. loopflow-0.8.2/.github/workflows/clear-scratch.yml +52 -0
  5. loopflow-0.8.2/.github/workflows/release.yml +144 -0
  6. {loopflow-0.7.2 → loopflow-0.8.2}/.gitignore +4 -1
  7. loopflow-0.8.2/.lf/SUMMARIZE.md +33 -0
  8. loopflow-0.8.2/.lf/config.yaml +23 -0
  9. loopflow-0.8.2/.lf/directions/conductor.md +13 -0
  10. loopflow-0.8.2/.lf/directions/improviser.md +13 -0
  11. loopflow-0.8.2/.lf/directions/listener.md +13 -0
  12. loopflow-0.8.2/AGENTS.md +316 -0
  13. loopflow-0.8.2/CLAUDE.md +1 -0
  14. loopflow-0.8.2/Cargo.lock +3527 -0
  15. loopflow-0.8.2/Cargo.toml +23 -0
  16. {loopflow-0.7.2 → loopflow-0.8.2}/PKG-INFO +50 -33
  17. loopflow-0.8.2/PROMPT_STYLE.md +197 -0
  18. {loopflow-0.7.2 → loopflow-0.8.2}/README.md +41 -11
  19. loopflow-0.8.2/RELEASE_NOTES.md +9 -0
  20. loopflow-0.8.2/STYLE.md +318 -0
  21. loopflow-0.8.2/TESTING.md +74 -0
  22. loopflow-0.8.2/VISUAL_DESIGN.md +402 -0
  23. loopflow-0.8.2/bin/test-summaries +108 -0
  24. loopflow-0.8.2/bin/waves-start +11 -0
  25. loopflow-0.8.2/bin/waves-stop +3 -0
  26. loopflow-0.8.2/docs/_config.yml +15 -0
  27. loopflow-0.8.2/docs/config.md +369 -0
  28. loopflow-0.8.2/docs/getting-started.md +137 -0
  29. loopflow-0.8.2/docs/index.md +239 -0
  30. loopflow-0.8.2/docs/lf.md +194 -0
  31. loopflow-0.8.2/docs/lfd.md +54 -0
  32. loopflow-0.8.2/docs/lfops.md +248 -0
  33. loopflow-0.8.2/docs/screenshots/concerto-main-uitest.png +0 -0
  34. loopflow-0.8.2/docs/screenshots/concerto-main.png +0 -0
  35. loopflow-0.8.2/docs/screenshots/concerto-wave-running-uitest.png +0 -0
  36. loopflow-0.8.2/docs/screenshots/concerto-wave-running.png +0 -0
  37. loopflow-0.8.2/docs/screenshots/concerto-wave-waiting-uitest.png +0 -0
  38. loopflow-0.8.2/docs/screenshots/concerto-wave-waiting.png +0 -0
  39. loopflow-0.8.2/docs/stubs/lf-context +22 -0
  40. loopflow-0.8.2/docs/troubleshooting.md +124 -0
  41. loopflow-0.8.2/docs/waves.md +169 -0
  42. loopflow-0.8.2/loopflow.code-workspace +7 -0
  43. loopflow-0.8.2/proto/README.md +160 -0
  44. loopflow-0.8.2/proto/VERSIONING.md +153 -0
  45. loopflow-0.8.2/proto/fixtures/events/output_line.json +8 -0
  46. loopflow-0.8.2/proto/fixtures/events/scheduler_slot_acquired.json +8 -0
  47. loopflow-0.8.2/proto/fixtures/events/scheduler_slot_released.json +8 -0
  48. loopflow-0.8.2/proto/fixtures/events/session_ended.json +11 -0
  49. loopflow-0.8.2/proto/fixtures/events/session_started.json +12 -0
  50. loopflow-0.8.2/proto/fixtures/events/wave_activated.json +8 -0
  51. loopflow-0.8.2/proto/fixtures/events/wave_created.json +8 -0
  52. loopflow-0.8.2/proto/fixtures/events/wave_started.json +7 -0
  53. loopflow-0.8.2/proto/fixtures/events/wave_stopped.json +7 -0
  54. loopflow-0.8.2/proto/fixtures/events/wave_waiting.json +12 -0
  55. loopflow-0.8.2/proto/fixtures/events/worktree_pruned.json +8 -0
  56. loopflow-0.8.2/proto/fixtures/events/worktree_updated.json +49 -0
  57. loopflow-0.8.2/proto/fixtures/requests/connect_wave.json +3 -0
  58. loopflow-0.8.2/proto/fixtures/requests/create_wave.json +8 -0
  59. loopflow-0.8.2/proto/fixtures/requests/gather_context.json +25 -0
  60. loopflow-0.8.2/proto/fixtures/responses/analyze_tokens.json +67 -0
  61. loopflow-0.8.2/proto/fixtures/responses/connect_wave.json +8 -0
  62. loopflow-0.8.2/proto/fixtures/responses/create_wave.json +21 -0
  63. loopflow-0.8.2/proto/fixtures/responses/error_detail.json +8 -0
  64. loopflow-0.8.2/proto/fixtures/responses/gather_context.json +50 -0
  65. loopflow-0.8.2/proto/fixtures/responses/get_health.json +20 -0
  66. loopflow-0.8.2/proto/fixtures/responses/get_status.json +6 -0
  67. loopflow-0.8.2/proto/fixtures/responses/list_worktrees.json +65 -0
  68. loopflow-0.8.2/proto/loopflow/control/v1/control.proto +771 -0
  69. loopflow-0.8.2/proto/loopflow/engine/v1/engine.proto +595 -0
  70. loopflow-0.8.2/pyproject.toml +52 -0
  71. loopflow-0.8.2/python/loopflow/__init__.py +1 -0
  72. loopflow-0.8.2/python/loopflow/api.py +133 -0
  73. loopflow-0.8.2/python/loopflow/cli.py +137 -0
  74. loopflow-0.8.2/python/loopflow/client.py +215 -0
  75. loopflow-0.8.2/python/loopflow/errors.py +6 -0
  76. loopflow-0.8.2/python/loopflow/models.py +52 -0
  77. loopflow-0.8.2/python/tests/conftest.py +63 -0
  78. loopflow-0.8.2/python/tests/test_client.py +135 -0
  79. loopflow-0.8.2/python/tests/test_models.py +49 -0
  80. loopflow-0.8.2/reports/cli/ux-polish.md +28 -0
  81. loopflow-0.8.2/reports/code-quality.md +29 -0
  82. loopflow-0.8.2/reports/concerto/00-overview.md +39 -0
  83. loopflow-0.8.2/reports/concerto/01-platform.md +41 -0
  84. loopflow-0.8.2/reports/concerto/02-auth.md +37 -0
  85. loopflow-0.8.2/reports/concerto/03-conduct-ux.md +67 -0
  86. loopflow-0.8.2/reports/concerto/04-improvise-ux.md +61 -0
  87. loopflow-0.8.2/reports/concerto/05-remote-terminal.md +44 -0
  88. loopflow-0.8.2/reports/concerto/06-data-structures.md +81 -0
  89. loopflow-0.8.2/reports/concerto/07-ux-experiments.md +124 -0
  90. loopflow-0.8.2/reports/concerto/08-notifications.md +56 -0
  91. loopflow-0.8.2/reports/concerto/09-phasing.md +60 -0
  92. loopflow-0.8.2/reports/concerto/README.md +30 -0
  93. loopflow-0.8.2/reports/concerto-vision.md +138 -0
  94. loopflow-0.8.2/reports/landscape.md +129 -0
  95. loopflow-0.8.2/reports/lfd-reliability.md +133 -0
  96. loopflow-0.8.2/reports/rust-lfd.md +225 -0
  97. loopflow-0.8.2/reports/target-customer.md +104 -0
  98. loopflow-0.8.2/reports/teams-vision.md +89 -0
  99. loopflow-0.8.2/reports/terminal-reference.md +581 -0
  100. loopflow-0.8.2/roadmap/concerto/02-studio-auth-v0.md +142 -0
  101. loopflow-0.8.2/roadmap/concerto/03-mobile-client-v0.md +238 -0
  102. loopflow-0.8.2/roadmap/concerto/README.md +88 -0
  103. loopflow-0.8.2/roadmap/concerto/agent-harness.md +60 -0
  104. loopflow-0.8.2/roadmap/concerto/chat-experience.md +61 -0
  105. loopflow-0.8.2/roadmap/concerto/ios-conduct-ui.md +31 -0
  106. loopflow-0.8.2/roadmap/concerto/ios-improvise-ui.md +30 -0
  107. loopflow-0.8.2/roadmap/concerto/push-notifications.md +40 -0
  108. loopflow-0.8.2/roadmap/concerto/remote-terminal-view.md +35 -0
  109. loopflow-0.8.2/roadmap/rust/02b-summarize.md +107 -0
  110. loopflow-0.8.2/roadmap/rust/02c-grpc-events.md +13 -0
  111. loopflow-0.8.2/roadmap/rust/03-service.md +485 -0
  112. loopflow-0.8.2/roadmap/rust/04-distribution.md +408 -0
  113. loopflow-0.8.2/roadmap/rust/05-auth.md +530 -0
  114. loopflow-0.8.2/roadmap/rust/06-executors.md +596 -0
  115. loopflow-0.8.2/roadmap/rust/07-deployment.md +524 -0
  116. loopflow-0.8.2/roadmap/rust/08-hosted.md +412 -0
  117. loopflow-0.8.2/roadmap/rust/ARCHITECTURE.md +346 -0
  118. loopflow-0.8.2/roadmap/rust/README.md +108 -0
  119. loopflow-0.8.2/rust/loopflow/Cargo.toml +74 -0
  120. loopflow-0.8.2/rust/loopflow/src/bin/lf-prompt.rs +75 -0
  121. loopflow-0.8.2/rust/loopflow/src/bin/lf.rs +273 -0
  122. loopflow-0.8.2/rust/loopflow/src/bin/lfd.rs +124 -0
  123. loopflow-0.8.2/rust/loopflow/src/engine/agent.rs +570 -0
  124. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/design.md +5 -1
  125. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/init.md +1 -9
  126. loopflow-0.8.2/rust/loopflow/src/engine/builtins.rs +195 -0
  127. loopflow-0.8.2/rust/loopflow/src/engine/clipboard.rs +52 -0
  128. loopflow-0.8.2/rust/loopflow/src/engine/command.rs +72 -0
  129. loopflow-0.8.2/rust/loopflow/src/engine/config.rs +947 -0
  130. loopflow-0.8.2/rust/loopflow/src/engine/error.rs +99 -0
  131. loopflow-0.8.2/rust/loopflow/src/engine/event.rs +31 -0
  132. loopflow-0.8.2/rust/loopflow/src/engine/flow.rs +858 -0
  133. loopflow-0.8.2/rust/loopflow/src/engine/git.rs +708 -0
  134. loopflow-0.8.2/rust/loopflow/src/engine/mod.rs +37 -0
  135. loopflow-0.8.2/rust/loopflow/src/engine/naming.rs +236 -0
  136. loopflow-0.8.2/rust/loopflow/src/engine/platform.rs +11 -0
  137. loopflow-0.8.2/rust/loopflow/src/engine/prompt.rs +2283 -0
  138. loopflow-0.8.2/rust/loopflow/src/engine/stream.rs +920 -0
  139. loopflow-0.8.2/rust/loopflow/src/engine/worktree.rs +97 -0
  140. loopflow-0.8.2/rust/loopflow/src/engine/worktrees.rs +265 -0
  141. loopflow-0.8.2/rust/loopflow/src/lf/commands/flow.rs +68 -0
  142. loopflow-0.8.2/rust/loopflow/src/lf/commands/list.rs +251 -0
  143. loopflow-0.8.2/rust/loopflow/src/lf/commands/mod.rs +5 -0
  144. loopflow-0.8.2/rust/loopflow/src/lf/commands/ops/mod.rs +720 -0
  145. loopflow-0.8.2/rust/loopflow/src/lf/commands/run.rs +317 -0
  146. loopflow-0.8.2/rust/loopflow/src/lf/commands/util.rs +32 -0
  147. loopflow-0.8.2/rust/loopflow/src/lf/discovery.rs +575 -0
  148. loopflow-0.8.2/rust/loopflow/src/lf/mod.rs +234 -0
  149. loopflow-0.8.2/rust/loopflow/src/lf/output.rs +240 -0
  150. loopflow-0.8.2/rust/loopflow/src/lfd/auth.rs +131 -0
  151. loopflow-0.8.2/rust/loopflow/src/lfd/config.rs +56 -0
  152. loopflow-0.8.2/rust/loopflow/src/lfd/credentials.rs +34 -0
  153. loopflow-0.8.2/rust/loopflow/src/lfd/events.rs +26 -0
  154. loopflow-0.8.2/rust/loopflow/src/lfd/executor.rs +788 -0
  155. loopflow-0.8.2/rust/loopflow/src/lfd/http/dto.rs +214 -0
  156. loopflow-0.8.2/rust/loopflow/src/lfd/http/mod.rs +110 -0
  157. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/flows.rs +152 -0
  158. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/hooks.rs +28 -0
  159. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/mod.rs +88 -0
  160. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/system.rs +110 -0
  161. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/wave_runs.rs +189 -0
  162. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/waves.rs +648 -0
  163. loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/ws.rs +111 -0
  164. loopflow-0.8.2/rust/loopflow/src/lfd/http/state.rs +24 -0
  165. loopflow-0.8.2/rust/loopflow/src/lfd/id.rs +120 -0
  166. loopflow-0.8.2/rust/loopflow/src/lfd/machine_id.rs +33 -0
  167. loopflow-0.8.2/rust/loopflow/src/lfd/mod.rs +82 -0
  168. loopflow-0.8.2/rust/loopflow/src/lfd/obs.rs +6 -0
  169. loopflow-0.8.2/rust/loopflow/src/lfd/output.rs +108 -0
  170. loopflow-0.8.2/rust/loopflow/src/lfd/registration.rs +261 -0
  171. loopflow-0.8.2/rust/loopflow/src/lfd/scheduler.rs +150 -0
  172. loopflow-0.8.2/rust/loopflow/src/lfd/sessions.rs +104 -0
  173. loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/001_initial.sql +103 -0
  174. loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/002_flow_parents.sql +4 -0
  175. loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/003_run_snapshots.sql +27 -0
  176. loopflow-0.8.2/rust/loopflow/src/lfd/store/mod.rs +431 -0
  177. loopflow-0.8.2/rust/loopflow/src/lfd/store/postgres.rs +1325 -0
  178. loopflow-0.8.2/rust/loopflow/src/lfd/store/schema.rs +3 -0
  179. loopflow-0.8.2/rust/loopflow/src/lfd/store/sqlite.rs +1208 -0
  180. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/common.rs +43 -0
  181. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/cron.rs +189 -0
  182. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/loop_ticker.rs +91 -0
  183. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/mod.rs +10 -0
  184. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/recovery.rs +65 -0
  185. loopflow-0.8.2/rust/loopflow/src/lfd/triggers/watch.rs +264 -0
  186. loopflow-0.8.2/rust/loopflow/src/lfd/types/agent.rs +69 -0
  187. loopflow-0.8.2/rust/loopflow/src/lfd/types/event.rs +139 -0
  188. loopflow-0.8.2/rust/loopflow/src/lfd/types/mod.rs +14 -0
  189. loopflow-0.8.2/rust/loopflow/src/lfd/types/stimulus.rs +86 -0
  190. loopflow-0.8.2/rust/loopflow/src/lfd/types/wave.rs +179 -0
  191. loopflow-0.8.2/rust/loopflow/src/lib.rs +4 -0
  192. loopflow-0.8.2/rust/loopflow/src/ops/abandon.rs +79 -0
  193. loopflow-0.8.2/rust/loopflow/src/ops/commit.rs +238 -0
  194. loopflow-0.8.2/rust/loopflow/src/ops/error.rs +27 -0
  195. loopflow-0.8.2/rust/loopflow/src/ops/land.rs +291 -0
  196. loopflow-0.8.2/rust/loopflow/src/ops/lint.rs +141 -0
  197. loopflow-0.8.2/rust/loopflow/src/ops/messages.rs +268 -0
  198. loopflow-0.8.2/rust/loopflow/src/ops/mod.rs +24 -0
  199. loopflow-0.8.2/rust/loopflow/src/ops/next.rs +246 -0
  200. loopflow-0.8.2/rust/loopflow/src/ops/pr.rs +352 -0
  201. loopflow-0.8.2/rust/loopflow/src/ops/progress.rs +18 -0
  202. loopflow-0.8.2/rust/loopflow/src/ops/rebase.rs +108 -0
  203. loopflow-0.8.2/rust/loopflow/src/ops/trace.rs +123 -0
  204. loopflow-0.8.2/rust/loopflow/src/ops/util.rs +15 -0
  205. loopflow-0.8.2/rust/loopflow/tests/agent_tests.rs +144 -0
  206. loopflow-0.8.2/rust/loopflow/tests/commit_tests.rs +120 -0
  207. loopflow-0.8.2/rust/loopflow/tests/config_tests.rs +381 -0
  208. loopflow-0.8.2/rust/loopflow/tests/context_tests.rs +722 -0
  209. loopflow-0.8.2/rust/loopflow/tests/discovery_tests.rs +143 -0
  210. loopflow-0.8.2/rust/loopflow/tests/flow_tests.rs +275 -0
  211. loopflow-0.8.2/rust/loopflow/tests/git_tests.rs +171 -0
  212. loopflow-0.8.2/rust/loopflow/tests/golden_prompt.rs +95 -0
  213. loopflow-0.8.2/rust/loopflow/tests/land_tests.rs +166 -0
  214. loopflow-0.8.2/rust/loopflow/tests/next_tests.rs +138 -0
  215. loopflow-0.8.2/rust/loopflow/tests/pr_tests.rs +154 -0
  216. loopflow-0.8.2/rust/loopflow/tests/rebase_tests.rs +94 -0
  217. loopflow-0.8.2/rust/loopflow/tests/support/mod.rs +59 -0
  218. loopflow-0.8.2/rust/loopflow/tests/token_tests.rs +9 -0
  219. loopflow-0.8.2/rust/loopflow/tests/wave_worktree_tests.rs +125 -0
  220. loopflow-0.8.2/rust/loopflow/tests/worktree_tests.rs +72 -0
  221. loopflow-0.8.2/rust/loopflow-test-support/Cargo.toml +9 -0
  222. loopflow-0.8.2/rust/loopflow-test-support/src/lib.rs +161 -0
  223. loopflow-0.8.2/scripts/collapse_migrations.py +87 -0
  224. loopflow-0.8.2/scripts/dev-lf +14 -0
  225. loopflow-0.8.2/scripts/dev.py +394 -0
  226. loopflow-0.8.2/scripts/generate_screenshots.py +651 -0
  227. loopflow-0.8.2/scripts/publish.py +576 -0
  228. loopflow-0.8.2/scripts/screenshots.yaml +58 -0
  229. loopflow-0.8.2/swift/Concerto/AppIcon.icns +0 -0
  230. loopflow-0.8.2/swift/Concerto/BrandColors.swift +76 -0
  231. loopflow-0.8.2/swift/Concerto/Concerto.sdef +11 -0
  232. loopflow-0.8.2/swift/Concerto/ConcertoApp.swift +120 -0
  233. loopflow-0.8.2/swift/Concerto/DesignSystem.swift +152 -0
  234. loopflow-0.8.2/swift/Concerto/Flags.swift +11 -0
  235. loopflow-0.8.2/swift/Concerto/Info.plist +45 -0
  236. loopflow-0.8.2/swift/Concerto/Models/RecentRepo.swift +13 -0
  237. loopflow-0.8.2/swift/Concerto/ScriptCommands.swift +28 -0
  238. loopflow-0.8.2/swift/Concerto/Services/AppIconProvider.swift +95 -0
  239. loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyManager.swift +256 -0
  240. loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyTerminalView.swift +604 -0
  241. loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyTypes.swift +25 -0
  242. loopflow-0.8.2/swift/Concerto/Services/Ghostty/README.md +294 -0
  243. loopflow-0.8.2/swift/Concerto/Services/NameGenerator.swift +28 -0
  244. loopflow-0.8.2/swift/Concerto/Services/RecentAreasService.swift +40 -0
  245. loopflow-0.8.2/swift/Concerto/Services/RecentsService.swift +61 -0
  246. loopflow-0.8.2/swift/Concerto/Services/SetupService.swift +223 -0
  247. loopflow-0.8.2/swift/Concerto/Services/SnapshotService.swift +74 -0
  248. loopflow-0.8.2/swift/Concerto/Services/TerminalLauncher.swift +326 -0
  249. loopflow-0.8.2/swift/Concerto/State/OutputBuffer.swift +130 -0
  250. loopflow-0.8.2/swift/Concerto/State/RepoState.swift +527 -0
  251. loopflow-0.8.2/swift/Concerto/UX_DESIGN.md +115 -0
  252. loopflow-0.8.2/swift/Concerto/Views/AreaTypeahead.swift +202 -0
  253. loopflow-0.8.2/swift/Concerto/Views/CommandPalette.swift +226 -0
  254. loopflow-0.8.2/swift/Concerto/Views/ContentView.swift +135 -0
  255. loopflow-0.8.2/swift/Concerto/Views/DiagnosticsView.swift +42 -0
  256. loopflow-0.8.2/swift/Concerto/Views/DirectionTypeahead.swift +172 -0
  257. loopflow-0.8.2/swift/Concerto/Views/EmbeddedTerminalPanel.swift +141 -0
  258. loopflow-0.8.2/swift/Concerto/Views/FlowProgressPills.swift +137 -0
  259. loopflow-0.8.2/swift/Concerto/Views/FlowTypeahead.swift +233 -0
  260. loopflow-0.8.2/swift/Concerto/Views/InteractiveSessionView.swift +183 -0
  261. loopflow-0.8.2/swift/Concerto/Views/LiveOutput.swift +51 -0
  262. loopflow-0.8.2/swift/Concerto/Views/NextActionsBar.swift +288 -0
  263. loopflow-0.8.2/swift/Concerto/Views/QuickExperimentView.swift +213 -0
  264. loopflow-0.8.2/swift/Concerto/Views/RepoWindow.swift +84 -0
  265. loopflow-0.8.2/swift/Concerto/Views/ScreenshotWindow.swift +165 -0
  266. loopflow-0.8.2/swift/Concerto/Views/SetupView.swift +177 -0
  267. loopflow-0.8.2/swift/Concerto/Views/StepRunner.swift +199 -0
  268. loopflow-0.8.2/swift/Concerto/Views/TerminalTestWindow.swift +100 -0
  269. loopflow-0.8.2/swift/Concerto/Views/TypeaheadComponents.swift +203 -0
  270. loopflow-0.8.2/swift/Concerto/Views/WaitingStateCard.swift +221 -0
  271. loopflow-0.8.2/swift/Concerto/Views/WaveDetailPanel.swift +530 -0
  272. loopflow-0.8.2/swift/Concerto/Views/WaveRow.swift +259 -0
  273. loopflow-0.8.2/swift/Concerto/Views/WaveSidebar.swift +390 -0
  274. loopflow-0.8.2/swift/Concerto/Views/WelcomeWindow.swift +105 -0
  275. loopflow-0.8.2/swift/ConcertoTests/AuthServiceTests.swift +37 -0
  276. loopflow-0.8.2/swift/ConcertoTests/GhosttyTests.swift +153 -0
  277. loopflow-0.8.2/swift/ConcertoTests/WaveRowTests.swift +111 -0
  278. loopflow-0.8.2/swift/ConcertoTests/WaveTests.swift +515 -0
  279. loopflow-0.8.2/swift/ConcertoUITests/ScreenshotPipelineTests.swift +35 -0
  280. loopflow-0.8.2/swift/DESIGN.md +828 -0
  281. loopflow-0.8.2/swift/LoopflowCore/Info.plist +22 -0
  282. loopflow-0.8.2/swift/LoopflowCore/LoopflowCore.swift +17 -0
  283. loopflow-0.8.2/swift/LoopflowCore/Models/AppPreferences.swift +33 -0
  284. loopflow-0.8.2/swift/LoopflowCore/Models/AppearanceMode.swift +23 -0
  285. loopflow-0.8.2/swift/LoopflowCore/Models/Flow.swift +56 -0
  286. loopflow-0.8.2/swift/LoopflowCore/Models/PullRequest.swift +41 -0
  287. loopflow-0.8.2/swift/LoopflowCore/Models/Step.swift +109 -0
  288. loopflow-0.8.2/swift/LoopflowCore/Models/Wave.swift +179 -0
  289. loopflow-0.8.2/swift/LoopflowCore/Models/WaveRun.swift +87 -0
  290. loopflow-0.8.2/swift/LoopflowCore/Models/WaveViewModel.swift +212 -0
  291. loopflow-0.8.2/swift/LoopflowCore/Services/AuthError.swift +39 -0
  292. loopflow-0.8.2/swift/LoopflowCore/Services/AuthService.swift +232 -0
  293. loopflow-0.8.2/swift/LoopflowCore/Services/AuthState.swift +73 -0
  294. loopflow-0.8.2/swift/LoopflowCore/Services/LocalEventService.swift +318 -0
  295. loopflow-0.8.2/swift/LoopflowCore/Services/LocalWaveService.swift +802 -0
  296. loopflow-0.8.2/swift/LoopflowCore/Services/LoggingService.swift +83 -0
  297. loopflow-0.8.2/swift/LoopflowCore/Services/NotificationService.swift +107 -0
  298. loopflow-0.8.2/swift/LoopflowCore/Services/TokenProvider.swift +30 -0
  299. loopflow-0.8.2/swift/Package.resolved +15 -0
  300. loopflow-0.8.2/swift/Package.swift +64 -0
  301. loopflow-0.8.2/swift/README.md +102 -0
  302. loopflow-0.8.2/swift/Symphonia/SymphoniaApp.swift +16 -0
  303. loopflow-0.8.2/swift/Symphonia/Views/PlaceholderView.swift +31 -0
  304. loopflow-0.8.2/swift/SymphoniaTests/SymphoniaTests.swift +11 -0
  305. loopflow-0.8.2/swift/project.yml +79 -0
  306. loopflow-0.8.2/tests/e2e/test_full_cycle.sh +50 -0
  307. loopflow-0.8.2/tests/e2e/test_rebase_conflict.sh +59 -0
  308. loopflow-0.8.2/tests/e2e/test_smoke.sh +55 -0
  309. loopflow-0.8.2/tests/goldens/basic.md +85 -0
  310. loopflow-0.8.2/tests/goldens/basic.yaml +11 -0
  311. loopflow-0.8.2/tests/goldens/with_direction.md +92 -0
  312. loopflow-0.8.2/tests/goldens/with_direction.yaml +12 -0
  313. loopflow-0.8.2/tests/goldens/with_lfdocs.md +117 -0
  314. loopflow-0.8.2/tests/goldens/with_lfdocs.yaml +11 -0
  315. loopflow-0.8.2/tests/parity/fixtures/basic/.lf/steps/test.md +1 -0
  316. loopflow-0.8.2/tests/parity/fixtures/with_direction/.lf/directions/thorough.md +1 -0
  317. loopflow-0.8.2/tests/parity/fixtures/with_direction/.lf/steps/test.md +1 -0
  318. loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/.lf/steps/test.md +3 -0
  319. loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/README.md +3 -0
  320. loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/roadmap/rust/README.md +3 -0
  321. loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/scratch/design.md +3 -0
  322. loopflow-0.8.2/uv.lock +1148 -0
  323. loopflow-0.7.2/pyproject.toml +0 -103
  324. loopflow-0.7.2/src/loopflow/STYLE.md +0 -130
  325. loopflow-0.7.2/src/loopflow/__init__.py +0 -1
  326. loopflow-0.7.2/src/loopflow/init_check.py +0 -40
  327. loopflow-0.7.2/src/loopflow/lf/__init__.py +0 -1
  328. loopflow-0.7.2/src/loopflow/lf/branch_names.py +0 -71
  329. loopflow-0.7.2/src/loopflow/lf/builtins/__init__.py +0 -1
  330. loopflow-0.7.2/src/loopflow/lf/builtins/prompts.py +0 -11
  331. loopflow-0.7.2/src/loopflow/lf/cli.py +0 -360
  332. loopflow-0.7.2/src/loopflow/lf/config.py +0 -243
  333. loopflow-0.7.2/src/loopflow/lf/context.py +0 -1077
  334. loopflow-0.7.2/src/loopflow/lf/deps.py +0 -154
  335. loopflow-0.7.2/src/loopflow/lf/design.py +0 -185
  336. loopflow-0.7.2/src/loopflow/lf/directions.py +0 -223
  337. loopflow-0.7.2/src/loopflow/lf/execution.py +0 -209
  338. loopflow-0.7.2/src/loopflow/lf/files.py +0 -382
  339. loopflow-0.7.2/src/loopflow/lf/flow.py +0 -1094
  340. loopflow-0.7.2/src/loopflow/lf/flows.py +0 -576
  341. loopflow-0.7.2/src/loopflow/lf/frontmatter.py +0 -271
  342. loopflow-0.7.2/src/loopflow/lf/git.py +0 -288
  343. loopflow-0.7.2/src/loopflow/lf/launcher.py +0 -684
  344. loopflow-0.7.2/src/loopflow/lf/logging.py +0 -72
  345. loopflow-0.7.2/src/loopflow/lf/messages.py +0 -340
  346. loopflow-0.7.2/src/loopflow/lf/naming.py +0 -185
  347. loopflow-0.7.2/src/loopflow/lf/ops/__init__.py +0 -0
  348. loopflow-0.7.2/src/loopflow/lf/ops/_helpers.py +0 -195
  349. loopflow-0.7.2/src/loopflow/lf/ops/abandon.py +0 -132
  350. loopflow-0.7.2/src/loopflow/lf/ops/add.py +0 -43
  351. loopflow-0.7.2/src/loopflow/lf/ops/commit.py +0 -111
  352. loopflow-0.7.2/src/loopflow/lf/ops/cp.py +0 -97
  353. loopflow-0.7.2/src/loopflow/lf/ops/git.py +0 -632
  354. loopflow-0.7.2/src/loopflow/lf/ops/init.py +0 -106
  355. loopflow-0.7.2/src/loopflow/lf/ops/land.py +0 -747
  356. loopflow-0.7.2/src/loopflow/lf/ops/next.py +0 -427
  357. loopflow-0.7.2/src/loopflow/lf/ops/pr.py +0 -256
  358. loopflow-0.7.2/src/loopflow/lf/ops/rebase.py +0 -62
  359. loopflow-0.7.2/src/loopflow/lf/ops/shell.py +0 -185
  360. loopflow-0.7.2/src/loopflow/lf/ops/summarize.py +0 -648
  361. loopflow-0.7.2/src/loopflow/lf/ops/sync.py +0 -35
  362. loopflow-0.7.2/src/loopflow/lf/ops/wt.py +0 -365
  363. loopflow-0.7.2/src/loopflow/lf/output.py +0 -87
  364. loopflow-0.7.2/src/loopflow/lf/roadmap.py +0 -267
  365. loopflow-0.7.2/src/loopflow/lf/skills.py +0 -398
  366. loopflow-0.7.2/src/loopflow/lf/step.py +0 -611
  367. loopflow-0.7.2/src/loopflow/lf/tokens.py +0 -231
  368. loopflow-0.7.2/src/loopflow/lf/wave.py +0 -119
  369. loopflow-0.7.2/src/loopflow/lf/worktrees.py +0 -497
  370. loopflow-0.7.2/src/loopflow/lfd/README.md +0 -113
  371. loopflow-0.7.2/src/loopflow/lfd/__init__.py +0 -4
  372. loopflow-0.7.2/src/loopflow/lfd/autoprune.py +0 -111
  373. loopflow-0.7.2/src/loopflow/lfd/cli.py +0 -1796
  374. loopflow-0.7.2/src/loopflow/lfd/daemon/__init__.py +0 -10
  375. loopflow-0.7.2/src/loopflow/lfd/daemon/client.py +0 -111
  376. loopflow-0.7.2/src/loopflow/lfd/daemon/grpc_server.py +0 -571
  377. loopflow-0.7.2/src/loopflow/lfd/daemon/http_server.py +0 -1007
  378. loopflow-0.7.2/src/loopflow/lfd/daemon/launchd.py +0 -283
  379. loopflow-0.7.2/src/loopflow/lfd/daemon/manager.py +0 -143
  380. loopflow-0.7.2/src/loopflow/lfd/daemon/metrics.py +0 -19
  381. loopflow-0.7.2/src/loopflow/lfd/daemon/process.py +0 -12
  382. loopflow-0.7.2/src/loopflow/lfd/daemon/protocol.py +0 -56
  383. loopflow-0.7.2/src/loopflow/lfd/daemon/server.py +0 -612
  384. loopflow-0.7.2/src/loopflow/lfd/daemon/status.py +0 -21
  385. loopflow-0.7.2/src/loopflow/lfd/db.py +0 -217
  386. loopflow-0.7.2/src/loopflow/lfd/draft_prs.py +0 -65
  387. loopflow-0.7.2/src/loopflow/lfd/execution/README.md +0 -141
  388. loopflow-0.7.2/src/loopflow/lfd/execution/__init__.py +0 -7
  389. loopflow-0.7.2/src/loopflow/lfd/execution/collector.py +0 -387
  390. loopflow-0.7.2/src/loopflow/lfd/execution/runner.py +0 -1098
  391. loopflow-0.7.2/src/loopflow/lfd/execution/worker.py +0 -447
  392. loopflow-0.7.2/src/loopflow/lfd/flow_run.py +0 -309
  393. loopflow-0.7.2/src/loopflow/lfd/git_hooks.py +0 -174
  394. loopflow-0.7.2/src/loopflow/lfd/logging.py +0 -49
  395. loopflow-0.7.2/src/loopflow/lfd/migrations/README.md +0 -44
  396. loopflow-0.7.2/src/loopflow/lfd/migrations/__init__.py +0 -0
  397. loopflow-0.7.2/src/loopflow/lfd/migrations/baseline.py +0 -116
  398. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2025_01_23_zz_stimulus.py +0 -33
  399. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_24_agent_worktree.py +0 -27
  400. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_24_nullable_goal_area.py +0 -71
  401. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_25_agent_paused.py +0 -17
  402. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_26_step_index.py +0 -15
  403. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_28_wave_stacking.py +0 -21
  404. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_29_stimuli.py +0 -80
  405. loopflow-0.7.2/src/loopflow/lfd/migrations/registry.py +0 -37
  406. loopflow-0.7.2/src/loopflow/lfd/models.py +0 -408
  407. loopflow-0.7.2/src/loopflow/lfd/pr_poller.py +0 -237
  408. loopflow-0.7.2/src/loopflow/lfd/protocol_v1.py +0 -218
  409. loopflow-0.7.2/src/loopflow/lfd/step_run.py +0 -208
  410. loopflow-0.7.2/src/loopflow/lfd/stimulus.py +0 -321
  411. loopflow-0.7.2/src/loopflow/lfd/wave.py +0 -884
  412. loopflow-0.7.2/src/loopflow/lfd/worktree_state.py +0 -147
  413. loopflow-0.7.2/src/loopflow/proto/__init__.py +0 -23
  414. loopflow-0.7.2/src/loopflow/proto/generate.py +0 -88
  415. loopflow-0.7.2/src/loopflow/proto/loopflow/__init__.py +0 -0
  416. loopflow-0.7.2/src/loopflow/proto/loopflow/control/__init__.py +0 -0
  417. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/__init__.py +0 -0
  418. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.py +0 -217
  419. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.pyi +0 -1216
  420. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2_grpc.py +0 -1202
  421. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/__init__.py +0 -0
  422. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/__init__.py +0 -0
  423. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.py +0 -163
  424. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.pyi +0 -1218
  425. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2_grpc.py +0 -779
  426. loopflow-0.7.2/src/loopflow/publish.py +0 -427
  427. loopflow-0.7.2/src/loopflow/templates/config.yaml +0 -36
  428. {loopflow-0.7.2/src/loopflow → loopflow-0.8.2/rust/loopflow/src/engine/builtins}/LOOPFLOW.md +0 -0
  429. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/ceo.md +0 -0
  430. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/designer.md +0 -0
  431. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/infra-engineer.md +0 -0
  432. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/product-engineer.md +0 -0
  433. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/craft.md +0 -0
  434. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/flow.md +0 -0
  435. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/scale.md +0 -0
  436. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/README.md +0 -0
  437. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/design-and-ship.yaml +0 -0
  438. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/grind.yaml +0 -0
  439. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/incident.yaml +0 -0
  440. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/pair.yaml +0 -0
  441. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/ship-roadmap.yaml +0 -0
  442. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/ship.yaml +0 -0
  443. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/start.yaml +0 -0
  444. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/publish.yaml +0 -0
  445. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/research.yaml +0 -0
  446. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-expand.yaml +0 -0
  447. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-polish.yaml +0 -0
  448. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-reduce.yaml +0 -0
  449. /loopflow-0.7.2/src/loopflow/lf/builtins/commit_message.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/commit_message.md +0 -0
  450. /loopflow-0.7.2/src/loopflow/lf/builtins/pr_message.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/pr_message.md +0 -0
  451. /loopflow-0.7.2/src/loopflow/lf/builtins/release_notes.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/release_notes.md +0 -0
  452. /loopflow-0.7.2/src/loopflow/lf/builtins/summarize.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/summarize.md +0 -0
  453. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/compress.md +0 -0
  454. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/debug.md +0 -0
  455. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/gate.md +0 -0
  456. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/implement.md +0 -0
  457. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/explore.md +0 -0
  458. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/refine.md +0 -0
  459. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/add-to-roadmap.md +0 -0
  460. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/commit.md +0 -0
  461. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/consolidate.md +0 -0
  462. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/lint.md +0 -0
  463. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/rebase.md +0 -0
  464. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/synthesize.md +0 -0
  465. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/validate.md +0 -0
  466. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/5whys.md +0 -0
  467. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/expand.md +0 -0
  468. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/ingest.md +0 -0
  469. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/iterate.md +0 -0
  470. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/kickoff.md +0 -0
  471. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/polish.md +0 -0
  472. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/reduce.md +0 -0
  473. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/review.md +0 -0
  474. {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/roadmap.md +0 -0
@@ -0,0 +1,75 @@
1
+ ---
2
+ requires: screenshot(s) in area
3
+ produces: roadmap/concerto/<date>-<direction>-<order>-<slug>.md
4
+ interactive: true
5
+ ---
6
+
7
+ Review screenshot(s) through the lens of the given direction (persona).
8
+
9
+ ## Usage
10
+
11
+ ```bash
12
+ # Review all screenshots with a persona
13
+ lf ux-review --direction conductor --area docs/screenshots/
14
+
15
+ # Review specific screenshot
16
+ lf ux-review --direction conductor --area docs/screenshots/concerto-main.png
17
+ ```
18
+
19
+ ## Process
20
+
21
+ For each screenshot in the area:
22
+ 1. Read the screenshot
23
+ 2. Apply each question from the direction
24
+ 3. For each question that the UI fails to answer well, write a backlog item file
25
+
26
+ ## Output format
27
+
28
+ For each issue found, write a backlog item file in `roadmap/<wave>/`:
29
+
30
+ - Use `--wave` if provided; otherwise infer from the worktree name.
31
+ - If no wave can be determined, default to `roadmap/concerto/`.
32
+ - Filename: `<date>-<direction>-<order>-<slug>.md`
33
+ - `date`: `YYYYMMDD`
34
+ - `direction`: the persona name
35
+ - `order`: zero-padded sequence number for this run (01, 02, 03...) in the order found
36
+ - `slug`: kebab-case title
37
+ - Keep one issue per file
38
+ - Use the format below
39
+ - After writing files, print an ordered list of filenames with their wave folder
40
+
41
+ ```markdown
42
+ ---
43
+ status: todo
44
+ phase: 1
45
+ persona: <direction-name>
46
+ screenshot: <screenshot-path>
47
+ order: <order>
48
+ ---
49
+
50
+ # <Title>
51
+
52
+ <One-line problem statement>
53
+
54
+ ## Current
55
+ <What exists now>
56
+
57
+ ## Problem
58
+ <Why it fails the persona question>
59
+
60
+ ## Build
61
+ <What to change>
62
+
63
+ ## Done when
64
+ <Persona question that should pass>
65
+ ```
66
+
67
+ ## Guidelines
68
+
69
+ - Be specific about what you see in the screenshot
70
+ - Quote the exact persona question being failed
71
+ - Propose concrete changes, not vague improvements
72
+ - One issue per backlog item file
73
+ - Keep items right-sized: 1–2 concrete improvements, not a grab bag
74
+ - Order matters: use the sequence from this run so ingestion preserves priority
75
+ - Skip questions the UI already handles well
@@ -0,0 +1,78 @@
1
+ ---
2
+ requires: roadmap items in persona waves
3
+ produces: roadmap/concerto/<date>-<order>-<slug>.md
4
+ interactive: true
5
+ ---
6
+ Synthesize persona wave roadmaps into a single ordered Concerto backlog.
7
+
8
+ ## Inputs
9
+
10
+ Read all items from these wave folders (if present):
11
+ - `roadmap/conductor/`
12
+ - `roadmap/improviser/`
13
+ - `roadmap/listener/`
14
+ - `roadmap/product-designer/`
15
+ - `roadmap/ceo/`
16
+
17
+ ## Goal
18
+
19
+ Produce a single ordered set of backlog items in `roadmap/concerto/` that:
20
+ - Deduplicates overlapping issues across personas
21
+ - Preserves the most actionable framing
22
+ - Prioritizes by user impact and clarity
23
+
24
+ ## Process
25
+
26
+ 1. Cluster related items across waves (same problem, different framing).
27
+ 2. Pick the strongest framing and concrete Build steps.
28
+ 3. Assign an overall order (01, 02, 03...) for the Concerto backlog.
29
+ 4. Write one file per item to `roadmap/concerto/`.
30
+
31
+ ## Output format
32
+
33
+ Write files with:
34
+
35
+ - Filename: `<date>-<order>-<slug>.md`
36
+ - `date`: `YYYYMMDD`
37
+ - `order`: zero-padded sequence number
38
+ - `slug`: kebab-case title
39
+
40
+ Frontmatter:
41
+
42
+ ```markdown
43
+ ---
44
+ status: todo
45
+ phase: 1
46
+ persona: concerto
47
+ order: <order>
48
+ sources: [conductor, improviser, listener, product-designer, ceo]
49
+ ---
50
+ ```
51
+
52
+ Body:
53
+
54
+ ```markdown
55
+ # <Title>
56
+
57
+ <One-line problem statement>
58
+
59
+ ## Current
60
+ <What exists now>
61
+
62
+ ## Problem
63
+ <Why it fails across personas>
64
+
65
+ ## Build
66
+ <What to change>
67
+
68
+ ## Done when
69
+ <Concrete success condition>
70
+ ```
71
+
72
+ ## Guidelines
73
+
74
+ - One issue per file
75
+ - Keep items right-sized (1–2 concrete improvements)
76
+ - Use the clearest wording from the source waves
77
+ - Prefer outcomes that help multiple personas at once
78
+ - Print an ordered list of filenames at the end
@@ -0,0 +1,56 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ merge_group:
8
+
9
+ jobs:
10
+ rust-test:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: dtolnay/rust-toolchain@stable
15
+ - name: Run cargo fmt check
16
+ run: cargo fmt --all -- --check
17
+ - name: Run cargo clippy
18
+ run: cargo clippy --all-targets -- -D warnings
19
+ - name: Run Rust tests
20
+ run: cargo test --all
21
+
22
+ python-test:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - uses: astral-sh/setup-uv@v4
27
+ - name: Run Python tests
28
+ run: uv run pytest python/tests/
29
+
30
+ e2e-smoke:
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: dtolnay/rust-toolchain@stable
35
+ - name: Run E2E smoke test
36
+ run: tests/e2e/test_smoke.sh
37
+
38
+ swift-test:
39
+ runs-on: macos-15
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ - name: Run Swift tests
43
+ run: swift test --package-path swift
44
+
45
+ concerto-ui-test:
46
+ runs-on: macos-15
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+ - name: Install XcodeGen
50
+ run: brew install xcodegen
51
+ - name: Generate Xcode project
52
+ run: xcodegen generate
53
+ working-directory: swift
54
+ - name: Run Concerto UI tests
55
+ run: xcodebuild test -project LoopflowSwift.xcodeproj -scheme Concerto -destination 'platform=macOS'
56
+ working-directory: swift
@@ -0,0 +1,52 @@
1
+ name: Clear Scratch
2
+
3
+ on:
4
+ merge_group:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ clear-scratch:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ with:
16
+ fetch-depth: 0
17
+
18
+ - name: Clear scratch if needed
19
+ env:
20
+ GH_TOKEN: ${{ github.token }}
21
+ run: |
22
+ FILES=$(find scratch -type f ! -name '.gitkeep' 2>/dev/null || true)
23
+ if [ -z "$FILES" ]; then
24
+ echo "scratch/ is already clean"
25
+ exit 0
26
+ fi
27
+
28
+ echo "Clearing scratch/..."
29
+ echo "$FILES"
30
+
31
+ # Get the PR branch from merge group ref (format: gh-readonly-queue/main/pr-NUM-SHA)
32
+ PR_NUM=$(echo "${{ github.ref }}" | sed -n 's/.*pr-\([0-9]*\).*/\1/p')
33
+ PR_BRANCH=$(gh pr view "$PR_NUM" --json headRefName -q .headRefName)
34
+
35
+ echo "Pushing cleanup to PR branch: $PR_BRANCH"
36
+
37
+ # Checkout and clean the actual PR branch
38
+ git fetch origin "$PR_BRANCH"
39
+ git checkout "$PR_BRANCH"
40
+
41
+ find scratch -type f ! -name '.gitkeep' -delete
42
+ find scratch -type d -empty -delete 2>/dev/null || true
43
+ mkdir -p scratch
44
+ touch scratch/.gitkeep
45
+
46
+ git config user.name "github-actions[bot]"
47
+ git config user.email "github-actions[bot]@users.noreply.github.com"
48
+ git add scratch/
49
+ git commit -m "chore: clear scratch"
50
+ git push origin "$PR_BRANCH"
51
+
52
+ echo "Cleanup pushed - merge queue will restart with clean branch"
@@ -0,0 +1,144 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ # Build native binaries (GitHub Releases, shell installer)
10
+ build-native:
11
+ strategy:
12
+ matrix:
13
+ include:
14
+ - os: macos-latest
15
+ target: aarch64-apple-darwin
16
+ - os: macos-15-intel
17
+ target: x86_64-apple-darwin
18
+ - os: ubuntu-latest
19
+ target: x86_64-unknown-linux-gnu
20
+ - os: ubuntu-24.04-arm
21
+ target: aarch64-unknown-linux-gnu
22
+ runs-on: ${{ matrix.os }}
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - name: Set version from tag
26
+ run: sed -i.bak 's/^version = "0.0.0"/version = "'"${GITHUB_REF_NAME#v}"'"/' Cargo.toml && rm Cargo.toml.bak
27
+ - uses: dtolnay/rust-toolchain@stable
28
+ with:
29
+ targets: ${{ matrix.target }}
30
+ - name: Build
31
+ run: cargo build --release --target ${{ matrix.target }} -p loopflow
32
+ - name: Package
33
+ run: |
34
+ cd target/${{ matrix.target }}/release
35
+ tar czf ../../../lf-${{ matrix.target }}.tar.gz lf lfd
36
+ - uses: actions/upload-artifact@v4
37
+ with:
38
+ name: native-${{ matrix.target }}
39
+ path: lf-*.tar.gz
40
+
41
+ # Publish to crates.io
42
+ publish-crates:
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+ - name: Set version from tag
47
+ run: sed -i.bak 's/^version = "0.0.0"/version = "'"${GITHUB_REF_NAME#v}"'"/' Cargo.toml && rm Cargo.toml.bak
48
+ - uses: dtolnay/rust-toolchain@stable
49
+ - name: Publish to crates.io
50
+ run: cargo publish -p loopflow --allow-dirty
51
+ env:
52
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
53
+
54
+ # Publish pure Python package to PyPI
55
+ publish-pypi:
56
+ runs-on: ubuntu-latest
57
+ environment: pypi
58
+ permissions:
59
+ id-token: write
60
+ steps:
61
+ - uses: actions/checkout@v4
62
+ with:
63
+ fetch-depth: 0
64
+ - uses: astral-sh/setup-uv@v4
65
+ - name: Build package
66
+ run: uv build
67
+ - name: Publish to PyPI
68
+ uses: pypa/gh-action-pypi-publish@release/v1
69
+ with:
70
+ packages-dir: dist/
71
+
72
+ # Create GitHub Release with native binaries
73
+ release:
74
+ needs: build-native
75
+ runs-on: ubuntu-latest
76
+ permissions:
77
+ contents: write
78
+ steps:
79
+ - uses: actions/checkout@v4
80
+ - uses: actions/download-artifact@v4
81
+ with:
82
+ pattern: native-*
83
+ merge-multiple: true
84
+ path: dist/native
85
+ - name: Generate shell installer
86
+ run: |
87
+ cat > dist/install.sh << 'INSTALLER'
88
+ #!/bin/sh
89
+ set -eu
90
+
91
+ REPO="loopflowstudio/loopflow"
92
+ INSTALL_DIR="${LF_INSTALL_DIR:-$HOME/.local/bin}"
93
+
94
+ detect_target() {
95
+ os=$(uname -s)
96
+ arch=$(uname -m)
97
+ case "$os" in
98
+ Darwin)
99
+ case "$arch" in
100
+ arm64|aarch64) echo "aarch64-apple-darwin" ;;
101
+ x86_64) echo "x86_64-apple-darwin" ;;
102
+ *) echo "Unsupported architecture: $arch" >&2; exit 1 ;;
103
+ esac ;;
104
+ Linux)
105
+ case "$arch" in
106
+ aarch64) echo "aarch64-unknown-linux-gnu" ;;
107
+ x86_64) echo "x86_64-unknown-linux-gnu" ;;
108
+ *) echo "Unsupported architecture: $arch" >&2; exit 1 ;;
109
+ esac ;;
110
+ *) echo "Unsupported OS: $os" >&2; exit 1 ;;
111
+ esac
112
+ }
113
+
114
+ main() {
115
+ target=$(detect_target)
116
+ version="${1:-latest}"
117
+
118
+ if [ "$version" = "latest" ]; then
119
+ url="https://github.com/$REPO/releases/latest/download/lf-$target.tar.gz"
120
+ else
121
+ url="https://github.com/$REPO/releases/download/v$version/lf-$target.tar.gz"
122
+ fi
123
+
124
+ echo "Installing lf ($target)..."
125
+ mkdir -p "$INSTALL_DIR"
126
+ curl -fsSL "$url" | tar xz -C "$INSTALL_DIR"
127
+ chmod +x "$INSTALL_DIR/lf" "$INSTALL_DIR/lfd"
128
+ echo "Installed to $INSTALL_DIR/lf"
129
+
130
+ case ":$PATH:" in
131
+ *":$INSTALL_DIR:"*) ;;
132
+ *) echo "Add to PATH: export PATH=\"$INSTALL_DIR:\$PATH\"" ;;
133
+ esac
134
+ }
135
+
136
+ main "$@"
137
+ INSTALLER
138
+ - name: Create GitHub Release
139
+ uses: softprops/action-gh-release@v2
140
+ with:
141
+ generate_release_notes: true
142
+ files: |
143
+ dist/native/*.tar.gz
144
+ dist/install.sh
@@ -7,13 +7,16 @@ __pycache__/
7
7
  xcuserdata/
8
8
  .swiftpm/xcode/
9
9
  swift/*.xcodeproj/
10
+ dist/
10
11
  swift/dist/
11
12
 
12
13
  # Claude Code (personal state)
13
14
  .claude/settings.local.json
14
15
 
15
- # Loopflow (generated cache)
16
+ # Loopflow (generated)
17
+ .lf/log/
16
18
  .lf/summaries/
17
19
  *.profraw
20
+ *.actual.md
18
21
  .DS_Store
19
22
  target/
@@ -0,0 +1,33 @@
1
+ Create a reference summary of this content for LLM context.
2
+
3
+ **OUTPUT BUDGET:** ~{token_budget} tokens. Use most of it—this is a budget to spend, not a limit to avoid.
4
+
5
+ ## What to Include
6
+
7
+ **For code:**
8
+ - Data structures with full type annotations
9
+ - Public function signatures AND their docstrings (include the docstring text)
10
+ - Key constants, enums, and configuration schemas
11
+ - Entry points and CLI commands with usage examples
12
+
13
+ **For documentation:**
14
+ - Key concepts and definitions
15
+ - Commands, APIs, and their usage examples
16
+ - Configuration options and their effects
17
+
18
+ **Style:**
19
+ - Quote directly rather than paraphrase when the original is clear
20
+ - Consolidate related definitions together
21
+ - Preserve exact names, paths, commands, and terminology
22
+ - Code blocks for anything that looks like code
23
+ - Dense markdown, organized by topic/module
24
+
25
+ **Priority when budget is tight:**
26
+ 1. Type definitions and schemas
27
+ 2. Public APIs with docstrings
28
+ 3. CLI usage examples
29
+ 4. Implementation patterns
30
+
31
+ <source>
32
+ {content}
33
+ </source>
@@ -0,0 +1,23 @@
1
+ agent_model: claude:opus
2
+ yolo: true
3
+ chrome: true
4
+
5
+ skill_sources:
6
+ - name: superpowers
7
+ prefix: sp
8
+ path: ~/.superpowers
9
+ exclude:
10
+ - uv.lock
11
+ push: true
12
+
13
+ summary_tokens: 25000
14
+
15
+ summaries:
16
+ - path: .
17
+ model: claude:sonnet
18
+
19
+ branch_names:
20
+ schema: "{user}.{name}.{ts}"
21
+
22
+ internal:
23
+ use_rust: true
@@ -0,0 +1,13 @@
1
+ Managing multiple parallel workstreams. Checking in, not diving deep.
2
+
3
+ - Can I see what needs attention without drilling in?
4
+ - Is urgency visually obvious?
5
+ - How many clicks from "I see a problem" to "I'm acting on it"?
6
+ - Would I trust this to surface the right thing while I'm away?
7
+ - Do routine actions feel like single actions or workflows?
8
+ - Am I confirming things I already decided?
9
+
10
+ Red flags:
11
+ - Flat lists with no hierarchy
12
+ - Status requires interaction to reveal
13
+ - Confirmation dialogs for routine operations
@@ -0,0 +1,13 @@
1
+ Exploring unfamiliar territory. Doesn't know the right approach yet.
2
+
3
+ - How fast from intent to action?
4
+ - Am I configuring things I don't care about yet?
5
+ - Can I do one thing without committing to a sequence?
6
+ - Does this feel like a workshop or a form?
7
+ - If I change my mind, is that cheap?
8
+ - Am I exploring or filling out paperwork?
9
+
10
+ Red flags:
11
+ - Setup wizards before first action
12
+ - Required fields for optional concepts
13
+ - Changing course requires starting over
@@ -0,0 +1,13 @@
1
+ Checking in, not coding. Needs to understand what happened and what matters next.
2
+
3
+ - Can I tell what happened while I was gone?
4
+ - Is "needs me" vs "fine" instant to distinguish?
5
+ - Do I have to click into each item to understand state?
6
+ - Is there a summary or must I reconstruct context?
7
+ - Can I triage N items in a few minutes without opening details?
8
+
9
+ Red flags:
10
+ - No history/timeline visible
11
+ - State only visible after navigation
12
+ - No clear explanation of why something is blocked
13
+ - Requires taking action before understanding