loopflow 0.7.0__tar.gz → 0.7.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 (198) hide show
  1. {loopflow-0.7.0 → loopflow-0.7.2}/.gitignore +2 -0
  2. loopflow-0.7.2/PKG-INFO +206 -0
  3. loopflow-0.7.2/README.md +167 -0
  4. {loopflow-0.7.0 → loopflow-0.7.2}/pyproject.toml +5 -3
  5. loopflow-0.7.2/src/loopflow/LOOPFLOW.md +73 -0
  6. loopflow-0.7.2/src/loopflow/__init__.py +1 -0
  7. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/branch_names.py +12 -1
  8. loopflow-0.7.2/src/loopflow/lf/builtins/directions/roles/infra-engineer.md +24 -0
  9. loopflow-0.7.2/src/loopflow/lf/builtins/directions/values/craft.md +3 -0
  10. loopflow-0.7.2/src/loopflow/lf/builtins/directions/values/flow.md +3 -0
  11. loopflow-0.7.2/src/loopflow/lf/builtins/directions/values/scale.md +3 -0
  12. loopflow-0.7.2/src/loopflow/lf/builtins/flows/README.md +50 -0
  13. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/design-and-ship.yaml +4 -0
  14. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/grind.yaml +4 -0
  15. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/incident.yaml +3 -0
  16. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/pair.yaml +2 -0
  17. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/ship-roadmap.yaml +2 -0
  18. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/ship.yaml +4 -0
  19. loopflow-0.7.2/src/loopflow/lf/builtins/flows/code/start.yaml +2 -0
  20. loopflow-0.7.2/src/loopflow/lf/builtins/flows/plan/publish.yaml +2 -0
  21. loopflow-0.7.2/src/loopflow/lf/builtins/flows/plan/research.yaml +3 -0
  22. loopflow-0.7.2/src/loopflow/lf/builtins/flows/plan/roadmap-expand.yaml +8 -0
  23. loopflow-0.7.2/src/loopflow/lf/builtins/flows/plan/roadmap-polish.yaml +8 -0
  24. loopflow-0.7.2/src/loopflow/lf/builtins/flows/plan/roadmap-reduce.yaml +8 -0
  25. loopflow-0.7.2/src/loopflow/lf/builtins/release_notes.txt +41 -0
  26. loopflow-0.7.2/src/loopflow/lf/builtins/steps/code/compress.md +74 -0
  27. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/code}/debug.md +1 -0
  28. loopflow-0.7.2/src/loopflow/lf/builtins/steps/code/gate.md +93 -0
  29. loopflow-0.7.2/src/loopflow/lf/builtins/steps/code/implement.md +49 -0
  30. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/interactive}/design.md +2 -1
  31. loopflow-0.7.2/src/loopflow/lf/builtins/steps/interactive/explore.md +29 -0
  32. loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops/add-to-roadmap.md +84 -0
  33. loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops/consolidate.md +42 -0
  34. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops}/init.md +2 -2
  35. loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops/synthesize.md +56 -0
  36. loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops/validate.md +52 -0
  37. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan}/5whys.md +5 -13
  38. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/expand.md +74 -0
  39. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/ingest.md +66 -0
  40. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/iterate.md +22 -0
  41. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/kickoff.md +74 -0
  42. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/polish.md +60 -0
  43. loopflow-0.7.0/src/loopflow/templates/steps/reduce-big.md → loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/reduce.md +5 -1
  44. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/review.md +97 -0
  45. loopflow-0.7.2/src/loopflow/lf/builtins/steps/plan/roadmap.md +50 -0
  46. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/cli.py +97 -8
  47. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/config.py +38 -16
  48. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/context.py +293 -112
  49. loopflow-0.7.2/src/loopflow/lf/design.py +185 -0
  50. loopflow-0.7.2/src/loopflow/lf/directions.py +223 -0
  51. loopflow-0.7.2/src/loopflow/lf/execution.py +209 -0
  52. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/files.py +57 -0
  53. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/flow.py +276 -173
  54. loopflow-0.7.2/src/loopflow/lf/flows.py +576 -0
  55. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/frontmatter.py +14 -14
  56. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/git.py +28 -37
  57. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/messages.py +19 -10
  58. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/naming.py +61 -18
  59. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/_helpers.py +42 -61
  60. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/abandon.py +1 -1
  61. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/commit.py +1 -1
  62. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/cp.py +2 -8
  63. loopflow-0.7.2/src/loopflow/lf/ops/git.py +632 -0
  64. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/land.py +32 -38
  65. loopflow-0.7.2/src/loopflow/lf/ops/next.py +427 -0
  66. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/pr.py +78 -2
  67. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/rebase.py +23 -22
  68. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/summarize.py +1 -0
  69. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/sync.py +1 -1
  70. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/wt.py +39 -21
  71. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/output.py +40 -0
  72. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/roadmap.py +6 -6
  73. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/step.py +77 -158
  74. loopflow-0.7.2/src/loopflow/lf/wave.py +119 -0
  75. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/worktrees.py +110 -9
  76. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/README.md +18 -18
  77. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/autoprune.py +5 -5
  78. loopflow-0.7.2/src/loopflow/lfd/cli.py +1796 -0
  79. loopflow-0.7.2/src/loopflow/lfd/daemon/grpc_server.py +571 -0
  80. loopflow-0.7.2/src/loopflow/lfd/daemon/http_server.py +1007 -0
  81. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/launchd.py +6 -0
  82. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/manager.py +6 -6
  83. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/server.py +48 -18
  84. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/status.py +6 -6
  85. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/db.py +3 -3
  86. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/execution/README.md +19 -19
  87. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/execution/runner.py +329 -160
  88. loopflow-0.7.2/src/loopflow/lfd/execution/worker.py +447 -0
  89. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/flow_run.py +80 -33
  90. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/baseline.py +16 -16
  91. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/m_2025_01_23_zz_stimulus.py +6 -6
  92. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_24_agent_worktree.py +27 -0
  93. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/m_2026_01_24_nullable_goal_area.py +19 -18
  94. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_25_agent_paused.py +17 -0
  95. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_26_step_index.py +15 -0
  96. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_28_wave_stacking.py +21 -0
  97. loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_29_stimuli.py +80 -0
  98. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/registry.py +8 -0
  99. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/models.py +156 -62
  100. loopflow-0.7.2/src/loopflow/lfd/protocol_v1.py +218 -0
  101. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/step_run.py +32 -2
  102. loopflow-0.7.2/src/loopflow/lfd/stimulus.py +321 -0
  103. loopflow-0.7.2/src/loopflow/lfd/wave.py +884 -0
  104. loopflow-0.7.2/src/loopflow/proto/__init__.py +23 -0
  105. loopflow-0.7.2/src/loopflow/proto/generate.py +88 -0
  106. loopflow-0.7.2/src/loopflow/proto/loopflow/control/__init__.py +0 -0
  107. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/__init__.py +0 -0
  108. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.py +217 -0
  109. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.pyi +1216 -0
  110. loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2_grpc.py +1202 -0
  111. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/__init__.py +0 -0
  112. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/__init__.py +0 -0
  113. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.py +163 -0
  114. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.pyi +1218 -0
  115. loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2_grpc.py +779 -0
  116. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/publish.py +67 -0
  117. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/templates/config.yaml +1 -1
  118. loopflow-0.7.0/PKG-INFO +0 -143
  119. loopflow-0.7.0/README.md +0 -106
  120. loopflow-0.7.0/src/loopflow/LOOPFLOW.md +0 -104
  121. loopflow-0.7.0/src/loopflow/__init__.py +0 -1
  122. loopflow-0.7.0/src/loopflow/lf/builtins/flows/README.md +0 -16
  123. loopflow-0.7.0/src/loopflow/lf/builtins/flows/roadmap.py +0 -13
  124. loopflow-0.7.0/src/loopflow/lf/builtins/flows/ship.py +0 -5
  125. loopflow-0.7.0/src/loopflow/lf/builtins/release_notes.txt +0 -25
  126. loopflow-0.7.0/src/loopflow/lf/design.py +0 -127
  127. loopflow-0.7.0/src/loopflow/lf/flows.py +0 -369
  128. loopflow-0.7.0/src/loopflow/lf/goals.py +0 -210
  129. loopflow-0.7.0/src/loopflow/lfd/agent.py +0 -696
  130. loopflow-0.7.0/src/loopflow/lfd/cli.py +0 -1164
  131. loopflow-0.7.0/src/loopflow/lfd/daemon/http_server.py +0 -392
  132. loopflow-0.7.0/src/loopflow/lfd/execution/worker.py +0 -308
  133. loopflow-0.7.0/src/loopflow/lfd/migrations/m_2026_01_24_agent_worktree.py +0 -27
  134. loopflow-0.7.0/src/loopflow/lfd/work/asana_backend.py +0 -215
  135. loopflow-0.7.0/src/loopflow/lfd/work/backend.py +0 -29
  136. loopflow-0.7.0/src/loopflow/lfd/work/file_backend.py +0 -177
  137. loopflow-0.7.0/src/loopflow/lfd/work/models.py +0 -34
  138. loopflow-0.7.0/src/loopflow/lfops/__init__.py +0 -18
  139. loopflow-0.7.0/src/loopflow/lfops/commands.py +0 -47
  140. loopflow-0.7.0/src/loopflow/lfops/next.py +0 -289
  141. loopflow-0.7.0/src/loopflow/lfwork.py +0 -258
  142. loopflow-0.7.0/src/loopflow/templates/goals/adapt.md +0 -24
  143. loopflow-0.7.0/src/loopflow/templates/goals/infra-engineer.md +0 -30
  144. loopflow-0.7.0/src/loopflow/templates/goals/roadmap.md +0 -33
  145. loopflow-0.7.0/src/loopflow/templates/goals/ship.md +0 -29
  146. loopflow-0.7.0/src/loopflow/templates/steps/design_from_roadmap.md +0 -44
  147. loopflow-0.7.0/src/loopflow/templates/steps/expand-big.md +0 -60
  148. loopflow-0.7.0/src/loopflow/templates/steps/expand.md +0 -27
  149. loopflow-0.7.0/src/loopflow/templates/steps/explore.md +0 -27
  150. loopflow-0.7.0/src/loopflow/templates/steps/implement.md +0 -38
  151. loopflow-0.7.0/src/loopflow/templates/steps/iterate.md +0 -37
  152. loopflow-0.7.0/src/loopflow/templates/steps/polish-big.md +0 -75
  153. loopflow-0.7.0/src/loopflow/templates/steps/polish.md +0 -49
  154. loopflow-0.7.0/src/loopflow/templates/steps/reduce.md +0 -27
  155. loopflow-0.7.0/src/loopflow/templates/steps/review-big.md +0 -37
  156. loopflow-0.7.0/src/loopflow/templates/steps/review.md +0 -70
  157. loopflow-0.7.0/src/loopflow/templates/steps/roadmap.md +0 -45
  158. loopflow-0.7.0/src/loopflow/templates/steps/synthesize.md +0 -21
  159. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/STYLE.md +0 -0
  160. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/init_check.py +0 -0
  161. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/__init__.py +0 -0
  162. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/builtins/__init__.py +0 -0
  163. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/builtins/commit_message.txt +0 -0
  164. {loopflow-0.7.0/src/loopflow/templates/goals → loopflow-0.7.2/src/loopflow/lf/builtins/directions/roles}/ceo.md +0 -0
  165. {loopflow-0.7.0/src/loopflow/templates/goals → loopflow-0.7.2/src/loopflow/lf/builtins/directions/roles}/designer.md +0 -0
  166. {loopflow-0.7.0/src/loopflow/templates/goals → loopflow-0.7.2/src/loopflow/lf/builtins/directions/roles}/product-engineer.md +0 -0
  167. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/builtins/pr_message.txt +0 -0
  168. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/builtins/prompts.py +0 -0
  169. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/interactive}/refine.md +0 -0
  170. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops}/commit.md +0 -0
  171. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops}/lint.md +0 -0
  172. {loopflow-0.7.0/src/loopflow/templates/steps → loopflow-0.7.2/src/loopflow/lf/builtins/steps/ops}/rebase.md +0 -0
  173. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/builtins/summarize.txt +0 -0
  174. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/deps.py +0 -0
  175. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/launcher.py +0 -0
  176. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/logging.py +0 -0
  177. {loopflow-0.7.0/src/loopflow/lf/builtins/flows → loopflow-0.7.2/src/loopflow/lf/ops}/__init__.py +0 -0
  178. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/add.py +0 -0
  179. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/init.py +0 -0
  180. {loopflow-0.7.0/src/loopflow/lfops → loopflow-0.7.2/src/loopflow/lf/ops}/shell.py +0 -0
  181. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/skills.py +0 -0
  182. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lf/tokens.py +0 -0
  183. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/__init__.py +0 -0
  184. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/__init__.py +0 -0
  185. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/client.py +0 -0
  186. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/metrics.py +0 -0
  187. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/process.py +0 -0
  188. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/daemon/protocol.py +0 -0
  189. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/draft_prs.py +0 -0
  190. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/execution/__init__.py +0 -0
  191. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/execution/collector.py +0 -0
  192. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/git_hooks.py +0 -0
  193. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/logging.py +0 -0
  194. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/README.md +0 -0
  195. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/migrations/__init__.py +0 -0
  196. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/pr_poller.py +0 -0
  197. {loopflow-0.7.0 → loopflow-0.7.2}/src/loopflow/lfd/worktree_state.py +0 -0
  198. {loopflow-0.7.0/src/loopflow/lfd/work → loopflow-0.7.2/src/loopflow/proto/loopflow}/__init__.py +0 -0
