@kenkaiiii/ggcoder 4.3.232 → 4.3.233

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 (348) hide show
  1. package/README.md +1 -2
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +7 -89
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +2 -2
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/prompt-commands.d.ts.map +1 -1
  9. package/dist/core/prompt-commands.js +8 -16
  10. package/dist/core/prompt-commands.js.map +1 -1
  11. package/dist/core/prompt-commands.test.js +14 -44
  12. package/dist/core/prompt-commands.test.js.map +1 -1
  13. package/dist/core/runtime-mode.d.ts +0 -11
  14. package/dist/core/runtime-mode.d.ts.map +1 -1
  15. package/dist/core/runtime-mode.js +0 -9
  16. package/dist/core/runtime-mode.js.map +1 -1
  17. package/dist/core/session-restore-display.test.js +4 -110
  18. package/dist/core/session-restore-display.test.js.map +1 -1
  19. package/dist/interactive.d.ts.map +1 -1
  20. package/dist/interactive.js +1 -1
  21. package/dist/interactive.js.map +1 -1
  22. package/dist/system-prompt.d.ts +1 -2
  23. package/dist/system-prompt.d.ts.map +1 -1
  24. package/dist/system-prompt.js +11 -58
  25. package/dist/system-prompt.js.map +1 -1
  26. package/dist/system-prompt.test.js +3 -158
  27. package/dist/system-prompt.test.js.map +1 -1
  28. package/dist/tools/bash.d.ts +1 -4
  29. package/dist/tools/bash.d.ts.map +1 -1
  30. package/dist/tools/bash.js +3 -12
  31. package/dist/tools/bash.js.map +1 -1
  32. package/dist/tools/checkpoint-hook.test.js +3 -3
  33. package/dist/tools/checkpoint-hook.test.js.map +1 -1
  34. package/dist/tools/edit.d.ts +1 -4
  35. package/dist/tools/edit.d.ts.map +1 -1
  36. package/dist/tools/edit.js +5 -13
  37. package/dist/tools/edit.js.map +1 -1
  38. package/dist/tools/enter-plan.js +1 -1
  39. package/dist/tools/enter-plan.js.map +1 -1
  40. package/dist/tools/index.d.ts +0 -9
  41. package/dist/tools/index.d.ts.map +1 -1
  42. package/dist/tools/index.js +4 -8
  43. package/dist/tools/index.js.map +1 -1
  44. package/dist/tools/prompt-hints.d.ts.map +1 -1
  45. package/dist/tools/prompt-hints.js +0 -2
  46. package/dist/tools/prompt-hints.js.map +1 -1
  47. package/dist/tools/screenshot.d.ts +1 -1
  48. package/dist/tools/subagent.d.ts +1 -4
  49. package/dist/tools/subagent.d.ts.map +1 -1
  50. package/dist/tools/subagent.js +2 -5
  51. package/dist/tools/subagent.js.map +1 -1
  52. package/dist/tools/write.d.ts +1 -4
  53. package/dist/tools/write.d.ts.map +1 -1
  54. package/dist/tools/write.js +5 -13
  55. package/dist/tools/write.js.map +1 -1
  56. package/dist/ui/App.d.ts +5 -20
  57. package/dist/ui/App.d.ts.map +1 -1
  58. package/dist/ui/App.js +71 -309
  59. package/dist/ui/App.js.map +1 -1
  60. package/dist/ui/app-items.d.ts +23 -25
  61. package/dist/ui/app-items.d.ts.map +1 -1
  62. package/dist/ui/app-items.js +37 -0
  63. package/dist/ui/app-items.js.map +1 -1
  64. package/dist/ui/app-items.test.d.ts +2 -0
  65. package/dist/ui/app-items.test.d.ts.map +1 -0
  66. package/dist/ui/app-items.test.js +38 -0
  67. package/dist/ui/app-items.test.js.map +1 -0
  68. package/dist/ui/app-state-persistence.test.js +14 -318
  69. package/dist/ui/app-state-persistence.test.js.map +1 -1
  70. package/dist/ui/chat-layout-pinning.test.js +74 -4
  71. package/dist/ui/chat-layout-pinning.test.js.map +1 -1
  72. package/dist/ui/components/AssistantMessage.test.js +6 -9
  73. package/dist/ui/components/AssistantMessage.test.js.map +1 -1
  74. package/dist/ui/components/Banner.js +1 -1
  75. package/dist/ui/components/Banner.js.map +1 -1
  76. package/dist/ui/components/ChatFooterPane.d.ts +1 -5
  77. package/dist/ui/components/ChatFooterPane.d.ts.map +1 -1
  78. package/dist/ui/components/ChatFooterPane.js +3 -4
  79. package/dist/ui/components/ChatFooterPane.js.map +1 -1
  80. package/dist/ui/components/ChatInputStack.d.ts +3 -1
  81. package/dist/ui/components/ChatInputStack.d.ts.map +1 -1
  82. package/dist/ui/components/ChatInputStack.js +4 -3
  83. package/dist/ui/components/ChatInputStack.js.map +1 -1
  84. package/dist/ui/components/ChatScreen.d.ts +3 -16
  85. package/dist/ui/components/ChatScreen.d.ts.map +1 -1
  86. package/dist/ui/components/ChatScreen.js +2 -3
  87. package/dist/ui/components/ChatScreen.js.map +1 -1
  88. package/dist/ui/components/Footer.d.ts +3 -8
  89. package/dist/ui/components/Footer.d.ts.map +1 -1
  90. package/dist/ui/components/Footer.js +5 -25
  91. package/dist/ui/components/Footer.js.map +1 -1
  92. package/dist/ui/components/InputArea.d.ts +1 -9
  93. package/dist/ui/components/InputArea.d.ts.map +1 -1
  94. package/dist/ui/components/InputArea.js +2 -44
  95. package/dist/ui/components/InputArea.js.map +1 -1
  96. package/dist/ui/components/LiveToolPanel.d.ts +30 -0
  97. package/dist/ui/components/LiveToolPanel.d.ts.map +1 -0
  98. package/dist/ui/components/LiveToolPanel.js +66 -0
  99. package/dist/ui/components/LiveToolPanel.js.map +1 -0
  100. package/dist/ui/components/ToolExecution.js +0 -2
  101. package/dist/ui/components/ToolExecution.js.map +1 -1
  102. package/dist/ui/components/TranscriptViewport.d.ts +1 -1
  103. package/dist/ui/components/TranscriptViewport.js +1 -1
  104. package/dist/ui/footer-jump-regression.test.js +12 -2
  105. package/dist/ui/footer-jump-regression.test.js.map +1 -1
  106. package/dist/ui/footer-status-layout.test.js +4 -12
  107. package/dist/ui/footer-status-layout.test.js.map +1 -1
  108. package/dist/ui/hooks/useChatLayoutMeasurements.d.ts +3 -4
  109. package/dist/ui/hooks/useChatLayoutMeasurements.d.ts.map +1 -1
  110. package/dist/ui/hooks/useChatLayoutMeasurements.js +26 -4
  111. package/dist/ui/hooks/useChatLayoutMeasurements.js.map +1 -1
  112. package/dist/ui/hooks/useModeState.d.ts +4 -19
  113. package/dist/ui/hooks/useModeState.d.ts.map +1 -1
  114. package/dist/ui/hooks/useModeState.js +5 -45
  115. package/dist/ui/hooks/useModeState.js.map +1 -1
  116. package/dist/ui/hooks/usePixelFixFlow.js +2 -2
  117. package/dist/ui/layout-decisions.d.ts +11 -34
  118. package/dist/ui/layout-decisions.d.ts.map +1 -1
  119. package/dist/ui/layout-decisions.js +15 -42
  120. package/dist/ui/layout-decisions.js.map +1 -1
  121. package/dist/ui/live-area-height.d.ts.map +1 -1
  122. package/dist/ui/live-area-height.js +6 -1
  123. package/dist/ui/live-area-height.js.map +1 -1
  124. package/dist/ui/live-frame-height.test.js +26 -1
  125. package/dist/ui/live-frame-height.test.js.map +1 -1
  126. package/dist/ui/plan-overlay.test.js +1 -1
  127. package/dist/ui/plan-overlay.test.js.map +1 -1
  128. package/dist/ui/prompt-routing.d.ts +1 -19
  129. package/dist/ui/prompt-routing.d.ts.map +1 -1
  130. package/dist/ui/prompt-routing.js +1 -79
  131. package/dist/ui/prompt-routing.js.map +1 -1
  132. package/dist/ui/render.d.ts +3 -18
  133. package/dist/ui/render.d.ts.map +1 -1
  134. package/dist/ui/render.js +0 -10
  135. package/dist/ui/render.js.map +1 -1
  136. package/dist/ui/scroll-stabilization.test.js +1 -7
  137. package/dist/ui/scroll-stabilization.test.js.map +1 -1
  138. package/dist/ui/slash-command-images.test.js +11 -86
  139. package/dist/ui/slash-command-images.test.js.map +1 -1
  140. package/dist/ui/streaming-flush-bounce.test.d.ts +2 -0
  141. package/dist/ui/streaming-flush-bounce.test.d.ts.map +1 -0
  142. package/dist/ui/streaming-flush-bounce.test.js +156 -0
  143. package/dist/ui/streaming-flush-bounce.test.js.map +1 -0
  144. package/dist/ui/submit-prompt-command.d.ts +1 -16
  145. package/dist/ui/submit-prompt-command.d.ts.map +1 -1
  146. package/dist/ui/submit-prompt-command.js +4 -54
  147. package/dist/ui/submit-prompt-command.js.map +1 -1
  148. package/dist/ui/submit-slash-commands.d.ts +0 -1
  149. package/dist/ui/submit-slash-commands.d.ts.map +1 -1
  150. package/dist/ui/submit-slash-commands.js +0 -4
  151. package/dist/ui/submit-slash-commands.js.map +1 -1
  152. package/dist/ui/terminal-history-status-renderers.d.ts +0 -1
  153. package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -1
  154. package/dist/ui/terminal-history-status-renderers.js +0 -3
  155. package/dist/ui/terminal-history-status-renderers.js.map +1 -1
  156. package/dist/ui/terminal-history.d.ts.map +1 -1
  157. package/dist/ui/terminal-history.js +11 -56
  158. package/dist/ui/terminal-history.js.map +1 -1
  159. package/dist/ui/terminal-history.test.js +6 -33
  160. package/dist/ui/terminal-history.test.js.map +1 -1
  161. package/dist/ui/tool-line-summary.d.ts +29 -0
  162. package/dist/ui/tool-line-summary.d.ts.map +1 -0
  163. package/dist/ui/tool-line-summary.js +153 -0
  164. package/dist/ui/tool-line-summary.js.map +1 -0
  165. package/dist/ui/transcript/TranscriptRenderer.d.ts +1 -1
  166. package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
  167. package/dist/ui/transcript/TranscriptRenderer.js +18 -12
  168. package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
  169. package/dist/ui/transcript/presentation.d.ts +1 -17
  170. package/dist/ui/transcript/presentation.d.ts.map +1 -1
  171. package/dist/ui/transcript/presentation.js +0 -26
  172. package/dist/ui/transcript/presentation.js.map +1 -1
  173. package/dist/ui/transcript/spacing.d.ts +2 -2
  174. package/dist/ui/transcript/spacing.d.ts.map +1 -1
  175. package/dist/ui/transcript/spacing.js +14 -9
  176. package/dist/ui/transcript/spacing.js.map +1 -1
  177. package/dist/ui/transcript/spacing.test.js +5 -8
  178. package/dist/ui/transcript/spacing.test.js.map +1 -1
  179. package/dist/ui/transcript/tool-presentation.js +1 -1
  180. package/dist/ui/transcript/tool-presentation.js.map +1 -1
  181. package/dist/ui/transcript/transcript-lines.d.ts.map +1 -1
  182. package/dist/ui/transcript/transcript-lines.js +4 -0
  183. package/dist/ui/transcript/transcript-lines.js.map +1 -1
  184. package/dist/ui/tui-history-parity.test.js +0 -47
  185. package/dist/ui/tui-history-parity.test.js.map +1 -1
  186. package/dist/ui/tui-simulation.test.js +2 -1
  187. package/dist/ui/tui-simulation.test.js.map +1 -1
  188. package/package.json +4 -4
  189. package/dist/core/goal-controller.d.ts +0 -82
  190. package/dist/core/goal-controller.d.ts.map +0 -1
  191. package/dist/core/goal-controller.js +0 -838
  192. package/dist/core/goal-controller.js.map +0 -1
  193. package/dist/core/goal-controller.test.d.ts +0 -2
  194. package/dist/core/goal-controller.test.d.ts.map +0 -1
  195. package/dist/core/goal-controller.test.js +0 -1279
  196. package/dist/core/goal-controller.test.js.map +0 -1
  197. package/dist/core/goal-engine.d.ts +0 -61
  198. package/dist/core/goal-engine.d.ts.map +0 -1
  199. package/dist/core/goal-engine.js +0 -123
  200. package/dist/core/goal-engine.js.map +0 -1
  201. package/dist/core/goal-engine.test.d.ts +0 -2
  202. package/dist/core/goal-engine.test.d.ts.map +0 -1
  203. package/dist/core/goal-engine.test.js +0 -295
  204. package/dist/core/goal-engine.test.js.map +0 -1
  205. package/dist/core/goal-integration.d.ts +0 -80
  206. package/dist/core/goal-integration.d.ts.map +0 -1
  207. package/dist/core/goal-integration.js +0 -296
  208. package/dist/core/goal-integration.js.map +0 -1
  209. package/dist/core/goal-integration.test.d.ts +0 -2
  210. package/dist/core/goal-integration.test.d.ts.map +0 -1
  211. package/dist/core/goal-integration.test.js +0 -369
  212. package/dist/core/goal-integration.test.js.map +0 -1
  213. package/dist/core/goal-lifecycle-smoke.test.d.ts +0 -2
  214. package/dist/core/goal-lifecycle-smoke.test.d.ts.map +0 -1
  215. package/dist/core/goal-lifecycle-smoke.test.js +0 -248
  216. package/dist/core/goal-lifecycle-smoke.test.js.map +0 -1
  217. package/dist/core/goal-overhead-harness.d.ts +0 -33
  218. package/dist/core/goal-overhead-harness.d.ts.map +0 -1
  219. package/dist/core/goal-overhead-harness.js +0 -268
  220. package/dist/core/goal-overhead-harness.js.map +0 -1
  221. package/dist/core/goal-prerequisites.d.ts +0 -23
  222. package/dist/core/goal-prerequisites.d.ts.map +0 -1
  223. package/dist/core/goal-prerequisites.js +0 -114
  224. package/dist/core/goal-prerequisites.js.map +0 -1
  225. package/dist/core/goal-prerequisites.test.d.ts +0 -2
  226. package/dist/core/goal-prerequisites.test.d.ts.map +0 -1
  227. package/dist/core/goal-prerequisites.test.js +0 -154
  228. package/dist/core/goal-prerequisites.test.js.map +0 -1
  229. package/dist/core/goal-references.d.ts +0 -14
  230. package/dist/core/goal-references.d.ts.map +0 -1
  231. package/dist/core/goal-references.js +0 -153
  232. package/dist/core/goal-references.js.map +0 -1
  233. package/dist/core/goal-references.test.d.ts +0 -2
  234. package/dist/core/goal-references.test.d.ts.map +0 -1
  235. package/dist/core/goal-references.test.js +0 -77
  236. package/dist/core/goal-references.test.js.map +0 -1
  237. package/dist/core/goal-store.d.ts +0 -289
  238. package/dist/core/goal-store.d.ts.map +0 -1
  239. package/dist/core/goal-store.js +0 -1156
  240. package/dist/core/goal-store.js.map +0 -1
  241. package/dist/core/goal-store.test.d.ts +0 -2
  242. package/dist/core/goal-store.test.d.ts.map +0 -1
  243. package/dist/core/goal-store.test.js +0 -530
  244. package/dist/core/goal-store.test.js.map +0 -1
  245. package/dist/core/goal-verifier.d.ts +0 -17
  246. package/dist/core/goal-verifier.d.ts.map +0 -1
  247. package/dist/core/goal-verifier.js +0 -87
  248. package/dist/core/goal-verifier.js.map +0 -1
  249. package/dist/core/goal-verifier.test.d.ts +0 -2
  250. package/dist/core/goal-verifier.test.d.ts.map +0 -1
  251. package/dist/core/goal-verifier.test.js +0 -131
  252. package/dist/core/goal-verifier.test.js.map +0 -1
  253. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts +0 -2
  254. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts.map +0 -1
  255. package/dist/core/goal-worker-dev-server-lifecycle.test.js +0 -68
  256. package/dist/core/goal-worker-dev-server-lifecycle.test.js.map +0 -1
  257. package/dist/core/goal-worker.d.ts +0 -61
  258. package/dist/core/goal-worker.d.ts.map +0 -1
  259. package/dist/core/goal-worker.js +0 -467
  260. package/dist/core/goal-worker.js.map +0 -1
  261. package/dist/core/goal-worker.test.d.ts +0 -2
  262. package/dist/core/goal-worker.test.d.ts.map +0 -1
  263. package/dist/core/goal-worker.test.js +0 -493
  264. package/dist/core/goal-worker.test.js.map +0 -1
  265. package/dist/core/goal-worktree.d.ts +0 -108
  266. package/dist/core/goal-worktree.d.ts.map +0 -1
  267. package/dist/core/goal-worktree.js +0 -300
  268. package/dist/core/goal-worktree.js.map +0 -1
  269. package/dist/core/goal-worktree.test.d.ts +0 -2
  270. package/dist/core/goal-worktree.test.d.ts.map +0 -1
  271. package/dist/core/goal-worktree.test.js +0 -448
  272. package/dist/core/goal-worktree.test.js.map +0 -1
  273. package/dist/tools/goal-mode.test.d.ts +0 -2
  274. package/dist/tools/goal-mode.test.d.ts.map +0 -1
  275. package/dist/tools/goal-mode.test.js +0 -121
  276. package/dist/tools/goal-mode.test.js.map +0 -1
  277. package/dist/tools/goals.d.ts +0 -143
  278. package/dist/tools/goals.d.ts.map +0 -1
  279. package/dist/tools/goals.js +0 -1038
  280. package/dist/tools/goals.js.map +0 -1
  281. package/dist/tools/goals.test.d.ts +0 -2
  282. package/dist/tools/goals.test.d.ts.map +0 -1
  283. package/dist/tools/goals.test.js +0 -1444
  284. package/dist/tools/goals.test.js.map +0 -1
  285. package/dist/ui/components/GoalOverlay.d.ts +0 -83
  286. package/dist/ui/components/GoalOverlay.d.ts.map +0 -1
  287. package/dist/ui/components/GoalOverlay.js +0 -710
  288. package/dist/ui/components/GoalOverlay.js.map +0 -1
  289. package/dist/ui/components/GoalPickerMenu.d.ts +0 -9
  290. package/dist/ui/components/GoalPickerMenu.d.ts.map +0 -1
  291. package/dist/ui/components/GoalPickerMenu.js +0 -37
  292. package/dist/ui/components/GoalPickerMenu.js.map +0 -1
  293. package/dist/ui/components/GoalStatusBar.d.ts +0 -26
  294. package/dist/ui/components/GoalStatusBar.d.ts.map +0 -1
  295. package/dist/ui/components/GoalStatusBar.js +0 -130
  296. package/dist/ui/components/GoalStatusBar.js.map +0 -1
  297. package/dist/ui/components/GoalStatusBar.test.d.ts +0 -2
  298. package/dist/ui/components/GoalStatusBar.test.d.ts.map +0 -1
  299. package/dist/ui/components/GoalStatusBar.test.js +0 -17
  300. package/dist/ui/components/GoalStatusBar.test.js.map +0 -1
  301. package/dist/ui/goal-events.d.ts +0 -125
  302. package/dist/ui/goal-events.d.ts.map +0 -1
  303. package/dist/ui/goal-events.js +0 -407
  304. package/dist/ui/goal-events.js.map +0 -1
  305. package/dist/ui/goal-events.test.d.ts +0 -2
  306. package/dist/ui/goal-events.test.d.ts.map +0 -1
  307. package/dist/ui/goal-events.test.js +0 -416
  308. package/dist/ui/goal-events.test.js.map +0 -1
  309. package/dist/ui/goal-lifecycle-orchestration.test.d.ts +0 -2
  310. package/dist/ui/goal-lifecycle-orchestration.test.d.ts.map +0 -1
  311. package/dist/ui/goal-lifecycle-orchestration.test.js +0 -555
  312. package/dist/ui/goal-lifecycle-orchestration.test.js.map +0 -1
  313. package/dist/ui/goal-overlay.test.d.ts +0 -2
  314. package/dist/ui/goal-overlay.test.d.ts.map +0 -1
  315. package/dist/ui/goal-overlay.test.js +0 -384
  316. package/dist/ui/goal-overlay.test.js.map +0 -1
  317. package/dist/ui/goal-progress.d.ts +0 -31
  318. package/dist/ui/goal-progress.d.ts.map +0 -1
  319. package/dist/ui/goal-progress.js +0 -149
  320. package/dist/ui/goal-progress.js.map +0 -1
  321. package/dist/ui/goal-run-helpers.d.ts +0 -12
  322. package/dist/ui/goal-run-helpers.d.ts.map +0 -1
  323. package/dist/ui/goal-run-helpers.js +0 -42
  324. package/dist/ui/goal-run-helpers.js.map +0 -1
  325. package/dist/ui/goal-status-bar.test.d.ts +0 -2
  326. package/dist/ui/goal-status-bar.test.d.ts.map +0 -1
  327. package/dist/ui/goal-status-bar.test.js +0 -174
  328. package/dist/ui/goal-status-bar.test.js.map +0 -1
  329. package/dist/ui/goal-summary.d.ts +0 -14
  330. package/dist/ui/goal-summary.d.ts.map +0 -1
  331. package/dist/ui/goal-summary.js +0 -194
  332. package/dist/ui/goal-summary.js.map +0 -1
  333. package/dist/ui/hooks/useGoalOrchestration.d.ts +0 -82
  334. package/dist/ui/hooks/useGoalOrchestration.d.ts.map +0 -1
  335. package/dist/ui/hooks/useGoalOrchestration.js +0 -863
  336. package/dist/ui/hooks/useGoalOrchestration.js.map +0 -1
  337. package/dist/ui/hooks/useGoalPickerController.d.ts +0 -22
  338. package/dist/ui/hooks/useGoalPickerController.d.ts.map +0 -1
  339. package/dist/ui/hooks/useGoalPickerController.js +0 -35
  340. package/dist/ui/hooks/useGoalPickerController.js.map +0 -1
  341. package/dist/ui/prompt-routing.test.d.ts +0 -2
  342. package/dist/ui/prompt-routing.test.d.ts.map +0 -1
  343. package/dist/ui/prompt-routing.test.js +0 -48
  344. package/dist/ui/prompt-routing.test.js.map +0 -1
  345. package/dist/ui/transcript/GoalRows.d.ts +0 -10
  346. package/dist/ui/transcript/GoalRows.d.ts.map +0 -1
  347. package/dist/ui/transcript/GoalRows.js +0 -35
  348. package/dist/ui/transcript/GoalRows.js.map +0 -1
