poly-weaver 0.2.5

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 (365) hide show
  1. package/README.md +388 -0
  2. package/dist/agents/implementors/adapter.d.ts +18 -0
  3. package/dist/agents/implementors/adapter.d.ts.map +1 -0
  4. package/dist/agents/implementors/adapter.js +36 -0
  5. package/dist/agents/implementors/adapter.js.map +1 -0
  6. package/dist/agents/implementors/dsl.d.ts +11 -0
  7. package/dist/agents/implementors/dsl.d.ts.map +1 -0
  8. package/dist/agents/implementors/dsl.js +9 -0
  9. package/dist/agents/implementors/dsl.js.map +1 -0
  10. package/dist/agents/implementors/handler.d.ts +10 -0
  11. package/dist/agents/implementors/handler.d.ts.map +1 -0
  12. package/dist/agents/implementors/handler.js +55 -0
  13. package/dist/agents/implementors/handler.js.map +1 -0
  14. package/dist/agents/implementors/index.d.ts +10 -0
  15. package/dist/agents/implementors/index.d.ts.map +1 -0
  16. package/dist/agents/implementors/index.js +21 -0
  17. package/dist/agents/implementors/index.js.map +1 -0
  18. package/dist/agents/implementors/prompts.d.ts +20 -0
  19. package/dist/agents/implementors/prompts.d.ts.map +1 -0
  20. package/dist/agents/implementors/prompts.js +72 -0
  21. package/dist/agents/implementors/prompts.js.map +1 -0
  22. package/dist/agents/implementors/types.d.ts +24 -0
  23. package/dist/agents/implementors/types.d.ts.map +1 -0
  24. package/dist/agents/implementors/types.js +2 -0
  25. package/dist/agents/implementors/types.js.map +1 -0
  26. package/dist/agents/index.d.ts +12 -0
  27. package/dist/agents/index.d.ts.map +1 -0
  28. package/dist/agents/index.js +25 -0
  29. package/dist/agents/index.js.map +1 -0
  30. package/dist/agents/planners/adapter.d.ts +22 -0
  31. package/dist/agents/planners/adapter.d.ts.map +1 -0
  32. package/dist/agents/planners/adapter.js +67 -0
  33. package/dist/agents/planners/adapter.js.map +1 -0
  34. package/dist/agents/planners/dsl.d.ts +13 -0
  35. package/dist/agents/planners/dsl.d.ts.map +1 -0
  36. package/dist/agents/planners/dsl.js +9 -0
  37. package/dist/agents/planners/dsl.js.map +1 -0
  38. package/dist/agents/planners/handler.d.ts +9 -0
  39. package/dist/agents/planners/handler.d.ts.map +1 -0
  40. package/dist/agents/planners/handler.js +86 -0
  41. package/dist/agents/planners/handler.js.map +1 -0
  42. package/dist/agents/planners/index.d.ts +10 -0
  43. package/dist/agents/planners/index.d.ts.map +1 -0
  44. package/dist/agents/planners/index.js +21 -0
  45. package/dist/agents/planners/index.js.map +1 -0
  46. package/dist/agents/planners/prompts.d.ts +30 -0
  47. package/dist/agents/planners/prompts.d.ts.map +1 -0
  48. package/dist/agents/planners/prompts.js +153 -0
  49. package/dist/agents/planners/prompts.js.map +1 -0
  50. package/dist/agents/planners/types.d.ts +37 -0
  51. package/dist/agents/planners/types.d.ts.map +1 -0
  52. package/dist/agents/planners/types.js +2 -0
  53. package/dist/agents/planners/types.js.map +1 -0
  54. package/dist/agents/registry.d.ts +29 -0
  55. package/dist/agents/registry.d.ts.map +1 -0
  56. package/dist/agents/registry.js +44 -0
  57. package/dist/agents/registry.js.map +1 -0
  58. package/dist/agents/reviewers/adapter.d.ts +10 -0
  59. package/dist/agents/reviewers/adapter.d.ts.map +1 -0
  60. package/dist/agents/reviewers/adapter.js +35 -0
  61. package/dist/agents/reviewers/adapter.js.map +1 -0
  62. package/dist/agents/reviewers/dsl.d.ts +12 -0
  63. package/dist/agents/reviewers/dsl.d.ts.map +1 -0
  64. package/dist/agents/reviewers/dsl.js +9 -0
  65. package/dist/agents/reviewers/dsl.js.map +1 -0
  66. package/dist/agents/reviewers/handler.d.ts +8 -0
  67. package/dist/agents/reviewers/handler.d.ts.map +1 -0
  68. package/dist/agents/reviewers/handler.js +48 -0
  69. package/dist/agents/reviewers/handler.js.map +1 -0
  70. package/dist/agents/reviewers/index.d.ts +10 -0
  71. package/dist/agents/reviewers/index.d.ts.map +1 -0
  72. package/dist/agents/reviewers/index.js +33 -0
  73. package/dist/agents/reviewers/index.js.map +1 -0
  74. package/dist/agents/reviewers/prompts.d.ts +25 -0
  75. package/dist/agents/reviewers/prompts.d.ts.map +1 -0
  76. package/dist/agents/reviewers/prompts.js +143 -0
  77. package/dist/agents/reviewers/prompts.js.map +1 -0
  78. package/dist/agents/reviewers/types.d.ts +35 -0
  79. package/dist/agents/reviewers/types.d.ts.map +1 -0
  80. package/dist/agents/reviewers/types.js +10 -0
  81. package/dist/agents/reviewers/types.js.map +1 -0
  82. package/dist/agents/runner.d.ts +62 -0
  83. package/dist/agents/runner.d.ts.map +1 -0
  84. package/dist/agents/runner.js +136 -0
  85. package/dist/agents/runner.js.map +1 -0
  86. package/dist/agents/simplifiers/adapter.d.ts +12 -0
  87. package/dist/agents/simplifiers/adapter.d.ts.map +1 -0
  88. package/dist/agents/simplifiers/adapter.js +27 -0
  89. package/dist/agents/simplifiers/adapter.js.map +1 -0
  90. package/dist/agents/simplifiers/dsl.d.ts +11 -0
  91. package/dist/agents/simplifiers/dsl.d.ts.map +1 -0
  92. package/dist/agents/simplifiers/dsl.js +9 -0
  93. package/dist/agents/simplifiers/dsl.js.map +1 -0
  94. package/dist/agents/simplifiers/handler.d.ts +9 -0
  95. package/dist/agents/simplifiers/handler.d.ts.map +1 -0
  96. package/dist/agents/simplifiers/handler.js +39 -0
  97. package/dist/agents/simplifiers/handler.js.map +1 -0
  98. package/dist/agents/simplifiers/index.d.ts +10 -0
  99. package/dist/agents/simplifiers/index.d.ts.map +1 -0
  100. package/dist/agents/simplifiers/index.js +20 -0
  101. package/dist/agents/simplifiers/index.js.map +1 -0
  102. package/dist/agents/simplifiers/prompts.d.ts +11 -0
  103. package/dist/agents/simplifiers/prompts.d.ts.map +1 -0
  104. package/dist/agents/simplifiers/prompts.js +24 -0
  105. package/dist/agents/simplifiers/prompts.js.map +1 -0
  106. package/dist/agents/simplifiers/types.d.ts +15 -0
  107. package/dist/agents/simplifiers/types.d.ts.map +1 -0
  108. package/dist/agents/simplifiers/types.js +2 -0
  109. package/dist/agents/simplifiers/types.js.map +1 -0
  110. package/dist/agents/whip-hint.d.ts +23 -0
  111. package/dist/agents/whip-hint.d.ts.map +1 -0
  112. package/dist/agents/whip-hint.js +41 -0
  113. package/dist/agents/whip-hint.js.map +1 -0
  114. package/dist/ansi.d.ts +39 -0
  115. package/dist/ansi.d.ts.map +1 -0
  116. package/dist/ansi.js +158 -0
  117. package/dist/ansi.js.map +1 -0
  118. package/dist/cli.d.ts +3 -0
  119. package/dist/cli.d.ts.map +1 -0
  120. package/dist/cli.js +309 -0
  121. package/dist/cli.js.map +1 -0
  122. package/dist/config.d.ts +41 -0
  123. package/dist/config.d.ts.map +1 -0
  124. package/dist/config.js +55 -0
  125. package/dist/config.js.map +1 -0
  126. package/dist/dsl.d.ts +25 -0
  127. package/dist/dsl.d.ts.map +1 -0
  128. package/dist/dsl.js +16 -0
  129. package/dist/dsl.js.map +1 -0
  130. package/dist/flow/artifacts.d.ts +13 -0
  131. package/dist/flow/artifacts.d.ts.map +1 -0
  132. package/dist/flow/artifacts.js +27 -0
  133. package/dist/flow/artifacts.js.map +1 -0
  134. package/dist/flow/built-in/default.d.ts +15 -0
  135. package/dist/flow/built-in/default.d.ts.map +1 -0
  136. package/dist/flow/built-in/default.js +123 -0
  137. package/dist/flow/built-in/default.js.map +1 -0
  138. package/dist/flow/built-in/default.ts +152 -0
  139. package/dist/flow/built-in/why-so-serious.d.ts +15 -0
  140. package/dist/flow/built-in/why-so-serious.d.ts.map +1 -0
  141. package/dist/flow/built-in/why-so-serious.js +147 -0
  142. package/dist/flow/built-in/why-so-serious.js.map +1 -0
  143. package/dist/flow/custom/AUTHORING.md +558 -0
  144. package/dist/flow/custom/index.d.ts +3 -0
  145. package/dist/flow/custom/index.d.ts.map +1 -0
  146. package/dist/flow/custom/index.js +2 -0
  147. package/dist/flow/custom/index.js.map +1 -0
  148. package/dist/flow/custom/load.d.ts +19 -0
  149. package/dist/flow/custom/load.d.ts.map +1 -0
  150. package/dist/flow/custom/load.js +117 -0
  151. package/dist/flow/custom/load.js.map +1 -0
  152. package/dist/flow/diagram.d.ts +37 -0
  153. package/dist/flow/diagram.d.ts.map +1 -0
  154. package/dist/flow/diagram.js +596 -0
  155. package/dist/flow/diagram.js.map +1 -0
  156. package/dist/flow/dsl.d.ts +65 -0
  157. package/dist/flow/dsl.d.ts.map +1 -0
  158. package/dist/flow/dsl.js +210 -0
  159. package/dist/flow/dsl.js.map +1 -0
  160. package/dist/flow/executor.d.ts +22 -0
  161. package/dist/flow/executor.d.ts.map +1 -0
  162. package/dist/flow/executor.js +185 -0
  163. package/dist/flow/executor.js.map +1 -0
  164. package/dist/flow/index.d.ts +16 -0
  165. package/dist/flow/index.d.ts.map +1 -0
  166. package/dist/flow/index.js +12 -0
  167. package/dist/flow/index.js.map +1 -0
  168. package/dist/flow/inspect.d.ts +21 -0
  169. package/dist/flow/inspect.d.ts.map +1 -0
  170. package/dist/flow/inspect.js +54 -0
  171. package/dist/flow/inspect.js.map +1 -0
  172. package/dist/flow/neighbors.d.ts +10 -0
  173. package/dist/flow/neighbors.d.ts.map +1 -0
  174. package/dist/flow/neighbors.js +48 -0
  175. package/dist/flow/neighbors.js.map +1 -0
  176. package/dist/flow/params.d.ts +21 -0
  177. package/dist/flow/params.d.ts.map +1 -0
  178. package/dist/flow/params.js +44 -0
  179. package/dist/flow/params.js.map +1 -0
  180. package/dist/flow/types.d.ts +159 -0
  181. package/dist/flow/types.d.ts.map +1 -0
  182. package/dist/flow/types.js +33 -0
  183. package/dist/flow/types.js.map +1 -0
  184. package/dist/flow-editor/index.d.ts +9 -0
  185. package/dist/flow-editor/index.d.ts.map +1 -0
  186. package/dist/flow-editor/index.js +6 -0
  187. package/dist/flow-editor/index.js.map +1 -0
  188. package/dist/flow-editor/llm.d.ts +33 -0
  189. package/dist/flow-editor/llm.d.ts.map +1 -0
  190. package/dist/flow-editor/llm.js +137 -0
  191. package/dist/flow-editor/llm.js.map +1 -0
  192. package/dist/flow-editor/names.d.ts +5 -0
  193. package/dist/flow-editor/names.d.ts.map +1 -0
  194. package/dist/flow-editor/names.js +21 -0
  195. package/dist/flow-editor/names.js.map +1 -0
  196. package/dist/flow-editor/save.d.ts +59 -0
  197. package/dist/flow-editor/save.d.ts.map +1 -0
  198. package/dist/flow-editor/save.js +143 -0
  199. package/dist/flow-editor/save.js.map +1 -0
  200. package/dist/flow-editor/tui.d.ts +56 -0
  201. package/dist/flow-editor/tui.d.ts.map +1 -0
  202. package/dist/flow-editor/tui.js +628 -0
  203. package/dist/flow-editor/tui.js.map +1 -0
  204. package/dist/flow-editor/validate.d.ts +39 -0
  205. package/dist/flow-editor/validate.d.ts.map +1 -0
  206. package/dist/flow-editor/validate.js +192 -0
  207. package/dist/flow-editor/validate.js.map +1 -0
  208. package/dist/git-info.d.ts +6 -0
  209. package/dist/git-info.d.ts.map +1 -0
  210. package/dist/git-info.js +26 -0
  211. package/dist/git-info.js.map +1 -0
  212. package/dist/orchestrator.d.ts +55 -0
  213. package/dist/orchestrator.d.ts.map +1 -0
  214. package/dist/orchestrator.js +240 -0
  215. package/dist/orchestrator.js.map +1 -0
  216. package/dist/preflight.d.ts +30 -0
  217. package/dist/preflight.d.ts.map +1 -0
  218. package/dist/preflight.js +107 -0
  219. package/dist/preflight.js.map +1 -0
  220. package/dist/preview-panel.d.ts +87 -0
  221. package/dist/preview-panel.d.ts.map +1 -0
  222. package/dist/preview-panel.js +418 -0
  223. package/dist/preview-panel.js.map +1 -0
  224. package/dist/prompts.d.ts +34 -0
  225. package/dist/prompts.d.ts.map +1 -0
  226. package/dist/prompts.js +67 -0
  227. package/dist/prompts.js.map +1 -0
  228. package/dist/providers/base-completion.d.ts +56 -0
  229. package/dist/providers/base-completion.d.ts.map +1 -0
  230. package/dist/providers/base-completion.js +111 -0
  231. package/dist/providers/base-completion.js.map +1 -0
  232. package/dist/providers/claude/completion.d.ts +28 -0
  233. package/dist/providers/claude/completion.d.ts.map +1 -0
  234. package/dist/providers/claude/completion.js +103 -0
  235. package/dist/providers/claude/completion.js.map +1 -0
  236. package/dist/providers/claude/index.d.ts +2 -0
  237. package/dist/providers/claude/index.d.ts.map +1 -0
  238. package/dist/providers/claude/index.js +2 -0
  239. package/dist/providers/claude/index.js.map +1 -0
  240. package/dist/providers/claude/session.d.ts +55 -0
  241. package/dist/providers/claude/session.d.ts.map +1 -0
  242. package/dist/providers/claude/session.js +172 -0
  243. package/dist/providers/claude/session.js.map +1 -0
  244. package/dist/providers/claude/strategy.d.ts +14 -0
  245. package/dist/providers/claude/strategy.d.ts.map +1 -0
  246. package/dist/providers/claude/strategy.js +38 -0
  247. package/dist/providers/claude/strategy.js.map +1 -0
  248. package/dist/providers/codex/completion.d.ts +21 -0
  249. package/dist/providers/codex/completion.d.ts.map +1 -0
  250. package/dist/providers/codex/completion.js +63 -0
  251. package/dist/providers/codex/completion.js.map +1 -0
  252. package/dist/providers/codex/index.d.ts +2 -0
  253. package/dist/providers/codex/index.d.ts.map +1 -0
  254. package/dist/providers/codex/index.js +2 -0
  255. package/dist/providers/codex/index.js.map +1 -0
  256. package/dist/providers/codex/session.d.ts +46 -0
  257. package/dist/providers/codex/session.d.ts.map +1 -0
  258. package/dist/providers/codex/session.js +151 -0
  259. package/dist/providers/codex/session.js.map +1 -0
  260. package/dist/providers/codex/strategy.d.ts +14 -0
  261. package/dist/providers/codex/strategy.d.ts.map +1 -0
  262. package/dist/providers/codex/strategy.js +41 -0
  263. package/dist/providers/codex/strategy.js.map +1 -0
  264. package/dist/providers/copilot/completion.d.ts +22 -0
  265. package/dist/providers/copilot/completion.d.ts.map +1 -0
  266. package/dist/providers/copilot/completion.js +65 -0
  267. package/dist/providers/copilot/completion.js.map +1 -0
  268. package/dist/providers/copilot/index.d.ts +2 -0
  269. package/dist/providers/copilot/index.d.ts.map +1 -0
  270. package/dist/providers/copilot/index.js +2 -0
  271. package/dist/providers/copilot/index.js.map +1 -0
  272. package/dist/providers/copilot/session.d.ts +39 -0
  273. package/dist/providers/copilot/session.d.ts.map +1 -0
  274. package/dist/providers/copilot/session.js +185 -0
  275. package/dist/providers/copilot/session.js.map +1 -0
  276. package/dist/providers/copilot/strategy.d.ts +14 -0
  277. package/dist/providers/copilot/strategy.d.ts.map +1 -0
  278. package/dist/providers/copilot/strategy.js +48 -0
  279. package/dist/providers/copilot/strategy.js.map +1 -0
  280. package/dist/providers/index.d.ts +8 -0
  281. package/dist/providers/index.d.ts.map +1 -0
  282. package/dist/providers/index.js +6 -0
  283. package/dist/providers/index.js.map +1 -0
  284. package/dist/providers/invoke.d.ts +14 -0
  285. package/dist/providers/invoke.d.ts.map +1 -0
  286. package/dist/providers/invoke.js +55 -0
  287. package/dist/providers/invoke.js.map +1 -0
  288. package/dist/providers/path-utils.d.ts +7 -0
  289. package/dist/providers/path-utils.d.ts.map +1 -0
  290. package/dist/providers/path-utils.js +9 -0
  291. package/dist/providers/path-utils.js.map +1 -0
  292. package/dist/providers/prompt-file.d.ts +8 -0
  293. package/dist/providers/prompt-file.d.ts.map +1 -0
  294. package/dist/providers/prompt-file.js +17 -0
  295. package/dist/providers/prompt-file.js.map +1 -0
  296. package/dist/providers/registry.d.ts +17 -0
  297. package/dist/providers/registry.d.ts.map +1 -0
  298. package/dist/providers/registry.js +49 -0
  299. package/dist/providers/registry.js.map +1 -0
  300. package/dist/providers/types.d.ts +145 -0
  301. package/dist/providers/types.d.ts.map +1 -0
  302. package/dist/providers/types.js +5 -0
  303. package/dist/providers/types.js.map +1 -0
  304. package/dist/providers/version.d.ts +11 -0
  305. package/dist/providers/version.d.ts.map +1 -0
  306. package/dist/providers/version.js +31 -0
  307. package/dist/providers/version.js.map +1 -0
  308. package/dist/pty/exit.d.ts +12 -0
  309. package/dist/pty/exit.d.ts.map +1 -0
  310. package/dist/pty/exit.js +43 -0
  311. package/dist/pty/exit.js.map +1 -0
  312. package/dist/pty/spawn.d.ts +20 -0
  313. package/dist/pty/spawn.d.ts.map +1 -0
  314. package/dist/pty/spawn.js +163 -0
  315. package/dist/pty/spawn.js.map +1 -0
  316. package/dist/pty/types.d.ts +44 -0
  317. package/dist/pty/types.d.ts.map +1 -0
  318. package/dist/pty/types.js +2 -0
  319. package/dist/pty/types.js.map +1 -0
  320. package/dist/session/dir.d.ts +19 -0
  321. package/dist/session/dir.d.ts.map +1 -0
  322. package/dist/session/dir.js +31 -0
  323. package/dist/session/dir.js.map +1 -0
  324. package/dist/session/locator.d.ts +28 -0
  325. package/dist/session/locator.d.ts.map +1 -0
  326. package/dist/session/locator.js +88 -0
  327. package/dist/session/locator.js.map +1 -0
  328. package/dist/session/reader.d.ts +12 -0
  329. package/dist/session/reader.d.ts.map +1 -0
  330. package/dist/session/reader.js +94 -0
  331. package/dist/session/reader.js.map +1 -0
  332. package/dist/startup-tui.d.ts +75 -0
  333. package/dist/startup-tui.d.ts.map +1 -0
  334. package/dist/startup-tui.js +504 -0
  335. package/dist/startup-tui.js.map +1 -0
  336. package/dist/status-bar.d.ts +29 -0
  337. package/dist/status-bar.d.ts.map +1 -0
  338. package/dist/status-bar.js +135 -0
  339. package/dist/status-bar.js.map +1 -0
  340. package/dist/terminal-input.d.ts +51 -0
  341. package/dist/terminal-input.d.ts.map +1 -0
  342. package/dist/terminal-input.js +212 -0
  343. package/dist/terminal-input.js.map +1 -0
  344. package/dist/user/dsl.d.ts +13 -0
  345. package/dist/user/dsl.d.ts.map +1 -0
  346. package/dist/user/dsl.js +19 -0
  347. package/dist/user/dsl.js.map +1 -0
  348. package/dist/user/handler.d.ts +16 -0
  349. package/dist/user/handler.d.ts.map +1 -0
  350. package/dist/user/handler.js +49 -0
  351. package/dist/user/handler.js.map +1 -0
  352. package/dist/user/index.d.ts +5 -0
  353. package/dist/user/index.d.ts.map +1 -0
  354. package/dist/user/index.js +4 -0
  355. package/dist/user/index.js.map +1 -0
  356. package/dist/user/prompt.d.ts +86 -0
  357. package/dist/user/prompt.d.ts.map +1 -0
  358. package/dist/user/prompt.js +320 -0
  359. package/dist/user/prompt.js.map +1 -0
  360. package/dist/version.d.ts +2 -0
  361. package/dist/version.d.ts.map +1 -0
  362. package/dist/version.js +4 -0
  363. package/dist/version.js.map +1 -0
  364. package/package.json +50 -0
  365. package/schemas/review-verdict.json +41 -0