@@ -15,3 +15,5 @@ swift/dist/
15
15
  # Loopflow (generated cache)
16
16
  .lf/summaries/
17
17
  *.profraw
18
+ .DS_Store
19
+ target/
@@ -0,0 +1,206 @@
1
+ Metadata-Version: 2.4
2
+ Name: loopflow
3
+ Version: 0.7.2
4
+ Summary: Run LLM coding agents from reusable prompt files
5
+ Project-URL: Homepage, https://loopflowstudio.github.io/loopflow/
6
+ Project-URL: Repository, https://github.com/loopflowstudio/loopflow
7
+ Project-URL: Documentation, https://loopflowstudio.github.io/loopflow/
8
+ Project-URL: Issues, https://github.com/loopflowstudio/loopflow/issues
9
+ Project-URL: Changelog, https://github.com/loopflowstudio/loopflow/releases
10
+ Author: Jack
11
+ License-Expression: MIT
12
+ Keywords: agents,ai,automation,claude,cli,codex,coding,gemini,llm,prompts,workflow
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Software Development
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.10
25
+ Requires-Dist: croniter>=2.0
26
+ Requires-Dist: fastapi>=0.115.0
27
+ Requires-Dist: grpcio-tools>=1.60.0
28
+ Requires-Dist: grpcio>=1.60.0
29
+ Requires-Dist: pathspec>=0.11.0
30
+ Requires-Dist: protobuf>=4.25.0
31
+ Requires-Dist: pydantic>=2.12.5
32
+ Requires-Dist: pyyaml>=6.0
33
+ Requires-Dist: tiktoken>=0.7.0
34
+ Requires-Dist: typer>=0.9.0
35
+ Requires-Dist: uvicorn>=0.34.0
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest>=7.0.0; extra == 'dev'
38
+ Description-Content-Type: text/markdown
39
+
40
+ # Loopflow
41
+
42
+ Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI) at high scale.
43
+
44
+ Loopflow helps you create and run **Waves**. Waves are chains of coding agents working together in pre-defined ways.
45
+
46
+ Waves are first built manually through more interactive exploration. Eventually waves become autonomous through looping, scheduling, and watching for changes.
47
+
48
+ ## Waves
49
+
50
+ Waves are objects with 4 primary fields.
51
+
52
+ | Field | Usage | Form |
53
+ |-------|------|------|
54
+ | **Area** | Scope and context | pathset |
55
+ | **Flow** | Process followed / steps taken | sequence of prompts |
56
+ | **Direction** | Defines success, quality, and aesthetics | prompt |
57
+ | **Stimulus** | Watch, loop, or cron | mode |
58
+
59
+ ## Steps
60
+
61
+ ```bash
62
+ lf debug -c # paste an error, watch it fix
63
+ lf design # interactive design session
64
+ ```
65
+
66
+ Steps are prompts that run coding agents. Add your own in `.lf/steps/`.
67
+
68
+ ### Planning steps (`plan/`)
69
+
70
+ | Step | What it does |
71
+ |------|--------------|
72
+ | `review` | Research an area — architecture, complexity, quality, potential |
73
+ | `reduce` | Find simplification opportunities |
74
+ | `polish` | Find polish priorities |
75
+ | `expand` | Find expansion opportunities |
76
+ | `iterate` | Read review, write design to address it |
77
+ | `ingest` | Pick roadmap item, move to scratch/ |
78
+ | `kickoff` | Elaborate design — alternatives, research, imagine success/failure |
79
+ | `roadmap` | Synthesize analysis into a roadmap proposal |
80
+ | `5whys` | Root cause analysis on a bug fix |
81
+
82
+ ### Code steps (`code/`)
83
+
84
+ | Step | What it does |
85
+ |------|--------------|
86
+ | `debug` | Fix an error |
87
+ | `implement` | Build from a design doc |
88
+ | `compress` | Simplify touched code |
89
+ | `gate` | Ship-ready code and reviewer-friendly docs |
90
+
91
+ ### Interactive steps (`interactive/`)
92
+
93
+ | Step | What it does |
94
+ |------|--------------|
95
+ | `design` | Interactive design session |
96
+ | `explore` | Investigate the codebase |
97
+ | `refine` | Refine existing work |
98
+
99
+ ### Ops steps (`ops/`)
100
+
101
+ | Step | What it does |
102
+ |------|--------------|
103
+ | `consolidate` | Reorganize scratch/ for roadmap |
104
+ | `add-to-roadmap` | Promote from scratch/ to roadmap/ |
105
+ | `synthesize` | Combine multiple perspectives into one |
106
+ | `validate` | Validate flows, steps, and directions |
107
+
108
+ ## Flows
109
+
110
+ ```bash
111
+ lf design && lf implement && lf gate # chain steps manually
112
+ lf flow ship # or use a named flow
113
+ ```
114
+
115
+ Steps chain into flows. Flows feed into waves.
116
+
117
+ ### Code flows (`code/`)
118
+
119
+ | Flow | Steps |
120
+ |------|-------|
121
+ | `ship` | implement → compress → gate → consolidate |
122
+ | `design-and-ship` | design → implement → reduce → polish |
123
+ | `pair` | design → ship |
124
+ | `grind` | review → iterate → ship → gate |
125
+ | `incident` | debug → 5whys → ship |
126
+ | `start` | ingest → kickoff |
127
+ | `ship-roadmap` | start → ship |
128
+
129
+ ### Plan flows (`plan/`)
130
+
131
+ | Flow | Steps |
132
+ |------|-------|
133
+ | `roadmap-reduce` | review → fork(reduce×3) → publish |
134
+ | `roadmap-polish` | review → fork(polish×3) → publish |
135
+ | `roadmap-expand` | review → fork(expand×3) → publish |
136
+ | `research` | explore → review → publish |
137
+ | `publish` | consolidate → add-to-roadmap |
138
+
139
+ ### Forks
140
+
141
+ Forks run a step in parallel with different directions, then synthesize the results.
142
+
143
+ ```bash
144
+ lf flow roadmap-reduce # runs reduce 3x with different perspectives
145
+ ```
146
+
147
+ `roadmap-reduce` forks `reduce` across infra-engineer, designer, and product-engineer directions, then synthesizes and publishes to roadmap.
148
+
149
+ ## Playing in the Waves
150
+
151
+ Once you have played with chaining steps into flows, you're ready to start running waves.
152
+
153
+ ```bash
154
+ lfd create engbot # create a wave
155
+ lfd area engbot src/ # set area
156
+ lfd direction engbot product-engineer # set direction
157
+ lfd flow engbot ship # set flow
158
+ lfd loop engbot # start looping
159
+ ```
160
+
161
+ Runs the `ship` flow on `src/` continuously using the `product-engineer` direction, creating PRs until stopped.
162
+
163
+ ```bash
164
+ lfd watch ship designs/ -d designer # ship when designs/ changes on main
165
+ ```
166
+
167
+ You can compose multiple directions to add additional nuance or perspectives.
168
+
169
+ ```bash
170
+ lf review -d designer,product-engineer
171
+ lf review -d ceo
172
+ ```
173
+
174
+ ## Install
175
+
176
+ ```bash
177
+ uv tool install loopflow
178
+ ```
179
+
180
+ Built-in steps and flows included. `lf init` sets up your coding agent and preferences.
181
+
182
+ [Documentation →](docs/index.md)
183
+
184
+ ## Integrations
185
+
186
+ **Coding Agents**
187
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — Anthropic's coding agent (default)
188
+ - [Codex CLI](https://github.com/openai/codex) — OpenAI's coding agent
189
+ - [Gemini CLI](https://github.com/google-gemini/gemini-cli) — Google's coding agent
190
+
191
+ **Tools**
192
+ - [worktrunk](https://github.com/loopflowstudio/worktrunk) — git worktree management (`wt` commands)
193
+
194
+ **Skill Libraries**
195
+ - [superpowers](https://github.com/obra/superpowers) — prompt library (`lf sp:<skill>`)
196
+ - [SkillRegistry](https://skillregistry.io/) — remote skill directory (`lf sr:<skill>`)
197
+ - [rams](https://rams.ai) — accessibility and visual design review
198
+
199
+ ## Requirements
200
+
201
+ - macOS
202
+ - [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)
203
+
204
+ ## License
205
+
206
+ MIT
@@ -0,0 +1,167 @@
1
+ # Loopflow
2
+
3
+ Loopflow helps you maintain flow and craft using coding agents (Claude Code, Codex, Gemini CLI) at high scale.
4
+
5
+ Loopflow helps you create and run **Waves**. Waves are chains of coding agents working together in pre-defined ways.
6
+
7
+ Waves are first built manually through more interactive exploration. Eventually waves become autonomous through looping, scheduling, and watching for changes.
8
+
9
+ ## Waves
10
+
11
+ Waves are objects with 4 primary fields.
12
+
13
+ | Field | Usage | Form |
14
+ |-------|------|------|
15
+ | **Area** | Scope and context | pathset |
16
+ | **Flow** | Process followed / steps taken | sequence of prompts |
17
+ | **Direction** | Defines success, quality, and aesthetics | prompt |
18
+ | **Stimulus** | Watch, loop, or cron | mode |
19
+
20
+ ## Steps
21
+
22
+ ```bash
23
+ lf debug -c # paste an error, watch it fix
24
+ lf design # interactive design session
25
+ ```
26
+
27
+ Steps are prompts that run coding agents. Add your own in `.lf/steps/`.
28
+
29
+ ### Planning steps (`plan/`)
30
+
31
+ | Step | What it does |
32
+ |------|--------------|
33
+ | `review` | Research an area — architecture, complexity, quality, potential |
34
+ | `reduce` | Find simplification opportunities |
35
+ | `polish` | Find polish priorities |
36
+ | `expand` | Find expansion opportunities |
37
+ | `iterate` | Read review, write design to address it |
38
+ | `ingest` | Pick roadmap item, move to scratch/ |
39
+ | `kickoff` | Elaborate design — alternatives, research, imagine success/failure |
40
+ | `roadmap` | Synthesize analysis into a roadmap proposal |
41
+ | `5whys` | Root cause analysis on a bug fix |
42
+
43
+ ### Code steps (`code/`)
44
+
45
+ | Step | What it does |
46
+ |------|--------------|
47
+ | `debug` | Fix an error |
48
+ | `implement` | Build from a design doc |
49
+ | `compress` | Simplify touched code |
50
+ | `gate` | Ship-ready code and reviewer-friendly docs |
51
+
52
+ ### Interactive steps (`interactive/`)
53
+
54
+ | Step | What it does |
55
+ |------|--------------|
56
+ | `design` | Interactive design session |
57
+ | `explore` | Investigate the codebase |
58
+ | `refine` | Refine existing work |
59
+
60
+ ### Ops steps (`ops/`)
61
+
62
+ | Step | What it does |
63
+ |------|--------------|
64
+ | `consolidate` | Reorganize scratch/ for roadmap |
65
+ | `add-to-roadmap` | Promote from scratch/ to roadmap/ |
66
+ | `synthesize` | Combine multiple perspectives into one |
67
+ | `validate` | Validate flows, steps, and directions |
68
+
69
+ ## Flows
70
+
71
+ ```bash
72
+ lf design && lf implement && lf gate # chain steps manually
73
+ lf flow ship # or use a named flow
74
+ ```
75
+
76
+ Steps chain into flows. Flows feed into waves.
77
+
78
+ ### Code flows (`code/`)
79
+
80
+ | Flow | Steps |
81
+ |------|-------|
82
+ | `ship` | implement → compress → gate → consolidate |
83
+ | `design-and-ship` | design → implement → reduce → polish |
84
+ | `pair` | design → ship |
85
+ | `grind` | review → iterate → ship → gate |
86
+ | `incident` | debug → 5whys → ship |
87
+ | `start` | ingest → kickoff |
88
+ | `ship-roadmap` | start → ship |
89
+
90
+ ### Plan flows (`plan/`)
91
+
92
+ | Flow | Steps |
93
+ |------|-------|
94
+ | `roadmap-reduce` | review → fork(reduce×3) → publish |
95
+ | `roadmap-polish` | review → fork(polish×3) → publish |
96
+ | `roadmap-expand` | review → fork(expand×3) → publish |
97
+ | `research` | explore → review → publish |
98
+ | `publish` | consolidate → add-to-roadmap |
99
+
100
+ ### Forks
101
+
102
+ Forks run a step in parallel with different directions, then synthesize the results.
103
+
104
+ ```bash
105
+ lf flow roadmap-reduce # runs reduce 3x with different perspectives
106
+ ```
107
+
108
+ `roadmap-reduce` forks `reduce` across infra-engineer, designer, and product-engineer directions, then synthesizes and publishes to roadmap.
109
+
110
+ ## Playing in the Waves
111
+
112
+ Once you have played with chaining steps into flows, you're ready to start running waves.
113
+
114
+ ```bash
115
+ lfd create engbot # create a wave
116
+ lfd area engbot src/ # set area
117
+ lfd direction engbot product-engineer # set direction
118
+ lfd flow engbot ship # set flow
119
+ lfd loop engbot # start looping
120
+ ```
121
+
122
+ Runs the `ship` flow on `src/` continuously using the `product-engineer` direction, creating PRs until stopped.
123
+
124
+ ```bash
125
+ lfd watch ship designs/ -d designer # ship when designs/ changes on main
126
+ ```
127
+
128
+ You can compose multiple directions to add additional nuance or perspectives.
129
+
130
+ ```bash
131
+ lf review -d designer,product-engineer
132
+ lf review -d ceo
133
+ ```
134
+
135
+ ## Install
136
+
137
+ ```bash
138
+ uv tool install loopflow
139
+ ```
140
+
141
+ Built-in steps and flows included. `lf init` sets up your coding agent and preferences.
142
+
143
+ [Documentation →](docs/index.md)
144
+
145
+ ## Integrations
146
+
147
+ **Coding Agents**
148
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — Anthropic's coding agent (default)
149
+ - [Codex CLI](https://github.com/openai/codex) — OpenAI's coding agent
150
+ - [Gemini CLI](https://github.com/google-gemini/gemini-cli) — Google's coding agent
151
+
152
+ **Tools**
153
+ - [worktrunk](https://github.com/loopflowstudio/worktrunk) — git worktree management (`wt` commands)
154
+
155
+ **Skill Libraries**
156
+ - [superpowers](https://github.com/obra/superpowers) — prompt library (`lf sp:<skill>`)
157
+ - [SkillRegistry](https://skillregistry.io/) — remote skill directory (`lf sr:<skill>`)
158
+ - [rams](https://rams.ai) — accessibility and visual design review
159
+
160
+ ## Requirements
161
+
162
+ - macOS
163
+ - [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)
164
+
165
+ ## License
166
+
167
+ MIT
@@ -30,10 +30,12 @@ dependencies = [
30
30
  "pyyaml>=6.0",
31
31
  "pydantic>=2.12.5",
32
32
  "tiktoken>=0.7.0",
33
- "asana>=5.0.0",
34
33
  "croniter>=2.0",
35
34
  "fastapi>=0.115.0",
36
35
  "uvicorn>=0.34.0",
36
+ "grpcio>=1.60.0",
37
+ "grpcio-tools>=1.60.0",
38
+ "protobuf>=4.25.0",
37
39
  ]
38
40
 
39
41
  [project.urls]
@@ -51,8 +53,6 @@ dev = [
51
53
  [project.scripts]
52
54
  lf = "loopflow.lf.cli:main"
53
55
  lfd = "loopflow.lfd.cli:main"
54
- lfops = "loopflow.lfops:main"
55
- lfwork = "loopflow.lfwork:main"
56
56
 
57
57
  [build-system]
58
58
  requires = ["hatchling"]
@@ -92,10 +92,12 @@ select = [
92
92
 
93
93
  [tool.ruff.lint.per-file-ignores]
94
94
  "tests/*" = ["F841"] # unused variables OK in test fixtures
95
+ "src/loopflow/proto/**/*_pb2*" = ["E501", "F401", "F811", "I001", "E402"] # generated protobuf code
95
96
 
96
97
  [dependency-groups]
97
98
  dev = [
98
99
  "pytest>=9.0.2",
99
100
  "boto3>=1.35.0",
100
101
  "ruff>=0.9.0",
102
+ "maturin>=1.4,<2.0",
101
103
  ]
@@ -0,0 +1,73 @@
1
+ # Loopflow
2
+
3
+ Run prompts, hand off cleanly. Each step does one thing and leaves state for the next.
4
+
5
+ ---
6
+
7
+ ## Area
8
+
9
+ Your working scope. Everything here is relevant.
10
+
11
+ **Area docs**: Patterns and constraints for this part of the codebase.
12
+
13
+ **Repo docs**: STYLE, CLAUDE.md, and other guidelines. Follow them.
14
+
15
+ **Direction**: Your perspective. Follow its principles.
16
+
17
+ **Step**: Your task. Do what it says.
18
+
19
+ **Diff**: What's changed on this branch. Your primary working material.
20
+
21
+ **Clipboard**: User-provided input. If present, it's why you're here.
22
+
23
+ ---
24
+
25
+ ## Run Modes
26
+
27
+ Check the run mode at the top of the prompt.
28
+
29
+ **If auto mode**: Run to completion. Don't pause for questions. Make best-effort assumptions. Write open questions to `scratch/questions.md` and keep moving.
30
+
31
+ **If interactive mode**: Ask clarifying questions when needed. The user will guide you.
32
+
33
+ ---
34
+
35
+ ## Where to Write
36
+
37
+ **scratch/**: PR-scoped artifacts. Design docs, notes, questions. Cleared on merge.
38
+ - `scratch/<branch>.md` — design doc for current work
39
+ - `scratch/questions.md` — open questions, unknowns, blockers
40
+
41
+ **Code**: The actual work. Tests, implementation, fixes.
42
+
43
+ Don't modify `roadmap/` unless the step explicitly says to. It persists across PRs.
44
+
45
+ ---
46
+
47
+ ## Commits
48
+
49
+ In auto mode, commit when a step completes. Small, atomic commits. Don't leave the branch broken.
50
+
51
+ In interactive mode, commit at natural breakpoints when the user signals readiness.
52
+
53
+ ---
54
+
55
+ ## Chaining
56
+
57
+ Steps produce artifacts that later steps consume:
58
+
59
+ | Step | Reads | Writes |
60
+ |------|-------|--------|
61
+ | design | — | scratch/<branch>.md |
62
+ | implement | scratch/<branch>.md | code, tests |
63
+ | review | code on branch | verdict in scratch/ |
64
+
65
+ If a required artifact is missing, check scratch/ first. If still missing, note it in `scratch/questions.md` and proceed with what you have.
66
+
67
+ ---
68
+
69
+ ## Quality
70
+
71
+ Ship working code. Tests pass. No regressions.
72
+
73
+ When unsure between two approaches, pick the simpler one. You can always iterate.
@@ -0,0 +1 @@
1
+ __version__ = "0.7.2"
@@ -6,6 +6,8 @@ import subprocess
6
6
  from datetime import datetime
7
7
  from typing import TYPE_CHECKING
8
8
 
9
+ from loopflow.lf.naming import generate_word_pair
10
+
9
11
  if TYPE_CHECKING:
10
12
  from loopflow.lf.config import BranchNameConfig
11
13
 
@@ -36,7 +38,15 @@ def _sanitize_for_branch(s: str) -> str:
36
38
 
37
39
 
38
40
  def format_branch_name(short_name: str, config: "BranchNameConfig | None") -> str:
39
- """Transform short name into full branch name using schema."""
41
+ """Transform short name into full branch name using schema.
42
+
43
+ Available placeholders:
44
+ {name} - the short name provided
45
+ {user} - git username
46
+ {ts} - timestamp (YYYYMMDD_HHMM)
47
+ {date} - date (YYYYMMDD)
48
+ {words} - magical-musical word pair (e.g., wisp-forte)
49
+ """
40
50
  if config is None:
41
51
  return short_name
42
52
 
@@ -51,6 +61,7 @@ def format_branch_name(short_name: str, config: "BranchNameConfig | None") -> st
51
61
  "user": _get_git_username(),
52
62
  "ts": now.strftime("%Y%m%d_%H%M"),
53
63
  "date": now.strftime("%Y%m%d"),
64
+ "words": generate_word_pair(),
54
65
  }
55
66
 
56
67
  result = schema
@@ -0,0 +1,24 @@
1
+ Build systems that don't break.
2
+
3
+ ## Core responsibilities
4
+
5
+ **Security.** Defense in depth. Validate inputs, sanitize outputs, minimize attack surface. Assume breach. Least privilege. Audit sensitive operations.
6
+
7
+ **Performance.** Speed matters. Measure before optimizing. Profile hot paths. Watch memory, latency, throughput. Indexing, batching, caching, connection pooling.
8
+
9
+ **Reliability.** Systems work correctly, always. Handle failures gracefully. Retry with backoff. Circuit breakers. Graceful degradation. Timeouts, health checks, monitoring.
10
+
11
+ ## What matters
12
+
13
+ **Slow is smooth. Smooth is fast.** Rushing creates incidents. Measure twice, cut once.
14
+
15
+ **Correctness over speed.** A fast system that's wrong is worthless. A correct system can be optimized.
16
+
17
+ **Observability is not optional.** If you can't see it, you can't fix it. Logging, metrics, tracing are load-bearing.
18
+
19
+ ## Quality bar
20
+
21
+ - Handles 10x current load without architectural changes
22
+ - Fails gracefully—partial degradation, not total collapse
23
+ - Recoverable in minutes, not hours
24
+ - Every state change is observable and reversible
@@ -0,0 +1,3 @@
1
+ Quality and attention to detail. Code should be clear, tested, documented.
2
+ Take time to get it right. Refactor when needed. No shortcuts.
3
+ Consider: edge cases, error messages, naming, consistency.
@@ -0,0 +1,3 @@
1
+ Maintain momentum. Ship small, iterate fast, unblock quickly.
2
+ Prefer simple solutions that work now over perfect solutions later.
3
+ Consider: what's the smallest useful change? What's blocking progress?
@@ -0,0 +1,3 @@
1
+ Build for growth. Prefer horizontal scaling, stateless design, async patterns.
2
+ Avoid premature optimization but design for 10x current load.
3
+ Consider: caching, sharding, queues, idempotency.
@@ -0,0 +1,50 @@
1
+ # Built-in Flows
2
+
3
+ Flows shipped with loopflow. Organized by purpose.
4
+
5
+ ## Code flows (`code/`)
6
+
7
+ Flows that produce code changes.
8
+
9
+ | Flow | Steps | Use case |
10
+ |------|-------|----------|
11
+ | `ship` | implement → compress → gate | Build from design, ship clean |
12
+ | `pair` | design → ship | Interactive design then build |
13
+ | `grind` | review → iterate → ship → gate | Review-driven iteration |
14
+ | `incident` | debug → 5whys → ship | Fix bug, analyze root cause, ship fixes |
15
+ | `start` | ingest → kickoff | Pick roadmap item, elaborate design |
16
+ | `ship-roadmap` | start → ship | Pick roadmap item, elaborate, build |
17
+
18
+ ## Plan flows (`plan/`)
19
+
20
+ Flows that produce roadmap items and analysis.
21
+
22
+ | Flow | Steps | Use case |
23
+ |------|-------|----------|
24
+ | `roadmap-reduce` | review → fork(reduce×3) → publish | Find simplification opportunities |
25
+ | `roadmap-polish` | review → fork(polish×3) → publish | Find polish priorities |
26
+ | `roadmap-expand` | review → fork(expand×3) → publish | Find expansion opportunities |
27
+ | `research` | explore → review → publish | Investigate then propose |
28
+ | `publish` | consolidate → add-to-roadmap | Promote scratch/ to roadmap/ |
29
+
30
+ ## Fork pattern
31
+
32
+ Plan flows use forks to get multiple perspectives:
33
+
34
+ ```yaml
35
+ - review
36
+ - fork:
37
+ step: reduce
38
+ drafts:
39
+ - direction: infra-engineer
40
+ - direction: designer
41
+ - direction: product-engineer
42
+ - publish
43
+ ```
44
+
45
+ The fork runs `reduce` three times with different directions, synthesizes results using the wave's direction, then publishes to roadmap.
46
+
47
+ ## Adding a flow
48
+
49
+ 1. Create `{category}/{name}.yaml` with step list
50
+ 2. Update this README
@@ -0,0 +1,4 @@
1
+ - design
2
+ - implement
3
+ - reduce
4
+ - polish
@@ -0,0 +1,4 @@
1
+ - review
2
+ - iterate
3
+ - ship
4
+ - gate
@@ -0,0 +1,3 @@
1
+ - debug
2
+ - 5whys
3
+ - ship
@@ -0,0 +1,2 @@
1
+ - design
2
+ - ship
@@ -0,0 +1,4 @@
1
+ - implement
2
+ - compress
3
+ - gate
4
+ - consolidate
@@ -0,0 +1,2 @@
1
+ - ingest
2
+ - kickoff
@@ -0,0 +1,2 @@
1
+ - consolidate
2
+ - add-to-roadmap
@@ -0,0 +1,3 @@
1
+ - explore
2
+ - review
3
+ - publish
@@ -0,0 +1,8 @@
1
+ - review
2
+ - fork:
3
+ step: expand
4
+ drafts:
5
+ - direction: infra-engineer
6
+ - direction: designer
7
+ - direction: product-engineer
8
+ - publish
@@ -0,0 +1,8 @@
1
+ - review
2
+ - fork:
3
+ step: polish
4
+ drafts:
5
+ - direction: infra-engineer
6
+ - direction: designer
7
+ - direction: product-engineer
8
+ - publish