@mobrienv/autoloop 0.3.0 → 0.7.0

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 (415) hide show
  1. package/README.md +140 -43
  2. package/bin/autoloop +1 -1
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.js +19 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/testing/mock-backend.js +3 -5
  7. package/dist/testing/mock-backend.js.map +1 -1
  8. package/package.json +32 -10
  9. package/plugins/autoloop/.claude-plugin/plugin.json +1 -1
  10. package/dist/agent-map.d.ts +0 -10
  11. package/dist/agent-map.js +0 -58
  12. package/dist/agent-map.js.map +0 -1
  13. package/dist/backend/acp-client.d.ts +0 -38
  14. package/dist/backend/acp-client.js +0 -288
  15. package/dist/backend/acp-client.js.map +0 -1
  16. package/dist/backend/index.d.ts +0 -10
  17. package/dist/backend/index.js +0 -71
  18. package/dist/backend/index.js.map +0 -1
  19. package/dist/backend/kiro-bridge.d.ts +0 -17
  20. package/dist/backend/kiro-bridge.js +0 -84
  21. package/dist/backend/kiro-bridge.js.map +0 -1
  22. package/dist/backend/kiro-worker.d.ts +0 -1
  23. package/dist/backend/kiro-worker.js +0 -92
  24. package/dist/backend/kiro-worker.js.map +0 -1
  25. package/dist/backend/run-command.d.ts +0 -7
  26. package/dist/backend/run-command.js +0 -50
  27. package/dist/backend/run-command.js.map +0 -1
  28. package/dist/backend/run-kiro.d.ts +0 -3
  29. package/dist/backend/run-kiro.js +0 -16
  30. package/dist/backend/run-kiro.js.map +0 -1
  31. package/dist/backend/run-mock.d.ts +0 -1
  32. package/dist/backend/run-mock.js +0 -6
  33. package/dist/backend/run-mock.js.map +0 -1
  34. package/dist/backend/run-pi.d.ts +0 -5
  35. package/dist/backend/run-pi.js +0 -5
  36. package/dist/backend/run-pi.js.map +0 -1
  37. package/dist/backend/types.d.ts +0 -21
  38. package/dist/backend/types.js +0 -2
  39. package/dist/backend/types.js.map +0 -1
  40. package/dist/chains/budget.d.ts +0 -7
  41. package/dist/chains/budget.js +0 -54
  42. package/dist/chains/budget.js.map +0 -1
  43. package/dist/chains/load.d.ts +0 -18
  44. package/dist/chains/load.js +0 -129
  45. package/dist/chains/load.js.map +0 -1
  46. package/dist/chains/render.d.ts +0 -2
  47. package/dist/chains/render.js +0 -74
  48. package/dist/chains/render.js.map +0 -1
  49. package/dist/chains/run.d.ts +0 -17
  50. package/dist/chains/run.js +0 -260
  51. package/dist/chains/run.js.map +0 -1
  52. package/dist/chains/types.d.ts +0 -38
  53. package/dist/chains/types.js +0 -2
  54. package/dist/chains/types.js.map +0 -1
  55. package/dist/chains.d.ts +0 -6
  56. package/dist/chains.js +0 -5
  57. package/dist/chains.js.map +0 -1
  58. package/dist/commands/chain.d.ts +0 -1
  59. package/dist/commands/chain.js +0 -53
  60. package/dist/commands/chain.js.map +0 -1
  61. package/dist/commands/config.d.ts +0 -1
  62. package/dist/commands/config.js +0 -74
  63. package/dist/commands/config.js.map +0 -1
  64. package/dist/commands/dashboard.d.ts +0 -1
  65. package/dist/commands/dashboard.js +0 -68
  66. package/dist/commands/dashboard.js.map +0 -1
  67. package/dist/commands/guide.d.ts +0 -1
  68. package/dist/commands/guide.js +0 -33
  69. package/dist/commands/guide.js.map +0 -1
  70. package/dist/commands/inspect.d.ts +0 -1
  71. package/dist/commands/inspect.js +0 -203
  72. package/dist/commands/inspect.js.map +0 -1
  73. package/dist/commands/list.d.ts +0 -1
  74. package/dist/commands/list.js +0 -15
  75. package/dist/commands/list.js.map +0 -1
  76. package/dist/commands/loops.d.ts +0 -1
  77. package/dist/commands/loops.js +0 -72
  78. package/dist/commands/loops.js.map +0 -1
  79. package/dist/commands/memory.d.ts +0 -1
  80. package/dist/commands/memory.js +0 -65
  81. package/dist/commands/memory.js.map +0 -1
  82. package/dist/commands/pi-adapter.d.ts +0 -1
  83. package/dist/commands/pi-adapter.js +0 -6
  84. package/dist/commands/pi-adapter.js.map +0 -1
  85. package/dist/commands/run.d.ts +0 -1
  86. package/dist/commands/run.js +0 -292
  87. package/dist/commands/run.js.map +0 -1
  88. package/dist/commands/runs.d.ts +0 -1
  89. package/dist/commands/runs.js +0 -50
  90. package/dist/commands/runs.js.map +0 -1
  91. package/dist/commands/task.d.ts +0 -1
  92. package/dist/commands/task.js +0 -74
  93. package/dist/commands/task.js.map +0 -1
  94. package/dist/commands/worktree.d.ts +0 -1
  95. package/dist/commands/worktree.js +0 -162
  96. package/dist/commands/worktree.js.map +0 -1
  97. package/dist/config.d.ts +0 -31
  98. package/dist/config.js +0 -261
  99. package/dist/config.js.map +0 -1
  100. package/dist/dashboard/app.d.ts +0 -12
  101. package/dist/dashboard/app.js +0 -23
  102. package/dist/dashboard/app.js.map +0 -1
  103. package/dist/dashboard/routes/api.d.ts +0 -3
  104. package/dist/dashboard/routes/api.js +0 -130
  105. package/dist/dashboard/routes/api.js.map +0 -1
  106. package/dist/dashboard/routes/pages.d.ts +0 -2
  107. package/dist/dashboard/routes/pages.js +0 -14
  108. package/dist/dashboard/routes/pages.js.map +0 -1
  109. package/dist/dashboard/views/alpine-vendor.d.ts +0 -1
  110. package/dist/dashboard/views/alpine-vendor.js +0 -10
  111. package/dist/dashboard/views/alpine-vendor.js.map +0 -1
  112. package/dist/dashboard/views/shell.d.ts +0 -1
  113. package/dist/dashboard/views/shell.js +0 -746
  114. package/dist/dashboard/views/shell.js.map +0 -1
  115. package/dist/events/decode.d.ts +0 -2
  116. package/dist/events/decode.js +0 -45
  117. package/dist/events/decode.js.map +0 -1
  118. package/dist/events/encode.d.ts +0 -2
  119. package/dist/events/encode.js +0 -33
  120. package/dist/events/encode.js.map +0 -1
  121. package/dist/events/guards.d.ts +0 -5
  122. package/dist/events/guards.js +0 -42
  123. package/dist/events/guards.js.map +0 -1
  124. package/dist/events/types.d.ts +0 -26
  125. package/dist/events/types.js +0 -2
  126. package/dist/events/types.js.map +0 -1
  127. package/dist/harness/config-helpers.d.ts +0 -35
  128. package/dist/harness/config-helpers.js +0 -411
  129. package/dist/harness/config-helpers.js.map +0 -1
  130. package/dist/harness/coordination.d.ts +0 -1
  131. package/dist/harness/coordination.js +0 -127
  132. package/dist/harness/coordination.js.map +0 -1
  133. package/dist/harness/display.d.ts +0 -21
  134. package/dist/harness/display.js +0 -176
  135. package/dist/harness/display.js.map +0 -1
  136. package/dist/harness/emit.d.ts +0 -15
  137. package/dist/harness/emit.js +0 -240
  138. package/dist/harness/emit.js.map +0 -1
  139. package/dist/harness/index.d.ts +0 -13
  140. package/dist/harness/index.js +0 -240
  141. package/dist/harness/index.js.map +0 -1
  142. package/dist/harness/iteration.d.ts +0 -16
  143. package/dist/harness/iteration.js +0 -131
  144. package/dist/harness/iteration.js.map +0 -1
  145. package/dist/harness/journal.d.ts +0 -31
  146. package/dist/harness/journal.js +0 -178
  147. package/dist/harness/journal.js.map +0 -1
  148. package/dist/harness/metareview.d.ts +0 -4
  149. package/dist/harness/metareview.js +0 -48
  150. package/dist/harness/metareview.js.map +0 -1
  151. package/dist/harness/metrics.d.ts +0 -12
  152. package/dist/harness/metrics.js +0 -180
  153. package/dist/harness/metrics.js.map +0 -1
  154. package/dist/harness/parallel.d.ts +0 -37
  155. package/dist/harness/parallel.js +0 -237
  156. package/dist/harness/parallel.js.map +0 -1
  157. package/dist/harness/prompt.d.ts +0 -46
  158. package/dist/harness/prompt.js +0 -403
  159. package/dist/harness/prompt.js.map +0 -1
  160. package/dist/harness/scratchpad.d.ts +0 -2
  161. package/dist/harness/scratchpad.js +0 -67
  162. package/dist/harness/scratchpad.js.map +0 -1
  163. package/dist/harness/stop.d.ts +0 -5
  164. package/dist/harness/stop.js +0 -70
  165. package/dist/harness/stop.js.map +0 -1
  166. package/dist/harness/tools.d.ts +0 -3
  167. package/dist/harness/tools.js +0 -65
  168. package/dist/harness/tools.js.map +0 -1
  169. package/dist/harness/types.d.ts +0 -110
  170. package/dist/harness/types.js +0 -2
  171. package/dist/harness/types.js.map +0 -1
  172. package/dist/harness/wave/finalize-wave.d.ts +0 -9
  173. package/dist/harness/wave/finalize-wave.js +0 -87
  174. package/dist/harness/wave/finalize-wave.js.map +0 -1
  175. package/dist/harness/wave/launch-branches.d.ts +0 -6
  176. package/dist/harness/wave/launch-branches.js +0 -314
  177. package/dist/harness/wave/launch-branches.js.map +0 -1
  178. package/dist/harness/wave/parse-objectives.d.ts +0 -3
  179. package/dist/harness/wave/parse-objectives.js +0 -32
  180. package/dist/harness/wave/parse-objectives.js.map +0 -1
  181. package/dist/harness/wave/types.d.ts +0 -43
  182. package/dist/harness/wave/types.js +0 -2
  183. package/dist/harness/wave/types.js.map +0 -1
  184. package/dist/harness/wave.d.ts +0 -6
  185. package/dist/harness/wave.js +0 -159
  186. package/dist/harness/wave.js.map +0 -1
  187. package/dist/isolation/index.d.ts +0 -4
  188. package/dist/isolation/index.js +0 -3
  189. package/dist/isolation/index.js.map +0 -1
  190. package/dist/isolation/resolve.d.ts +0 -39
  191. package/dist/isolation/resolve.js +0 -118
  192. package/dist/isolation/resolve.js.map +0 -1
  193. package/dist/isolation/run-scope.d.ts +0 -21
  194. package/dist/isolation/run-scope.js +0 -50
  195. package/dist/isolation/run-scope.js.map +0 -1
  196. package/dist/json.d.ts +0 -8
  197. package/dist/json.js +0 -82
  198. package/dist/json.js.map +0 -1
  199. package/dist/loops/health.d.ts +0 -16
  200. package/dist/loops/health.js +0 -152
  201. package/dist/loops/health.js.map +0 -1
  202. package/dist/loops/list.d.ts +0 -6
  203. package/dist/loops/list.js +0 -21
  204. package/dist/loops/list.js.map +0 -1
  205. package/dist/loops/policy.d.ts +0 -6
  206. package/dist/loops/policy.js +0 -41
  207. package/dist/loops/policy.js.map +0 -1
  208. package/dist/loops/render.d.ts +0 -19
  209. package/dist/loops/render.js +0 -100
  210. package/dist/loops/render.js.map +0 -1
  211. package/dist/loops/show.d.ts +0 -8
  212. package/dist/loops/show.js +0 -31
  213. package/dist/loops/show.js.map +0 -1
  214. package/dist/loops/watch.d.ts +0 -14
  215. package/dist/loops/watch.js +0 -143
  216. package/dist/loops/watch.js.map +0 -1
  217. package/dist/main.d.ts +0 -1
  218. package/dist/main.js +0 -148
  219. package/dist/main.js.map +0 -1
  220. package/dist/markdown.d.ts +0 -10
  221. package/dist/markdown.js +0 -66
  222. package/dist/markdown.js.map +0 -1
  223. package/dist/memory-render.d.ts +0 -6
  224. package/dist/memory-render.js +0 -81
  225. package/dist/memory-render.js.map +0 -1
  226. package/dist/memory.d.ts +0 -22
  227. package/dist/memory.js +0 -318
  228. package/dist/memory.js.map +0 -1
  229. package/dist/pi-adapter.d.ts +0 -1
  230. package/dist/pi-adapter.js +0 -220
  231. package/dist/pi-adapter.js.map +0 -1
  232. package/dist/profiles.d.ts +0 -12
  233. package/dist/profiles.js +0 -71
  234. package/dist/profiles.js.map +0 -1
  235. package/dist/registry/derive.d.ts +0 -8
  236. package/dist/registry/derive.js +0 -88
  237. package/dist/registry/derive.js.map +0 -1
  238. package/dist/registry/discover.d.ts +0 -20
  239. package/dist/registry/discover.js +0 -98
  240. package/dist/registry/discover.js.map +0 -1
  241. package/dist/registry/harness.d.ts +0 -7
  242. package/dist/registry/harness.js +0 -63
  243. package/dist/registry/harness.js.map +0 -1
  244. package/dist/registry/index.d.ts +0 -6
  245. package/dist/registry/index.js +0 -6
  246. package/dist/registry/index.js.map +0 -1
  247. package/dist/registry/read.d.ts +0 -11
  248. package/dist/registry/read.js +0 -50
  249. package/dist/registry/read.js.map +0 -1
  250. package/dist/registry/rebuild.d.ts +0 -5
  251. package/dist/registry/rebuild.js +0 -22
  252. package/dist/registry/rebuild.js.map +0 -1
  253. package/dist/registry/types.d.ts +0 -28
  254. package/dist/registry/types.js +0 -2
  255. package/dist/registry/types.js.map +0 -1
  256. package/dist/registry/update.d.ts +0 -2
  257. package/dist/registry/update.js +0 -7
  258. package/dist/registry/update.js.map +0 -1
  259. package/dist/tasks-render.d.ts +0 -2
  260. package/dist/tasks-render.js +0 -44
  261. package/dist/tasks-render.js.map +0 -1
  262. package/dist/tasks.d.ts +0 -24
  263. package/dist/tasks.js +0 -184
  264. package/dist/tasks.js.map +0 -1
  265. package/dist/topology.d.ts +0 -31
  266. package/dist/topology.js +0 -309
  267. package/dist/topology.js.map +0 -1
  268. package/dist/usage.d.ts +0 -9
  269. package/dist/usage.js +0 -159
  270. package/dist/usage.js.map +0 -1
  271. package/dist/utils.d.ts +0 -21
  272. package/dist/utils.js +0 -349
  273. package/dist/utils.js.map +0 -1
  274. package/dist/worktree/clean.d.ts +0 -12
  275. package/dist/worktree/clean.js +0 -98
  276. package/dist/worktree/clean.js.map +0 -1
  277. package/dist/worktree/create.d.ts +0 -14
  278. package/dist/worktree/create.js +0 -71
  279. package/dist/worktree/create.js.map +0 -1
  280. package/dist/worktree/index.d.ts +0 -10
  281. package/dist/worktree/index.js +0 -6
  282. package/dist/worktree/index.js.map +0 -1
  283. package/dist/worktree/list.d.ts +0 -9
  284. package/dist/worktree/list.js +0 -24
  285. package/dist/worktree/list.js.map +0 -1
  286. package/dist/worktree/merge.d.ts +0 -11
  287. package/dist/worktree/merge.js +0 -129
  288. package/dist/worktree/merge.js.map +0 -1
  289. package/dist/worktree/meta.d.ts +0 -17
  290. package/dist/worktree/meta.js +0 -34
  291. package/dist/worktree/meta.js.map +0 -1
  292. package/presets/autocode/README.md +0 -81
  293. package/presets/autocode/autoloops.toml +0 -30
  294. package/presets/autocode/harness.md +0 -26
  295. package/presets/autocode/miniloops.toml +0 -22
  296. package/presets/autocode/roles/build.md +0 -34
  297. package/presets/autocode/roles/critic.md +0 -40
  298. package/presets/autocode/roles/finalizer.md +0 -43
  299. package/presets/autocode/roles/planner.md +0 -40
  300. package/presets/autocode/topology.toml +0 -32
  301. package/presets/autodoc/README.md +0 -42
  302. package/presets/autodoc/autoloops.toml +0 -21
  303. package/presets/autodoc/harness.md +0 -19
  304. package/presets/autodoc/miniloops.toml +0 -21
  305. package/presets/autodoc/roles/auditor.md +0 -39
  306. package/presets/autodoc/roles/checker.md +0 -43
  307. package/presets/autodoc/roles/publisher.md +0 -51
  308. package/presets/autodoc/roles/writer.md +0 -37
  309. package/presets/autodoc/topology.toml +0 -31
  310. package/presets/autofix/README.md +0 -56
  311. package/presets/autofix/autoloops.toml +0 -24
  312. package/presets/autofix/harness.md +0 -25
  313. package/presets/autofix/miniloops.toml +0 -21
  314. package/presets/autofix/roles/closer.md +0 -48
  315. package/presets/autofix/roles/diagnoser.md +0 -43
  316. package/presets/autofix/roles/fixer.md +0 -28
  317. package/presets/autofix/roles/verifier.md +0 -31
  318. package/presets/autofix/topology.toml +0 -33
  319. package/presets/autoideas/README.md +0 -73
  320. package/presets/autoideas/autoloops.toml +0 -18
  321. package/presets/autoideas/harness.md +0 -31
  322. package/presets/autoideas/miniloops.toml +0 -18
  323. package/presets/autoideas/roles/analyst.md +0 -32
  324. package/presets/autoideas/roles/reviewer.md +0 -36
  325. package/presets/autoideas/roles/scanner.md +0 -26
  326. package/presets/autoideas/roles/synthesizer.md +0 -61
  327. package/presets/autoideas/topology.toml +0 -32
  328. package/presets/automerge/README.md +0 -3
  329. package/presets/automerge/autoloops.toml +0 -12
  330. package/presets/automerge/harness.md +0 -10
  331. package/presets/automerge/miniloops.toml +0 -12
  332. package/presets/automerge/roles/merge.md +0 -10
  333. package/presets/automerge/topology.toml +0 -10
  334. package/presets/autoperf/README.md +0 -56
  335. package/presets/autoperf/autoloops.toml +0 -21
  336. package/presets/autoperf/harness.md +0 -21
  337. package/presets/autoperf/miniloops.toml +0 -21
  338. package/presets/autoperf/roles/judge.md +0 -38
  339. package/presets/autoperf/roles/measurer.md +0 -36
  340. package/presets/autoperf/roles/optimizer.md +0 -35
  341. package/presets/autoperf/roles/profiler.md +0 -38
  342. package/presets/autoperf/topology.toml +0 -32
  343. package/presets/autopr/README.md +0 -99
  344. package/presets/autopr/autoloops.toml +0 -22
  345. package/presets/autopr/harness.md +0 -27
  346. package/presets/autopr/miniloops.toml +0 -22
  347. package/presets/autopr/roles/collector.md +0 -55
  348. package/presets/autopr/roles/drafter.md +0 -38
  349. package/presets/autopr/roles/publisher.md +0 -28
  350. package/presets/autopr/roles/validator.md +0 -31
  351. package/presets/autopr/topology.toml +0 -32
  352. package/presets/autoqa/README.md +0 -76
  353. package/presets/autoqa/autoloops.toml +0 -21
  354. package/presets/autoqa/harness.md +0 -30
  355. package/presets/autoqa/miniloops.toml +0 -21
  356. package/presets/autoqa/roles/executor.md +0 -43
  357. package/presets/autoqa/roles/inspector.md +0 -45
  358. package/presets/autoqa/roles/planner.md +0 -55
  359. package/presets/autoqa/roles/reporter.md +0 -74
  360. package/presets/autoqa/topology.toml +0 -31
  361. package/presets/autoresearch/README.md +0 -63
  362. package/presets/autoresearch/autoloops.toml +0 -18
  363. package/presets/autoresearch/harness.md +0 -28
  364. package/presets/autoresearch/miniloops.toml +0 -18
  365. package/presets/autoresearch/roles/benchmarker.md +0 -34
  366. package/presets/autoresearch/roles/evaluator.md +0 -33
  367. package/presets/autoresearch/roles/implementer.md +0 -26
  368. package/presets/autoresearch/roles/strategist.md +0 -43
  369. package/presets/autoresearch/topology.toml +0 -31
  370. package/presets/autoreview/README.md +0 -51
  371. package/presets/autoreview/autoloops.toml +0 -21
  372. package/presets/autoreview/harness.md +0 -20
  373. package/presets/autoreview/miniloops.toml +0 -21
  374. package/presets/autoreview/roles/checker.md +0 -36
  375. package/presets/autoreview/roles/reader.md +0 -33
  376. package/presets/autoreview/roles/suggester.md +0 -26
  377. package/presets/autoreview/roles/summarizer.md +0 -57
  378. package/presets/autoreview/topology.toml +0 -31
  379. package/presets/autosec/README.md +0 -51
  380. package/presets/autosec/autoloops.toml +0 -21
  381. package/presets/autosec/harness.md +0 -20
  382. package/presets/autosec/miniloops.toml +0 -21
  383. package/presets/autosec/roles/analyst.md +0 -38
  384. package/presets/autosec/roles/hardener.md +0 -36
  385. package/presets/autosec/roles/reporter.md +0 -63
  386. package/presets/autosec/roles/scanner.md +0 -38
  387. package/presets/autosec/topology.toml +0 -31
  388. package/presets/autosimplify/README.md +0 -83
  389. package/presets/autosimplify/autoloops.toml +0 -26
  390. package/presets/autosimplify/harness.md +0 -25
  391. package/presets/autosimplify/miniloops.toml +0 -22
  392. package/presets/autosimplify/roles/reviewer.md +0 -38
  393. package/presets/autosimplify/roles/scoper.md +0 -42
  394. package/presets/autosimplify/roles/simplifier.md +0 -51
  395. package/presets/autosimplify/roles/verifier.md +0 -40
  396. package/presets/autosimplify/topology.toml +0 -32
  397. package/presets/autospec/README.md +0 -84
  398. package/presets/autospec/autoloops.toml +0 -21
  399. package/presets/autospec/harness.md +0 -23
  400. package/presets/autospec/miniloops.toml +0 -21
  401. package/presets/autospec/roles/clarifier.md +0 -39
  402. package/presets/autospec/roles/critic.md +0 -41
  403. package/presets/autospec/roles/designer.md +0 -37
  404. package/presets/autospec/roles/planner.md +0 -38
  405. package/presets/autospec/roles/researcher.md +0 -33
  406. package/presets/autospec/topology.toml +0 -38
  407. package/presets/autotest/README.md +0 -55
  408. package/presets/autotest/autoloops.toml +0 -21
  409. package/presets/autotest/harness.md +0 -21
  410. package/presets/autotest/miniloops.toml +0 -21
  411. package/presets/autotest/roles/assessor.md +0 -57
  412. package/presets/autotest/roles/runner.md +0 -31
  413. package/presets/autotest/roles/surveyor.md +0 -39
  414. package/presets/autotest/roles/writer.md +0 -37
  415. package/presets/autotest/topology.toml +0 -32