package/README.md ADDED
@@ -0,0 +1,388 @@
1
+ # poly-weaver
2
+
3
+ Orchestrates pluggable AI coding agents in iterative plan-review loops.
4
+
5
+ poly-weaver spawns AI CLI tools (Claude Code, Codex CLI, GitHub Copilot CLI) via PTY and drives them through a declarative **Flow DSL** that defines the workflow as composable steps. A planner agent drafts a plan, a reviewer agent evaluates it, and the user can intervene at each checkpoint. Once approved, an implementor agent executes the plan with its own review cycle. A simplifier agent can optionally refine the result after implementation. All inter-step data flows through an artifact-based system — steps declare what they read and write, and data is exchanged via a shared artifact store.
6
+
7
+ ## How it works
8
+
9
+ The default flow uses a **two-layered loop** structure:
10
+
11
+ ```
12
+ Task
13
+
14
+
15
+ ┌─── Outer loop (user feedback) ──────────────────────────────────┐
16
+ │ │
17
+ │ ┌──────────┐ ┌──────────────┐ │
18
+ │ │ Planner │──▶│ User review │──▶ accept / give feedback │
19
+ │ └──────────┘ └──────────────┘ │ │
20
+ │ ▲ │ feedback │ accept │
21
+ │ └──────────────────┘ ▼ │
22
+ │ ┌─── Inner loop ──────────┐ │
23
+ │ │ Plan ──▶ Review │ │
24
+ │ │ ▲ rejected │ │ │
25
+ │ │ └──────────────┘ │ │
26
+ │ │ │ approved │ │
27
+ │ └─────────┼────────────────┘ │
28
+ │ ▼ │
29
+ │ ┌──────────────┐ │
30
+ │ │ User approve │──▶ restart / ok │
31
+ │ └──────────────┘ │
32
+ └─────────────────────────────────────────────────────────────────┘
33
+ │ ok
34
+
35
+ ┌─── Impl loop ──────────────┐
36
+ │ Implement ──▶ Review │
37
+ │ ▲ rejected │ │
38
+ │ └───────────────┘ │
39
+ │ │ approved │
40
+ └──────────┼──────────────────┘
41
+
42
+ Done
43
+ ```
44
+
45
+ In **auto mode** (`--auto`), user review steps are skipped — the reviewer loop alone decides approval. The startup TUI renders a live ASCII flow diagram reflecting the configured mode.
46
+
47
+ ### "Why So Serious" workflow
48
+
49
+ The **why-so-serious** workflow (selectable via Shift+Tab in the TUI) extends the default flow with two additions:
50
+
51
+ 1. **Conditional re-planning** — if the implementation reviewer finds more than 2 issues, a planner step runs before the next implementation attempt to draft a targeted fix plan. When issues are within threshold, the implementor revises normally.
52
+ 2. **Simplification pass** — after the implementation loop is approved, a simplifier agent reviews the codebase and produces a simplification plan, which the implementor then applies.
53
+
54
+ ```
55
+ Default impl loop Why-so-serious impl loop
56
+ ──────────────── ────────────────────────
57
+ Implement → Review issues > 2 ? → Planner (fix plan)
58
+ ↑ rejected │ Implement → Review
59
+ └────────────┘ ↑ rejected │
60
+ │ approved └────────────┘
61
+ ▼ │ approved
62
+ Done ▼
63
+ Simplifier → Implement
64
+
65
+ Done
66
+ ```
67
+
68
+ ### Custom flows
69
+
70
+ Custom flows live in `~/.poly-weaver/flows/` as `.mjs` files. Each file exports a factory function that receives the DSL toolkit and returns a flow template:
71
+
72
+ ```js
73
+ // ~/.poly-weaver/flows/my-flow.mjs
74
+ export default function (dsl) {
75
+ const { defineFlow, loop, artifactData, plan, review, TASK } = dsl;
76
+
77
+ return {
78
+ name: "my-flow",
79
+ params: [
80
+ { key: "planner", type: "driver", role: "planner", label: "Planner", default: "claude" },
81
+ { key: "reviewer", type: "driver", role: "reviewer", label: "Reviewer", default: "codex" },
82
+ { key: "maxIterations", type: "number", label: "Max Iterations", default: 5, min: 1, max: 50 },
83
+ ],
84
+ build(values) {
85
+ return defineFlow("my-flow", [
86
+ loop(values.maxIterations, artifactData("verdict", "approved"), [
87
+ plan({ driver: values.planner, reads: { task: TASK, verdict: "verdict" }, writes: { plan: "plan" } }),
88
+ review({ driver: values.reviewer, variant: "plan", reads: { task: TASK, plan: "plan" }, writes: { verdict: "verdict" } }),
89
+ ]),
90
+ ]);
91
+ },
92
+ };
93
+ }
94
+ ```
95
+
96
+ The DSL toolkit is imported via `poly-weaver/dsl` and includes all step builders (`plan`, `review`, `implement`, `simplify`, `user`), loop/predicate helpers, and the `TASK` constant. Use `create-flow` and `modify-flow` subcommands for LLM-assisted authoring. See [`src/flow/custom/AUTHORING.md`](src/flow/custom/AUTHORING.md) for the full DSL reference.
97
+
98
+ Each agent is a real CLI process (Claude Code, Codex, or GitHub Copilot) running in a pseudo-terminal. poly-weaver reads their session files to detect completion, extract responses, and feed feedback.
99
+
100
+ ## Installation
101
+
102
+ ### Prerequisites
103
+
104
+ - Node.js 18+
105
+ - A C++ toolchain for [node-pty](https://github.com/nicktomlin/node-pty):
106
+ - **Windows** — Visual Studio Build Tools
107
+ - **macOS** — Xcode Command Line Tools
108
+ - **Linux** — `build-essential`
109
+ - At least one supported AI CLI installed and authenticated:
110
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — `npm install -g @anthropic-ai/claude-code`
111
+ - [Codex CLI](https://github.com/openai/codex) — `npm install -g @openai/codex`
112
+ - [GitHub Copilot CLI](https://github.com/github/copilot-cli) — `winget install GitHub.CopilotCLI`
113
+
114
+ ### Install from GitHub Packages
115
+
116
+ ```bash
117
+ npm install -g poly-weaver
118
+ ```
119
+
120
+ ### Install from source
121
+
122
+ ```bash
123
+ git clone https://github.com/gim-home/poly-weaver.git
124
+ cd poly-weaver
125
+ npm install # installs dependencies and builds automatically
126
+ npm link # registers the `poly-weaver` command globally
127
+ ```
128
+
129
+ ### Uninstall
130
+
131
+ ```bash
132
+ npm uninstall -g poly-weaver
133
+ # or if installed from source:
134
+ npm unlink -g poly-weaver
135
+ ```
136
+
137
+ ## Usage
138
+
139
+ ```bash
140
+ poly-weaver
141
+ ```
142
+
143
+ This opens an interactive TUI to configure the task, select providers for each role, and set options before starting the orchestration loop.
144
+
145
+ You can also pass arguments directly:
146
+
147
+ ```bash
148
+ # Pass a task directly
149
+ poly-weaver "Refactor the auth module to use JWT"
150
+
151
+ # Read task from a file
152
+ poly-weaver task.md
153
+
154
+ # Choose providers for each role
155
+ poly-weaver "Add unit tests" --planner claude --reviewer copilot --implementor claude
156
+
157
+ # Plan only (skip implementation)
158
+ poly-weaver "Design a caching layer" --plan-only
159
+
160
+ # Fully automated (no user checkpoints)
161
+ poly-weaver "Fix the login bug" --auto
162
+
163
+ # Opinionless mode — minimal prompts, agent decides the approach
164
+ poly-weaver "Refactor the auth module" --opinionless
165
+ ```
166
+
167
+ ### CLI options
168
+
169
+ | Option | Description | Default |
170
+ |---|---|---|
171
+ | `[task]` | Task description or path to a `.md`/`.txt` file | _(interactive)_ |
172
+ | `--planner <cli>` | Provider for planning (`claude` \| `codex` \| `copilot`) | `claude` |
173
+ | `--reviewer <cli>` | Provider for reviewing (`claude` \| `codex` \| `copilot`) | `codex` |
174
+ | `--implementor <cli>` | Provider for implementation (`claude` \| `codex` \| `copilot`) | `claude` |
175
+ | `--simplifier <cli>` | Provider for simplification (`claude` \| `codex` \| `copilot`) | `claude` |
176
+ | `--max-iterations <n>` | Max plan-review cycles | `5` (range: 1–50) |
177
+ | `--max-impl-iterations <n>` | Max implementation-review cycles | `5` (range: 1–50) |
178
+ | `--auto` | Skip user review phases | `false` |
179
+ | `--plan-only` | Stop after plan approval, skip implementation | `false` |
180
+ | `--workdir <path>` | Working directory for agent CLIs | current directory |
181
+ | `--opinionless` | Use minimal prompts; let agents decide how to plan/review/implement | `false` |
182
+ | `--no-yolo` | Run agents without auto-approving permissions | `false` (agents run with permission-skipping) |
183
+ | `--whip-mode` / `--no-whip-mode` | Enable/disable neighbor awareness hints between agents | `false` |
184
+ | `--workflow <name>` | Workflow template to use | `default` |
185
+ | `--config <path>` | Path to a JSON config file | _(none)_ |
186
+ | `--verbose` | Preserve session files for debugging | `false` |
187
+
188
+ Workflow is selected via `--workflow <name>` or **Shift+Tab** in the TUI. Built-in workflows: `default`, `why-so-serious`. Custom flows are also available (see below).
189
+
190
+ ### Subcommands
191
+
192
+ ```bash
193
+ poly-weaver create-flow # LLM-assisted custom flow creation
194
+ poly-weaver modify-flow # Modify an existing custom flow
195
+ ```
196
+
197
+ ## Architecture
198
+
199
+ ```
200
+ src/
201
+ ├── cli.ts # Entry point, argument parsing (Commander)
202
+ ├── orchestrator.ts # Builds flow from template, runs executor
203
+ ├── config.ts # Config file loading, user config persistence
204
+ ├── dsl.ts # DSL toolkit barrel for custom flows (poly-weaver/dsl)
205
+ ├── prompts.ts # Shared prompt utilities (verdict schema, feedback derivation)
206
+ ├── preflight.ts # CLI availability checks
207
+ ├── startup-tui.ts # Interactive startup TUI with live flow diagram
208
+ ├── preview-panel.ts # Shared TUI panel rendering (config fields, flow diagram)
209
+ ├── status-bar.ts # Persistent status bar rendering
210
+ ├── terminal-input.ts # Terminal input utilities
211
+ ├── git-info.ts # Git branch/status detection
212
+ ├── ansi.ts # Shared ANSI helpers
213
+ ├── version.ts # App version constant
214
+ ├── flow/
215
+ │ ├── types.ts # FlowStep, ArtifactStore, FlowTemplate, FlowParam
216
+ │ ├── dsl.ts # DSL helpers: defineFlow, loop, predicates
217
+ │ ├── executor.ts # Walks a FlowDefinition, runs steps
218
+ │ ├── neighbors.ts # Data-flow consumer map computation
219
+ │ ├── artifacts.ts # MapArtifactStore implementation
220
+ │ ├── params.ts # Flow param resolution (CLI > file > user > default)
221
+ │ ├── diagram.ts # ASCII flow diagram renderer for TUI
222
+ │ ├── inspect.ts # Flow definition introspection utilities
223
+ │ ├── index.ts # Re-exports
224
+ │ ├── built-in/
225
+ │ │ ├── default.ts # Default two-layered flow template
226
+ │ │ └── why-so-serious.ts # Why-so-serious flow template (conditional replan + simplify)
227
+ │ └── custom/
228
+ │ ├── load.ts # Custom flow loader (discovers ~/.poly-weaver/flows/*.mjs)
229
+ │ ├── index.ts # Re-exports
230
+ │ └── AUTHORING.md # Full DSL reference for custom flow authors
231
+ ├── flow-editor/
232
+ │ ├── tui.ts # Flow editor TUI (create/modify modes)
233
+ │ ├── llm.ts # LLM prompt builders and code generation
234
+ │ ├── validate.ts # Flow code validation pipeline
235
+ │ ├── save.ts # Flow file persistence with backup
236
+ │ ├── names.ts # Random flow name generator
237
+ │ └── index.ts # Re-exports
238
+ ├── agents/
239
+ │ ├── registry.ts # Role registry: registerRole, createHandler
240
+ │ ├── runner.ts # AgentRunner — shared spawn→detect→exit lifecycle
241
+ │ ├── whip-hint.ts # Whip mode hint builder
242
+ │ ├── index.ts # Registers built-in providers, re-exports DSL helpers
243
+ │ ├── planners/
244
+ │ │ ├── prompts.ts # Planner prompt builders and prompt sets
245
+ │ │ ├── dsl.ts # plan() DSL helper
246
+ │ │ ├── handler.ts # PlannerRoleHandler (artifact ↔ driver bridge)
247
+ │ │ ├── adapter.ts # PlannerAdapter (driver ↔ provider bridge)
248
+ │ │ ├── types.ts # PlannerDriver interface
249
+ │ │ └── index.ts # Self-registers into role registry
250
+ │ ├── reviewers/ # Same structure + prompts.ts
251
+ │ ├── implementors/ # Same structure + prompts.ts
252
+ │ └── simplifiers/ # Same structure + prompts.ts
253
+ ├── user/
254
+ │ ├── dsl.ts # user() DSL helper for user-review steps
255
+ │ ├── handler.ts # User checkpoint handler
256
+ │ ├── prompt.ts # User prompt rendering
257
+ │ └── index.ts # Re-exports
258
+ ├── providers/
259
+ │ ├── types.ts # ProviderStrategy, SessionHandler, CompletionDetector
260
+ │ ├── registry.ts # Built-in provider registry (name → strategy)
261
+ │ ├── invoke.ts # Non-interactive provider invocation
262
+ │ ├── base-completion.ts # Shared completion detection logic
263
+ │ ├── prompt-file.ts # Prompt file writing utilities
264
+ │ ├── path-utils.ts # Path helpers
265
+ │ ├── index.ts # Re-exports all provider strategies
266
+ │ ├── claude/
267
+ │ │ ├── strategy.ts # ClaudeStrategy
268
+ │ │ ├── session.ts # Claude session file handling
269
+ │ │ ├── completion.ts # Claude completion detection
270
+ │ │ └── index.ts
271
+ │ ├── codex/
272
+ │ │ ├── strategy.ts # CodexStrategy
273
+ │ │ ├── session.ts # Codex session file handling
274
+ │ │ ├── completion.ts # Codex completion detection
275
+ │ │ └── index.ts
276
+ │ └── copilot/
277
+ │ ├── strategy.ts # CopilotStrategy
278
+ │ ├── session.ts # Copilot session file handling
279
+ │ ├── completion.ts # Copilot completion detection
280
+ │ └── index.ts
281
+ ├── session/
282
+ │ ├── dir.ts # Session temp directory lifecycle
283
+ │ ├── reader.ts # JSONL session file parser
284
+ │ └── locator.ts # Session file discovery
285
+ └── pty/
286
+ ├── spawn.ts # PTY spawning (node-pty)
287
+ ├── exit.ts # Exit signal handling
288
+ └── types.ts # PTY-related types
289
+ ```
290
+
291
+ ### Opinionless mode
292
+
293
+ By default, poly-weaver prompts include prescriptive criteria for each role — evaluation rubrics for reviewers, structural requirements for planners, step-by-step instructions for implementors.
294
+
295
+ With `--opinionless`, prompts are stripped to the structural minimum: file path references and the verdict output schema. The agent decides how to approach its role. The verdict schema is also simplified — each issue only requires a `description`, with `category` and `severity` left to the agent's discretion.
296
+
297
+ This is useful when the AI agent has its own strong conventions, or when you want to compare agent behavior with and without prescriptive guidance.
298
+
299
+ ### Whip mode
300
+
301
+ With `--whip-mode`, each agent receives a hint describing who produced its input and who will consume its output. For example, a planner might see:
302
+
303
+ > The previous step was performed by Claude. Codex will review your plan.
304
+
305
+ Hints are suppressed when neighbors use the same provider — telling Claude that Claude produced the input is not actionable. This means whip mode only adds value in **mixed-provider workflows** where agents benefit from knowing their neighbors' capabilities and conventions.
306
+
307
+ Toggle it in the TUI or pass `--whip-mode` / `--no-whip-mode` on the command line.
308
+
309
+ ### Registry + Handler + Adapter + Runner
310
+
311
+ The agent system has four layers:
312
+
313
+ - **Role Registry** (`src/agents/registry.ts`) — maps role names (planner, reviewer, implementor) to role modules. Each module self-registers on import and exposes `createHandler()` and `availableDrivers()`.
314
+ - **Role Handlers** (e.g. `PlannerRoleHandler`) — bridge the artifact store and the driver interface. They read artifacts declared in the step's `reads`, call the driver, and write results to the step's `writes`.
315
+ - **Role Adapters** (e.g. `PlannerAdapter`) — implement the driver interface by translating role-specific calls into generic agent runs with the appropriate prompts and file routing. Each adapter wraps a `ProviderStrategy`.
316
+ - **`AgentRunner`** — executes the shared lifecycle: snapshot session files → spawn PTY → detect completion → extract response → exit. Accepts any `ProviderStrategy`.
317
+
318
+ DSL helpers (`plan()`, `review()`, `implement()`, `simplify()`, `user()`) create flow step definitions. The executor walks the flow and uses the registry to instantiate handlers, which delegate to adapters, which delegate to the runner.
319
+
320
+ For programmatic use outside flows, `invoke(provider, prompt, workdir)` in `src/providers/invoke.ts` offers one-shot non-interactive provider invocation — resolve provider, spawn PTY, detect completion, return response text.
321
+
322
+ ### Artifact system
323
+
324
+ Steps declare what they read and write via `reads` and `writes` mappings (e.g. `reads: { task: "task", verdict: "verdict" }`). Data flows through a shared in-memory `ArtifactStore` — a `Map<string, Artifact>` where each artifact can carry:
325
+
326
+ - `file` — path to an artifact file on disk (in the session temp directory)
327
+ - `text` — human-readable content
328
+ - `data` — parsed structured data (for predicates to inspect programmatically)
329
+ - `meta` — metadata (e.g. source, version)
330
+
331
+ ## Adding a provider
332
+
333
+ 1. Implement `ProviderStrategy`, `SessionHandler`, and `CompletionDetector` (see `src/providers/types.ts`)
334
+ 2. Register the provider strategy with each role module:
335
+
336
+ ```ts
337
+ import * as planners from "./agents/planners/index.js";
338
+ import * as reviewers from "./agents/reviewers/index.js";
339
+ import * as implementors from "./agents/implementors/index.js";
340
+ import * as simplifiers from "./agents/simplifiers/index.js";
341
+
342
+ const myProvider = new MyStrategy();
343
+ planners.registerProvider("my-cli", myProvider);
344
+ reviewers.registerProvider("my-cli", myProvider);
345
+ implementors.registerProvider("my-cli", myProvider);
346
+ simplifiers.registerProvider("my-cli", myProvider);
347
+ ```
348
+
349
+ ## Adding a role
350
+
351
+ 1. Create six files in `src/agents/<role>/`:
352
+
353
+ | File | Purpose |
354
+ |------|---------|
355
+ | `types.ts` | Driver interface, run options, and result types |
356
+ | `prompts.ts` | Role-specific prompt builders and prompt sets |
357
+ | `adapter.ts` | Extends `BaseAdapter`; bridges the driver to `AgentRunner` via prompt selection |
358
+ | `handler.ts` | Implements `RoleHandler`; orchestrates artifacts, retry, and session state |
359
+ | `dsl.ts` | DSL helper (e.g. `myRole()`) that wraps `agentStep()` with role defaults |
360
+ | `index.ts` | Module entry — calls `createRoleModule()`, exports DSL helper and `registerProvider` |
361
+
362
+ 2. Wire the role into the system (2 edits):
363
+ - **`src/agents/index.ts`** — add a side-effect import (`import "./<role>/index.js"`) and re-export the DSL helper
364
+ - **`src/flow/types.ts`** — add the role name to the `BuiltinRole` union
365
+
366
+ 3. Use the DSL helper in a flow:
367
+
368
+ ```ts
369
+ import { myRole } from "./agents/index.js";
370
+
371
+ const steps = [
372
+ myRole({ driver: "claude", reads: { task: "task" }, writes: { output: "result" } }),
373
+ ];
374
+ ```
375
+
376
+ ## Development
377
+
378
+ ```bash
379
+ npm run build # Compile TypeScript
380
+ npm run dev # Run via tsx (no build step)
381
+ npm test # Run unit tests (vitest)
382
+ npm run test:e2e # Run end-to-end tests
383
+ npm run typecheck # Type-check without emitting
384
+ ```
385
+
386
+ ## License
387
+
388
+ [MIT](LICENSE)
@@ -0,0 +1,18 @@
1
+ import type { ImplementorDriver, ImplementResult, ImplementorPromptSet } from "./types.js";
2
+ import type { StepMeta } from "../../flow/types.js";
3
+ import type { ProviderStrategy } from "../../providers/types.js";
4
+ import { BaseAdapter } from "../runner.js";
5
+ type ImplementorRunOptions = {
6
+ resumeSessionId?: string;
7
+ feedbackFile?: string;
8
+ producers?: Record<string, StepMeta>;
9
+ consumers?: Record<string, StepMeta[]>;
10
+ };
11
+ export declare function selectImplementorPrompt(planFile: string, opts: ImplementorRunOptions, prompts?: ImplementorPromptSet): string;
12
+ export declare class ImplementorAdapter extends BaseAdapter implements ImplementorDriver {
13
+ private readonly prompts?;
14
+ constructor(strategy: ProviderStrategy, workdir: string, prompts?: ImplementorPromptSet | undefined, yolo?: boolean);
15
+ run(planFile: string, opts?: ImplementorRunOptions): Promise<ImplementResult>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/implementors/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C,KAAK,qBAAqB,GAAG;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,GAAE,oBAAgD,GACxD,MAAM,CAQR;AAED,qBAAa,kBAAmB,SAAQ,WAAY,YAAW,iBAAiB;IAI5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAFzB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACE,OAAO,CAAC,EAAE,oBAAoB,YAAA,EAC/C,IAAI,CAAC,EAAE,OAAO;IAKV,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,eAAe,CAAC;CAiB5B"}
@@ -0,0 +1,36 @@
1
+ import { BaseAdapter } from "../runner.js";
2
+ import { buildAgentWhipHint } from "../whip-hint.js";
3
+ import { defaultImplementorPrompts } from "./prompts.js";
4
+ export function selectImplementorPrompt(planFile, opts, prompts = defaultImplementorPrompts) {
5
+ if (opts.feedbackFile) {
6
+ if (opts.resumeSessionId) {
7
+ return prompts.resumeRevision(opts.feedbackFile);
8
+ }
9
+ return prompts.revision(planFile, opts.feedbackFile);
10
+ }
11
+ return prompts.initial(planFile);
12
+ }
13
+ export class ImplementorAdapter extends BaseAdapter {
14
+ prompts;
15
+ constructor(strategy, workdir, prompts, yolo) {
16
+ super(strategy, workdir, yolo);
17
+ this.prompts = prompts;
18
+ }
19
+ async run(planFile, opts = {}) {
20
+ const rawPrompt = selectImplementorPrompt(planFile, opts, this.prompts);
21
+ const hint = buildAgentWhipHint(this.strategy.name, opts, "implementation");
22
+ const prompt = this.applyWhipHint(hint, rawPrompt);
23
+ const result = await this.runAgent({
24
+ prompt,
25
+ workdir: this.workdir,
26
+ resumeSessionId: opts.resumeSessionId,
27
+ sessionFilePath: this.sessionFilePath,
28
+ });
29
+ return {
30
+ sessionId: result.sessionId,
31
+ rawText: result.responseText,
32
+ agentUsed: this.name,
33
+ };
34
+ }
35
+ }
36
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/agents/implementors/adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AASzD,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,IAA2B,EAC3B,UAAgC,yBAAyB;IAEzD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IAI9B;IAHnB,YACE,QAA0B,EAC1B,OAAe,EACE,OAA8B,EAC/C,IAAc;QAEd,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAHd,YAAO,GAAP,OAAO,CAAuB;IAIjD,CAAC;IAED,KAAK,CAAC,GAAG,CACP,QAAgB,EAChB,OAA8B,EAAE;QAEhC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YACjC,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,YAAY;YAC5B,SAAS,EAAE,IAAI,CAAC,IAAI;SACrB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { type PhaseLabelSpec } from "../../flow/dsl.js";
2
+ import type { AgentStep } from "../../flow/types.js";
3
+ export declare function implement(opts: {
4
+ driver: string;
5
+ reads: Record<string, string>;
6
+ writes?: Record<string, string>;
7
+ id?: string;
8
+ feedbackToTask?: boolean;
9
+ phaseLabel?: PhaseLabelSpec;
10
+ }): AgentStep;
11
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../../src/agents/implementors/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B,GAAG,SAAS,CAMZ"}
@@ -0,0 +1,9 @@
1
+ import { agentStep } from "../../flow/dsl.js";
2
+ export function implement(opts) {
3
+ return agentStep("implementor", {
4
+ feedbackToTask: false,
5
+ idPrefix: "implement",
6
+ phaseLabel: "🔨 Implementing...",
7
+ }, opts);
8
+ }
9
+ //# sourceMappingURL=dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../../src/agents/implementors/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,mBAAmB,CAAC;AAGnE,MAAM,UAAU,SAAS,CAAC,IAOzB;IACC,OAAO,SAAS,CAAC,aAAa,EAAE;QAC9B,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,WAAW;QACrB,UAAU,EAAE,oBAAoB;KACjC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ImplementorDriver } from "./types.js";
2
+ import { type BaseStep, type StepContext, type StepSignal, type RetryFn, type RoleHandler } from "../../flow/types.js";
3
+ export declare class ImplementorRoleHandler implements RoleHandler {
4
+ private driver;
5
+ /** Tracks the last execution mode per step ID for session invalidation. */
6
+ private lastModeByStep;
7
+ constructor(driver: ImplementorDriver);
8
+ execute(step: BaseStep, ctx: StepContext, retry: RetryFn): Promise<StepSignal>;
9
+ }
10
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/agents/implementors/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,sBAAuB,YAAW,WAAW;IAI5C,OAAO,CAAC,MAAM;IAH1B,2EAA2E;IAC3E,OAAO,CAAC,cAAc,CAA+C;gBAEjD,MAAM,EAAE,iBAAiB;IAEvC,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC;CAqDvB"}
@@ -0,0 +1,55 @@
1
+ import { resolveWhipNeighbors, } from "../../flow/types.js";
2
+ export class ImplementorRoleHandler {
3
+ driver;
4
+ /** Tracks the last execution mode per step ID for session invalidation. */
5
+ lastModeByStep = new Map();
6
+ constructor(driver) {
7
+ this.driver = driver;
8
+ }
9
+ async execute(step, ctx, retry) {
10
+ // Check for revise-plan (pure plan follower mode)
11
+ const revisePlanFile = step.reads.revisePlan
12
+ ? ctx.artifacts.getFile(step.reads.revisePlan)
13
+ : undefined;
14
+ const currentMode = revisePlanFile ? "revise-plan" : "normal";
15
+ const lastMode = this.lastModeByStep.get(step.id);
16
+ let planFile;
17
+ let feedbackFile;
18
+ let resumeSessionId;
19
+ if (revisePlanFile) {
20
+ // Pure plan follower: revise-plan only, no verdict, fresh session.
21
+ planFile = revisePlanFile;
22
+ feedbackFile = undefined;
23
+ resumeSessionId = undefined;
24
+ }
25
+ else {
26
+ // Normal mode: original plan + verdict feedback
27
+ const basePlanFile = ctx.artifacts.getFile(step.reads.plan);
28
+ if (!basePlanFile)
29
+ throw new Error("ImplementorRoleHandler: plan artifact missing");
30
+ planFile = basePlanFile;
31
+ const verdictArtifact = step.reads.verdict
32
+ ? ctx.artifacts.get(step.reads.verdict) : undefined;
33
+ feedbackFile = verdictArtifact?.file;
34
+ // Resume only if previous invocation was also in normal mode (or first time).
35
+ resumeSessionId = (lastMode === undefined || lastMode === "normal")
36
+ ? ctx.sessionIds.get(step.id)
37
+ : undefined;
38
+ }
39
+ const { producers, consumers } = resolveWhipNeighbors(step, ctx);
40
+ const implResult = await retry("implementor", async (attempt) => {
41
+ return this.driver.run(planFile, {
42
+ resumeSessionId: attempt === 1 ? resumeSessionId : undefined,
43
+ feedbackFile: feedbackFile ?? undefined,
44
+ producers,
45
+ consumers,
46
+ });
47
+ });
48
+ this.lastModeByStep.set(step.id, currentMode);
49
+ if (implResult.sessionId) {
50
+ ctx.sessionIds.set(step.id, implResult.sessionId);
51
+ }
52
+ return { kind: "continue" };
53
+ }
54
+ }
55
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/agents/implementors/handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,GAMrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,sBAAsB;IAIb;IAHpB,2EAA2E;IACnE,cAAc,GAAG,IAAI,GAAG,EAAoC,CAAC;IAErE,YAAoB,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAO,CACX,IAAc,EACd,GAAgB,EAChB,KAAc;QAEd,kDAAkD;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;YAC1C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,WAAW,GACf,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElD,IAAI,QAAgB,CAAC;QACrB,IAAI,YAAgC,CAAC;QACrC,IAAI,eAAmC,CAAC;QAExC,IAAI,cAAc,EAAE,CAAC;YACnB,mEAAmE;YACnE,QAAQ,GAAG,cAAc,CAAC;YAC1B,YAAY,GAAG,SAAS,CAAC;YACzB,eAAe,GAAG,SAAS,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACpF,QAAQ,GAAG,YAAY,CAAC;YACxB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;gBACxC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,YAAY,GAAG,eAAe,EAAE,IAAI,CAAC;YAErC,8EAA8E;YAC9E,eAAe,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,CAAC;gBACjE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC/B,eAAe,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;gBAC5D,YAAY,EAAE,YAAY,IAAI,SAAS;gBACvC,SAAS;gBACT,SAAS;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9C,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderStrategy } from "../../providers/types.js";
2
+ import type { ImplementorDriver, ImplementorPromptSet } from "./types.js";
3
+ import type { DriverName } from "../../flow/types.js";
4
+ export { implement } from "./dsl.js";
5
+ export { ImplementorRoleHandler } from "./handler.js";
6
+ export type { ImplementorDriver, ImplementorPromptSet } from "./types.js";
7
+ export type ImplementorFactory = (workdir: string, prompts?: ImplementorPromptSet) => ImplementorDriver;
8
+ export declare const registerProvider: (name: DriverName, strategy: ProviderStrategy) => void;
9
+ export declare const registerFactory: (name: string, factory: ImplementorFactory) => void, availableDrivers: () => string[];
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/implementors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,iBAAiB,CAAC;AAexG,eAAO,MAAM,gBAAgB,EAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAC/G,eAAO,MAAQ,eAAe,uDAAE,gBAAgB,gBAAQ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { ImplementorAdapter } from "./adapter.js";
2
+ import { ImplementorRoleHandler } from "./handler.js";
3
+ import { createRoleModule } from "../registry.js";
4
+ import { minimalImplementorPrompts } from "./prompts.js";
5
+ export { implement } from "./dsl.js";
6
+ export { ImplementorRoleHandler } from "./handler.js";
7
+ const mod = createRoleModule({
8
+ roleName: "implementor",
9
+ fromFactory: (factory, workdir, opts) => {
10
+ const prompts = opts?.opinionless ? minimalImplementorPrompts : undefined;
11
+ return factory(workdir, prompts);
12
+ },
13
+ fromProvider: (strategy, workdir, opts) => {
14
+ const prompts = opts?.opinionless ? minimalImplementorPrompts : undefined;
15
+ return new ImplementorAdapter(strategy, workdir, prompts, opts?.yolo);
16
+ },
17
+ toHandler: (driver) => new ImplementorRoleHandler(driver),
18
+ });
19
+ export const registerProvider = mod.registerProvider;
20
+ export const { registerFactory, availableDrivers } = mod;
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/implementors/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAoB,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAKtD,MAAM,GAAG,GAAG,gBAAgB,CAAwC;IAClE,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,OAAO,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,OAAO,IAAI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IACD,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAA0E,CAAC;AAC/G,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ImplementorPromptSet } from "./types.js";
2
+ /**
3
+ * Build the initial implementor prompt.
4
+ */
5
+ export declare function buildImplementorPrompt(planFile: string): string;
6
+ /**
7
+ * Build the implementor revision prompt (when reviewer feedback was received).
8
+ */
9
+ export declare function buildImplementorRevisionPrompt(planFile: string, feedbackFile: string): string;
10
+ /**
11
+ * Build a lighter implementor revision prompt for resumed sessions.
12
+ * The agent already has task and plan context in-session.
13
+ */
14
+ export declare function buildImplementorResumeRevisionPrompt(feedbackFile: string): string;
15
+ export declare function buildMinimalImplementorPrompt(planFile: string): string;
16
+ export declare function buildMinimalImplementorRevisionPrompt(planFile: string, feedbackFile: string): string;
17
+ export declare function buildMinimalImplementorResumeRevisionPrompt(feedbackFile: string): string;
18
+ export declare const defaultImplementorPrompts: ImplementorPromptSet;
19
+ export declare const minimalImplementorPrompts: ImplementorPromptSet;
20
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/agents/implementors/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAClD,YAAY,EAAE,MAAM,GACnB,MAAM,CAOR;AAID,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAOR;AAED,wBAAgB,2CAA2C,CACzD,YAAY,EAAE,MAAM,GACnB,MAAM,CAMR;AAID,eAAO,MAAM,yBAAyB,EAAE,oBAIvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,oBAIvC,CAAC"}