@sleepy-ai/cli 0.0.0-main-202607032053 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (799) hide show
  1. package/.sleepycode-test-fixtures-50158/sleepycode-test-eqsxv84ythu/.watcher-b67v64k2mnv +1 -0
  2. package/Dockerfile +18 -0
  3. package/README.md +6 -139
  4. package/drizzle.config.ts +10 -0
  5. package/git +0 -0
  6. package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
  7. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
  8. package/migration/20260211171708_add_project_commands/migration.sql +1 -0
  9. package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
  10. package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
  11. package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
  12. package/migration/20260225215848_workspace/migration.sql +7 -0
  13. package/migration/20260225215848_workspace/snapshot.json +959 -0
  14. package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
  15. package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
  16. package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
  17. package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
  18. package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
  19. package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
  20. package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
  21. package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
  22. package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
  23. package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
  24. package/migration/20260323234822_events/migration.sql +13 -0
  25. package/migration/20260323234822_events/snapshot.json +1271 -0
  26. package/migration/20260410174513_workspace-name/migration.sql +16 -0
  27. package/migration/20260410174513_workspace-name/snapshot.json +1271 -0
  28. package/migration/20260413175956_chief_energizer/migration.sql +13 -0
  29. package/migration/20260413175956_chief_energizer/snapshot.json +1399 -0
  30. package/migration/20260422160000_context_inheritance/migration.sql +3 -0
  31. package/migration/20260422170000_task_registry/migration.sql +18 -0
  32. package/migration/20260423145421_remove_session_entry/migration.sql +4 -0
  33. package/migration/20260515000000_actor_rename/migration.sql +7 -0
  34. package/migration/20260515010000_memory_fts/migration.sql +33 -0
  35. package/migration/20260515020000_user_task/migration.sql +29 -0
  36. package/migration/20260519000000_last_checkpoint_message_id/migration.sql +1 -0
  37. package/migration/20260521000000_message_agent_id/migration.sql +2 -0
  38. package/migration/20260521000100_actor_registry_v6/migration.sql +25 -0
  39. package/migration/20260521010000_memory_fts_v6/migration.sql +33 -0
  40. package/migration/20260521020000_memory_fts_triggers/migration.sql +17 -0
  41. package/migration/20260526000000_agent_id_main/migration.sql +14 -0
  42. package/migration/20260527000000_actor_lifecycle/migration.sql +8 -0
  43. package/migration/20260527000100_inbox/migration.sql +12 -0
  44. package/migration/20260529000000_task_todo_redesign/migration.sql +16 -0
  45. package/migration/20260603000000_task_in_progress_owner/migration.sql +1 -0
  46. package/migration/20260603000000_workflow_run/migration.sql +17 -0
  47. package/migration/20260604000000_workflow_script_sha/migration.sql +1 -0
  48. package/migration/20260608000000_claude_import/migration.sql +7 -0
  49. package/migration/20260608010000_claude_import_message_ids/migration.sql +1 -0
  50. package/migration/20260609000000_history_fts/migration.sql +29 -0
  51. package/migration/20260609230000_workflow_agent_timeout/migration.sql +1 -0
  52. package/migration/20260612000000_external_import/migration.sql +16 -0
  53. package/package.json +193 -32
  54. package/parsers-config.ts +290 -0
  55. package/src/account/account.sql.ts +39 -0
  56. package/src/account/account.ts +456 -0
  57. package/src/account/repo.ts +166 -0
  58. package/src/account/schema.ts +99 -0
  59. package/src/account/url.ts +8 -0
  60. package/src/acp/README.md +174 -0
  61. package/src/acp/agent.ts +1787 -0
  62. package/src/acp/session.ts +116 -0
  63. package/src/acp/types.ts +24 -0
  64. package/src/actor/actor.sql.ts +38 -0
  65. package/src/actor/events.ts +67 -0
  66. package/src/actor/index.ts +2 -0
  67. package/src/actor/registry.ts +412 -0
  68. package/src/actor/return-header.ts +24 -0
  69. package/src/actor/schema.ts +47 -0
  70. package/src/actor/spawn-ref.ts +16 -0
  71. package/src/actor/spawn.ts +756 -0
  72. package/src/actor/turn.ts +49 -0
  73. package/src/actor/waiter.ts +166 -0
  74. package/src/agent/agent.ts +574 -0
  75. package/src/agent/config.ts +5 -0
  76. package/src/agent/generate.txt +75 -0
  77. package/src/agent/prompt/checkpoint-writer.txt +167 -0
  78. package/src/agent/prompt/compaction.txt +9 -0
  79. package/src/agent/prompt/distill.txt +199 -0
  80. package/src/agent/prompt/dream.txt +155 -0
  81. package/src/agent/prompt/explore.txt +18 -0
  82. package/src/agent/prompt/summary.txt +11 -0
  83. package/src/agent/prompt/title.txt +44 -0
  84. package/src/audio.d.ts +9 -0
  85. package/src/auth/index.ts +97 -0
  86. package/src/bus/bus-event.ts +33 -0
  87. package/src/bus/global.ts +12 -0
  88. package/src/bus/index.ts +193 -0
  89. package/src/cli/bootstrap.ts +33 -0
  90. package/src/cli/cmd/account.ts +258 -0
  91. package/src/cli/cmd/acp.ts +70 -0
  92. package/src/cli/cmd/agent.ts +248 -0
  93. package/src/cli/cmd/cmd.ts +7 -0
  94. package/src/cli/cmd/db.ts +120 -0
  95. package/src/cli/cmd/debug/agent.ts +192 -0
  96. package/src/cli/cmd/debug/config.ts +17 -0
  97. package/src/cli/cmd/debug/file.ts +100 -0
  98. package/src/cli/cmd/debug/index.ts +48 -0
  99. package/src/cli/cmd/debug/lsp.ts +61 -0
  100. package/src/cli/cmd/debug/ripgrep.ts +105 -0
  101. package/src/cli/cmd/debug/scrap.ts +16 -0
  102. package/src/cli/cmd/debug/skill.ts +23 -0
  103. package/src/cli/cmd/debug/snapshot.ts +53 -0
  104. package/src/cli/cmd/doctor.ts +116 -0
  105. package/src/cli/cmd/export.ts +306 -0
  106. package/src/cli/cmd/generate.ts +50 -0
  107. package/src/cli/cmd/github.ts +1647 -0
  108. package/src/cli/cmd/import.ts +208 -0
  109. package/src/cli/cmd/init.ts +97 -0
  110. package/src/cli/cmd/login.ts +402 -0
  111. package/src/cli/cmd/mcp.ts +812 -0
  112. package/src/cli/cmd/models.ts +88 -0
  113. package/src/cli/cmd/plug.ts +233 -0
  114. package/src/cli/cmd/pr.ts +138 -0
  115. package/src/cli/cmd/providers.ts +713 -0
  116. package/src/cli/cmd/run-completion.ts +77 -0
  117. package/src/cli/cmd/run.ts +694 -0
  118. package/src/cli/cmd/serve.ts +30 -0
  119. package/src/cli/cmd/session.ts +181 -0
  120. package/src/cli/cmd/stats.ts +413 -0
  121. package/src/cli/cmd/tui/app.tsx +1181 -0
  122. package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +12 -0
  123. package/src/cli/cmd/tui/asset/charge.wav +0 -0
  124. package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
  125. package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
  126. package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
  127. package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
  128. package/src/cli/cmd/tui/asset/ten_vad_loader.js +30 -0
  129. package/src/cli/cmd/tui/attach.ts +84 -0
  130. package/src/cli/cmd/tui/component/background-image.tsx +150 -0
  131. package/src/cli/cmd/tui/component/banner-session-expired.tsx +48 -0
  132. package/src/cli/cmd/tui/component/bg-pulse.tsx +130 -0
  133. package/src/cli/cmd/tui/component/border.tsx +21 -0
  134. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  135. package/src/cli/cmd/tui/component/dialog-agreement.tsx +111 -0
  136. package/src/cli/cmd/tui/component/dialog-command.tsx +219 -0
  137. package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
  138. package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +157 -0
  139. package/src/cli/cmd/tui/component/dialog-image-list.tsx +111 -0
  140. package/src/cli/cmd/tui/component/dialog-logo-design.tsx +37 -0
  141. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  142. package/src/cli/cmd/tui/component/dialog-model.tsx +299 -0
  143. package/src/cli/cmd/tui/component/dialog-provider.tsx +449 -0
  144. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +101 -0
  145. package/src/cli/cmd/tui/component/dialog-session-list.tsx +269 -0
  146. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  147. package/src/cli/cmd/tui/component/dialog-skill.tsx +42 -0
  148. package/src/cli/cmd/tui/component/dialog-sleepy-login.tsx +288 -0
  149. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  150. package/src/cli/cmd/tui/component/dialog-status.tsx +170 -0
  151. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  152. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  153. package/src/cli/cmd/tui/component/dialog-token-plan.tsx +77 -0
  154. package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
  155. package/src/cli/cmd/tui/component/dialog-workflows.tsx +51 -0
  156. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +289 -0
  157. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +81 -0
  158. package/src/cli/cmd/tui/component/dialog-worktree.tsx +90 -0
  159. package/src/cli/cmd/tui/component/error-component.tsx +92 -0
  160. package/src/cli/cmd/tui/component/logo.tsx +961 -0
  161. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  162. package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +34 -0
  163. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +668 -0
  164. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  165. package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
  166. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  167. package/src/cli/cmd/tui/component/prompt/index.tsx +1869 -0
  168. package/src/cli/cmd/tui/component/prompt/offset.ts +45 -0
  169. package/src/cli/cmd/tui/component/prompt/part.ts +36 -0
  170. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  171. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  172. package/src/cli/cmd/tui/component/starry-background.tsx +305 -0
  173. package/src/cli/cmd/tui/component/startup-loading.tsx +67 -0
  174. package/src/cli/cmd/tui/component/task-item.tsx +63 -0
  175. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  176. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  177. package/src/cli/cmd/tui/component/workflow-tree.tsx +177 -0
  178. package/src/cli/cmd/tui/config/cwd.ts +5 -0
  179. package/src/cli/cmd/tui/config/tui-migrate.ts +151 -0
  180. package/src/cli/cmd/tui/config/tui-schema.ts +38 -0
  181. package/src/cli/cmd/tui/config/tui.ts +219 -0
  182. package/src/cli/cmd/tui/context/args.tsx +16 -0
  183. package/src/cli/cmd/tui/context/directory.ts +15 -0
  184. package/src/cli/cmd/tui/context/event.ts +45 -0
  185. package/src/cli/cmd/tui/context/exit.tsx +65 -0
  186. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  187. package/src/cli/cmd/tui/context/keybind.tsx +105 -0
  188. package/src/cli/cmd/tui/context/kv.tsx +86 -0
  189. package/src/cli/cmd/tui/context/language.tsx +91 -0
  190. package/src/cli/cmd/tui/context/local.tsx +469 -0
  191. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  192. package/src/cli/cmd/tui/context/project.tsx +109 -0
  193. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  194. package/src/cli/cmd/tui/context/route.tsx +68 -0
  195. package/src/cli/cmd/tui/context/sdk.tsx +150 -0
  196. package/src/cli/cmd/tui/context/sync.tsx +884 -0
  197. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  198. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  199. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  200. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
  201. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
  202. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  203. package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
  204. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  205. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  206. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  207. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  208. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  209. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  210. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  211. package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
  212. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  213. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  214. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  215. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  216. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  217. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  218. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  219. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  220. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  221. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  222. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  223. package/src/cli/cmd/tui/context/theme/sleepycode.json +245 -0
  224. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  225. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  226. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  227. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  228. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  229. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  230. package/src/cli/cmd/tui/context/theme.tsx +1298 -0
  231. package/src/cli/cmd/tui/context/thinking.ts +48 -0
  232. package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
  233. package/src/cli/cmd/tui/event.ts +62 -0
  234. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +93 -0
  235. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +193 -0
  236. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +54 -0
  237. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +267 -0
  238. package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +45 -0
  239. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  240. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  241. package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +84 -0
  242. package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +54 -0
  243. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  244. package/src/cli/cmd/tui/feature-plugins/sidebar/mascot.tsx +69 -0
  245. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +98 -0
  246. package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +95 -0
  247. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +51 -0
  248. package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +31 -0
  249. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +274 -0
  250. package/src/cli/cmd/tui/i18n/en.ts +465 -0
  251. package/src/cli/cmd/tui/i18n/es.ts +508 -0
  252. package/src/cli/cmd/tui/i18n/fr.ts +515 -0
  253. package/src/cli/cmd/tui/i18n/ja.ts +463 -0
  254. package/src/cli/cmd/tui/i18n/locales.ts +82 -0
  255. package/src/cli/cmd/tui/i18n/ru.ts +527 -0
  256. package/src/cli/cmd/tui/i18n/slash-command.ts +11 -0
  257. package/src/cli/cmd/tui/i18n/zh.ts +454 -0
  258. package/src/cli/cmd/tui/i18n/zht.ts +430 -0
  259. package/src/cli/cmd/tui/layer.ts +6 -0
  260. package/src/cli/cmd/tui/plugin/api.tsx +402 -0
  261. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  262. package/src/cli/cmd/tui/plugin/internal.ts +37 -0
  263. package/src/cli/cmd/tui/plugin/runtime.ts +1057 -0
  264. package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
  265. package/src/cli/cmd/tui/routes/home.tsx +165 -0
  266. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
  267. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +116 -0
  268. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +47 -0
  269. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  270. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  271. package/src/cli/cmd/tui/routes/session/index.tsx +3073 -0
  272. package/src/cli/cmd/tui/routes/session/permission.tsx +697 -0
  273. package/src/cli/cmd/tui/routes/session/question.tsx +488 -0
  274. package/src/cli/cmd/tui/routes/session/sidebar.tsx +97 -0
  275. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +143 -0
  276. package/src/cli/cmd/tui/thread.ts +323 -0
  277. package/src/cli/cmd/tui/ui/dialog-alert.tsx +61 -0
  278. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +95 -0
  279. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +223 -0
  280. package/src/cli/cmd/tui/ui/dialog-help.tsx +42 -0
  281. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +123 -0
  282. package/src/cli/cmd/tui/ui/dialog-select.tsx +467 -0
  283. package/src/cli/cmd/tui/ui/dialog.tsx +207 -0
  284. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  285. package/src/cli/cmd/tui/ui/spinner.ts +378 -0
  286. package/src/cli/cmd/tui/ui/toast.tsx +102 -0
  287. package/src/cli/cmd/tui/util/clipboard.ts +203 -0
  288. package/src/cli/cmd/tui/util/editor.ts +36 -0
  289. package/src/cli/cmd/tui/util/image-protocol.ts +35 -0
  290. package/src/cli/cmd/tui/util/index.ts +6 -0
  291. package/src/cli/cmd/tui/util/model.ts +23 -0
  292. package/src/cli/cmd/tui/util/pinyin.ts +20 -0
  293. package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
  294. package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
  295. package/src/cli/cmd/tui/util/scroll.ts +23 -0
  296. package/src/cli/cmd/tui/util/selection.ts +23 -0
  297. package/src/cli/cmd/tui/util/signal.ts +41 -0
  298. package/src/cli/cmd/tui/util/sound.ts +154 -0
  299. package/src/cli/cmd/tui/util/system-locale.ts +209 -0
  300. package/src/cli/cmd/tui/util/terminal.ts +110 -0
  301. package/src/cli/cmd/tui/util/transcript.ts +112 -0
  302. package/src/cli/cmd/tui/util/vad.ts +229 -0
  303. package/src/cli/cmd/tui/util/voice.ts +450 -0
  304. package/src/cli/cmd/tui/win32.ts +130 -0
  305. package/src/cli/cmd/tui/worker.ts +104 -0
  306. package/src/cli/cmd/uninstall.ts +351 -0
  307. package/src/cli/cmd/upgrade.ts +79 -0
  308. package/src/cli/cmd/web.ts +96 -0
  309. package/src/cli/effect/prompt.ts +25 -0
  310. package/src/cli/error.ts +82 -0
  311. package/src/cli/heap.ts +59 -0
  312. package/src/cli/i18n.ts +15 -0
  313. package/src/cli/logo.ts +53 -0
  314. package/src/cli/network.ts +68 -0
  315. package/src/cli/ui.ts +133 -0
  316. package/src/cli/upgrade.ts +41 -0
  317. package/src/command/index.ts +276 -0
  318. package/src/command/template/initialize.txt +66 -0
  319. package/src/command/template/review.txt +101 -0
  320. package/src/config/agent.ts +197 -0
  321. package/src/config/command.ts +69 -0
  322. package/src/config/compose.ts +26 -0
  323. package/src/config/config.ts +1047 -0
  324. package/src/config/console-state.ts +16 -0
  325. package/src/config/entry-name.ts +16 -0
  326. package/src/config/error.ts +21 -0
  327. package/src/config/formatter.ts +17 -0
  328. package/src/config/history.ts +21 -0
  329. package/src/config/index.ts +17 -0
  330. package/src/config/keybinds.ts +127 -0
  331. package/src/config/layout.ts +10 -0
  332. package/src/config/lsp.ts +45 -0
  333. package/src/config/managed.ts +70 -0
  334. package/src/config/markdown.ts +97 -0
  335. package/src/config/mcp.ts +172 -0
  336. package/src/config/model-id.ts +14 -0
  337. package/src/config/parse.ts +44 -0
  338. package/src/config/paths.ts +85 -0
  339. package/src/config/permission.ts +76 -0
  340. package/src/config/plugin.ts +88 -0
  341. package/src/config/provider.ts +118 -0
  342. package/src/config/server.ts +20 -0
  343. package/src/config/skills.ts +16 -0
  344. package/src/config/variable.ts +90 -0
  345. package/src/control-plane/adaptors/index.ts +52 -0
  346. package/src/control-plane/adaptors/worktree.ts +47 -0
  347. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  348. package/src/control-plane/schema.ts +19 -0
  349. package/src/control-plane/sse.ts +66 -0
  350. package/src/control-plane/types.ts +34 -0
  351. package/src/control-plane/util.ts +37 -0
  352. package/src/control-plane/workspace-context.ts +26 -0
  353. package/src/control-plane/workspace.sql.ts +17 -0
  354. package/src/control-plane/workspace.ts +615 -0
  355. package/src/effect/app-runtime.ts +146 -0
  356. package/src/effect/bootstrap-runtime.ts +33 -0
  357. package/src/effect/bridge.ts +48 -0
  358. package/src/effect/cross-spawn-spawner.ts +514 -0
  359. package/src/effect/index.ts +5 -0
  360. package/src/effect/instance-ref.ts +11 -0
  361. package/src/effect/instance-registry.ts +12 -0
  362. package/src/effect/instance-state.ts +81 -0
  363. package/src/effect/logger.ts +73 -0
  364. package/src/effect/memo-map.ts +3 -0
  365. package/src/effect/observability.ts +107 -0
  366. package/src/effect/run-service.ts +52 -0
  367. package/src/effect/runner.ts +210 -0
  368. package/src/effect/runtime.ts +19 -0
  369. package/src/env/index.ts +37 -0
  370. package/src/file/ignore.ts +81 -0
  371. package/src/file/index.ts +664 -0
  372. package/src/file/protected.ts +59 -0
  373. package/src/file/ripgrep.ts +485 -0
  374. package/src/file/watcher.ts +163 -0
  375. package/src/flag/flag.ts +185 -0
  376. package/src/format/formatter.ts +403 -0
  377. package/src/format/index.ts +203 -0
  378. package/src/git/index.ts +260 -0
  379. package/src/global/index.ts +54 -0
  380. package/src/history/backfill.ts +162 -0
  381. package/src/history/extract.ts +67 -0
  382. package/src/history/fts-query.ts +15 -0
  383. package/src/history/fts.sql.ts +20 -0
  384. package/src/history/index.ts +10 -0
  385. package/src/history/resolve.ts +65 -0
  386. package/src/history/service.ts +258 -0
  387. package/src/history/writer.ts +112 -0
  388. package/src/id/id.ts +87 -0
  389. package/src/ide/index.ts +73 -0
  390. package/src/inbox/inbox-ref.ts +38 -0
  391. package/src/inbox/inbox.sql.ts +26 -0
  392. package/src/inbox/inbox.ts +223 -0
  393. package/src/inbox/index.ts +3 -0
  394. package/src/inbox/render.ts +40 -0
  395. package/src/index.ts +268 -0
  396. package/src/installation/index.ts +362 -0
  397. package/src/installation/version.ts +8 -0
  398. package/src/lsp/client.ts +249 -0
  399. package/src/lsp/diagnostic.ts +29 -0
  400. package/src/lsp/index.ts +3 -0
  401. package/src/lsp/language.ts +120 -0
  402. package/src/lsp/launch.ts +21 -0
  403. package/src/lsp/lsp.ts +519 -0
  404. package/src/lsp/server.ts +1956 -0
  405. package/src/mcp/auth.ts +144 -0
  406. package/src/mcp/index.ts +939 -0
  407. package/src/mcp/oauth-callback.ts +236 -0
  408. package/src/mcp/oauth-provider.ts +214 -0
  409. package/src/memory/fts-query.ts +37 -0
  410. package/src/memory/fts.sql.ts +19 -0
  411. package/src/memory/index.ts +1 -0
  412. package/src/memory/paths.ts +116 -0
  413. package/src/memory/reconcile.ts +144 -0
  414. package/src/memory/service.ts +144 -0
  415. package/src/metrics/client.ts +40 -0
  416. package/src/metrics/event.ts +43 -0
  417. package/src/metrics/index.ts +5 -0
  418. package/src/metrics/installation.ts +18 -0
  419. package/src/metrics/subscriber.ts +58 -0
  420. package/src/metrics/util.ts +9 -0
  421. package/src/node.ts +6 -0
  422. package/src/npm/config.ts +0 -0
  423. package/src/npm/index.ts +293 -0
  424. package/src/npmcli-config.d.ts +43 -0
  425. package/src/patch/index.ts +680 -0
  426. package/src/permission/arity.ts +163 -0
  427. package/src/permission/evaluate.ts +15 -0
  428. package/src/permission/index.ts +382 -0
  429. package/src/permission/schema.ts +17 -0
  430. package/src/plugin/checkpoint-splitover.ts +60 -0
  431. package/src/plugin/cloudflare.ts +76 -0
  432. package/src/plugin/codex.ts +611 -0
  433. package/src/plugin/github-copilot/copilot.ts +368 -0
  434. package/src/plugin/github-copilot/models.ts +153 -0
  435. package/src/plugin/index.ts +637 -0
  436. package/src/plugin/install.ts +439 -0
  437. package/src/plugin/loader.ts +216 -0
  438. package/src/plugin/matcher.ts +33 -0
  439. package/src/plugin/meta.ts +188 -0
  440. package/src/plugin/shared.ts +323 -0
  441. package/src/plugin/sleepy.ts +244 -0
  442. package/src/plugin/subagent-progress-checker.ts +147 -0
  443. package/src/project/bootstrap.ts +59 -0
  444. package/src/project/index.ts +2 -0
  445. package/src/project/instance.ts +215 -0
  446. package/src/project/project-id.ts +48 -0
  447. package/src/project/project.sql.ts +16 -0
  448. package/src/project/project.ts +522 -0
  449. package/src/project/schema.ts +15 -0
  450. package/src/project/vcs.ts +227 -0
  451. package/src/project/workspace-trust.ts +67 -0
  452. package/src/provider/auth.ts +234 -0
  453. package/src/provider/error.ts +216 -0
  454. package/src/provider/index.ts +5 -0
  455. package/src/provider/models-snapshot.d.ts +2 -0
  456. package/src/provider/models-snapshot.js +3 -0
  457. package/src/provider/models.ts +180 -0
  458. package/src/provider/provider.ts +2098 -0
  459. package/src/provider/schema.ts +36 -0
  460. package/src/provider/sdk/copilot/README.md +5 -0
  461. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
  462. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
  463. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
  464. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
  465. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
  466. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
  467. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
  468. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
  469. package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
  470. package/src/provider/sdk/copilot/index.ts +2 -0
  471. package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
  472. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
  473. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
  474. package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
  475. package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
  476. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
  477. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1770 -0
  478. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
  479. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
  480. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
  481. package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
  482. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
  483. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
  484. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
  485. package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
  486. package/src/provider/session-check.ts +163 -0
  487. package/src/provider/transform.ts +1376 -0
  488. package/src/pty/index.ts +364 -0
  489. package/src/pty/pty.bun.ts +26 -0
  490. package/src/pty/pty.node.ts +27 -0
  491. package/src/pty/pty.ts +25 -0
  492. package/src/pty/schema.ts +17 -0
  493. package/src/question/index.ts +252 -0
  494. package/src/question/schema.ts +17 -0
  495. package/src/server/adapter.bun.ts +40 -0
  496. package/src/server/adapter.node.ts +66 -0
  497. package/src/server/adapter.ts +21 -0
  498. package/src/server/auth.ts +16 -0
  499. package/src/server/error.ts +53 -0
  500. package/src/server/event.ts +7 -0
  501. package/src/server/fence.ts +81 -0
  502. package/src/server/mdns.ts +60 -0
  503. package/src/server/middleware.ts +94 -0
  504. package/src/server/projectors.ts +28 -0
  505. package/src/server/proxy.ts +171 -0
  506. package/src/server/pty-ticket.ts +42 -0
  507. package/src/server/rate-limit.ts +38 -0
  508. package/src/server/routes/control/index.ts +160 -0
  509. package/src/server/routes/control/workspace.ts +203 -0
  510. package/src/server/routes/global.ts +367 -0
  511. package/src/server/routes/instance/bash-interactive.ts +82 -0
  512. package/src/server/routes/instance/config.ts +89 -0
  513. package/src/server/routes/instance/event.ts +108 -0
  514. package/src/server/routes/instance/experimental.ts +408 -0
  515. package/src/server/routes/instance/file.ts +190 -0
  516. package/src/server/routes/instance/httpapi/config.ts +51 -0
  517. package/src/server/routes/instance/httpapi/permission.ts +72 -0
  518. package/src/server/routes/instance/httpapi/project.ts +62 -0
  519. package/src/server/routes/instance/httpapi/provider.ts +142 -0
  520. package/src/server/routes/instance/httpapi/question.ts +121 -0
  521. package/src/server/routes/instance/httpapi/server.ts +153 -0
  522. package/src/server/routes/instance/index.ts +301 -0
  523. package/src/server/routes/instance/mcp.ts +260 -0
  524. package/src/server/routes/instance/middleware.ts +44 -0
  525. package/src/server/routes/instance/permission.ts +73 -0
  526. package/src/server/routes/instance/project.ts +122 -0
  527. package/src/server/routes/instance/provider.ts +158 -0
  528. package/src/server/routes/instance/pty.ts +302 -0
  529. package/src/server/routes/instance/question.ts +162 -0
  530. package/src/server/routes/instance/session.ts +1328 -0
  531. package/src/server/routes/instance/sync.ts +143 -0
  532. package/src/server/routes/instance/trace.ts +59 -0
  533. package/src/server/routes/instance/tui.ts +384 -0
  534. package/src/server/routes/instance/workflows.ts +142 -0
  535. package/src/server/routes/ui.ts +37 -0
  536. package/src/server/server.ts +146 -0
  537. package/src/server/workspace.ts +122 -0
  538. package/src/session/auto-dream.ts +123 -0
  539. package/src/session/boundary.ts +77 -0
  540. package/src/session/budgeted-read.ts +118 -0
  541. package/src/session/checkpoint-align.ts +29 -0
  542. package/src/session/checkpoint-context.ts +36 -0
  543. package/src/session/checkpoint-paths.ts +86 -0
  544. package/src/session/checkpoint-progress-reconcile.ts +111 -0
  545. package/src/session/checkpoint-retry.ts +192 -0
  546. package/src/session/checkpoint-templates.ts +114 -0
  547. package/src/session/checkpoint-validator.ts +259 -0
  548. package/src/session/checkpoint.ts +1560 -0
  549. package/src/session/classify.ts +117 -0
  550. package/src/session/claude-import.ts +381 -0
  551. package/src/session/codex-import.ts +416 -0
  552. package/src/session/compaction.ts +545 -0
  553. package/src/session/external-import.sql.ts +18 -0
  554. package/src/session/external-import.ts +136 -0
  555. package/src/session/goal.ts +232 -0
  556. package/src/session/index.ts +1 -0
  557. package/src/session/instruction.ts +276 -0
  558. package/src/session/last-message-info.ts +32 -0
  559. package/src/session/llm-request-prefix.ts +82 -0
  560. package/src/session/llm.ts +737 -0
  561. package/src/session/max-mode.ts +410 -0
  562. package/src/session/message-v2.ts +1138 -0
  563. package/src/session/message.ts +191 -0
  564. package/src/session/opencode-import.ts +281 -0
  565. package/src/session/overflow.ts +53 -0
  566. package/src/session/prefix-capture-ref.ts +48 -0
  567. package/src/session/processor.ts +983 -0
  568. package/src/session/projectors.ts +137 -0
  569. package/src/session/prompt/anthropic.txt +154 -0
  570. package/src/session/prompt/beast.txt +155 -0
  571. package/src/session/prompt/build-switch.txt +5 -0
  572. package/src/session/prompt/codex.txt +79 -0
  573. package/src/session/prompt/compose.txt +119 -0
  574. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  575. package/src/session/prompt/deepseek.txt +131 -0
  576. package/src/session/prompt/default.old.txt +151 -0
  577. package/src/session/prompt/default.txt +172 -0
  578. package/src/session/prompt/gemini.txt +155 -0
  579. package/src/session/prompt/glm.txt +51 -0
  580. package/src/session/prompt/gpt.txt +107 -0
  581. package/src/session/prompt/kimi.txt +95 -0
  582. package/src/session/prompt/max-steps.txt +16 -0
  583. package/src/session/prompt/minimax.txt +140 -0
  584. package/src/session/prompt/text-loop-recovery.ts +40 -0
  585. package/src/session/prompt/text-ngram-detection.ts +87 -0
  586. package/src/session/prompt/trinity.txt +97 -0
  587. package/src/session/prompt.ts +3878 -0
  588. package/src/session/prune.ts +481 -0
  589. package/src/session/retry.ts +178 -0
  590. package/src/session/revert.ts +161 -0
  591. package/src/session/run-state.ts +135 -0
  592. package/src/session/schema.ts +36 -0
  593. package/src/session/session.sql.ts +110 -0
  594. package/src/session/session.ts +908 -0
  595. package/src/session/status.ts +89 -0
  596. package/src/session/summary.ts +163 -0
  597. package/src/session/system.ts +96 -0
  598. package/src/session/todo.ts +77 -0
  599. package/src/session/trajectory.ts +98 -0
  600. package/src/share/index.ts +2 -0
  601. package/src/share/session.ts +57 -0
  602. package/src/share/share-next.ts +381 -0
  603. package/src/share/share.sql.ts +13 -0
  604. package/src/shell/shell.ts +124 -0
  605. package/src/skill/builtin/.bundle/self-extend/SKILL.md +131 -0
  606. package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +242 -0
  607. package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +114 -0
  608. package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +115 -0
  609. package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +258 -0
  610. package/src/skill/builtin/bundle.macro.ts +30 -0
  611. package/src/skill/builtin/extract.ts +41 -0
  612. package/src/skill/compose/.bundle/ask/SKILL.md +58 -0
  613. package/src/skill/compose/.bundle/brainstorm/SKILL.md +200 -0
  614. package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +214 -0
  615. package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +88 -0
  616. package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +354 -0
  617. package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +148 -0
  618. package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +56 -0
  619. package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +50 -0
  620. package/src/skill/compose/.bundle/brainstorm/visual-companion.md +258 -0
  621. package/src/skill/compose/.bundle/debug/CREATION-LOG.md +119 -0
  622. package/src/skill/compose/.bundle/debug/SKILL.md +297 -0
  623. package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +158 -0
  624. package/src/skill/compose/.bundle/debug/condition-based-waiting.md +106 -0
  625. package/src/skill/compose/.bundle/debug/defense-in-depth.md +122 -0
  626. package/src/skill/compose/.bundle/debug/find-polluter.sh +63 -0
  627. package/src/skill/compose/.bundle/debug/root-cause-tracing.md +144 -0
  628. package/src/skill/compose/.bundle/debug/test-academic.md +14 -0
  629. package/src/skill/compose/.bundle/debug/test-pressure-1.md +58 -0
  630. package/src/skill/compose/.bundle/debug/test-pressure-2.md +68 -0
  631. package/src/skill/compose/.bundle/debug/test-pressure-3.md +69 -0
  632. package/src/skill/compose/.bundle/execute/SKILL.md +71 -0
  633. package/src/skill/compose/.bundle/feedback/SKILL.md +214 -0
  634. package/src/skill/compose/.bundle/merge/SKILL.md +252 -0
  635. package/src/skill/compose/.bundle/new-skill/SKILL.md +211 -0
  636. package/src/skill/compose/.bundle/parallel/SKILL.md +168 -0
  637. package/src/skill/compose/.bundle/plan/SKILL.md +183 -0
  638. package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +50 -0
  639. package/src/skill/compose/.bundle/report/SKILL.md +180 -0
  640. package/src/skill/compose/.bundle/review/SKILL.md +104 -0
  641. package/src/skill/compose/.bundle/review/code-reviewer.md +178 -0
  642. package/src/skill/compose/.bundle/subagent/SKILL.md +325 -0
  643. package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +26 -0
  644. package/src/skill/compose/.bundle/subagent/implementer-prompt.md +128 -0
  645. package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +118 -0
  646. package/src/skill/compose/.bundle/tdd/SKILL.md +360 -0
  647. package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +299 -0
  648. package/src/skill/compose/.bundle/verify/SKILL.md +140 -0
  649. package/src/skill/compose/.bundle/worktree/SKILL.md +234 -0
  650. package/src/skill/compose/LICENSE-karpathy +28 -0
  651. package/{LICENSE → src/skill/compose/LICENSE-superpowers} +6 -3
  652. package/src/skill/compose/bundle.macro.ts +30 -0
  653. package/src/skill/compose/extract.ts +85 -0
  654. package/src/skill/discovery.ts +114 -0
  655. package/src/skill/index.ts +328 -0
  656. package/src/snapshot/index.ts +777 -0
  657. package/src/sql.d.ts +4 -0
  658. package/src/storage/db.bun.ts +8 -0
  659. package/src/storage/db.node.ts +8 -0
  660. package/src/storage/db.ts +172 -0
  661. package/src/storage/index.ts +26 -0
  662. package/src/storage/json-migration.ts +426 -0
  663. package/src/storage/read-sqlite.bun.ts +11 -0
  664. package/src/storage/read-sqlite.node.ts +13 -0
  665. package/src/storage/read-sqlite.ts +10 -0
  666. package/src/storage/schema.sql.ts +10 -0
  667. package/src/storage/schema.ts +7 -0
  668. package/src/storage/storage.ts +331 -0
  669. package/src/sync/README.md +179 -0
  670. package/src/sync/event.sql.ts +16 -0
  671. package/src/sync/index.ts +278 -0
  672. package/src/sync/schema.ts +14 -0
  673. package/src/task/events.ts +28 -0
  674. package/src/task/gate-state.ts +54 -0
  675. package/src/task/gate.ts +116 -0
  676. package/src/task/index.ts +1 -0
  677. package/src/task/registry.ts +394 -0
  678. package/src/task/schema.ts +43 -0
  679. package/src/task/task.sql.ts +50 -0
  680. package/src/team/events.ts +22 -0
  681. package/src/team/index.ts +113 -0
  682. package/src/team/schema.ts +31 -0
  683. package/src/temporary.ts +33 -0
  684. package/src/tool/actor.shell.txt +72 -0
  685. package/src/tool/actor.ts +804 -0
  686. package/src/tool/actor.txt +103 -0
  687. package/src/tool/apply_patch.ts +308 -0
  688. package/src/tool/apply_patch.txt +33 -0
  689. package/src/tool/bash-interactive.ts +183 -0
  690. package/src/tool/bash.ts +704 -0
  691. package/src/tool/bash.txt +123 -0
  692. package/src/tool/change-directory.ts +91 -0
  693. package/src/tool/codesearch.ts +63 -0
  694. package/src/tool/codesearch.txt +12 -0
  695. package/src/tool/edit.ts +693 -0
  696. package/src/tool/edit.txt +10 -0
  697. package/src/tool/external-directory.ts +132 -0
  698. package/src/tool/glob.ts +100 -0
  699. package/src/tool/glob.txt +6 -0
  700. package/src/tool/grep.ts +145 -0
  701. package/src/tool/grep.txt +8 -0
  702. package/src/tool/history.ts +146 -0
  703. package/src/tool/history.txt +17 -0
  704. package/src/tool/index.ts +4 -0
  705. package/src/tool/invalid.ts +20 -0
  706. package/src/tool/invocation-style.ts +17 -0
  707. package/src/tool/lsp.ts +91 -0
  708. package/src/tool/lsp.txt +19 -0
  709. package/src/tool/mcp-exa.ts +78 -0
  710. package/src/tool/memory-path-guard.ts +162 -0
  711. package/src/tool/memory.ts +81 -0
  712. package/src/tool/memory.txt +69 -0
  713. package/src/tool/multiedit.ts +54 -0
  714. package/src/tool/multiedit.txt +41 -0
  715. package/src/tool/notebook-edit.ts +225 -0
  716. package/src/tool/notebook-edit.txt +10 -0
  717. package/src/tool/plan-enter.txt +16 -0
  718. package/src/tool/plan-exit.txt +14 -0
  719. package/src/tool/plan.ts +179 -0
  720. package/src/tool/question.ts +67 -0
  721. package/src/tool/question.txt +10 -0
  722. package/src/tool/read-state.ts +44 -0
  723. package/src/tool/read.ts +327 -0
  724. package/src/tool/read.txt +14 -0
  725. package/src/tool/recoverable.ts +35 -0
  726. package/src/tool/registry.ts +429 -0
  727. package/src/tool/schema.ts +17 -0
  728. package/src/tool/session-cwd.ts +35 -0
  729. package/src/tool/shell-tokenize.ts +374 -0
  730. package/src/tool/shell-wrap.ts +235 -0
  731. package/src/tool/skill.ts +76 -0
  732. package/src/tool/skill.txt +5 -0
  733. package/src/tool/task.shell.txt +57 -0
  734. package/src/tool/task.ts +456 -0
  735. package/src/tool/task.txt +56 -0
  736. package/src/tool/tool.ts +166 -0
  737. package/src/tool/truncate.ts +201 -0
  738. package/src/tool/truncation-dir.ts +4 -0
  739. package/src/tool/webfetch.ts +208 -0
  740. package/src/tool/webfetch.txt +13 -0
  741. package/src/tool/websearch/index.ts +104 -0
  742. package/src/tool/websearch/sleepy.ts +118 -0
  743. package/src/tool/websearch/websearch.txt +14 -0
  744. package/src/tool/workflow.ts +357 -0
  745. package/src/tool/workflow.txt +25 -0
  746. package/src/tool/write.ts +88 -0
  747. package/src/tool/write.txt +10 -0
  748. package/src/util/abort.ts +35 -0
  749. package/src/util/archive.ts +15 -0
  750. package/src/util/color.ts +17 -0
  751. package/src/util/data-url.ts +9 -0
  752. package/src/util/defer.ts +10 -0
  753. package/src/util/effect-http-client.ts +11 -0
  754. package/src/util/effect-zod.ts +367 -0
  755. package/src/util/env-info.ts +62 -0
  756. package/src/util/error.ts +78 -0
  757. package/src/util/filesystem.ts +243 -0
  758. package/src/util/fn.ts +21 -0
  759. package/src/util/format.ts +20 -0
  760. package/src/util/iife.ts +3 -0
  761. package/src/util/index.ts +14 -0
  762. package/src/util/keybind.ts +101 -0
  763. package/src/util/lazy.ts +18 -0
  764. package/src/util/local-context.ts +23 -0
  765. package/src/util/locale.ts +79 -0
  766. package/src/util/lock.ts +96 -0
  767. package/src/util/log.ts +234 -0
  768. package/src/util/media.ts +26 -0
  769. package/src/util/network.ts +9 -0
  770. package/src/util/process.ts +174 -0
  771. package/src/util/provider-priority.ts +48 -0
  772. package/src/util/queue.ts +60 -0
  773. package/src/util/record.ts +3 -0
  774. package/src/util/rpc.ts +64 -0
  775. package/src/util/schema.ts +53 -0
  776. package/src/util/scrap.ts +10 -0
  777. package/src/util/signal.ts +12 -0
  778. package/src/util/sleepy-process.ts +24 -0
  779. package/src/util/ssrf.ts +116 -0
  780. package/src/util/timeout.ts +14 -0
  781. package/src/util/token.ts +5 -0
  782. package/src/util/tool-compat.ts +144 -0
  783. package/src/util/update-schema.ts +13 -0
  784. package/src/util/which.ts +14 -0
  785. package/src/util/wildcard.ts +57 -0
  786. package/src/workflow/builtin/compose.js +749 -0
  787. package/src/workflow/builtin/deep-research.js +398 -0
  788. package/src/workflow/builtin.ts +59 -0
  789. package/src/workflow/events.ts +72 -0
  790. package/src/workflow/meta.ts +335 -0
  791. package/src/workflow/persistence.ts +312 -0
  792. package/src/workflow/resolve.ts +45 -0
  793. package/src/workflow/runtime-ref.ts +18 -0
  794. package/src/workflow/runtime.ts +1447 -0
  795. package/src/workflow/sandbox.ts +286 -0
  796. package/src/workflow/workflow.sql.ts +31 -0
  797. package/src/workflow/workspace.ts +69 -0
  798. package/src/worktree/index.ts +629 -0
  799. package/postinstall.mjs +0 -102
