@kenkaiiii/ggcoder 4.3.212 → 4.3.214

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 (312) hide show
  1. package/README.md +5 -8
  2. package/dist/cli.d.ts +3 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +112 -61
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/continue-replay-inventory.test.d.ts +2 -0
  7. package/dist/core/continue-replay-inventory.test.d.ts.map +1 -0
  8. package/dist/core/continue-replay-inventory.test.js +42 -0
  9. package/dist/core/continue-replay-inventory.test.js.map +1 -0
  10. package/dist/core/goal-controller.d.ts +2 -0
  11. package/dist/core/goal-controller.d.ts.map +1 -1
  12. package/dist/core/goal-controller.js +283 -24
  13. package/dist/core/goal-controller.js.map +1 -1
  14. package/dist/core/goal-controller.test.js +413 -16
  15. package/dist/core/goal-controller.test.js.map +1 -1
  16. package/dist/core/goal-lifecycle-smoke.test.js +48 -6
  17. package/dist/core/goal-lifecycle-smoke.test.js.map +1 -1
  18. package/dist/core/goal-prerequisites.d.ts +5 -0
  19. package/dist/core/goal-prerequisites.d.ts.map +1 -1
  20. package/dist/core/goal-prerequisites.js +37 -0
  21. package/dist/core/goal-prerequisites.js.map +1 -1
  22. package/dist/core/goal-prerequisites.test.js +29 -1
  23. package/dist/core/goal-prerequisites.test.js.map +1 -1
  24. package/dist/core/goal-references.d.ts +14 -0
  25. package/dist/core/goal-references.d.ts.map +1 -0
  26. package/dist/core/goal-references.js +153 -0
  27. package/dist/core/goal-references.js.map +1 -0
  28. package/dist/core/goal-references.test.d.ts +2 -0
  29. package/dist/core/goal-references.test.d.ts.map +1 -0
  30. package/dist/core/goal-references.test.js +77 -0
  31. package/dist/core/goal-references.test.js.map +1 -0
  32. package/dist/core/goal-store.d.ts +25 -0
  33. package/dist/core/goal-store.d.ts.map +1 -1
  34. package/dist/core/goal-store.js +150 -36
  35. package/dist/core/goal-store.js.map +1 -1
  36. package/dist/core/goal-store.test.js +19 -2
  37. package/dist/core/goal-store.test.js.map +1 -1
  38. package/dist/core/goal-verifier.d.ts.map +1 -1
  39. package/dist/core/goal-verifier.js +4 -1
  40. package/dist/core/goal-verifier.js.map +1 -1
  41. package/dist/core/goal-verifier.test.js +43 -0
  42. package/dist/core/goal-verifier.test.js.map +1 -1
  43. package/dist/core/goal-worker.d.ts +2 -0
  44. package/dist/core/goal-worker.d.ts.map +1 -1
  45. package/dist/core/goal-worker.js +33 -9
  46. package/dist/core/goal-worker.js.map +1 -1
  47. package/dist/core/goal-worker.test.js +49 -1
  48. package/dist/core/goal-worker.test.js.map +1 -1
  49. package/dist/core/prompt-commands.d.ts.map +1 -1
  50. package/dist/core/prompt-commands.js +28 -846
  51. package/dist/core/prompt-commands.js.map +1 -1
  52. package/dist/core/prompt-commands.test.js +40 -78
  53. package/dist/core/prompt-commands.test.js.map +1 -1
  54. package/dist/core/runtime-mode.d.ts +14 -0
  55. package/dist/core/runtime-mode.d.ts.map +1 -0
  56. package/dist/core/runtime-mode.js +10 -0
  57. package/dist/core/runtime-mode.js.map +1 -0
  58. package/dist/core/session-restore-display.test.d.ts +2 -0
  59. package/dist/core/session-restore-display.test.d.ts.map +1 -0
  60. package/dist/core/session-restore-display.test.js +100 -0
  61. package/dist/core/session-restore-display.test.js.map +1 -0
  62. package/dist/core/verify-commands.js +4 -4
  63. package/dist/core/verify-commands.js.map +1 -1
  64. package/dist/system-prompt.d.ts +2 -1
  65. package/dist/system-prompt.d.ts.map +1 -1
  66. package/dist/system-prompt.js +51 -37
  67. package/dist/system-prompt.js.map +1 -1
  68. package/dist/system-prompt.test.js +147 -40
  69. package/dist/system-prompt.test.js.map +1 -1
  70. package/dist/tools/bash.d.ts +3 -2
  71. package/dist/tools/bash.d.ts.map +1 -1
  72. package/dist/tools/bash.js +11 -4
  73. package/dist/tools/bash.js.map +1 -1
  74. package/dist/tools/edit.d.ts +5 -3
  75. package/dist/tools/edit.d.ts.map +1 -1
  76. package/dist/tools/edit.js +14 -4
  77. package/dist/tools/edit.js.map +1 -1
  78. package/dist/tools/edit.test.js +0 -10
  79. package/dist/tools/edit.test.js.map +1 -1
  80. package/dist/tools/goal-mode.test.d.ts +2 -0
  81. package/dist/tools/goal-mode.test.d.ts.map +1 -0
  82. package/dist/tools/goal-mode.test.js +121 -0
  83. package/dist/tools/goal-mode.test.js.map +1 -0
  84. package/dist/tools/goals.d.ts +15 -3
  85. package/dist/tools/goals.d.ts.map +1 -1
  86. package/dist/tools/goals.js +336 -26
  87. package/dist/tools/goals.js.map +1 -1
  88. package/dist/tools/goals.test.js +346 -6
  89. package/dist/tools/goals.test.js.map +1 -1
  90. package/dist/tools/index.d.ts +7 -10
  91. package/dist/tools/index.d.ts.map +1 -1
  92. package/dist/tools/index.js +6 -19
  93. package/dist/tools/index.js.map +1 -1
  94. package/dist/tools/plan-mode.test.js +34 -224
  95. package/dist/tools/plan-mode.test.js.map +1 -1
  96. package/dist/tools/prompt-hints.d.ts.map +1 -1
  97. package/dist/tools/prompt-hints.js +2 -6
  98. package/dist/tools/prompt-hints.js.map +1 -1
  99. package/dist/tools/subagent.d.ts +3 -2
  100. package/dist/tools/subagent.d.ts.map +1 -1
  101. package/dist/tools/subagent.js +4 -9
  102. package/dist/tools/subagent.js.map +1 -1
  103. package/dist/tools/write.d.ts +5 -3
  104. package/dist/tools/write.d.ts.map +1 -1
  105. package/dist/tools/write.js +14 -13
  106. package/dist/tools/write.js.map +1 -1
  107. package/dist/tools/write.test.js +0 -16
  108. package/dist/tools/write.test.js.map +1 -1
  109. package/dist/ui/App.d.ts +145 -28
  110. package/dist/ui/App.d.ts.map +1 -1
  111. package/dist/ui/App.js +1153 -864
  112. package/dist/ui/App.js.map +1 -1
  113. package/dist/ui/activity-phrases.d.ts.map +1 -1
  114. package/dist/ui/activity-phrases.js +0 -2
  115. package/dist/ui/activity-phrases.js.map +1 -1
  116. package/dist/ui/app-state-persistence.test.js +173 -5
  117. package/dist/ui/app-state-persistence.test.js.map +1 -1
  118. package/dist/ui/chat-layout-pinning.test.d.ts +2 -0
  119. package/dist/ui/chat-layout-pinning.test.d.ts.map +1 -0
  120. package/dist/ui/chat-layout-pinning.test.js +407 -0
  121. package/dist/ui/chat-layout-pinning.test.js.map +1 -0
  122. package/dist/ui/components/ActivityIndicator.d.ts +1 -2
  123. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  124. package/dist/ui/components/ActivityIndicator.js +63 -94
  125. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  126. package/dist/ui/components/AssistantMessage.d.ts +6 -2
  127. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  128. package/dist/ui/components/AssistantMessage.js +9 -4
  129. package/dist/ui/components/AssistantMessage.js.map +1 -1
  130. package/dist/ui/components/AssistantMessage.test.d.ts +2 -0
  131. package/dist/ui/components/AssistantMessage.test.d.ts.map +1 -0
  132. package/dist/ui/components/AssistantMessage.test.js +369 -0
  133. package/dist/ui/components/AssistantMessage.test.js.map +1 -0
  134. package/dist/ui/components/BackgroundTasksBar.d.ts +1 -3
  135. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
  136. package/dist/ui/components/BackgroundTasksBar.js +2 -4
  137. package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
  138. package/dist/ui/components/Banner.d.ts +1 -3
  139. package/dist/ui/components/Banner.d.ts.map +1 -1
  140. package/dist/ui/components/Banner.js +7 -3
  141. package/dist/ui/components/Banner.js.map +1 -1
  142. package/dist/ui/components/Footer.d.ts +26 -4
  143. package/dist/ui/components/Footer.d.ts.map +1 -1
  144. package/dist/ui/components/Footer.js +73 -21
  145. package/dist/ui/components/Footer.js.map +1 -1
  146. package/dist/ui/components/GoalOverlay.d.ts +28 -20
  147. package/dist/ui/components/GoalOverlay.d.ts.map +1 -1
  148. package/dist/ui/components/GoalOverlay.js +283 -253
  149. package/dist/ui/components/GoalOverlay.js.map +1 -1
  150. package/dist/ui/components/InputArea.d.ts +2 -6
  151. package/dist/ui/components/InputArea.d.ts.map +1 -1
  152. package/dist/ui/components/InputArea.js +40 -32
  153. package/dist/ui/components/InputArea.js.map +1 -1
  154. package/dist/ui/components/InputArea.test.js +11 -1
  155. package/dist/ui/components/InputArea.test.js.map +1 -1
  156. package/dist/ui/components/Markdown.d.ts +11 -11
  157. package/dist/ui/components/Markdown.d.ts.map +1 -1
  158. package/dist/ui/components/Markdown.js +25 -198
  159. package/dist/ui/components/Markdown.js.map +1 -1
  160. package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
  161. package/dist/ui/components/PlanOverlay.js +1 -1
  162. package/dist/ui/components/PlanOverlay.js.map +1 -1
  163. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  164. package/dist/ui/components/ServerToolExecution.js +3 -2
  165. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  166. package/dist/ui/components/SlashCommandMenu.d.ts +4 -3
  167. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
  168. package/dist/ui/components/SlashCommandMenu.js +38 -26
  169. package/dist/ui/components/SlashCommandMenu.js.map +1 -1
  170. package/dist/ui/components/StreamingArea.d.ts +11 -2
  171. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  172. package/dist/ui/components/StreamingArea.js +20 -23
  173. package/dist/ui/components/StreamingArea.js.map +1 -1
  174. package/dist/ui/components/StreamingArea.test.d.ts +2 -0
  175. package/dist/ui/components/StreamingArea.test.d.ts.map +1 -0
  176. package/dist/ui/components/StreamingArea.test.js +18 -0
  177. package/dist/ui/components/StreamingArea.test.js.map +1 -0
  178. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  179. package/dist/ui/components/ToolExecution.js +11 -27
  180. package/dist/ui/components/ToolExecution.js.map +1 -1
  181. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  182. package/dist/ui/components/ToolGroupExecution.js +9 -124
  183. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  184. package/dist/ui/components/UserMessage.d.ts.map +1 -1
  185. package/dist/ui/components/UserMessage.js +15 -10
  186. package/dist/ui/components/UserMessage.js.map +1 -1
  187. package/dist/ui/components/UserMessage.test.d.ts +2 -0
  188. package/dist/ui/components/UserMessage.test.d.ts.map +1 -0
  189. package/dist/ui/components/UserMessage.test.js +39 -0
  190. package/dist/ui/components/UserMessage.test.js.map +1 -0
  191. package/dist/ui/footer-status-layout.test.js +21 -7
  192. package/dist/ui/footer-status-layout.test.js.map +1 -1
  193. package/dist/ui/goal-events.d.ts +13 -0
  194. package/dist/ui/goal-events.d.ts.map +1 -1
  195. package/dist/ui/goal-events.js +81 -16
  196. package/dist/ui/goal-events.js.map +1 -1
  197. package/dist/ui/goal-events.test.js +76 -2
  198. package/dist/ui/goal-events.test.js.map +1 -1
  199. package/dist/ui/goal-lifecycle-orchestration.test.js +131 -34
  200. package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
  201. package/dist/ui/goal-overlay.test.js +121 -43
  202. package/dist/ui/goal-overlay.test.js.map +1 -1
  203. package/dist/ui/goal-summary.d.ts +14 -0
  204. package/dist/ui/goal-summary.d.ts.map +1 -0
  205. package/dist/ui/goal-summary.js +194 -0
  206. package/dist/ui/goal-summary.js.map +1 -0
  207. package/dist/ui/hooks/useAgentLoop.d.ts +8 -2
  208. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  209. package/dist/ui/hooks/useAgentLoop.js +20 -9
  210. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  211. package/dist/ui/hooks/useAgentLoop.test.d.ts +2 -0
  212. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +1 -0
  213. package/dist/ui/hooks/useAgentLoop.test.js +8 -0
  214. package/dist/ui/hooks/useAgentLoop.test.js.map +1 -0
  215. package/dist/ui/hooks/useTerminalSize.d.ts +5 -9
  216. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  217. package/dist/ui/hooks/useTerminalSize.js +9 -14
  218. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  219. package/dist/ui/live-item-flush.d.ts +2 -2
  220. package/dist/ui/live-item-flush.d.ts.map +1 -1
  221. package/dist/ui/live-item-flush.js +8 -4
  222. package/dist/ui/live-item-flush.js.map +1 -1
  223. package/dist/ui/long-prompt-regression-harness.test.d.ts +2 -0
  224. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +1 -0
  225. package/dist/ui/long-prompt-regression-harness.test.js +195 -0
  226. package/dist/ui/long-prompt-regression-harness.test.js.map +1 -0
  227. package/dist/ui/plan-overlay.test.js +7 -29
  228. package/dist/ui/plan-overlay.test.js.map +1 -1
  229. package/dist/ui/queued-message.test.d.ts.map +1 -1
  230. package/dist/ui/queued-message.test.js +76 -14
  231. package/dist/ui/queued-message.test.js.map +1 -1
  232. package/dist/ui/render.d.ts +21 -24
  233. package/dist/ui/render.d.ts.map +1 -1
  234. package/dist/ui/render.js +46 -28
  235. package/dist/ui/render.js.map +1 -1
  236. package/dist/ui/render.test.d.ts +2 -0
  237. package/dist/ui/render.test.d.ts.map +1 -0
  238. package/dist/ui/render.test.js +16 -0
  239. package/dist/ui/render.test.js.map +1 -0
  240. package/dist/ui/scroll-stabilization.test.js +1 -1
  241. package/dist/ui/scroll-stabilization.test.js.map +1 -1
  242. package/dist/ui/slash-command-images.test.js +79 -4
  243. package/dist/ui/slash-command-images.test.js.map +1 -1
  244. package/dist/ui/terminal-history.d.ts +26 -0
  245. package/dist/ui/terminal-history.d.ts.map +1 -0
  246. package/dist/ui/terminal-history.js +910 -0
  247. package/dist/ui/terminal-history.js.map +1 -0
  248. package/dist/ui/terminal-history.test.d.ts +2 -0
  249. package/dist/ui/terminal-history.test.d.ts.map +1 -0
  250. package/dist/ui/terminal-history.test.js +314 -0
  251. package/dist/ui/terminal-history.test.js.map +1 -0
  252. package/dist/ui/tool-group-summary.d.ts +16 -0
  253. package/dist/ui/tool-group-summary.d.ts.map +1 -0
  254. package/dist/ui/tool-group-summary.js +123 -0
  255. package/dist/ui/tool-group-summary.js.map +1 -0
  256. package/dist/ui/tui-history-parity.test.d.ts +2 -0
  257. package/dist/ui/tui-history-parity.test.d.ts.map +1 -0
  258. package/dist/ui/tui-history-parity.test.js +243 -0
  259. package/dist/ui/tui-history-parity.test.js.map +1 -0
  260. package/dist/ui/utils/assistant-stream-split.d.ts +6 -0
  261. package/dist/ui/utils/assistant-stream-split.d.ts.map +1 -0
  262. package/dist/ui/utils/assistant-stream-split.js +37 -0
  263. package/dist/ui/utils/assistant-stream-split.js.map +1 -0
  264. package/dist/ui/utils/assistant-stream-split.test.d.ts +2 -0
  265. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +1 -0
  266. package/dist/ui/utils/assistant-stream-split.test.js +58 -0
  267. package/dist/ui/utils/assistant-stream-split.test.js.map +1 -0
  268. package/dist/ui/utils/latex-to-unicode.d.ts +22 -0
  269. package/dist/ui/utils/latex-to-unicode.d.ts.map +1 -0
  270. package/dist/ui/utils/latex-to-unicode.js +538 -0
  271. package/dist/ui/utils/latex-to-unicode.js.map +1 -0
  272. package/dist/ui/utils/markdown-renderer.d.ts +20 -0
  273. package/dist/ui/utils/markdown-renderer.d.ts.map +1 -0
  274. package/dist/ui/utils/markdown-renderer.js +327 -0
  275. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  276. package/dist/ui/utils/markdown-table.d.ts +9 -0
  277. package/dist/ui/utils/markdown-table.d.ts.map +1 -0
  278. package/dist/ui/utils/markdown-table.js +95 -0
  279. package/dist/ui/utils/markdown-table.js.map +1 -0
  280. package/dist/ui/utils/text-utils.d.ts +8 -0
  281. package/dist/ui/utils/text-utils.d.ts.map +1 -0
  282. package/dist/ui/utils/text-utils.js +16 -0
  283. package/dist/ui/utils/text-utils.js.map +1 -0
  284. package/dist/ui/utils/token-to-ansi.js +19 -9
  285. package/dist/ui/utils/token-to-ansi.js.map +1 -1
  286. package/dist/ui/utils/user-message-display.d.ts +7 -0
  287. package/dist/ui/utils/user-message-display.d.ts.map +1 -0
  288. package/dist/ui/utils/user-message-display.js +26 -0
  289. package/dist/ui/utils/user-message-display.js.map +1 -0
  290. package/dist/utils/format.js +0 -9
  291. package/dist/utils/format.js.map +1 -1
  292. package/package.json +9 -4
  293. package/dist/tools/enter-plan.d.ts +0 -8
  294. package/dist/tools/enter-plan.d.ts.map +0 -1
  295. package/dist/tools/enter-plan.js +0 -30
  296. package/dist/tools/enter-plan.js.map +0 -1
  297. package/dist/tools/exit-plan.d.ts +0 -8
  298. package/dist/tools/exit-plan.d.ts.map +0 -1
  299. package/dist/tools/exit-plan.js +0 -36
  300. package/dist/tools/exit-plan.js.map +0 -1
  301. package/dist/tools/tasks.d.ts +0 -16
  302. package/dist/tools/tasks.d.ts.map +0 -1
  303. package/dist/tools/tasks.js +0 -133
  304. package/dist/tools/tasks.js.map +0 -1
  305. package/dist/ui/components/EyesOverlay.d.ts +0 -10
  306. package/dist/ui/components/EyesOverlay.d.ts.map +0 -1
  307. package/dist/ui/components/EyesOverlay.js +0 -220
  308. package/dist/ui/components/EyesOverlay.js.map +0 -1
  309. package/dist/ui/components/TaskOverlay.d.ts +0 -10
  310. package/dist/ui/components/TaskOverlay.d.ts.map +0 -1
  311. package/dist/ui/components/TaskOverlay.js +0 -267
  312. package/dist/ui/components/TaskOverlay.js.map +0 -1