package/README.md CHANGED
@@ -1,21 +1,85 @@
1
1
  # autoloop
2
2
 
3
- Autonomous LLM loop harness for long-horizon, multi-role agent work.
3
+ autoloop is a spinoff of ralph-orchestrator built to keep the parts that mattered and drop a lot of the extra experimental surface area.
4
+
5
+ It’s a simpler, more opinionated loop harness for long-running agent work: inspectable runs, easier preset-driven workflows, and operator surfaces that agents can use directly too.
6
+
7
+ It’s early and still evolving. autoloop is not a replacement for ralph-orchestrator — it’s a cleaner path for exploring a simpler UX without breaking Ralph.
4
8
 
5
9
  [![npm version](https://img.shields.io/npm/v/@mobrienv/autoloop)](https://www.npmjs.com/package/@mobrienv/autoloop)
10
+ [![docs](https://img.shields.io/badge/docs-live-blue)](https://mikeyobrien.github.io/autoloop/)
6
11
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org/)
7
12
 
8
- ## Features
13
+ **[Read the docs →](https://mikeyobrien.github.io/autoloop/)**
14
+
15
+ [![autoloop hero showing the CLI surface and local dashboard](docs/launches/autoloop-readme-hero.png)](docs/launches/autoloop-hybrid-launch-video-x.mp4)
16
+
17
+ ## Use as a library
18
+
19
+ As of `0.5.0-sdk.0`, autoloop ships an embed-able runtime alongside the CLI. Pass an `AbortSignal` for cancellation and an `onEvent` callback to consume the structured event stream — no terminal output is produced unless you ask for it.
20
+
21
+ ```ts
22
+ import { run, type LoopEvent } from "@mobrienv/autoloop";
23
+
24
+ const controller = new AbortController();
25
+ setTimeout(() => controller.abort(), 60_000);
26
+
27
+ const summary = await run("./my-project", "build the login page", "autoloop", {
28
+ signal: controller.signal,
29
+ onEvent: (event: LoopEvent) => {
30
+ if (event.type === "iteration.start") console.log(`iter ${event.iteration}`);
31
+ if (event.type === "loop.finish") console.log(`done: ${event.stopReason}`);
32
+ },
33
+ });
34
+
35
+ console.log(summary); // { iterations, stopReason, runId }
36
+ ```
37
+
38
+ The CLI entry (`bin/autoloop`) is still the primary interface; the library export is for agent frameworks and dashboards that want to drive loops in-process.
39
+
40
+ ## Why autoloop exists
41
+
42
+ ralph-orchestrator grew to include a lot of different experiments and ways of doing things. autoloop spins out a narrower set of ideas into something simpler and more opinionated.
43
+
44
+ The bet is that long-running agent workflows get much better when they are:
45
+
46
+ - inspectable after every iteration
47
+ - easy to launch through reusable presets
48
+ - safe to run in isolation when they touch real code
49
+ - operable by both humans and agents
9
50
 
10
- - **Event-driven role routing** -- roles hand off via structured events; the harness manages iteration, backpressure, and completion detection
11
- - **Append-only journal** -- every iteration is recorded; inspect, replay, or audit any run
12
- - **Preset system** -- bundled presets for common workflows (code, docs, QA, security, specs); create your own in minutes
13
- - **Persistent memory** -- loops accumulate learnings and preferences across runs
51
+ If Ralph is the broader experimentation surface, autoloop is the cleaner runtime path.
52
+
53
+ ## What it emphasizes
54
+
55
+ - **Inspectable long-running loops** -- every iteration is recorded in an append-only journal, with tools to inspect prompts, outputs, topology, metrics, tasks, memory, and artifacts
56
+ - **Easier preset-driven workflows** -- bundled presets give you a fast starting point, and custom preset creation is a first-class path
57
+ - **Operator visibility** -- `loops`, `watch`, `health`, `inspect`, and the local dashboard show what actually happened
58
+ - **Worktree isolation + automerge** -- run risky coding passes in git worktrees and merge them back only when ready
59
+ - **Designed for agents too** -- autoloop is intentionally shaped as a surface that agents can use directly, not just a human operator CLI
14
60
  - **Dynamic chains** -- compose presets into multi-stage pipelines
15
- - **Worktree isolation** -- run loops in git worktrees so your working tree stays clean
61
+ - **Persistent memory + profiles** -- loops accumulate learnings across runs and can load repo/user tuning profiles
62
+
63
+ ## What autoloop is
64
+
65
+ - a simpler, more opinionated spinoff of ralph-orchestrator
66
+ - a loop harness for long-running agent workflows
67
+ - a system built around inspectability, presets, and operator visibility
68
+ - a tool for both human operators and agents
69
+
70
+ ## What it is not
71
+
72
+ - not a replacement for ralph-orchestrator
73
+ - not just a thin CLI wrapper around model calls
74
+ - not a generic workflow engine for everything
75
+ - not optimized for the broadest possible feature surface
16
76
 
17
77
  ## Table of contents
18
78
 
79
+ - [Why autoloop exists](#why-autoloop-exists)
80
+ - [What it emphasizes](#what-it-emphasizes)
81
+ - [What autoloop is](#what-autoloop-is)
82
+ - [What it is not](#what-it-is-not)
19
83
  - [Install](#install)
20
84
  - [Quick start](#quick-start)
21
85
  - [Usage](#usage)
@@ -33,7 +97,6 @@ Autonomous LLM loop harness for long-horizon, multi-role agent work.
33
97
 
34
98
  ```bash
35
99
  npm install -g @mobrienv/autoloop
36
- autoloop --help
37
100
  ```
38
101
 
39
102
  ### From source
@@ -50,31 +113,51 @@ node bin/autoloop --help
50
113
  ```bash
51
114
  # Run a bundled preset
52
115
  autoloop run autocode "Fix the login bug"
116
+
117
+ # Inspect active and recent runs
118
+ autoloop loops
119
+
120
+ # Open the local dashboard
121
+ autoloop dashboard
122
+
123
+ # Keep an implementation pass isolated in a git worktree
124
+ autoloop run autocode --worktree --automerge "Implement the approved fix"
53
125
  ```
54
126
 
55
- `autocode` is a bundled preset. The quoted string is the prompt passed to the loop. The harness iterates through roles (planner -> builder -> critic -> finalizer) until a `task.complete` event is emitted or the iteration limit is reached.
127
+ `autocode` is a bundled preset. The quoted string is the objective passed to the loop.
128
+
129
+ The usual golden path is:
130
+
131
+ 1. start a loop with a preset
132
+ 2. watch it move through iterations
133
+ 3. inspect the journal, events, and artifacts
134
+ 4. open the dashboard when you want a higher-level operator view
135
+ 5. use worktree isolation when the loop is making risky repo changes
56
136
 
57
137
  ## Usage
58
138
 
139
+ The main commands are:
140
+
59
141
  ```
60
142
  autoloop run <preset-name|preset-dir> [prompt...] [flags]
61
- autoloop emit <topic> [summary]
62
- autoloop inspect <artifact> [selector] [project-dir] [--format <md|terminal|text|json|csv>]
63
- autoloop memory <list|add|remove> [args]
64
- autoloop task <add|complete|update|remove|list> [args]
65
143
  autoloop list
66
144
  autoloop loops [--all]
67
145
  autoloop loops show <run-id>
68
146
  autoloop loops artifacts <run-id>
69
147
  autoloop loops watch <run-id>
70
- autoloop loops health [--verbose]
148
+ autoloop inspect <artifact> [selector] [project-dir] [--format <md|terminal|text|json|csv|graph>]
149
+ autoloop dashboard [--port <port>]
150
+ autoloop worktree <list|show|merge|clean> [args]
71
151
  autoloop chain <list|run> [args]
152
+ autoloop emit <topic> [summary]
153
+ autoloop memory <list|status|find|add|remove> [args]
154
+ autoloop task <add|complete|update|remove|list> [args]
72
155
  autoloop runs clean [--max-age <days>]
73
- autoloop worktree <list|show|merge|clean> [args]
74
156
  autoloop config <show|set|unset|path> [args]
75
- autoloop dashboard [--port <port>]
76
157
  ```
77
158
 
159
+ Use `run` to start work, `loops` and `inspect` to understand what happened, and `dashboard` when you want a local operator surface.
160
+
78
161
  ### Flags
79
162
 
80
163
  | Flag | Description |
@@ -90,17 +173,27 @@ autoloop dashboard [--port <port>]
90
173
  ### Examples
91
174
 
92
175
  ```bash
93
- # Run a preset by name
176
+ # Run a preset against a coding task
94
177
  autoloop run autocode "Refactor the auth module"
95
178
 
179
+ # Run a QA pass
180
+ autoloop run autoqa "Exercise the new onboarding flow and report UX issues"
181
+
96
182
  # Run from a custom preset directory
97
183
  autoloop run ./my-preset "Analyze the API"
98
184
 
99
- # Override the backend
100
- autoloop run autoqa -b claude "Review recent changes"
185
+ # Keep implementation isolated in a worktree
186
+ autoloop run autocode --worktree --automerge "Implement the approved fix"
101
187
 
102
- # List available presets
103
- autoloop list
188
+ # Watch a run in progress
189
+ autoloop loops watch <run-id>
190
+
191
+ # Inspect what happened after the run completes
192
+ autoloop inspect journal <run-id>
193
+ autoloop loops artifacts <run-id>
194
+
195
+ # Open the dashboard
196
+ autoloop dashboard
104
197
 
105
198
  # Run an inline chain
106
199
  autoloop run --chain autospec,autocode "Design and build feature X"
@@ -108,26 +201,30 @@ autoloop run --chain autospec,autocode "Design and build feature X"
108
201
 
109
202
  ## Bundled presets
110
203
 
204
+ Bundled presets give you opinionated starting points for common workflows like coding, QA, docs, review, security, specs, and performance.
205
+
111
206
  | Preset | Purpose |
112
207
  |--------|---------|
113
208
  | `autocode` | Plan, build, review, and commit code changes |
114
- | `autodoc` | Audit, write, verify, and publish documentation |
115
- | `autofix` | Diagnose, fix, and verify bugs |
209
+ | `autosimplify` | Scope, simplify, verify, and review code for simplicity |
116
210
  | `autoideas` | Scan, analyze, review, and synthesize improvement ideas |
117
- | `automerge` | Merge a completed worktree branch back into its base branch |
118
- | `autoperf` | Profile, measure, optimize, and judge performance |
119
- | `autopr` | Turn the current branch into a reviewable pull request |
120
- | `autoqa` | Plan, execute, inspect, and report on QA |
121
211
  | `autoresearch` | Research strategies, implement, evaluate, and benchmark |
212
+ | `autoqa` | Plan, execute, inspect, and report on QA |
213
+ | `autotest` | Survey, write, run, and assess tests |
214
+ | `autofix` | Diagnose, fix, and verify bugs |
122
215
  | `autoreview` | Read, suggest, check, and summarize code reviews |
216
+ | `autodoc` | Audit, write, verify, and publish documentation |
123
217
  | `autosec` | Scan, analyze, harden, and report on security |
124
- | `autosimplify` | Scope, simplify, verify, and review code for simplicity |
218
+ | `autoperf` | Profile, measure, optimize, and judge performance |
125
219
  | `autospec` | Research, clarify, design, plan, and critique specifications |
126
- | `autotest` | Survey, write, run, and assess tests |
220
+ | `automerge` | Merge a completed worktree branch back into its base branch |
221
+ | `autopr` | Turn the current branch into a reviewable pull request |
127
222
 
128
223
  ## Creating custom presets
129
224
 
130
- A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](docs/creating-presets.md) for the full guide, or examine any `presets/<name>/` directory as a working example.
225
+ A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets) for the full guide, or examine any `presets/<name>/` directory as a working example.
226
+
227
+ Some older or internal layouts may still include `miniloops.toml`, but `autoloops.toml` is the canonical entry point for new presets.
131
228
 
132
229
  ## Project structure
133
230
 
@@ -182,22 +279,22 @@ export MOCK_FIXTURE_PATH=test/fixtures/backend/complete-success.json
182
279
  node bin/autoloop run . -b "node dist/testing/mock-backend.js"
183
280
  ```
184
281
 
185
- See [CLI reference](docs/cli.md#mock-backend) for fixture schema and bundled scenarios.
282
+ See [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli#mock-backend) for fixture schema and bundled scenarios.
186
283
 
187
284
  ## Further reading
188
285
 
189
- - [Platform architecture](docs/platform.md)
190
- - [Configuration reference](docs/configuration.md)
191
- - [Creating presets](docs/creating-presets.md)
192
- - [Topology and event routing](docs/topology.md)
193
- - [Memory system](docs/memory.md)
194
- - [Dynamic chains](docs/dynamic-chains.md)
195
- - [CLI reference](docs/cli.md)
196
- - [Dashboard](docs/dashboard.md)
197
- - [Profiles](docs/profiles.md)
198
- - [Tasks](docs/tasks.md)
199
- - [Worktree isolation](docs/worktree.md)
200
- - [Releasing](docs/releasing.md)
286
+ - [Platform architecture](https://mikeyobrien.github.io/autoloop/concepts/platform)
287
+ - [Configuration reference](https://mikeyobrien.github.io/autoloop/reference/configuration)
288
+ - [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets)
289
+ - [Topology and event routing](https://mikeyobrien.github.io/autoloop/reference/topology)
290
+ - [Memory system](https://mikeyobrien.github.io/autoloop/reference/memory)
291
+ - [Dynamic chains](https://mikeyobrien.github.io/autoloop/features/dynamic-chains)
292
+ - [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli)
293
+ - [Dashboard](https://mikeyobrien.github.io/autoloop/features/dashboard)
294
+ - [Profiles](https://mikeyobrien.github.io/autoloop/features/profiles)
295
+ - [Tasks](https://mikeyobrien.github.io/autoloop/features/tasks)
296
+ - [Worktree isolation](https://mikeyobrien.github.io/autoloop/features/worktree)
297
+ - [Releasing](https://mikeyobrien.github.io/autoloop/development/releasing)
201
298
 
202
299
  ## Contributing
203
300
 
package/bin/autoloop CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import('../dist/main.js');
2
+ import('@mobrienv/autoloop-cli');
@@ -0,0 +1,6 @@
1
+ export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
2
+ export { type Config, defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, type LayeredConfig, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
3
+ export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
4
+ export type { EmitResult } from "@mobrienv/autoloop-harness/emit";
5
+ export type { LoopEvent, LoopEventEmitter, } from "@mobrienv/autoloop-harness/events";
6
+ export type { LoopContext, RunOptions, RunSummary, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ // Public SDK entry point for @mobrienv/autoloop.
2
+ //
3
+ // This module re-exports the minimal surface SDK consumers need to embed
4
+ // autoloop in their own code. It is deliberately narrow; everything else
5
+ // (CLI render helpers, preset resolution, dashboard, etc.) stays internal.
6
+ //
7
+ // Usage:
8
+ // import { run, type LoopEvent } from "@mobrienv/autoloop";
9
+ //
10
+ // const summary = await run(projectDir, prompt, "autoloop", {
11
+ // signal: controller.signal,
12
+ // onEvent: (e: LoopEvent) => console.log(e.type),
13
+ // });
14
+ export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
15
+ // Pure config helpers, for consumers who want to inspect merged config
16
+ // without re-implementing the schema layer.
17
+ export { defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
18
+ export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,SAAS;AACT,8DAA8D;AAC9D,EAAE;AACF,gEAAgE;AAChE,iCAAiC;AACjC,sDAAsD;AACtD,QAAQ;AAER,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EAEL,QAAQ,IAAI,cAAc,EAC1B,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,OAAO,IAAI,aAAa,EAExB,SAAS,IAAI,eAAe,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -10,8 +10,7 @@
10
10
  */
11
11
  import { execFileSync } from "node:child_process";
12
12
  import { readFileSync } from "node:fs";
13
- import { dirname, resolve } from "node:path";
14
- import { fileURLToPath } from "node:url";
13
+ import { createRequire } from "node:module";
15
14
  function fixturePathFromArgs() {
16
15
  return process.argv[2] ?? "";
17
16
  }
@@ -38,9 +37,8 @@ function loadFixture() {
38
37
  }
39
38
  }
40
39
  function emitEvent(event, payload) {
41
- const currentFile = fileURLToPath(import.meta.url);
42
- const distDir = dirname(dirname(currentFile));
43
- const mainEntry = resolve(distDir, "main.js");
40
+ const require = createRequire(import.meta.url);
41
+ const mainEntry = require.resolve("@mobrienv/autoloop-cli");
44
42
  try {
45
43
  execFileSync(process.execPath, [mainEntry, "emit", event, payload], {
46
44
  encoding: "utf-8",
@@ -1 +1 @@
1
- {"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;IAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8FAA8F,CAC/F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QACnD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;YAC9B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,GAAG,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,OAAe;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE;YAClE,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;YAClC,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;AACvC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,22 +1,37 @@
1
1
  {
2
2
  "name": "@mobrienv/autoloop",
3
- "version": "0.3.0",
4
- "description": "Autonomous LLM loop harness and control plane for long-horizon autonomous work",
3
+ "version": "0.7.0",
4
+ "description": "Simpler, opinionated loop harness for inspectable long-running agent workflows",
5
5
  "type": "module",
6
- "main": "dist/main.js",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
7
15
  "bin": {
8
16
  "autoloop": "bin/autoloop"
9
17
  },
10
18
  "files": [
11
19
  "bin/autoloop",
12
20
  "dist",
13
- "presets",
14
- "plugins",
21
+ "plugins/autoloop",
15
22
  "README.md"
16
23
  ],
17
24
  "engines": {
18
25
  "node": ">=18"
19
26
  },
27
+ "workspaces": [
28
+ "packages/core",
29
+ "packages/presets",
30
+ "packages/backends",
31
+ "packages/harness",
32
+ "packages/dashboard",
33
+ "packages/cli"
34
+ ],
20
35
  "repository": {
21
36
  "type": "git",
22
37
  "url": "git+https://github.com/mikeyobrien/autoloop.git"
@@ -38,7 +53,8 @@
38
53
  "provenance": true
39
54
  },
40
55
  "scripts": {
41
- "build": "tsc",
56
+ "build": "npm run build --workspaces && tsc",
57
+ "build:root": "tsc",
42
58
  "lint": "biome check src/ test/",
43
59
  "lint:fix": "biome check --write src/ test/",
44
60
  "format": "biome format src/ test/",
@@ -47,6 +63,10 @@
47
63
  "test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --coverage",
48
64
  "test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
49
65
  "check": "biome check src/ test/ && tsc --noEmit && npm run test:coverage",
66
+ "release": "node bin/release",
67
+ "docs:dev": "vitepress dev docs",
68
+ "docs:build": "vitepress build docs",
69
+ "docs:preview": "vitepress preview docs",
50
70
  "prepare": "husky",
51
71
  "version": "node -e \"const p=require('./plugins/autoloop/.claude-plugin/plugin.json');p.version=require('./package.json').version;require('fs').writeFileSync('./plugins/autoloop/.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n')\" && git add plugins/autoloop/.claude-plugin/plugin.json"
52
72
  },
@@ -63,12 +83,14 @@
63
83
  "lint-staged": "^16.4.0",
64
84
  "playwright": "^1.59.1",
65
85
  "typescript": "^5.9.3",
86
+ "vitepress": "^1.6.4",
87
+ "vitepress-plugin-llmstxt": "^0.5.1",
66
88
  "vitest": "^3.0.0"
67
89
  },
68
90
  "dependencies": {
69
- "@agentclientprotocol/sdk": "^0.18.0",
70
- "@hono/node-server": "^1.19.12",
71
- "@iarna/toml": "^2.2.5",
72
- "hono": "^4.12.10"
91
+ "@mobrienv/autoloop-cli": "0.7.0",
92
+ "@mobrienv/autoloop-core": "0.7.0",
93
+ "@mobrienv/autoloop-harness": "0.7.0",
94
+ "@mobrienv/autoloop-presets": "0.7.0"
73
95
  }
74
96
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autoloop",
3
- "version": "0.3.0",
3
+ "version": "0.7.0",
4
4
  "description": "Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up.",
5
5
  "homepage": "https://github.com/mikeyobrien/autoloop-ts",
6
6
  "repository": "https://github.com/mikeyobrien/autoloop-ts",
@@ -1,10 +0,0 @@
1
- export interface AgentMap {
2
- globalDefault: string;
3
- presets: Record<string, PresetAgentMap>;
4
- }
5
- export interface PresetAgentMap {
6
- defaultAgent: string;
7
- roles: Record<string, string>;
8
- }
9
- export declare function loadAgentMap(projectDir: string): AgentMap | null;
10
- export declare function resolveRoleAgent(agentMap: AgentMap | null, presetName: string, roleId: string): string | undefined;
package/dist/agent-map.js DELETED
@@ -1,58 +0,0 @@
1
- /**
2
- * Loads and resolves per-role agent mappings from agents.toml.
3
- *
4
- * Resolution order:
5
- * 1. preset.<name>.<role> (role-specific)
6
- * 2. preset.<name>.default (preset default)
7
- * 3. defaults.agent (global fallback)
8
- * 4. undefined (caller falls back to backend.agent)
9
- */
10
- import { existsSync, readFileSync } from "node:fs";
11
- import { join } from "node:path";
12
- import TOML from "@iarna/toml";
13
- export function loadAgentMap(projectDir) {
14
- const path = join(projectDir, "agents.toml");
15
- if (!existsSync(path))
16
- return null;
17
- const text = readFileSync(path, "utf-8");
18
- const parsed = TOML.parse(text);
19
- return buildAgentMap(parsed);
20
- }
21
- export function resolveRoleAgent(agentMap, presetName, roleId) {
22
- if (!agentMap)
23
- return undefined;
24
- const preset = agentMap.presets[presetName];
25
- if (preset) {
26
- const roleAgent = preset.roles[roleId];
27
- if (roleAgent)
28
- return roleAgent;
29
- if (preset.defaultAgent)
30
- return preset.defaultAgent;
31
- }
32
- return agentMap.globalDefault || undefined;
33
- }
34
- function buildAgentMap(parsed) {
35
- const defaults = parsed["defaults"];
36
- const globalDefault = typeof defaults?.["agent"] === "string" ? defaults["agent"] : "";
37
- const presets = {};
38
- const presetSection = parsed["preset"];
39
- if (presetSection) {
40
- for (const [name, value] of Object.entries(presetSection)) {
41
- if (typeof value === "object" && value !== null) {
42
- presets[name] = buildPresetAgentMap(value);
43
- }
44
- }
45
- }
46
- return { globalDefault, presets };
47
- }
48
- function buildPresetAgentMap(section) {
49
- const defaultAgent = typeof section["default"] === "string" ? section["default"] : "";
50
- const roles = {};
51
- for (const [key, value] of Object.entries(section)) {
52
- if (key !== "default" && typeof value === "string") {
53
- roles[key] = value;
54
- }
55
- }
56
- return { defaultAgent, roles };
57
- }
58
- //# sourceMappingURL=agent-map.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-map.js","sourceRoot":"","sources":["../src/agent-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAY/B,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,MAAM,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAwC,CAAC;IAC3E,MAAM,aAAa,GACjB,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAwC,CAAC;IAC9E,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -1,38 +0,0 @@
1
- import { type ChildProcess } from "node:child_process";
2
- import * as acp from "@agentclientprotocol/sdk";
3
- export interface AcpClientOptions {
4
- command: string;
5
- args: string[];
6
- cwd: string;
7
- trustAllTools: boolean;
8
- agentName?: string;
9
- modelId?: string;
10
- verbose?: boolean;
11
- }
12
- export interface AcpSession {
13
- sessionId: string;
14
- connection: acp.ClientSideConnection;
15
- process: ChildProcess;
16
- textBuffer: string;
17
- stderrBuffer: string;
18
- options: AcpClientOptions;
19
- /** Resolves when the child process exits — used to race against hanging prompts */
20
- closed: Promise<{
21
- code: number | null;
22
- signal: string | null;
23
- }>;
24
- }
25
- export interface AcpPromptResult {
26
- output: string;
27
- stopReason: acp.StopReason;
28
- timedOut: boolean;
29
- error?: string;
30
- }
31
- /**
32
- * Format an ACP SessionUpdate for verbose stderr output.
33
- * Returns null for event types that should be silenced.
34
- */
35
- export declare function formatStreamingUpdate(update: acp.SessionUpdate): string | null;
36
- export declare function initAcpSession(opts: AcpClientOptions): Promise<AcpSession>;
37
- export declare function sendAcpPrompt(session: AcpSession, prompt: string, timeoutMs: number): Promise<AcpPromptResult>;
38
- export declare function terminateAcpSession(session: AcpSession): Promise<void>;