@@ -0,0 +1,749 @@
1
+ export const meta = {
2
+ name: "compose",
3
+ description:
4
+ "Autonomous compose pipeline — brainstorms context, designs (spec/plan), implements via parallel per-task worktrees with TDD, verifies, reviews, reports, and merges. Bounded retry, never-ask mode.",
5
+ whenToUse:
6
+ "Use to drive a feature, bugfix, refactor, or review-feedback task through the full compose flow without user prompting. Pass args.task = the user's request. Optionally args.type to set the task type (feature/bugfix/refactor/feedback; otherwise inferred), args.feature_name for the report filename, args.skip_brainstorm / args.skip_report to drop those phases, args.maxConcurrent to bound per-batch parallelism. Independent tasks auto-run in parallel, each in its own worktree, then merge back; pass args.isolate_worktrees=false to force all-sequential or =true to force isolation.",
7
+ phases: [
8
+ { title: "Brainstorm", detail: "Context recon (never-ask): conventions, recent changes, relevant files" },
9
+ { title: "Design", detail: "Apply compose:plan, compose:debug, or compose:feedback; emit task list with deps" },
10
+ { title: "Implement", detail: "Topo-sorted batches; independent tasks parallelize in per-task worktrees, then integrate" },
11
+ { title: "Verify", detail: "Run project verify commands; structured pass/fail" },
12
+ { title: "Review", detail: "compose:review for critical/important/minor issues" },
13
+ { title: "Report", detail: "compose:report per-iteration + final consolidated report" },
14
+ { title: "Merge", detail: "compose:merge to commit (and optionally push/PR)" },
15
+ ],
16
+ }
17
+
18
+ const MAX_TDD_ATTEMPTS = 3
19
+ const MAX_REVIEW_FIX_ATTEMPTS = 2
20
+ const DEFAULT_MAX_CONCURRENT = 8
21
+
22
+ const BRAINSTORM_SHAPE = {
23
+ type: "object",
24
+ required: ["context"],
25
+ properties: {
26
+ context: {
27
+ type: "object",
28
+ required: ["projectType", "conventions", "recentChanges", "relevantFiles"],
29
+ properties: {
30
+ projectType: { type: "string" },
31
+ conventions: { type: "array", items: { type: "string" } },
32
+ recentChanges: { type: "array", items: { type: "string" } },
33
+ relevantFiles: { type: "array", items: { type: "string" } },
34
+ },
35
+ },
36
+ assumptions: { type: "array", items: { type: "string" } },
37
+ selfQA: { type: "array", items: { type: "object", properties: { question: { type: "string" }, answer: { type: "string" } } } },
38
+ approaches: { type: "array", items: { type: "object", properties: { name: { type: "string" }, tradeoffs: { type: "string" } } } },
39
+ chosenApproach: { type: "string" },
40
+ chosenRationale: { type: "string" },
41
+ openQuestions: { type: "array", items: { type: "string" } },
42
+ amends: { type: "string" },
43
+ existingDocs: { type: "array", items: { type: "string" } },
44
+ notes: { type: "string" },
45
+ },
46
+ }
47
+
48
+ const DESIGN_SHAPE = {
49
+ type: "object",
50
+ required: ["tasks"],
51
+ properties: {
52
+ tasks: {
53
+ type: "array",
54
+ minItems: 1,
55
+ items: {
56
+ type: "object",
57
+ required: ["id", "description", "acceptance"],
58
+ properties: {
59
+ id: { type: "string" },
60
+ description: { type: "string" },
61
+ acceptance: { type: "string" },
62
+ files: { type: "array", items: { type: "string" } },
63
+ dependsOn: { type: "array", items: { type: "string" } },
64
+ },
65
+ },
66
+ },
67
+ notes: { type: "string" },
68
+ },
69
+ }
70
+
71
+ const INTEGRATE_SHAPE = {
72
+ type: "object",
73
+ required: ["merged", "conflicts", "skipped_pristine"],
74
+ properties: {
75
+ merged: {
76
+ type: "array",
77
+ items: { type: "object", properties: { taskId: { type: "string" }, branch: { type: "string" }, sha: { type: "string" } } },
78
+ },
79
+ conflicts: {
80
+ type: "array",
81
+ items: { type: "object", properties: { taskId: { type: "string" }, branch: { type: "string" }, error: { type: "string" } } },
82
+ },
83
+ skipped_pristine: { type: "array", items: { type: "string" } },
84
+ },
85
+ }
86
+
87
+ const VERIFY_SHAPE = {
88
+ type: "object",
89
+ required: ["typecheck", "tests", "build", "allPassed"],
90
+ properties: {
91
+ typecheck: { enum: ["ok", "fail", "skipped"] },
92
+ tests: {
93
+ type: "object",
94
+ required: ["passed", "failed"],
95
+ properties: {
96
+ passed: { type: "number" },
97
+ failed: { type: "number" },
98
+ output: { type: "string" },
99
+ },
100
+ },
101
+ build: { enum: ["ok", "fail", "skipped"] },
102
+ allPassed: { type: "boolean" },
103
+ failures: { type: "string" },
104
+ },
105
+ }
106
+
107
+ const REVIEW_SHAPE = {
108
+ type: "object",
109
+ required: ["critical", "important", "minor", "readyToMerge"],
110
+ properties: {
111
+ critical: { type: "array", items: { type: "string" } },
112
+ important: { type: "array", items: { type: "string" } },
113
+ minor: { type: "array", items: { type: "string" } },
114
+ readyToMerge: { type: "boolean" },
115
+ },
116
+ }
117
+
118
+ const MERGE_SHAPE = {
119
+ type: "object",
120
+ required: ["committed", "action"],
121
+ properties: {
122
+ committed: { type: "boolean" },
123
+ sha: { type: "string" },
124
+ prUrl: { type: "string" },
125
+ action: { enum: ["commit", "commit+push", "commit+pr", "none"] },
126
+ },
127
+ }
128
+
129
+ // Accept args as either an object {task,type?,...} OR a JSON string OR a bare task
130
+ // string, because the AI-SDK tool boundary often serializes nested args as strings.
131
+ let _argsObj
132
+ if (typeof args === "object" && args !== null) {
133
+ _argsObj = args
134
+ } else if (typeof args === "string") {
135
+ try { _argsObj = JSON.parse(args) } catch (_) { _argsObj = { task: args } }
136
+ if (typeof _argsObj !== "object" || _argsObj === null) _argsObj = { task: args }
137
+ } else {
138
+ _argsObj = {}
139
+ }
140
+ const TASK = typeof _argsObj.task === "string" ? _argsObj.task : ""
141
+ if (!TASK) {
142
+ return { error: "no-task", message: "Pass args.task = '<request>'." }
143
+ }
144
+
145
+ const VALID_TYPES = ["feature", "bugfix", "refactor", "feedback"]
146
+ const argType = typeof _argsObj.type === "string" ? _argsObj.type : ""
147
+ const SKIP_BRAINSTORM = _argsObj.skip_brainstorm === true
148
+ const SKIP_REPORT = _argsObj.skip_report === true
149
+ // Per-batch worktree isolation. Independent tasks that would run concurrently MUST
150
+ // be isolated (parallel writes to one workspace conflict) — the runtime creates a
151
+ // worktree per task, the agent works in it, and an integrate agent merges it back.
152
+ // Decision is per batch: auto-isolate a batch iff it runs >1 task; a single-task
153
+ // batch stays sequential in the main workspace. args.isolate_worktrees forces it:
154
+ // true = always isolate, false = never. (Runtime worktree path verified by
155
+ // test/workflow/runtime-worktree.test.ts; not opt-in-off anymore.)
156
+ const ISOLATE_OVERRIDE =
157
+ _argsObj.isolate_worktrees === true ? true : _argsObj.isolate_worktrees === false ? false : undefined
158
+ const isolateBatch = (batchIds) =>
159
+ ISOLATE_OVERRIDE === true ? true : ISOLATE_OVERRIDE === false ? false : batchIds.length > 1
160
+ const MAX_CONCURRENT =
161
+ typeof _argsObj.maxConcurrent === "number" && _argsObj.maxConcurrent > 0 ? _argsObj.maxConcurrent : DEFAULT_MAX_CONCURRENT
162
+
163
+ // Docs dir injected by the host (workflow.ts) from ConfigCompose.resolveDocsDir,
164
+ // mirroring the <compose_docs_dir> block prompt.ts gives the interactive compose
165
+ // agent. Default keeps the workflow self-sufficient if the host didn't inject.
166
+ const DOCS_DIR = typeof _argsObj._composeDocsDir === "string" && _argsObj._composeDocsDir ? _argsObj._composeDocsDir : "docs/compose"
167
+ const SPECS_DIR = DOCS_DIR + "/specs"
168
+ const PLANS_DIR = DOCS_DIR + "/plans"
169
+ const REPORTS_DIR = DOCS_DIR + "/reports"
170
+ const docsBlock =
171
+ "<compose_docs_dir>\n" +
172
+ "Save compose skill outputs: specs in `" + SPECS_DIR + "`, plans in `" + PLANS_DIR + "`, reports in `" + REPORTS_DIR + "`.\n" +
173
+ "</compose_docs_dir>"
174
+
175
+ // Slug for the per-run report filename. feature_name overrides; else slugify task.
176
+ // Strip trailing dashes AFTER the length cap too, so a 60-char cut that lands on a
177
+ // separator doesn't leave an ugly trailing "-" in the filename.
178
+ const FEATURE_NAME =
179
+ ((typeof _argsObj.feature_name === "string" && _argsObj.feature_name ? _argsObj.feature_name : TASK)
180
+ .toLowerCase()
181
+ .replace(/[^a-z0-9]+/g, "-")
182
+ .replace(/^-+|-+$/g, "")
183
+ .slice(0, 60)
184
+ .replace(/-+$/, "")) || "compose-run"
185
+ const REPORT_PATH = REPORTS_DIR + "/" + FEATURE_NAME + ".md"
186
+
187
+ // ---------------------------------------------------------------------------
188
+ // Phase 0 — Brainstorm (autonomous-mode contract: context recon only, never-ask)
189
+ // ---------------------------------------------------------------------------
190
+ phase("Brainstorm")
191
+ const SYNTHETIC_CONTEXT = { projectType: "unknown", conventions: [], recentChanges: [], relevantFiles: [] }
192
+ // Surface any prior compose artifacts so brainstorm can detect an AMENDMENT (a
193
+ // change to an existing feature) vs new work — enabling incremental re-runs that
194
+ // reuse the existing spec/plan instead of regenerating everything. The workflow
195
+ // only lists the files; the agent reads + judges.
196
+ const _globArr = async (pat) => { const r = await glob(pat); return Array.isArray(r) ? r : [] }
197
+ const existingDocs = [
198
+ ...(await _globArr(SPECS_DIR + "/*.md")),
199
+ ...(await _globArr(PLANS_DIR + "/*.md")),
200
+ ...(await _globArr(REPORTS_DIR + "/*.md")),
201
+ ]
202
+ const existingDocsBlock = existingDocs.length
203
+ ? "\n## Existing compose artifacts (this project has prior compose work)\n" +
204
+ existingDocs.map((p) => "- " + p).join("\n") + "\n" +
205
+ "If the task below is a CHANGE/ADDITION to a feature documented above, READ the relevant spec/plan (use the `read` tool) " +
206
+ "and treat this as an AMENDMENT: set `amends` to that feature's name and list the docs you used in `existingDocs`. " +
207
+ "If the task is unrelated/new, leave `amends` empty.\n"
208
+ : ""
209
+ let brainstorm
210
+ if (SKIP_BRAINSTORM) {
211
+ brainstorm = { context: SYNTHETIC_CONTEXT, assumptions: [] }
212
+ } else {
213
+ brainstorm = await agent(
214
+ "Apply the `compose:brainstorm` skill in AUTONOMOUS mode — no user is available to answer. Use the `skill` tool to load it first.\n\n" +
215
+ "## Autonomous brainstorming — self-conduct the dialogue (do NOT stop at context recon)\n" +
216
+ "'No user' means you ask and answer the questions YOURSELF; it does NOT mean skip the thinking. Run the real brainstorm:\n" +
217
+ "1. Explore project context (files, docs, recent commits, layout) and note assumptions.\n" +
218
+ "2. Pose the clarifying questions you WOULD ask a user, and answer each from the context/your best judgment (record as selfQA).\n" +
219
+ "3. Propose 2-3 distinct approaches with trade-offs (record as approaches).\n" +
220
+ "4. Pick ONE and justify it (chosenApproach + chosenRationale). Note any unresolved openQuestions.\n" +
221
+ "Do NOT present a design to a user, do NOT wait for approval, do NOT write a spec here — that is Design's job. " +
222
+ "This reasoning is the KEY input Design consumes, so capture it fully in the structured output.\n\n" +
223
+ "## Task\n" + TASK + "\n\n" +
224
+ existingDocsBlock +
225
+ "## Context to gather\n" +
226
+ "- Read AGENTS.md / CLAUDE.md / README.md if present\n" +
227
+ "- Skim recent commits (`git log --oneline -20`)\n" +
228
+ "- Map top-level directory layout; identify files relevant to the task\n\n" +
229
+ "Return structured output only.",
230
+ { label: "brainstorm", phase: "Brainstorm", schema: BRAINSTORM_SHAPE }
231
+ )
232
+ if (!brainstorm || !brainstorm.context) brainstorm = { context: SYNTHETIC_CONTEXT, assumptions: [] }
233
+ }
234
+ const _arr = (v) => (Array.isArray(v) ? v : [])
235
+ const contextDigest =
236
+ "Project: " + brainstorm.context.projectType + "\n" +
237
+ "Conventions:\n" + _arr(brainstorm.context.conventions).map((c) => "- " + c).join("\n") + "\n" +
238
+ "Recent changes:\n" + _arr(brainstorm.context.recentChanges).map((c) => "- " + c).join("\n") + "\n" +
239
+ "Relevant files:\n" + _arr(brainstorm.context.relevantFiles).map((f) => "- " + f).join("\n") +
240
+ (_arr(brainstorm.assumptions).length ? "\nAssumptions:\n" + _arr(brainstorm.assumptions).map((a) => "- " + a).join("\n") : "") +
241
+ (_arr(brainstorm.selfQA).length ? "\nSelf-Q&A (brainstorm reasoning):\n" + _arr(brainstorm.selfQA).map((q) => "- Q: " + (q && q.question) + "\n A: " + (q && q.answer)).join("\n") : "") +
242
+ (_arr(brainstorm.approaches).length ? "\nApproaches considered:\n" + _arr(brainstorm.approaches).map((a) => "- " + (a && a.name) + " — " + (a && a.tradeoffs)).join("\n") : "") +
243
+ ((brainstorm.chosenApproach && typeof brainstorm.chosenApproach === "string") ? "\nChosen approach: " + brainstorm.chosenApproach + (brainstorm.chosenRationale ? " (because: " + brainstorm.chosenRationale + ")" : "") : "") +
244
+ (_arr(brainstorm.openQuestions).length ? "\nOpen questions:\n" + _arr(brainstorm.openQuestions).map((q) => "- " + q).join("\n") : "") +
245
+ ((brainstorm.amends && typeof brainstorm.amends === "string") ? "\nAmends existing feature: " + brainstorm.amends : "")
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // Type resolution (no separate Classify phase)
249
+ // ---------------------------------------------------------------------------
250
+ // First-principles: picking the design skill is a low-risk, reversible routing
251
+ // decision the later Design/Implement phases can self-correct — it does NOT
252
+ // warrant its own LLM phase (the original compose flow has no classifier; it goes
253
+ // brainstorm → compose:plan). So: honor an explicit args.type; otherwise default
254
+ // to "feature" (→ compose:plan) and let a cheap keyword heuristic divert obvious
255
+ // bugfix / PR-feedback tasks. The design agent re-judges with full context anyway.
256
+ let type
257
+ if (VALID_TYPES.indexOf(argType) >= 0) {
258
+ type = argType
259
+ } else {
260
+ const t = TASK.toLowerCase()
261
+ if (/\b(pr|review)\b.*\b(feedback|comment|address)\b|address .*\bfeedback\b/.test(t)) type = "feedback"
262
+ else if (/\b(bug|broken|regression|crash|fails?|incorrect|wrong|error)\b/.test(t)) type = "bugfix"
263
+ else type = "feature"
264
+ log("Task type: " + type)
265
+ }
266
+
267
+ const SKILL_BY_TYPE = {
268
+ feature: "compose:plan",
269
+ refactor: "compose:plan",
270
+ bugfix: "compose:debug",
271
+ feedback: "compose:feedback",
272
+ }
273
+
274
+ // ---------------------------------------------------------------------------
275
+ // Phase 2 — Design (spec/plan, context-grounded, dependency-aware)
276
+ // ---------------------------------------------------------------------------
277
+ phase("Design")
278
+ const designSkill = SKILL_BY_TYPE[type] || "compose:plan"
279
+ const SPEC_PATH = SPECS_DIR + "/" + FEATURE_NAME + ".md"
280
+ const PLAN_PATH = PLANS_DIR + "/" + FEATURE_NAME + ".md"
281
+ // Amendment: brainstorm flagged this as a change to an existing feature. Design
282
+ // edits the existing spec/plan in place and re-runs only the affected tasks,
283
+ // instead of regenerating everything.
284
+ const AMENDS = brainstorm && typeof brainstorm.amends === "string" ? brainstorm.amends.trim() : ""
285
+
286
+ // Step 1 — the AGENT writes (or amends) the spec + plan files. The workflow does
287
+ // NOT write them; it only gates on existence and re-dispatches if skipped. No
288
+ // `schema` here so the agent is free to use its write/skill tools.
289
+ const runDesignWrite = (sharpen) => agent(
290
+ "Apply the `" + designSkill + "` skill to the task below. Use the `skill` tool to load the skill FIRST, then follow it.\n\n" +
291
+ docsBlock + "\n\n" +
292
+ "## Task\n" + TASK + "\n\n" +
293
+ "## Project context (from brainstorm)\n" + contextDigest + "\n\n" +
294
+ (AMENDS
295
+ ? "## This is an AMENDMENT to an existing feature: " + AMENDS + "\n" +
296
+ "Use `glob`/`read` to find that feature's existing spec under `" + SPECS_DIR + "` and plan under `" + PLANS_DIR + "`. " +
297
+ "EDIT them IN PLACE (write back to the SAME file paths) to reflect ONLY the change in the task above — do NOT rewrite from scratch. " +
298
+ "In the plan, the task list must then contain ONLY the tasks that need to be (re-)implemented for this change, PLUS any tasks that " +
299
+ "depend on them. Tasks unaffected by the change MUST be omitted from the actionable list — they are reused as-is.\n\n" +
300
+ "## Scope the work to the actual change (CRITICAL)\n" +
301
+ "First assess the MAGNITUDE of this change: small (one spot / a few lines), medium (a few related tasks), " +
302
+ "or large (a foundational refactor touching many modules). Make the plan's actionable task list MATCH that magnitude:\n" +
303
+ "- Small change → ONE task (or zero, if the code already satisfies it). Do NOT split one small change into multiple tasks.\n" +
304
+ "- Medium → only the genuinely distinct tasks the change requires, plus their dependents.\n" +
305
+ "- Large refactor → re-decompose into as many independent tasks as the work truly needs.\n" +
306
+ "NEVER emit two near-identical or duplicate tasks for the same change. One distinct unit of work = exactly one task. " +
307
+ "The number of tasks must reflect the real scope — it is not fixed.\n\n" +
308
+ "Write the updated files with the `write` tool. Do not just describe them.\n"
309
+ : "## Your deliverable (REQUIRED — this is the whole job)\n" +
310
+ "Use the `write` tool to create BOTH of these files on disk:\n" +
311
+ "1. Spec: `" + SPEC_PATH + "`\n" +
312
+ "2. Plan: `" + PLAN_PATH + "` — a bite-sized task list per the skill, each task with id, description, acceptance, optional files, and `dependsOn` (empty for independent tasks; a prerequisite task id otherwise; no cycles).\n\n" +
313
+ (sharpen ? "## You did NOT write the required files last time. Write them NOW with the write tool before finishing.\n\n" : "") +
314
+ "Do the writes with the `write` tool. Do not just describe them."),
315
+ { label: "design:" + type, phase: "Design" }
316
+ )
317
+ await runDesignWrite(false)
318
+ // Gate: the agent owns the writes; the workflow only verifies they happened and
319
+ // re-dispatches the agent once if not. The workflow itself never writes the files.
320
+ // Robustness: the agent may write under a slightly different leaf name than our
321
+ // computed slug (model-chosen filename, trailing-dash drift, etc.). So treat the
322
+ // gate as "did ANY .md land in the specs and plans dirs", not an exact-path match —
323
+ // this avoids a redundant, expensive re-dispatch when the files are actually there.
324
+ const docsPresent = async () => {
325
+ const specs = await glob(SPECS_DIR + "/*.md")
326
+ const plans = await glob(PLANS_DIR + "/*.md")
327
+ return specs.length > 0 && plans.length > 0
328
+ }
329
+ if (!(await docsPresent())) {
330
+ await runDesignWrite(true)
331
+ }
332
+ const specWritten = (await glob(SPECS_DIR + "/*.md")).length > 0
333
+ const planWritten = (await glob(PLANS_DIR + "/*.md")).length > 0
334
+
335
+ // Step 2 — structured extraction: a separate agent reads the plan the previous
336
+ // agent wrote and returns the machine-usable task list. Schema lives here, where
337
+ // JSON-only is exactly what we want — no file work expected in this call. The
338
+ // prompt FORCES a direct StructuredOutput tool call: the model otherwise tends to
339
+ // answer with prose/markdown/XML, which fails schema validation and triggers a
340
+ // slow retry loop (each round-trip is a full model call).
341
+ const design = await agent(
342
+ "Read the implementation plan markdown in `" + PLANS_DIR + "` (use the `read` tool; if multiple files, read the most recent) and extract its task list.\n\n" +
343
+ (planWritten ? "" : "## No plan file found — derive the task list from the task below instead.\n## Task\n" + TASK + "\n\n") +
344
+ (AMENDS ? "## Amendment\nThis run amends the existing feature \"" + AMENDS + "\". Return the SMALLEST set of tasks that covers the actual change (plus their dependents). One distinct unit of work = exactly one task — do NOT return duplicate or near-identical tasks, and do NOT split a single small change across multiple tasks. OMIT every task unaffected by this change — they are reused as-is.\n\n" : "") +
345
+ "## Output contract (STRICT)\n" +
346
+ "Call the `StructuredOutput` tool EXACTLY ONCE with a JSON object matching the schema. " +
347
+ "Do NOT reply with prose, markdown, XML, or a code block — those do not count and will be rejected. " +
348
+ "The JSON has a `tasks` array; each task: id, description, acceptance, optional files[], and dependsOn[] " +
349
+ "(empty for independent tasks; a prerequisite task id otherwise; no cycles).",
350
+ { label: "design-extract:" + type, phase: "Design", schema: DESIGN_SHAPE }
351
+ )
352
+ if (!design || !Array.isArray(design.tasks) || design.tasks.length === 0) {
353
+ return { error: "design-failed", type, brainstorm, docs: { specWritten, planWritten } }
354
+ }
355
+ // Normalize task ids: the extract agent sometimes returns tasks with a missing or
356
+ // blank `id` (schema validation can let an empty string through), which then shows
357
+ // up as "implement:undefined" in labels and breaks dependsOn wiring. Backfill any
358
+ // missing/duplicate id with a synthetic Tn so labels, topo-sort, and deps are stable.
359
+ {
360
+ const seen = Object.create(null)
361
+ let n = 0
362
+ for (const t of design.tasks) {
363
+ n++
364
+ const raw = typeof t.id === "string" ? t.id.trim() : ""
365
+ t.id = raw && !seen[raw] ? raw : "T" + n
366
+ seen[t.id] = true
367
+ }
368
+ }
369
+ log("Designed " + design.tasks.length + " task(s) using " + designSkill + " (spec=" + specWritten + " plan=" + planWritten + ")")
370
+
371
+ // Topo-sort (Kahn) over design.tasks by dependsOn → ordered batches.
372
+ const topoSort = (tasks) => {
373
+ const byId = Object.create(null)
374
+ for (const t of tasks) byId[t.id] = t
375
+ const indeg = Object.create(null)
376
+ const deps = Object.create(null)
377
+ for (const t of tasks) {
378
+ deps[t.id] = (t.dependsOn || []).filter((d) => byId[d])
379
+ indeg[t.id] = deps[t.id].length
380
+ }
381
+ const batches = []
382
+ let remaining = tasks.map((t) => t.id)
383
+ while (remaining.length) {
384
+ const ready = remaining.filter((id) => indeg[id] === 0)
385
+ if (!ready.length) return { error: "design-cycle", cycleNodes: remaining }
386
+ batches.push(ready)
387
+ const readySet = Object.create(null)
388
+ for (const id of ready) readySet[id] = true
389
+ remaining = remaining.filter((id) => !readySet[id])
390
+ for (const id of remaining) {
391
+ indeg[id] = deps[id].filter((d) => !readySet[d] && remaining.indexOf(d) >= 0).length
392
+ }
393
+ }
394
+ return { batches }
395
+ }
396
+ const topo = topoSort(design.tasks)
397
+ if (topo.error) {
398
+ return { error: "design-cycle", cycleNodes: topo.cycleNodes, type, brainstorm, design }
399
+ }
400
+ const batches = topo.batches
401
+ const taskById = Object.create(null)
402
+ for (const t of design.tasks) taskById[t.id] = t
403
+
404
+ // Intent carried from brainstorm/design into each implementer so it builds toward
405
+ // the CHOSEN approach, not its own re-derivation. Plan path lets it read the spec.
406
+ const intentBlock =
407
+ ((brainstorm.chosenApproach && typeof brainstorm.chosenApproach === "string")
408
+ ? "## Intent (from design — build toward THIS approach)\n" + brainstorm.chosenApproach +
409
+ (brainstorm.chosenRationale ? "\nRationale: " + brainstorm.chosenRationale : "") + "\n" +
410
+ "Spec/plan for the whole feature: `" + SPEC_PATH + "` / `" + PLAN_PATH + "` (read if you need fuller context).\n\n"
411
+ : "")
412
+
413
+ // ---------------------------------------------------------------------------
414
+ // Helpers: implement (per-task, worktree), integrate, verify, debug, report
415
+ // ---------------------------------------------------------------------------
416
+ const runImplementTask = (task, failuresOrEmpty, isolate) => agent(
417
+ "Apply the `compose:tdd` skill. Use the `skill` tool to load it before working.\n\n" +
418
+ "## Overall task\n" + TASK + "\n\n" +
419
+ intentBlock +
420
+ "## Your work item (" + task.id + ")\n" + task.description + "\nAcceptance: " + task.acceptance +
421
+ (task.files && task.files.length ? "\nFiles: " + task.files.join(", ") : "") + "\n\n" +
422
+ (failuresOrEmpty ? "## Verify failures from previous attempt — focus on these\n" + failuresOrEmpty + "\n\n" : "") +
423
+ "Write the failing test first (use the `write` tool), then the minimal code to pass, then refactor. " +
424
+ "Actually create the source and test files on disk with the `write` tool — do not just describe them. " +
425
+ (isolate ? "Commit your work inside this worktree." : "Commit your work in the workspace."),
426
+ isolate
427
+ ? { label: "implement:" + task.id, phase: "Implement", isolation: "worktree" }
428
+ : { label: "implement:" + task.id, phase: "Implement" }
429
+ )
430
+
431
+ const runIntegrate = (kept) => agent(
432
+ "Integrate the per-task worktrees below into the main workspace.\n\n" +
433
+ "## Worktrees to merge\n" + JSON.stringify(kept) + "\n\n" +
434
+ "For each `_worktree`, fetch its branch into the main workspace and merge (or fast-forward) it onto current HEAD. " +
435
+ "Resolve trivial conflicts (whitespace, import order, formatting) automatically. Surface real conflicts unmodified. " +
436
+ "Then `git worktree remove` each integrated worktree.\n\n" +
437
+ "Return structured output only.",
438
+ { label: "integrate", phase: "Implement", schema: INTEGRATE_SHAPE }
439
+ )
440
+
441
+ const runVerify = () => agent(
442
+ "Apply the `compose:verify` skill. Use the `skill` tool to load it FIRST, then follow its discipline " +
443
+ "(the Iron Law: no completion claim without fresh verification evidence — run the real commands, read the full output, " +
444
+ "never trust 'should pass' or an agent's self-report).\n\n" +
445
+ "## Run the project's verification commands and report the outcome\n" +
446
+ "1. First run `pwd` and `ls` to confirm your working directory and that the project's source/test files are actually present here. The implemented code lives in THIS workspace — verify from the workspace root (or the package subdir AGENTS.md specifies), never from a stale or temp cwd.\n" +
447
+ "2. Inspect AGENTS.md / CLAUDE.md / package.json for the project's verify commands (typecheck, test, build).\n" +
448
+ "3. Run them via the Bash tool from the correct directory. If a command reports 'file not found' or 0 tests, you are in the wrong directory — `cd` to where the files are and re-run before reporting.\n" +
449
+ "4. Capture passed/failed test counts from the ACTUAL command output. Summarize failures concisely if any.\n\n" +
450
+ "Return structured output only — and it must reflect the real command output, not an assumption.",
451
+ { label: "verify", phase: "Verify", schema: VERIFY_SHAPE }
452
+ )
453
+
454
+ const runDebug = (failures) => agent(
455
+ "Apply the `compose:debug` skill. Use the `skill` tool to load it before working.\n\n" +
456
+ "## Verify failures / integrate conflicts\n" + failures + "\n\n" +
457
+ "Identify the root cause and fix it. Do not paper over symptoms.",
458
+ { label: "debug", phase: "Implement" }
459
+ )
460
+
461
+ const runIterationReport = async (iteration, verifyResult) => {
462
+ if (SKIP_REPORT) return null
463
+ // The agent writes the markdown report file. No schema — a schema would bias the
464
+ // agent into emitting JSON instead of doing the write. The workflow only verifies
465
+ // the file exists afterward.
466
+ await agent(
467
+ "Apply the `compose:report` skill in per-iteration mode. Use the `skill` tool to load it first.\n\n" +
468
+ docsBlock + "\n\n" +
469
+ "## Report file you MUST write (overwrite-in-place, accumulate Journey Log)\n" + REPORT_PATH + "\n\n" +
470
+ "## Iteration\n" + iteration + "\n\n" +
471
+ "## Overall task\n" + TASK + "\n\n" +
472
+ "## Verify result\n" + JSON.stringify(verifyResult) + "\n\n" +
473
+ "Read the existing report if present (use `read`), update sections, append a Journey Log entry for this iteration, " +
474
+ "and write the file with the `write` tool. Keep it brief. Writing the file is the deliverable — do not just describe it.",
475
+ { label: "iteration-report:" + iteration, phase: "Report" }
476
+ )
477
+ return { iteration, written: await exists(REPORT_PATH) }
478
+ }
479
+
480
+ // Dispatch a batch of tasks in parallel, each isolated in its own worktree, then
481
+ // integrate the kept worktrees. Returns { perTaskResults, integrate }.
482
+ const runBatch = async (batchIds, failuresOrEmpty) => {
483
+ const tasks = batchIds.map((id) => taskById[id])
484
+ const perTaskResults = []
485
+ const kept = []
486
+ // Per-batch isolation: a batch with >1 independent task auto-isolates (worktree
487
+ // per task) so they can run CONCURRENTLY without clobbering the shared workspace;
488
+ // a single-task batch stays sequential in the main workspace. args.isolate_worktrees
489
+ // forces either way. parallel() is gated on ISOLATE for exactly this reason.
490
+ const ISOLATE = isolateBatch(batchIds)
491
+ const limit = ISOLATE ? Math.min(MAX_CONCURRENT, tasks.length) : 1
492
+ for (let i = 0; i < tasks.length; i += limit) {
493
+ const chunk = tasks.slice(i, i + limit)
494
+ const results = await parallel(chunk.map((t) => () => runImplementTask(t, failuresOrEmpty, ISOLATE)))
495
+ for (let j = 0; j < chunk.length; j++) {
496
+ const t = chunk[j]
497
+ const r = results[j]
498
+ if (ISOLATE) {
499
+ const wt = r && typeof r === "object" ? r._worktree : null
500
+ if (wt && wt.changed) {
501
+ kept.push({ taskId: t.id, _worktree: wt })
502
+ perTaskResults.push({ taskId: t.id, status: "ok", branch: wt.branch })
503
+ } else if (r === null) {
504
+ perTaskResults.push({ taskId: t.id, status: "failed" })
505
+ } else {
506
+ perTaskResults.push({ taskId: t.id, status: "pristine" })
507
+ }
508
+ } else {
509
+ // Non-isolated: the agent wrote directly into the main workspace. A non-null
510
+ // result means it ran; failure surfaces as null. No worktree to integrate.
511
+ perTaskResults.push({ taskId: t.id, status: r === null ? "failed" : "ok" })
512
+ }
513
+ }
514
+ }
515
+ // Integrate only when isolated worktrees were kept. In non-isolated mode the work
516
+ // already lives in the main workspace, so there is nothing to merge.
517
+ const integrate = kept.length
518
+ ? await runIntegrate(kept)
519
+ : { merged: [], conflicts: [], skipped_pristine: perTaskResults.filter((r) => r.status !== "ok").map((r) => r.taskId) }
520
+ return { perTaskResults, integrate: integrate || { merged: [], conflicts: [], skipped_pristine: [] } }
521
+ }
522
+
523
+ // ---------------------------------------------------------------------------
524
+ // Phase 3 — Implement (TDD outer loop, ≤3 attempts)
525
+ // ---------------------------------------------------------------------------
526
+ phase("Implement")
527
+ const verifyHistory = []
528
+ const implementHistory = []
529
+ let verify = null
530
+ let tddAttempts = 0
531
+ for (let attempt = 0; attempt < MAX_TDD_ATTEMPTS; attempt++) {
532
+ tddAttempts = attempt + 1
533
+ const failures = attempt === 0 ? "" : (verify && verify.failures ? verify.failures : "")
534
+ let attemptConflicts = []
535
+ const perTaskResults = []
536
+ const integrateHistory = []
537
+ for (const batchIds of batches) {
538
+ const batchOut = await runBatch(batchIds, failures)
539
+ for (const r of batchOut.perTaskResults) perTaskResults.push(r)
540
+ integrateHistory.push(batchOut.integrate)
541
+ if (batchOut.integrate.conflicts && batchOut.integrate.conflicts.length) {
542
+ attemptConflicts = attemptConflicts.concat(batchOut.integrate.conflicts)
543
+ }
544
+ }
545
+
546
+ phase("Verify")
547
+ verify = await runVerify()
548
+ if (verify) verifyHistory.push(verify)
549
+ const conflictText = attemptConflicts.length ? "\nIntegrate conflicts: " + JSON.stringify(attemptConflicts) : ""
550
+ const passed = verify && verify.allPassed && attemptConflicts.length === 0
551
+
552
+ implementHistory.push({
553
+ attempt: tddAttempts,
554
+ perTaskResults,
555
+ integrate: { batches: integrateHistory },
556
+ verify: verify || null,
557
+ })
558
+
559
+ if (passed) {
560
+ log("Verify passed on attempt " + tddAttempts)
561
+ phase("Report")
562
+ await runIterationReport(tddAttempts, verify)
563
+ break
564
+ }
565
+ if (attempt + 1 === MAX_TDD_ATTEMPTS) {
566
+ return { error: "verify-exhausted", type, brainstorm, design, batches, verifyHistory, implementHistory, attempts: MAX_TDD_ATTEMPTS }
567
+ }
568
+ phase("Implement")
569
+ await runDebug((verify ? (verify.failures || "verify returned no detail") : "verify agent failed (null)") + conflictText)
570
+ }
571
+
572
+ // ---------------------------------------------------------------------------
573
+ // Phase 4 — Review + Phase 5 — Fix loop (≤2 attempts)
574
+ // ---------------------------------------------------------------------------
575
+ const IMPLEMENTED_DIGEST = design.tasks.map((t) => "- " + t.id + ": " + t.description + " (acceptance: " + t.acceptance + ")").join("\n")
576
+ const runReview = () => agent(
577
+ "Apply the `compose:review` skill. Use the `skill` tool to load it FIRST, then follow it.\n\n" +
578
+ "Review the implemented change in TWO STAGES, spec-compliance BEFORE code-quality (this mirrors compose:subagent's two-stage gate):\n" +
579
+ "### Stage 1 — Spec compliance (evidence-gated)\n" +
580
+ "Run `git diff` (e.g. `git diff HEAD~<n>..HEAD`, or against the run's base) to see EXACTLY what changed, and read the changed files. " +
581
+ "For each acceptance criterion below, confirm with evidence from the diff/tests that it is met. Anything unmet or unverifiable is a CRITICAL finding. " +
582
+ "Do this from the diff + spec ALONE first — do not assume the implementer's claims are correct.\n" +
583
+ "### Stage 2 — Code quality\n" +
584
+ "Only once spec compliance holds, review the diff for quality: correctness bugs, missing error handling at real boundaries, tests that don't test, dead code, simplification.\n\n" +
585
+ "## Overall task\n" + TASK + "\n\n" +
586
+ intentBlock +
587
+ "## What was implemented (acceptance criteria to verify)\n" + IMPLEMENTED_DIGEST + "\n\n" +
588
+ "## What to produce\n" +
589
+ "Triage findings into critical (must fix before merge — includes ANY unmet spec/acceptance), important (should fix), and minor (nits). " +
590
+ "Set readyToMerge=true ONLY if critical is empty AND every acceptance criterion is met with evidence.\n\n" +
591
+ "Return structured output only.",
592
+ { label: "review", phase: "Review", schema: REVIEW_SHAPE }
593
+ )
594
+
595
+ const runFixTask = (finding, i, isolate) => agent(
596
+ "Address the CRITICAL review finding below. Apply the `compose:tdd` skill to fix it with tests where possible. " +
597
+ "Use the `skill` tool to load it first.\n\n" +
598
+ "## Critical finding (" + (i + 1) + ")\n" + finding + "\n\n" +
599
+ "Fix it with the `write`/`edit` tools and commit " + (isolate ? "inside this worktree." : "in the workspace."),
600
+ isolate ? { label: "fix:" + i, phase: "Fix", isolation: "worktree" } : { label: "fix:" + i, phase: "Fix" }
601
+ )
602
+
603
+ phase("Review")
604
+ let review = await runReview()
605
+ if (!review) review = { critical: [], important: [], minor: [], readyToMerge: true }
606
+ let reviewFixAttempts = 0
607
+ const fixHistory = []
608
+
609
+ if (review.critical && review.critical.length > 0) {
610
+ phase("Fix")
611
+ for (let attempt = 0; attempt < MAX_REVIEW_FIX_ATTEMPTS; attempt++) {
612
+ reviewFixAttempts = attempt + 1
613
+ // Same per-batch rule as implement: isolate (worktree per fix) when >1 critical
614
+ // fix would run concurrently, or when forced; otherwise sequential in main workspace.
615
+ const ISOLATE = isolateBatch(review.critical.map((_, i) => "fix-" + i))
616
+ const limit = ISOLATE ? Math.min(MAX_CONCURRENT, review.critical.length) : 1
617
+ const perTaskResults = []
618
+ const kept = []
619
+ const criticals = review.critical
620
+ for (let i = 0; i < criticals.length; i += limit) {
621
+ const chunk = criticals.slice(i, i + limit)
622
+ const results = await parallel(chunk.map((finding, k) => () => runFixTask(finding, i + k, ISOLATE)))
623
+ for (let j = 0; j < chunk.length; j++) {
624
+ const r = results[j]
625
+ if (ISOLATE) {
626
+ const wt = r && typeof r === "object" ? r._worktree : null
627
+ if (wt && wt.changed) {
628
+ kept.push({ taskId: "fix-" + (i + j), _worktree: wt })
629
+ perTaskResults.push({ taskId: "fix-" + (i + j), status: "ok", branch: wt.branch })
630
+ } else {
631
+ perTaskResults.push({ taskId: "fix-" + (i + j), status: r === null ? "failed" : "pristine" })
632
+ }
633
+ } else {
634
+ perTaskResults.push({ taskId: "fix-" + (i + j), status: r === null ? "failed" : "ok" })
635
+ }
636
+ }
637
+ }
638
+ const integrate = kept.length ? (await runIntegrate(kept)) || { merged: [], conflicts: [], skipped_pristine: [] } : { merged: [], conflicts: [], skipped_pristine: [] }
639
+
640
+ phase("Verify")
641
+ const reverify = await runVerify()
642
+ if (reverify) verifyHistory.push(reverify)
643
+
644
+ phase("Review")
645
+ review = await runReview()
646
+ if (!review) review = { critical: [], important: [], minor: [], readyToMerge: false }
647
+
648
+ fixHistory.push({ attempt: reviewFixAttempts, perTaskResults, integrate, verify: reverify || null, review })
649
+
650
+ phase("Report")
651
+ await runIterationReport(MAX_TDD_ATTEMPTS + reviewFixAttempts, reverify)
652
+
653
+ if (!review.critical || review.critical.length === 0) {
654
+ log("Critical issues cleared on fix attempt " + reviewFixAttempts)
655
+ break
656
+ }
657
+ }
658
+ if (review.critical && review.critical.length > 0) {
659
+ return {
660
+ readyToMerge: false,
661
+ type, brainstorm, design, batches, verifyHistory, implementHistory, fixHistory, review,
662
+ attempts: { tdd: tddAttempts, reviewFix: reviewFixAttempts },
663
+ }
664
+ }
665
+ }
666
+
667
+ // ---------------------------------------------------------------------------
668
+ // Phase 6 — Final Report (consolidate, committed before merge)
669
+ // ---------------------------------------------------------------------------
670
+ let finalReport = null
671
+ if (!SKIP_REPORT) {
672
+ phase("Report")
673
+ // The agent writes the consolidated final report file; the workflow only gates
674
+ // on existence. No schema — writing the markdown is the deliverable.
675
+ await agent(
676
+ "Apply the `compose:report` skill in FINAL consolidation mode. Use the `skill` tool to load it first.\n\n" +
677
+ docsBlock + "\n\n" +
678
+ "## Report file you MUST write (read the in-progress per-iteration file, overwrite with canonical final state)\n" + REPORT_PATH + "\n\n" +
679
+ "## Overall task\n" + TASK + "\n\n" +
680
+ "## Run history\n" +
681
+ "verifyHistory: " + JSON.stringify(verifyHistory) + "\n" +
682
+ "implementHistory: " + JSON.stringify(implementHistory) + "\n" +
683
+ "reviewFixAttempts: " + reviewFixAttempts + "\n" +
684
+ "review: " + JSON.stringify(review) + "\n\n" +
685
+ "Produce the final-state report (What Was Built / Architecture / Design Decisions / Usage / Verification / Journey Log / Source Materials). " +
686
+ "Distill the Journey Log to at most 5 entries. Write the file with the `write` tool, then commit it. " +
687
+ "Writing the file is the deliverable — do not just describe it.",
688
+ { label: "final-report", phase: "Report" }
689
+ )
690
+ // Re-dispatch once if the agent skipped the write.
691
+ if (!(await exists(REPORT_PATH))) {
692
+ await agent(
693
+ "The final report file `" + REPORT_PATH + "` does not exist yet. Apply `compose:report` and WRITE it now with the `write` tool " +
694
+ "(What Was Built / Architecture / Design Decisions / Usage / Verification / Journey Log / Source Materials) for the task: " + TASK,
695
+ { label: "final-report-retry", phase: "Report" }
696
+ )
697
+ }
698
+ finalReport = { path: REPORT_PATH, written: await exists(REPORT_PATH) }
699
+ }
700
+
701
+ // ---------------------------------------------------------------------------
702
+ // Phase 7 — Merge
703
+ // ---------------------------------------------------------------------------
704
+ phase("Merge")
705
+ const merge = await agent(
706
+ "Apply the `compose:merge` skill. Use the `skill` tool to load it before working.\n\n" +
707
+ "## Task\n" + TASK + "\n\n" +
708
+ "## What was built (use this for the commit/PR message)\n" + IMPLEMENTED_DIGEST + "\n\n" +
709
+ ((review && (_arr(review.important).length || _arr(review.minor).length))
710
+ ? "## Review outcome (critical cleared; note any deferred items)\n" +
711
+ (_arr(review.important).length ? "Important (should follow up):\n" + _arr(review.important).map((x) => "- " + x).join("\n") + "\n" : "") +
712
+ (_arr(review.minor).length ? "Minor (nits):\n" + _arr(review.minor).map((x) => "- " + x).join("\n") + "\n" : "") + "\n"
713
+ : "") +
714
+ "Commit the changes. If the branch tracks a remote and a PR is appropriate, push and open one.\n" +
715
+ "Pick the smallest action that satisfies the goal:\n" +
716
+ "- `commit`: just record locally\n" +
717
+ "- `commit+push`: also push to the existing remote branch\n" +
718
+ "- `commit+pr`: push and open a PR\n\n" +
719
+ "Return structured output only.",
720
+ { label: "merge", phase: "Merge", schema: MERGE_SHAPE }
721
+ )
722
+ if (!merge || !merge.committed) {
723
+ return {
724
+ error: "merge-failed",
725
+ type, brainstorm, design, batches, verifyHistory, implementHistory, review, finalReport,
726
+ merge: merge || { committed: false, action: "none" },
727
+ attempts: { tdd: tddAttempts, reviewFix: reviewFixAttempts },
728
+ }
729
+ }
730
+
731
+ return {
732
+ brainstorm,
733
+ type,
734
+ design,
735
+ batches,
736
+ implementHistory,
737
+ verifyHistory,
738
+ review,
739
+ fixHistory: fixHistory.length ? fixHistory : undefined,
740
+ reviewFixes: reviewFixAttempts,
741
+ finalReport,
742
+ merge,
743
+ stats: {
744
+ agents: verifyHistory.length + tddAttempts + reviewFixAttempts + 4, // brainstorm + design-write + design-extract + review + merge (approx)
745
+ phases: 7,
746
+ parallelBatches: batches.length,
747
+ durationMs: 0, // QuickJS guest has no Date; host can compute from journal if needed
748
+ },
749
+ }