@@ -58,10 +58,9 @@ describe("goal lifecycle smoke", () => {
58
58
  label: "Persisted state proof",
59
59
  mechanism: "test",
60
60
  description: "Vitest asserts transitions and JSON persistence",
61
- status: "ready",
61
+ status: "planned",
62
62
  command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
63
63
  path: "packages/ggcoder/src/core/goal-lifecycle-smoke.test.ts",
64
- evidence: "This test inspects persisted Goal state after each tool call.",
65
64
  },
66
65
  ],
67
66
  verifier_command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
@@ -81,7 +80,7 @@ describe("goal lifecycle smoke", () => {
81
80
  expect.objectContaining({ id: "local-harness", command: expect.any(String) }),
82
81
  ]);
83
82
  expect(persisted.evidencePlan).toEqual([
84
- expect.objectContaining({ id: "state-proof", status: "ready" }),
83
+ expect.objectContaining({ id: "state-proof", status: "planned" }),
85
84
  ]);
86
85
  expect((await loadGoalRuns(tmpProject)).map((item) => item.id)).toContain("smoke-goal");
87
86
  await goals({
@@ -103,6 +102,19 @@ describe("goal lifecycle smoke", () => {
103
102
  evidence_content: "fixture persisted in temp-only smoke flow",
104
103
  });
105
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();
106
118
  expect(decideGoalNextAction(persisted)).toEqual({
107
119
  kind: "run_verifier",
108
120
  command: "pnpm --filter @kenkaiiii/ggcoder test -- goal-lifecycle-smoke",
@@ -175,20 +187,50 @@ describe("goal lifecycle smoke", () => {
175
187
  output_path: "artifacts/goal-lifecycle-smoke-pass.log",
176
188
  });
177
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();
178
220
  expect(canCompleteGoalRun(persisted)).toEqual({
179
221
  ok: true,
180
- reason: "All tasks are done and verifier evidence passed.",
222
+ reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
181
223
  });
182
224
  expect(decideGoalNextAction({ ...persisted, status: "ready" })).toEqual({
183
225
  kind: "complete",
184
- reason: "All tasks are done and verifier evidence passed.",
226
+ reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
185
227
  });
186
228
  expect(await goals({ action: "complete", run_id: "smoke-goal" })).toBe('Goal "Lifecycle smoke" is now passed.');
187
229
  persisted = await run();
188
230
  expect(persisted.status).toBe("passed");
189
231
  expect(decideGoalNextAction(persisted)).toEqual({
190
232
  kind: "complete",
191
- reason: "All tasks are done and verifier evidence passed.",
233
+ reason: "All tasks are done, verifier evidence passed, and final completion audit passed.",
192
234
  });
193
235
  expect(persisted.evidence).toEqual(expect.arrayContaining([
194
236
  expect.objectContaining({ label: "Local fixture artifact" }),
@@ -1 +1 @@
1
- {"version":3,"file":"goal-lifecycle-smoke.test.js","sourceRoot":"","sources":["../../src/core/goal-lifecycle-smoke.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-lifecycle-smoke.test.js","sourceRoot":"","sources":["../../src/core/goal-lifecycle-smoke.test.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,15 @@ export interface GoalPrerequisiteCheckResult {
4
4
  status: GoalPrerequisiteStatus;
5
5
  evidence: string;
6
6
  }
7
+ export interface PrerequisiteCommandSafetyResult {
8
+ safe: boolean;
9
+ reason?: string;
10
+ }
7
11
  export interface RunGoalPrerequisiteChecksResult {
8
12
  run: GoalRun;
9
13
  checkedCount: number;
10
14
  }
15
+ export declare function validateGoalPrerequisiteCheckCommand(command: string): PrerequisiteCommandSafetyResult;
11
16
  export declare function runGoalPrerequisiteCheckCommand({ cwd, command, timeoutMs, }: {
12
17
  cwd: string;
13
18
  command: string;
@@ -1 +1 @@
1
- {"version":3,"file":"goal-prerequisites.d.ts","sourceRoot":"","sources":["../../src/core/goal-prerequisites.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzF,eAAO,MAAM,0CAA0C,QAAS,CAAC;AAGjE,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAeD,wBAAsB,+BAA+B,CAAC,EACpD,GAAG,EACH,OAAO,EACP,SAAsD,GACvD,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAkCvC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAE9E;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,+BAA+B,CAAC,CAsB1C"}
1
+ {"version":3,"file":"goal-prerequisites.d.ts","sourceRoot":"","sources":["../../src/core/goal-prerequisites.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzF,eAAO,MAAM,0CAA0C,QAAS,CAAC;AAGjE,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAeD,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,GACd,+BAA+B,CA2BjC;AAED,wBAAsB,+BAA+B,CAAC,EACpD,GAAG,EACH,OAAO,EACP,SAAsD,GACvD,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAyCvC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAE9E;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,+BAA+B,CAAC,CAsB1C"}
@@ -12,7 +12,44 @@ function summarizePrerequisiteCheck(command, exitCode, output) {
12
12
  const suffix = normalizedOutput ? `; output: ${normalizedOutput}` : "";
13
13
  return `Checked locally: \`${command}\` exited ${exitCode}${suffix}`;
14
14
  }
15
+ export function validateGoalPrerequisiteCheckCommand(command) {
16
+ const normalized = command.trim();
17
+ if (!normalized)
18
+ return { safe: false, reason: "empty prerequisite check command" };
19
+ const checks = [
20
+ [/\brm\s+(?:-[^\s]*r[^\s]*f|-f[^\s]*r|-rf|-fr)\b/i, "destructive rm -rf command"],
21
+ [
22
+ /\b(?:npm|pnpm|yarn|bun)\s+(?:i|install|add|remove|uninstall|update|upgrade)\b/i,
23
+ "package mutation command",
24
+ ],
25
+ [
26
+ /\b(?:apt|apt-get|brew|pip|pip3|gem|cargo)\s+(?:install|add|remove|uninstall|update|upgrade)\b/i,
27
+ "system/package mutation command",
28
+ ],
29
+ [/(^|[^<])>>?\s*[^\s&|;]/, "shell redirection that writes files"],
30
+ [/\b(?:tee)\b(?!\s+-a?\s*\/dev\/null)/i, "tee file write command"],
31
+ [/\b(?:touch|mkdir|mv|cp|chmod|chown|truncate)\b/i, "file mutation command"],
32
+ [
33
+ /\b(?:serve|vite|next\s+dev|npm\s+run\s+dev|pnpm\s+dev|yarn\s+dev)\b/i,
34
+ "background/dev server command",
35
+ ],
36
+ [/[;&|]\s*$/, "trailing shell control operator"],
37
+ [/&\s*(?:$|[#;])/, "background command"],
38
+ ];
39
+ for (const [pattern, reason] of checks) {
40
+ if (pattern.test(normalized))
41
+ return { safe: false, reason };
42
+ }
43
+ return { safe: true };
44
+ }
15
45
  export async function runGoalPrerequisiteCheckCommand({ cwd, command, timeoutMs = DEFAULT_GOAL_PREREQUISITE_CHECK_TIMEOUT_MS, }) {
46
+ const safety = validateGoalPrerequisiteCheckCommand(command);
47
+ if (!safety.safe) {
48
+ return {
49
+ status: "missing",
50
+ evidence: `Prerequisite check rejected as unsafe: ${safety.reason}. Command was not executed: \`${command}\``,
51
+ };
52
+ }
16
53
  return await new Promise((resolve) => {
17
54
  const child = spawn(command, {
18
55
  cwd,
@@ -1 +1 @@
1
- {"version":3,"file":"goal-prerequisites.js","sourceRoot":"","sources":["../../src/core/goal-prerequisites.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-prerequisites.js","sourceRoot":"","sources":["../../src/core/goal-prerequisites.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
2
2
  import fs from "node:fs/promises";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
- import { runGoalPrerequisiteCheckCommand, runGoalPrerequisiteChecks, shouldRunGoalPrerequisiteCheck, } from "./goal-prerequisites.js";
5
+ import { runGoalPrerequisiteCheckCommand, runGoalPrerequisiteChecks, shouldRunGoalPrerequisiteCheck, validateGoalPrerequisiteCheckCommand, } from "./goal-prerequisites.js";
6
6
  function goalRun(overrides = {}) {
7
7
  return {
8
8
  id: "goal-a",
@@ -23,6 +23,34 @@ function goalRun(overrides = {}) {
23
23
  };
24
24
  }
25
25
  describe("goal prerequisite checks", () => {
26
+ it("rejects unsafe prerequisite commands without executing mutations", async () => {
27
+ expect(validateGoalPrerequisiteCheckCommand("rm -rf .goal-evidence")).toEqual({
28
+ safe: false,
29
+ reason: "destructive rm -rf command",
30
+ });
31
+ expect(validateGoalPrerequisiteCheckCommand("pnpm install left-pad")).toEqual({
32
+ safe: false,
33
+ reason: "package mutation command",
34
+ });
35
+ expect(validateGoalPrerequisiteCheckCommand("echo secret > leaked.txt")).toEqual({
36
+ safe: false,
37
+ reason: "shell redirection that writes files",
38
+ });
39
+ expect(validateGoalPrerequisiteCheckCommand("test -f package.json")).toEqual({ safe: true });
40
+ const tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "goal-prereq-safety-project-"));
41
+ try {
42
+ const result = await runGoalPrerequisiteCheckCommand({
43
+ cwd: tmpProject,
44
+ command: "echo unsafe > should-not-exist.txt",
45
+ });
46
+ expect(result.status).toBe("missing");
47
+ expect(result.evidence).toContain("rejected as unsafe");
48
+ await expect(fs.access(path.join(tmpProject, "should-not-exist.txt"))).rejects.toThrow();
49
+ }
50
+ finally {
51
+ await fs.rm(tmpProject, { recursive: true, force: true });
52
+ }
53
+ });
26
54
  it("runs cheap local check commands and records non-secret evidence", async () => {
27
55
  const tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "goal-prereq-test-project-"));
28
56
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"goal-prerequisites.test.js","sourceRoot":"","sources":["../../src/core/goal-prerequisites.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-prerequisites.test.js","sourceRoot":"","sources":["../../src/core/goal-prerequisites.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { GoalReference } from "./goal-store.js";
2
+ import type { ImageAttachment } from "../utils/image.js";
3
+ export interface GoalReferenceContext {
4
+ references: GoalReference[];
5
+ promptSection: string;
6
+ }
7
+ export declare function buildGoalReferenceContext({ cwd, originalGoalPrompt, attachments, }: {
8
+ cwd: string;
9
+ originalGoalPrompt: string;
10
+ attachments: readonly ImageAttachment[];
11
+ }): Promise<GoalReferenceContext>;
12
+ export declare function formatGoalReferencesForPrompt(references: readonly GoalReference[]): string;
13
+ export declare function referencesRequiringAcknowledgement(references: readonly GoalReference[]): GoalReference[];
14
+ //# sourceMappingURL=goal-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-references.d.ts","sourceRoot":"","sources":["../../src/core/goal-references.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQzD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAkGD,wBAAsB,yBAAyB,CAAC,EAC9C,GAAG,EACH,kBAAkB,EAClB,WAAW,GACZ,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;CACzC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwBhC;AAuBD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAW1F;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,SAAS,aAAa,EAAE,GACnC,aAAa,EAAE,CAEjB"}
@@ -0,0 +1,153 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ const GOAL_REFERENCES_DIR = ".gg/goal-references";
5
+ const MAX_PROMPT_REFERENCE_CHARS = 12_000;
6
+ const MAX_INLINE_REFERENCE_CHARS = 6_000;
7
+ const MAX_FORMATTED_REFERENCE_CHARS = 18_000;
8
+ const URL_PATTERN = /https?:\/\/[^\s<>()"']+/g;
9
+ function hashText(text) {
10
+ return createHash("sha256").update(text).digest("hex").slice(0, 12);
11
+ }
12
+ function truncateMiddle(text, maxChars) {
13
+ if (text.length <= maxChars)
14
+ return text;
15
+ const keep = Math.max(0, Math.floor((maxChars - 32) / 2));
16
+ return `${text.slice(0, keep)}\n[reference truncated]\n${text.slice(text.length - keep)}`;
17
+ }
18
+ function safeFileName(fileName) {
19
+ const base = path.basename(fileName).replace(/[^a-zA-Z0-9._-]+/g, "-");
20
+ return base || "reference";
21
+ }
22
+ function extensionForAttachment(attachment) {
23
+ const fromName = path.extname(attachment.fileName);
24
+ if (fromName)
25
+ return fromName;
26
+ if (attachment.kind === "text")
27
+ return ".txt";
28
+ if (attachment.mediaType === "image/jpeg")
29
+ return ".jpg";
30
+ if (attachment.mediaType === "image/webp")
31
+ return ".webp";
32
+ if (attachment.mediaType === "image/gif")
33
+ return ".gif";
34
+ return ".png";
35
+ }
36
+ function toProjectRelativePath(cwd, absolutePath) {
37
+ return path.relative(cwd, absolutePath).split(path.sep).join("/");
38
+ }
39
+ function classifyUrl(url) {
40
+ return /^https?:\/\/(?:www\.)?github\.com\/[^\s/]+\/[^\s/#?]+/i.test(url) ? "repo" : "url";
41
+ }
42
+ function normalizeUrlToken(url) {
43
+ return url.replace(/[),.;!?]+$/g, "");
44
+ }
45
+ function extractUrlReferences(text) {
46
+ const urls = Array.from(new Set((text.match(URL_PATTERN) ?? []).map(normalizeUrlToken)));
47
+ return urls.map((url) => {
48
+ const kind = classifyUrl(url);
49
+ const id = `${kind}-${hashText(url)}`;
50
+ return {
51
+ id,
52
+ kind,
53
+ label: kind === "repo" ? `Reference repository ${url}` : `Reference URL ${url}`,
54
+ value: url,
55
+ description: kind === "repo"
56
+ ? "Repository supplied in the original Goal prompt; workers/verifier must compare against it when relevant."
57
+ : "URL supplied in the original Goal prompt; workers/verifier must use it when relevant.",
58
+ source: "original-goal-prompt",
59
+ };
60
+ });
61
+ }
62
+ async function persistAttachmentReference(cwd, attachment) {
63
+ const digest = hashText(`${attachment.fileName}\n${attachment.mediaType}\n${attachment.data}`);
64
+ const id = `${attachment.kind}-${digest}`;
65
+ const ext = extensionForAttachment(attachment);
66
+ const fileName = `${id}-${safeFileName(attachment.fileName).replace(/\.[^.]*$/, "")}${ext}`;
67
+ const absoluteDir = path.join(cwd, GOAL_REFERENCES_DIR);
68
+ const absolutePath = path.join(absoluteDir, fileName);
69
+ await mkdir(absoluteDir, { recursive: true });
70
+ if (attachment.kind === "text") {
71
+ await writeFile(absolutePath, attachment.data, "utf-8");
72
+ return {
73
+ id,
74
+ kind: "text",
75
+ label: `Attached text reference ${attachment.fileName}`,
76
+ path: toProjectRelativePath(cwd, absolutePath),
77
+ mediaType: attachment.mediaType,
78
+ content: truncateMiddle(attachment.data, MAX_INLINE_REFERENCE_CHARS),
79
+ source: attachment.filePath,
80
+ description: "Text/document supplied with the original Goal prompt; setup, workers, verifier, and final audit must account for it.",
81
+ };
82
+ }
83
+ await writeFile(absolutePath, Buffer.from(attachment.data, "base64"));
84
+ return {
85
+ id,
86
+ kind: "image",
87
+ label: `Attached image reference ${attachment.fileName}`,
88
+ path: toProjectRelativePath(cwd, absolutePath),
89
+ mediaType: attachment.mediaType,
90
+ source: attachment.filePath,
91
+ description: "Image/screenshot supplied with the original Goal prompt; workers/verifier must inspect or compare against it when relevant.",
92
+ };
93
+ }
94
+ export async function buildGoalReferenceContext({ cwd, originalGoalPrompt, attachments, }) {
95
+ const references = [];
96
+ const trimmedPrompt = originalGoalPrompt.trim();
97
+ if (trimmedPrompt) {
98
+ references.push({
99
+ id: "original-goal-prompt",
100
+ kind: "prompt",
101
+ label: "Original Goal prompt",
102
+ content: truncateMiddle(trimmedPrompt, MAX_PROMPT_REFERENCE_CHARS),
103
+ source: "user",
104
+ description: "The exact /goal prompt text that started this run. Preserve its reference requirements in criteria, tasks, verifier, and audit.",
105
+ });
106
+ references.push(...extractUrlReferences(trimmedPrompt));
107
+ }
108
+ for (const attachment of attachments) {
109
+ references.push(await persistAttachmentReference(cwd, attachment));
110
+ }
111
+ return {
112
+ references,
113
+ promptSection: formatGoalReferencesForPrompt(references),
114
+ };
115
+ }
116
+ function formatReferenceValue(reference) {
117
+ const parts = [
118
+ `- [${reference.id}] kind=${reference.kind}; label=${JSON.stringify(reference.label)}`,
119
+ ];
120
+ if (reference.value)
121
+ parts.push(` value: ${reference.value}`);
122
+ if (reference.path)
123
+ parts.push(` path: ${reference.path}`);
124
+ if (reference.mediaType)
125
+ parts.push(` media_type: ${reference.mediaType}`);
126
+ if (reference.description)
127
+ parts.push(` why_it_matters: ${reference.description}`);
128
+ if (reference.source)
129
+ parts.push(` source: ${reference.source}`);
130
+ if (reference.content) {
131
+ parts.push(" content_excerpt:");
132
+ parts.push(truncateMiddle(reference.content, MAX_INLINE_REFERENCE_CHARS)
133
+ .split("\n")
134
+ .map((line) => ` ${line}`)
135
+ .join("\n"));
136
+ }
137
+ return parts.join("\n");
138
+ }
139
+ export function formatGoalReferencesForPrompt(references) {
140
+ if (references.length === 0)
141
+ return "";
142
+ const formatted = references.map(formatReferenceValue).join("\n");
143
+ const body = truncateMiddle(formatted, MAX_FORMATTED_REFERENCE_CHARS);
144
+ return (`## Goal References (MANDATORY)\n\n` +
145
+ `These references came from the user's original /goal prompt, URLs/repos, screenshots, or attached documents. ` +
146
+ `They are not optional context: success criteria, worker tasks, evidence paths, verifier, and final audit must use the relevant reference IDs. ` +
147
+ `If a reference cannot be accessed or compared locally, block the Goal with exact user instructions instead of silently ignoring it.\n\n` +
148
+ body);
149
+ }
150
+ export function referencesRequiringAcknowledgement(references) {
151
+ return references.filter((reference) => reference.kind !== "prompt");
152
+ }
153
+ //# sourceMappingURL=goal-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-references.js","sourceRoot":"","sources":["../../src/core/goal-references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=goal-references.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-references.test.d.ts","sourceRoot":"","sources":["../../src/core/goal-references.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
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 { buildGoalReferenceContext, referencesRequiringAcknowledgement, } from "./goal-references.js";
6
+ let tmpProject;
7
+ beforeEach(async () => {
8
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "goal-references-test-"));
9
+ });
10
+ afterEach(async () => {
11
+ await fs.rm(tmpProject, { recursive: true, force: true });
12
+ });
13
+ describe("goal reference context", () => {
14
+ it("extracts URLs, persists attachments, and formats mandatory prompt context", async () => {
15
+ const attachment = {
16
+ kind: "text",
17
+ fileName: "notes.md",
18
+ filePath: path.join(tmpProject, "notes.md"),
19
+ mediaType: "text/markdown",
20
+ data: "Match this documented behavior.",
21
+ };
22
+ const context = await buildGoalReferenceContext({
23
+ cwd: tmpProject,
24
+ originalGoalPrompt: "Build this like https://github.com/acme/reference-ui and explain https://example.com/docs.",
25
+ attachments: [attachment],
26
+ });
27
+ const kinds = context.references.map((reference) => reference.kind);
28
+ expect(kinds).toEqual(expect.arrayContaining(["prompt", "repo", "url", "text"]));
29
+ expect(context.promptSection).toContain("## Goal References (MANDATORY)");
30
+ expect(context.promptSection).toContain("https://github.com/acme/reference-ui");
31
+ expect(context.promptSection).toContain("Match this documented behavior.");
32
+ const textReference = context.references.find((reference) => reference.kind === "text");
33
+ expect(textReference?.path).toMatch(/^\.gg\/goal-references\/text-/);
34
+ expect(await fs.readFile(path.join(tmpProject, textReference?.path ?? ""), "utf-8")).toBe("Match this documented behavior.");
35
+ expect(referencesRequiringAcknowledgement(context.references).map((reference) => reference.kind)).toEqual(expect.arrayContaining(["repo", "url", "text"]));
36
+ expect(referencesRequiringAcknowledgement(context.references).map((reference) => reference.kind)).not.toContain("prompt");
37
+ });
38
+ it("covers prompt, URL/repo, screenshot image, attached document, and X/Y/Z feature-fix references", async () => {
39
+ const imageAttachment = {
40
+ kind: "image",
41
+ fileName: "liked-ui.png",
42
+ filePath: path.join(tmpProject, "liked-ui.png"),
43
+ mediaType: "image/png",
44
+ data: Buffer.from("fake-png-reference").toString("base64"),
45
+ };
46
+ const documentAttachment = {
47
+ kind: "text",
48
+ fileName: "feature-fix-x-y-z.md",
49
+ filePath: path.join(tmpProject, "feature-fix-x-y-z.md"),
50
+ mediaType: "text/markdown",
51
+ data: "Fix feature based on X: keyboard flow, Y: empty state copy, Z: error recovery.",
52
+ };
53
+ const context = await buildGoalReferenceContext({
54
+ cwd: tmpProject,
55
+ originalGoalPrompt: "Fix this feature based off X, Y, Z. Match https://example.com/design-system and repo https://github.com/acme/product-reference.",
56
+ attachments: [imageAttachment, documentAttachment],
57
+ });
58
+ expect(context.references.map((reference) => reference.kind)).toEqual(expect.arrayContaining(["prompt", "url", "repo", "image", "text"]));
59
+ expect(context.promptSection).toContain("Goal References (MANDATORY)");
60
+ expect(context.promptSection).toContain("success criteria, worker tasks, evidence paths, verifier, and final audit");
61
+ expect(context.promptSection).toContain("https://example.com/design-system");
62
+ expect(context.promptSection).toContain("https://github.com/acme/product-reference");
63
+ expect(context.promptSection).toContain("Attached image reference liked-ui.png");
64
+ expect(context.promptSection).toContain("feature-fix-x-y-z.md");
65
+ expect(context.promptSection).toContain("X: keyboard flow, Y: empty state copy, Z: error recovery");
66
+ const imageReference = context.references.find((reference) => reference.kind === "image");
67
+ const textReference = context.references.find((reference) => reference.kind === "text");
68
+ expect(imageReference?.path).toMatch(/^\.gg\/goal-references\/image-/);
69
+ expect(textReference?.path).toMatch(/^\.gg\/goal-references\/text-/);
70
+ await expect(fs.stat(path.join(tmpProject, imageReference?.path ?? ""))).resolves.toMatchObject({
71
+ size: Buffer.from("fake-png-reference").length,
72
+ });
73
+ await expect(fs.readFile(path.join(tmpProject, textReference?.path ?? ""), "utf-8")).resolves.toContain("X: keyboard flow, Y: empty state copy, Z: error recovery");
74
+ expect(referencesRequiringAcknowledgement(context.references).map((reference) => reference.kind)).toEqual(expect.arrayContaining(["url", "repo", "image", "text"]));
75
+ });
76
+ });
77
+ //# sourceMappingURL=goal-references.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-references.test.js","sourceRoot":"","sources":["../../src/core/goal-references.test.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,13 @@ export interface GoalVerificationResult {
12
12
  outputPath?: string;
13
13
  checkedAt: string;
14
14
  }
15
+ export interface GoalCompletionAudit {
16
+ status: GoalVerificationStatus;
17
+ summary: string;
18
+ checkedAt: string;
19
+ verifierCheckedAt?: string;
20
+ outputPath?: string;
21
+ }
15
22
  export interface GoalPrerequisite {
16
23
  id: string;
17
24
  label: string;
@@ -39,6 +46,18 @@ export interface GoalEvidencePlan {
39
46
  instructions?: string;
40
47
  evidence?: string;
41
48
  }
49
+ export type GoalReferenceKind = "prompt" | "url" | "repo" | "file" | "image" | "text";
50
+ export interface GoalReference {
51
+ id: string;
52
+ kind: GoalReferenceKind;
53
+ label: string;
54
+ value?: string;
55
+ path?: string;
56
+ mediaType?: string;
57
+ description?: string;
58
+ content?: string;
59
+ source?: string;
60
+ }
42
61
  export interface GoalTask {
43
62
  id: string;
44
63
  title: string;
@@ -74,9 +93,11 @@ export interface GoalRun {
74
93
  prerequisites: GoalPrerequisite[];
75
94
  harness: GoalHarnessItem[];
76
95
  evidencePlan: GoalEvidencePlan[];
96
+ references?: GoalReference[];
77
97
  tasks: GoalTask[];
78
98
  evidence: GoalEvidence[];
79
99
  verifier?: GoalVerifier;
100
+ completionAudit?: GoalCompletionAudit;
80
101
  blockers: string[];
81
102
  activeWorkerId?: string;
82
103
  continueRequestedAt?: string;
@@ -108,9 +129,11 @@ export interface GoalRunInput {
108
129
  prerequisites?: GoalPrerequisite[];
109
130
  harness?: GoalHarnessItem[];
110
131
  evidencePlan?: GoalEvidencePlan[];
132
+ references?: GoalReference[];
111
133
  tasks?: GoalTask[];
112
134
  evidence?: GoalEvidence[];
113
135
  verifier?: GoalVerifier;
136
+ completionAudit?: GoalCompletionAudit;
114
137
  blockers?: string[];
115
138
  activeWorkerId?: string;
116
139
  continueRequestedAt?: string;
@@ -134,6 +157,8 @@ export interface GoalEvidenceInput {
134
157
  createdAt?: string;
135
158
  }
136
159
  export declare function normalizeProjectPath(cwd: string): string;
160
+ export declare function dedupeGoalBlockers(blockers: readonly string[]): string[];
161
+ export declare function appendGoalBlockers(blockers: readonly string[], nextBlockers: string | readonly string[] | undefined): string[];
137
162
  export declare function hashPath(cwd: string): string;
138
163
  export declare function projectDir(cwd: string): string;
139
164
  export declare function createGoalTask(input: GoalTaskInput): GoalTask;