@@ -1,369 +0,0 @@
1
- import { afterEach, describe, expect, it } from "vitest";
2
- import { execFile } from "node:child_process";
3
- import fs from "node:fs/promises";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { promisify } from "node:util";
7
- import { confirmAndCommitMainIntegration, integrableWorktreeTasks, discardStagedIntegration, fileMatchesScope, finalizeStagedIntegration, stageGoalIntegration, } from "./goal-integration.js";
8
- import { commitGoalWorkerCandidate, createGoalWorkerWorktree } from "./goal-worktree.js";
9
- const execFileAsync = promisify(execFile);
10
- function goalRun(overrides = {}) {
11
- return {
12
- id: "goal-int",
13
- title: "Integrate candidates",
14
- goal: "Apply accepted worktree candidates to main deterministically",
15
- status: "ready",
16
- createdAt: "2024-01-01T00:00:00.000Z",
17
- updatedAt: "2024-01-01T00:00:00.000Z",
18
- projectPath: "/main",
19
- successCriteria: [],
20
- prerequisites: [],
21
- harness: [],
22
- evidencePlan: [],
23
- tasks: [],
24
- evidence: [],
25
- blockers: [],
26
- ...overrides,
27
- };
28
- }
29
- function candidateTask(overrides = {}) {
30
- return {
31
- id: "task-a",
32
- title: "Implement core change",
33
- prompt: "Do work",
34
- status: "done",
35
- attempts: 1,
36
- integration: "candidate",
37
- expectedChangedScope: ["packages/ggcoder/src/core/**"],
38
- worktree: {
39
- baseRef: "base",
40
- branchName: "goal/goal-int/task-a",
41
- path: "/wt-a",
42
- status: "created",
43
- },
44
- candidate: {
45
- baseRef: "base",
46
- headSha: "cand-sha",
47
- branchName: "goal/goal-int/task-a",
48
- changedFiles: ["packages/ggcoder/src/core/foo.ts"],
49
- committed: true,
50
- },
51
- ...overrides,
52
- };
53
- }
54
- function makeRunner(handler) {
55
- const calls = [];
56
- const runner = {
57
- async execFile(_file, args, opts) {
58
- const call = { cwd: opts.cwd, args: [...args] };
59
- calls.push(call);
60
- const out = handler(call);
61
- if (out instanceof Error)
62
- throw out;
63
- return { stdout: out, stderr: "" };
64
- },
65
- };
66
- return { runner, calls };
67
- }
68
- describe("goal staged integration", () => {
69
- afterEach(() => {
70
- delete process.env.GG_GOAL_AUTO_INTEGRATE;
71
- });
72
- it("matches expected_changed_scope globs conservatively", () => {
73
- expect(fileMatchesScope("packages/ggcoder/src/core/x.ts", ["packages/ggcoder/src/core/**"])).toBe(true);
74
- expect(fileMatchesScope("packages/ggcoder/src/ui/x.ts", ["packages/ggcoder/src/core/**"])).toBe(false);
75
- expect(fileMatchesScope("src/a.ts", ["src/*.ts"])).toBe(true);
76
- expect(fileMatchesScope("src/nested/a.ts", ["src/*.ts"])).toBe(false);
77
- });
78
- it("integrates every non-manual worktree candidate", () => {
79
- const run = goalRun({
80
- tasks: [
81
- candidateTask({ id: "after-dep" }),
82
- candidateTask({ id: "parallel", integration: "candidate" }),
83
- candidateTask({ id: "serial", integration: "candidate" }),
84
- candidateTask({ id: "pending", status: "pending" }),
85
- candidateTask({ id: "manual", integration: "manual" }),
86
- candidateTask({ id: "no-wt", worktree: undefined }),
87
- // Read-only task (e.g. audit): worktree but no candidate changes -> excluded.
88
- candidateTask({ id: "readonly", candidate: undefined }),
89
- ],
90
- });
91
- expect(integrableWorktreeTasks(run)
92
- .map((t) => t.id)
93
- .sort()).toEqual(["after-dep", "parallel", "serial"]);
94
- });
95
- it("stages an eligible typed candidate on a throwaway branch without touching main", () => {
96
- const { runner, calls } = makeRunner(({ args }) => {
97
- if (args[0] === "status")
98
- return ""; // main clean
99
- if (args[0] === "rev-parse")
100
- return "mainbase";
101
- if (args.includes("cherry-pick"))
102
- return "";
103
- return "";
104
- });
105
- return stageGoalIntegration({
106
- projectPath: "/main",
107
- run: goalRun({ tasks: [candidateTask()] }),
108
- stagingRoot: "/stage",
109
- commandRunner: runner,
110
- }).then((out) => {
111
- expect(out).toMatchObject({
112
- status: "staged",
113
- stagingBranch: "goal/goal-int/integration",
114
- mainBase: "mainbase",
115
- integratedTaskIds: ["task-a"],
116
- changedFiles: ["packages/ggcoder/src/core/foo.ts"],
117
- });
118
- // Built a staging worktree and cherry-picked there; main never modified.
119
- expect(calls.some((c) => c.args[0] === "worktree" && c.args[1] === "add")).toBe(true);
120
- expect(calls.some((c) => c.args.includes("cherry-pick"))).toBe(true);
121
- expect(calls.some((c) => c.args[0] === "merge")).toBe(false);
122
- // No archaeology on the candidate worktree (typed packet used).
123
- expect(calls.some((c) => c.cwd === "/wt-a")).toBe(false);
124
- });
125
- });
126
- it("falls back when the main checkout is dirty", async () => {
127
- const { runner, calls } = makeRunner(({ args }) => args[0] === "status" ? " M packages/ggcoder/src/core/foo.ts" : "");
128
- const out = await stageGoalIntegration({
129
- projectPath: "/main",
130
- run: goalRun({ tasks: [candidateTask()] }),
131
- commandRunner: runner,
132
- });
133
- expect(out.status).toBe("fallback");
134
- expect(calls.some((c) => c.args[0] === "worktree" && c.args[1] === "add")).toBe(false);
135
- });
136
- it("falls back when a candidate changes files outside its scope", async () => {
137
- const { runner } = makeRunner(({ args }) => (args[0] === "rev-parse" ? "mainbase" : ""));
138
- const out = await stageGoalIntegration({
139
- projectPath: "/main",
140
- run: goalRun({
141
- tasks: [candidateTask({ expectedChangedScope: ["packages/ggcoder/src/ui/**"] })],
142
- }),
143
- commandRunner: runner,
144
- });
145
- expect(out.status).toBe("fallback");
146
- expect(out.status === "fallback" && out.reason).toContain("outside expected_changed_scope");
147
- });
148
- it("falls back when a candidate has no expected_changed_scope", async () => {
149
- const { runner } = makeRunner(() => "");
150
- const out = await stageGoalIntegration({
151
- projectPath: "/main",
152
- run: goalRun({ tasks: [candidateTask({ expectedChangedScope: [] })] }),
153
- commandRunner: runner,
154
- });
155
- expect(out.status).toBe("fallback");
156
- });
157
- it("falls back when candidates overlap on the same file", async () => {
158
- const { runner } = makeRunner(({ args }) => (args[0] === "rev-parse" ? "mainbase" : ""));
159
- const out = await stageGoalIntegration({
160
- projectPath: "/main",
161
- run: goalRun({
162
- tasks: [
163
- candidateTask({ id: "task-a" }),
164
- candidateTask({
165
- id: "task-b",
166
- worktree: { baseRef: "base", branchName: "b-b", path: "/wt-b", status: "created" },
167
- candidate: {
168
- baseRef: "base",
169
- headSha: "cand-b",
170
- branchName: "b-b",
171
- changedFiles: ["packages/ggcoder/src/core/foo.ts"],
172
- committed: true,
173
- },
174
- }),
175
- ],
176
- }),
177
- commandRunner: runner,
178
- });
179
- expect(out.status).toBe("fallback");
180
- expect(out.status === "fallback" && out.reason).toContain("overlap");
181
- });
182
- it("aborts and cleans up staging on a cherry-pick conflict", async () => {
183
- const { runner, calls } = makeRunner(({ args }) => {
184
- if (args[0] === "status")
185
- return "";
186
- if (args[0] === "rev-parse")
187
- return "mainbase";
188
- if (args.includes("cherry-pick") && !args.includes("--abort"))
189
- return new Error("CONFLICT");
190
- return "";
191
- });
192
- const out = await stageGoalIntegration({
193
- projectPath: "/main",
194
- run: goalRun({ tasks: [candidateTask()] }),
195
- stagingRoot: "/stage",
196
- commandRunner: runner,
197
- });
198
- expect(out.status).toBe("fallback");
199
- expect(calls.some((c) => c.args.includes("cherry-pick") && c.args.includes("--abort"))).toBe(true);
200
- expect(calls.some((c) => c.args[0] === "worktree" && c.args[1] === "remove")).toBe(true);
201
- });
202
- it("is a noop when there are no candidate worktree tasks", async () => {
203
- const { runner, calls } = makeRunner(() => "");
204
- const out = await stageGoalIntegration({
205
- projectPath: "/main",
206
- run: goalRun({ tasks: [candidateTask({ integration: "manual" })] }),
207
- commandRunner: runner,
208
- });
209
- expect(out.status).toBe("noop");
210
- expect(calls).toHaveLength(0);
211
- });
212
- it("is disabled via GG_GOAL_AUTO_INTEGRATE=0", async () => {
213
- process.env.GG_GOAL_AUTO_INTEGRATE = "0";
214
- const { runner, calls } = makeRunner(() => "");
215
- const out = await stageGoalIntegration({
216
- projectPath: "/main",
217
- run: goalRun({ tasks: [candidateTask()] }),
218
- commandRunner: runner,
219
- });
220
- expect(out.status).toBe("fallback");
221
- expect(out.status === "fallback" && out.reason).toContain("GG_GOAL_AUTO_INTEGRATE=0");
222
- expect(calls).toHaveLength(0);
223
- });
224
- });
225
- describe("goal staged integration (real git)", () => {
226
- let tmp;
227
- let main;
228
- async function git(cwd, args) {
229
- const { stdout } = await execFileAsync("git", args, { cwd });
230
- return stdout.trim();
231
- }
232
- async function setupRepoWithCandidate() {
233
- tmp = await fs.mkdtemp(path.join(os.tmpdir(), "goal-staged-real-"));
234
- main = path.join(tmp, "main");
235
- await fs.mkdir(main, { recursive: true });
236
- await git(main, ["init", "-b", "main"]);
237
- await git(main, ["config", "user.email", "goal@test.local"]);
238
- await git(main, ["config", "user.name", "Goal Test"]);
239
- await fs.mkdir(path.join(main, "src"), { recursive: true });
240
- await fs.writeFile(path.join(main, "src/app.ts"), "export const v = 1;\n", "utf-8");
241
- await git(main, ["add", "-A"]);
242
- await git(main, ["commit", "-m", "base"]);
243
- const baseRef = await git(main, ["rev-parse", "HEAD"]);
244
- const worktree = await createGoalWorkerWorktree({
245
- projectPath: main,
246
- goalRunId: "goal-real",
247
- goalTaskId: "task-a",
248
- workerId: "w1",
249
- baseRef,
250
- worktreesRoot: path.join(tmp, "worktrees"),
251
- });
252
- await fs.writeFile(path.join(worktree.path, "src/app.ts"), "export const v = 2;\n", "utf-8");
253
- const candidate = await commitGoalWorkerCandidate({
254
- worktreePath: worktree.path,
255
- branchName: worktree.branchName,
256
- baseRef: worktree.baseRef,
257
- message: "goal(goal-real): candidate task-a",
258
- });
259
- const run = goalRun({
260
- id: "goal-real",
261
- projectPath: main,
262
- tasks: [
263
- candidateTask({
264
- id: "task-a",
265
- expectedChangedScope: ["src/**"],
266
- worktree: {
267
- baseRef,
268
- branchName: worktree.branchName,
269
- path: worktree.path,
270
- status: "created",
271
- },
272
- ...(candidate ? { candidate } : {}),
273
- }),
274
- ],
275
- });
276
- const staging = await stageGoalIntegration({
277
- projectPath: main,
278
- run,
279
- stagingRoot: path.join(tmp, "staging"),
280
- });
281
- return { baseRef, run, staging };
282
- }
283
- afterEach(async () => {
284
- if (tmp)
285
- await fs.rm(tmp, { recursive: true, force: true });
286
- });
287
- it("stages, verifies-then-fast-forwards main only on success", async () => {
288
- const { baseRef, staging } = await setupRepoWithCandidate();
289
- expect(staging.status).toBe("staged");
290
- // Staging built; main NOT yet advanced.
291
- expect(await git(main, ["rev-parse", "HEAD"])).toBe(baseRef);
292
- expect(await fs.readFile(path.join(main, "src/app.ts"), "utf-8")).toBe("export const v = 1;\n");
293
- if (staging.status !== "staged")
294
- throw new Error("expected staged");
295
- const { commitSha } = await finalizeStagedIntegration({ projectPath: main, staging });
296
- // After a green fast-forward, main holds the verified change.
297
- expect(await git(main, ["rev-parse", "HEAD"])).toBe(commitSha);
298
- expect(commitSha).not.toBe(baseRef);
299
- expect(await fs.readFile(path.join(main, "src/app.ts"), "utf-8")).toBe("export const v = 2;\n");
300
- // Staging branch is cleaned up.
301
- expect(await git(main, ["branch", "--list", staging.stagingBranch])).toBe("");
302
- });
303
- it("discards the staging and leaves main untouched on failure", async () => {
304
- const { baseRef, staging } = await setupRepoWithCandidate();
305
- expect(staging.status).toBe("staged");
306
- if (staging.status !== "staged")
307
- throw new Error("expected staged");
308
- await discardStagedIntegration({ projectPath: main, staging });
309
- // Main is exactly where it started; no unverified changes leaked in.
310
- expect(await git(main, ["rev-parse", "HEAD"])).toBe(baseRef);
311
- expect(await fs.readFile(path.join(main, "src/app.ts"), "utf-8")).toBe("export const v = 1;\n");
312
- expect(await git(main, ["branch", "--list", staging.stagingBranch])).toBe("");
313
- });
314
- async function freshRepo() {
315
- tmp = await fs.mkdtemp(path.join(os.tmpdir(), "goal-confirm-real-"));
316
- main = path.join(tmp, "main");
317
- await fs.mkdir(main, { recursive: true });
318
- await git(main, ["init", "-b", "main"]);
319
- await git(main, ["config", "user.email", "e2e@test.local"]);
320
- await git(main, ["config", "user.name", "E2E"]);
321
- await fs.writeFile(path.join(main, "a.txt"), "v1\n", "utf-8");
322
- await git(main, ["add", "-A"]);
323
- await git(main, ["commit", "-m", "base"]);
324
- return git(main, ["rev-parse", "HEAD"]);
325
- }
326
- it("commits an apply worker's uncommitted changes and confirms main advanced", async () => {
327
- const baseRef = await freshRepo();
328
- // Simulate an LLM apply worker that edited main but did NOT commit.
329
- await fs.writeFile(path.join(main, "a.txt"), "v2\n", "utf-8");
330
- const result = await confirmAndCommitMainIntegration({
331
- projectPath: main,
332
- baseRef,
333
- message: "goal(g): commit integrated changes",
334
- });
335
- expect(result.applied).toBe(true);
336
- expect(result.committed).toBe(true);
337
- expect(result.files).toEqual(["a.txt"]);
338
- expect(result.sha).not.toBe(baseRef);
339
- // Main is now clean and committed.
340
- expect(await git(main, ["status", "--porcelain"])).toBe("");
341
- expect(await git(main, ["rev-parse", "HEAD"])).toBe(result.sha);
342
- });
343
- it("confirms applied when the apply worker already committed (nothing to commit)", async () => {
344
- const baseRef = await freshRepo();
345
- await fs.writeFile(path.join(main, "a.txt"), "v2\n", "utf-8");
346
- await git(main, ["add", "-A"]);
347
- await git(main, ["commit", "-m", "worker already committed"]);
348
- const result = await confirmAndCommitMainIntegration({
349
- projectPath: main,
350
- baseRef,
351
- message: "goal(g): commit integrated changes",
352
- });
353
- expect(result.applied).toBe(true);
354
- expect(result.committed).toBe(false); // nothing left to commit
355
- expect(result.files).toEqual(["a.txt"]);
356
- });
357
- it("reports not-applied when main is unchanged versus the base", async () => {
358
- const baseRef = await freshRepo();
359
- const result = await confirmAndCommitMainIntegration({
360
- projectPath: main,
361
- baseRef,
362
- message: "goal(g): commit integrated changes",
363
- });
364
- expect(result.applied).toBe(false);
365
- expect(result.committed).toBe(false);
366
- expect(result.files).toEqual([]);
367
- });
368
- });
369
- //# sourceMappingURL=goal-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"goal-integration.test.js","sourceRoot":"","sources":["../../src/core/goal-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=goal-lifecycle-smoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"goal-lifecycle-smoke.test.d.ts","sourceRoot":"","sources":["../../src/core/goal-lifecycle-smoke.test.ts"],"names":[],"mappings":""}
@@ -1,248 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
- import fs from "node:fs/promises";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { decideGoalNextAction, canCompleteGoalRun } from "./goal-controller.js";
6
- import { getGoalRun, loadGoalRuns } from "./goal-store.js";
7
- import { createGoalsTool } from "../tools/goals.js";
8
- let tmpBase;
9
- let tmpProject;
10
- async function goals(args) {
11
- return createGoalsTool(tmpProject).execute(args, {
12
- signal: new AbortController().signal,
13
- toolCallId: "goal-lifecycle-smoke",
14
- });
15
- }
16
- async function run() {
17
- const current = await getGoalRun(tmpProject, "smoke-goal");
18
- expect(current, "smoke goal should be persisted before inspection").toBeTruthy();
19
- return current;
20
- }
21
- beforeEach(async () => {
22
- tmpBase = await fs.mkdtemp(path.join(os.tmpdir(), "goal-lifecycle-smoke-base-"));
23
- tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "goal-lifecycle-smoke-project-"));
24
- process.env.GG_GOALS_BASE = tmpBase;
25
- });
26
- afterEach(async () => {
27
- delete process.env.GG_GOALS_BASE;
28
- await fs.rm(tmpBase, { recursive: true, force: true });
29
- await fs.rm(tmpProject, { recursive: true, force: true });
30
- });
31
- describe("goal lifecycle smoke", () => {
32
- it("persists and drives a mini Goal lifecycle from planned proof through corrective verification to completion", async () => {
33
- await goals({
34
- action: "create",
35
- run_id: "smoke-goal",
36
- title: "Lifecycle smoke",
37
- goal: "Prove deterministic Goal lifecycle behavior in local temp storage",
38
- success_criteria: [
39
- "pending task completes",
40
- "verifier failure produces repair",
41
- "verifier pass gates completion",
42
- ],
43
- prerequisites: [
44
- { id: "local", label: "Local temp project", status: "met", evidence: tmpProject },
45
- ],
46
- harness: [
47
- {
48
- id: "local-harness",
49
- label: "Local smoke harness",
50
- command: "node ./scripts/goal-smoke.js",
51
- path: "scripts/goal-smoke.js",
52
- description: "Temp-only deterministic smoke harness metadata",
53
- },
54
- ],
55
- evidence_plan: [
56
- {
57
- id: "state-proof",
58
- label: "Persisted state proof",
59
- mechanism: "test",
60
- description: "Vitest asserts transitions and JSON persistence",
61
- status: "planned",
62
- command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
63
- path: "packages/ggcoder/src/core/goal-lifecycle-smoke.test.ts",
64
- },
65
- ],
66
- verifier_command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
67
- verifier_description: "Focused local Vitest lifecycle smoke",
68
- });
69
- await goals({
70
- action: "task",
71
- run_id: "smoke-goal",
72
- task_id: "implement-smoke",
73
- task_title: "Implement smoke target",
74
- task_prompt: "Create the local smoke target and persist evidence.",
75
- task_status: "pending",
76
- });
77
- let persisted = await run();
78
- expect(decideGoalNextAction(persisted)).toMatchObject({ kind: "start_worker", attempts: 1 });
79
- expect(persisted.harness).toEqual([
80
- expect.objectContaining({ id: "local-harness", command: expect.any(String) }),
81
- ]);
82
- expect(persisted.evidencePlan).toEqual([
83
- expect.objectContaining({ id: "state-proof", status: "planned" }),
84
- ]);
85
- expect((await loadGoalRuns(tmpProject)).map((item) => item.id)).toContain("smoke-goal");
86
- await goals({
87
- action: "task",
88
- run_id: "smoke-goal",
89
- task_id: "implement-smoke",
90
- task_title: "Implement smoke target",
91
- task_prompt: "Create the local smoke target and persist evidence.",
92
- task_status: "done",
93
- attempts: 1,
94
- summary: "Initial task done with local fixture evidence.",
95
- });
96
- await goals({
97
- action: "evidence",
98
- run_id: "smoke-goal",
99
- evidence_kind: "file",
100
- evidence_label: "Local fixture artifact",
101
- evidence_path: "tmp/goal-smoke-fixture.json",
102
- evidence_content: "fixture persisted in temp-only smoke flow",
103
- });
104
- persisted = await run();
105
- expect(decideGoalNextAction(persisted)).toMatchObject({
106
- kind: "create_task",
107
- title: "Build Goal evidence path",
108
- reason: "Goal evidence plan requires local instrumentation or exact prerequisite handling before verification.",
109
- });
110
- await goals({
111
- action: "evidence_plan",
112
- run_id: "smoke-goal",
113
- evidence_plan_item_id: "state-proof",
114
- evidence_plan_status: "ready",
115
- evidence_content: "This test inspects persisted Goal state after each tool call.",
116
- });
117
- persisted = await run();
118
- expect(decideGoalNextAction(persisted)).toEqual({
119
- kind: "run_verifier",
120
- command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
121
- reason: "All Goal tasks are done; running configured verifier for real completion evidence.",
122
- });
123
- expect(persisted.tasks).toEqual([
124
- expect.objectContaining({
125
- id: "implement-smoke",
126
- status: "done",
127
- lastSummary: "Initial task done with local fixture evidence.",
128
- }),
129
- ]);
130
- expect(persisted.evidence).toEqual(expect.arrayContaining([
131
- expect.objectContaining({
132
- label: "Local fixture artifact",
133
- path: "tmp/goal-smoke-fixture.json",
134
- }),
135
- ]));
136
- await goals({
137
- action: "verify",
138
- run_id: "smoke-goal",
139
- verification_status: "fail",
140
- summary: "intentional first verifier failure",
141
- exit_code: 1,
142
- output_path: "artifacts/goal-lifecycle-smoke-fail.log",
143
- });
144
- await goals({
145
- action: "task",
146
- run_id: "smoke-goal",
147
- task_id: "repair-verifier",
148
- task_title: "Fix verifier failure",
149
- task_prompt: "Use persisted verifier evidence to repair the smoke flow.",
150
- task_status: "pending",
151
- });
152
- persisted = await run();
153
- expect(persisted.status).toBe("ready");
154
- expect(persisted.verifier?.lastResult).toMatchObject({
155
- status: "fail",
156
- exitCode: 1,
157
- outputPath: "artifacts/goal-lifecycle-smoke-fail.log",
158
- });
159
- expect(persisted.evidence).toEqual(expect.arrayContaining([
160
- expect.objectContaining({
161
- kind: "command",
162
- label: "Verifier result",
163
- content: "intentional first verifier failure",
164
- }),
165
- ]));
166
- expect(decideGoalNextAction(persisted)).toMatchObject({
167
- kind: "start_worker",
168
- task: expect.objectContaining({ id: "repair-verifier" }),
169
- attempts: 1,
170
- });
171
- await goals({
172
- action: "task",
173
- run_id: "smoke-goal",
174
- task_id: "repair-verifier",
175
- task_title: "Fix verifier failure",
176
- task_prompt: "Use persisted verifier evidence to repair the smoke flow.",
177
- task_status: "done",
178
- attempts: 1,
179
- summary: "Corrective task completed.",
180
- });
181
- await goals({
182
- action: "verify",
183
- run_id: "smoke-goal",
184
- verification_status: "pass",
185
- summary: "focused lifecycle smoke passed",
186
- exit_code: 0,
187
- output_path: "artifacts/goal-lifecycle-smoke-pass.log",
188
- });
189
- persisted = await run();
190
- expect(canCompleteGoalRun(persisted)).toEqual({
191
- ok: false,
192
- reason: "Final completion audit status is unknown.",
193
- });
194
- const auditDecision = decideGoalNextAction({ ...persisted, status: "ready" });
195
- expect(auditDecision).toMatchObject({
196
- kind: "create_task",
197
- title: "Audit Goal completion evidence",
198
- });
199
- await goals({
200
- action: "task",
201
- run_id: "smoke-goal",
202
- task_id: "final-audit",
203
- task_title: "Audit Goal completion evidence",
204
- task_prompt: auditDecision.kind === "create_task" ? auditDecision.prompt : "Audit completion.",
205
- task_status: "done",
206
- attempts: 1,
207
- summary: "Final audit compared persisted artifacts and verifier output.",
208
- });
209
- persisted = await run();
210
- const verifierCheckedAt = persisted.verifier?.lastResult?.checkedAt;
211
- expect(verifierCheckedAt).toBeTruthy();
212
- await goals({
213
- action: "audit",
214
- run_id: "smoke-goal",
215
- verification_status: "pass",
216
- summary: `FINAL_AUDIT_PASS verifier_checked_at=${verifierCheckedAt}; artifact=artifacts/goal-lifecycle-smoke-pass.log matches the latest smoke verifier pass.`,
217
- output_path: "artifacts/goal-lifecycle-smoke-pass.log",
218
- });
219
- persisted = await run();
220
- expect(canCompleteGoalRun(persisted)).toEqual({
221
- ok: true,
222
- reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
223
- });
224
- expect(decideGoalNextAction({ ...persisted, status: "ready" })).toEqual({
225
- kind: "complete",
226
- reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
227
- });
228
- expect(await goals({ action: "complete", run_id: "smoke-goal" })).toBe('Goal "Lifecycle smoke" is now passed.');
229
- persisted = await run();
230
- expect(persisted.status).toBe("passed");
231
- expect(decideGoalNextAction(persisted)).toEqual({
232
- kind: "complete",
233
- reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
234
- });
235
- expect(persisted.evidence).toEqual(expect.arrayContaining([
236
- expect.objectContaining({ label: "Local fixture artifact" }),
237
- expect.objectContaining({
238
- label: "Verifier result",
239
- content: "intentional first verifier failure",
240
- }),
241
- expect.objectContaining({
242
- label: "Verifier result",
243
- content: "focused lifecycle smoke passed",
244
- }),
245
- ]));
246
- });
247
- });
248
- //# sourceMappingURL=goal-lifecycle-smoke.test.js.map