@kenkaiiii/ggcoder 4.3.211 → 4.3.213

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 (314) 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 +23 -0
  19. package/dist/core/goal-prerequisites.d.ts.map +1 -0
  20. package/dist/core/goal-prerequisites.js +114 -0
  21. package/dist/core/goal-prerequisites.js.map +1 -0
  22. package/dist/core/goal-prerequisites.test.d.ts +2 -0
  23. package/dist/core/goal-prerequisites.test.d.ts.map +1 -0
  24. package/dist/core/goal-prerequisites.test.js +118 -0
  25. package/dist/core/goal-prerequisites.test.js.map +1 -0
  26. package/dist/core/goal-references.d.ts +14 -0
  27. package/dist/core/goal-references.d.ts.map +1 -0
  28. package/dist/core/goal-references.js +153 -0
  29. package/dist/core/goal-references.js.map +1 -0
  30. package/dist/core/goal-references.test.d.ts +2 -0
  31. package/dist/core/goal-references.test.d.ts.map +1 -0
  32. package/dist/core/goal-references.test.js +77 -0
  33. package/dist/core/goal-references.test.js.map +1 -0
  34. package/dist/core/goal-store.d.ts +25 -0
  35. package/dist/core/goal-store.d.ts.map +1 -1
  36. package/dist/core/goal-store.js +161 -38
  37. package/dist/core/goal-store.js.map +1 -1
  38. package/dist/core/goal-store.test.js +33 -8
  39. package/dist/core/goal-store.test.js.map +1 -1
  40. package/dist/core/goal-verifier.d.ts.map +1 -1
  41. package/dist/core/goal-verifier.js +4 -1
  42. package/dist/core/goal-verifier.js.map +1 -1
  43. package/dist/core/goal-verifier.test.js +43 -0
  44. package/dist/core/goal-verifier.test.js.map +1 -1
  45. package/dist/core/goal-worker.d.ts +2 -0
  46. package/dist/core/goal-worker.d.ts.map +1 -1
  47. package/dist/core/goal-worker.js +33 -9
  48. package/dist/core/goal-worker.js.map +1 -1
  49. package/dist/core/goal-worker.test.js +49 -1
  50. package/dist/core/goal-worker.test.js.map +1 -1
  51. package/dist/core/prompt-commands.d.ts.map +1 -1
  52. package/dist/core/prompt-commands.js +28 -845
  53. package/dist/core/prompt-commands.js.map +1 -1
  54. package/dist/core/prompt-commands.test.js +40 -74
  55. package/dist/core/prompt-commands.test.js.map +1 -1
  56. package/dist/core/runtime-mode.d.ts +14 -0
  57. package/dist/core/runtime-mode.d.ts.map +1 -0
  58. package/dist/core/runtime-mode.js +10 -0
  59. package/dist/core/runtime-mode.js.map +1 -0
  60. package/dist/core/session-restore-display.test.d.ts +2 -0
  61. package/dist/core/session-restore-display.test.d.ts.map +1 -0
  62. package/dist/core/session-restore-display.test.js +100 -0
  63. package/dist/core/session-restore-display.test.js.map +1 -0
  64. package/dist/core/verify-commands.js +4 -4
  65. package/dist/core/verify-commands.js.map +1 -1
  66. package/dist/system-prompt.d.ts +2 -1
  67. package/dist/system-prompt.d.ts.map +1 -1
  68. package/dist/system-prompt.js +51 -37
  69. package/dist/system-prompt.js.map +1 -1
  70. package/dist/system-prompt.test.js +147 -40
  71. package/dist/system-prompt.test.js.map +1 -1
  72. package/dist/tools/bash.d.ts +3 -2
  73. package/dist/tools/bash.d.ts.map +1 -1
  74. package/dist/tools/bash.js +11 -4
  75. package/dist/tools/bash.js.map +1 -1
  76. package/dist/tools/edit.d.ts +5 -3
  77. package/dist/tools/edit.d.ts.map +1 -1
  78. package/dist/tools/edit.js +14 -4
  79. package/dist/tools/edit.js.map +1 -1
  80. package/dist/tools/edit.test.js +0 -10
  81. package/dist/tools/edit.test.js.map +1 -1
  82. package/dist/tools/goal-mode.test.d.ts +2 -0
  83. package/dist/tools/goal-mode.test.d.ts.map +1 -0
  84. package/dist/tools/goal-mode.test.js +121 -0
  85. package/dist/tools/goal-mode.test.js.map +1 -0
  86. package/dist/tools/goals.d.ts +15 -3
  87. package/dist/tools/goals.d.ts.map +1 -1
  88. package/dist/tools/goals.js +385 -35
  89. package/dist/tools/goals.js.map +1 -1
  90. package/dist/tools/goals.test.js +389 -6
  91. package/dist/tools/goals.test.js.map +1 -1
  92. package/dist/tools/index.d.ts +7 -10
  93. package/dist/tools/index.d.ts.map +1 -1
  94. package/dist/tools/index.js +6 -19
  95. package/dist/tools/index.js.map +1 -1
  96. package/dist/tools/plan-mode.test.js +34 -224
  97. package/dist/tools/plan-mode.test.js.map +1 -1
  98. package/dist/tools/prompt-hints.d.ts.map +1 -1
  99. package/dist/tools/prompt-hints.js +2 -6
  100. package/dist/tools/prompt-hints.js.map +1 -1
  101. package/dist/tools/subagent.d.ts +3 -2
  102. package/dist/tools/subagent.d.ts.map +1 -1
  103. package/dist/tools/subagent.js +4 -9
  104. package/dist/tools/subagent.js.map +1 -1
  105. package/dist/tools/write.d.ts +5 -3
  106. package/dist/tools/write.d.ts.map +1 -1
  107. package/dist/tools/write.js +14 -13
  108. package/dist/tools/write.js.map +1 -1
  109. package/dist/tools/write.test.js +0 -16
  110. package/dist/tools/write.test.js.map +1 -1
  111. package/dist/ui/App.d.ts +146 -30
  112. package/dist/ui/App.d.ts.map +1 -1
  113. package/dist/ui/App.js +1202 -910
  114. package/dist/ui/App.js.map +1 -1
  115. package/dist/ui/activity-phrases.d.ts.map +1 -1
  116. package/dist/ui/activity-phrases.js +0 -2
  117. package/dist/ui/activity-phrases.js.map +1 -1
  118. package/dist/ui/app-state-persistence.test.js +181 -13
  119. package/dist/ui/app-state-persistence.test.js.map +1 -1
  120. package/dist/ui/chat-layout-pinning.test.d.ts +2 -0
  121. package/dist/ui/chat-layout-pinning.test.d.ts.map +1 -0
  122. package/dist/ui/chat-layout-pinning.test.js +407 -0
  123. package/dist/ui/chat-layout-pinning.test.js.map +1 -0
  124. package/dist/ui/components/ActivityIndicator.d.ts +1 -2
  125. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  126. package/dist/ui/components/ActivityIndicator.js +63 -94
  127. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  128. package/dist/ui/components/AssistantMessage.d.ts +6 -2
  129. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  130. package/dist/ui/components/AssistantMessage.js +9 -4
  131. package/dist/ui/components/AssistantMessage.js.map +1 -1
  132. package/dist/ui/components/AssistantMessage.test.d.ts +2 -0
  133. package/dist/ui/components/AssistantMessage.test.d.ts.map +1 -0
  134. package/dist/ui/components/AssistantMessage.test.js +369 -0
  135. package/dist/ui/components/AssistantMessage.test.js.map +1 -0
  136. package/dist/ui/components/BackgroundTasksBar.d.ts +1 -3
  137. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
  138. package/dist/ui/components/BackgroundTasksBar.js +2 -4
  139. package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
  140. package/dist/ui/components/Banner.d.ts +1 -3
  141. package/dist/ui/components/Banner.d.ts.map +1 -1
  142. package/dist/ui/components/Banner.js +7 -3
  143. package/dist/ui/components/Banner.js.map +1 -1
  144. package/dist/ui/components/Footer.d.ts +26 -4
  145. package/dist/ui/components/Footer.d.ts.map +1 -1
  146. package/dist/ui/components/Footer.js +73 -21
  147. package/dist/ui/components/Footer.js.map +1 -1
  148. package/dist/ui/components/GoalOverlay.d.ts +28 -20
  149. package/dist/ui/components/GoalOverlay.d.ts.map +1 -1
  150. package/dist/ui/components/GoalOverlay.js +283 -253
  151. package/dist/ui/components/GoalOverlay.js.map +1 -1
  152. package/dist/ui/components/InputArea.d.ts +2 -6
  153. package/dist/ui/components/InputArea.d.ts.map +1 -1
  154. package/dist/ui/components/InputArea.js +40 -32
  155. package/dist/ui/components/InputArea.js.map +1 -1
  156. package/dist/ui/components/InputArea.test.js +11 -1
  157. package/dist/ui/components/InputArea.test.js.map +1 -1
  158. package/dist/ui/components/Markdown.d.ts +11 -11
  159. package/dist/ui/components/Markdown.d.ts.map +1 -1
  160. package/dist/ui/components/Markdown.js +25 -198
  161. package/dist/ui/components/Markdown.js.map +1 -1
  162. package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
  163. package/dist/ui/components/PlanOverlay.js +1 -1
  164. package/dist/ui/components/PlanOverlay.js.map +1 -1
  165. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  166. package/dist/ui/components/ServerToolExecution.js +3 -2
  167. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  168. package/dist/ui/components/SlashCommandMenu.d.ts +4 -3
  169. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
  170. package/dist/ui/components/SlashCommandMenu.js +38 -26
  171. package/dist/ui/components/SlashCommandMenu.js.map +1 -1
  172. package/dist/ui/components/StreamingArea.d.ts +11 -2
  173. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  174. package/dist/ui/components/StreamingArea.js +20 -23
  175. package/dist/ui/components/StreamingArea.js.map +1 -1
  176. package/dist/ui/components/StreamingArea.test.d.ts +2 -0
  177. package/dist/ui/components/StreamingArea.test.d.ts.map +1 -0
  178. package/dist/ui/components/StreamingArea.test.js +18 -0
  179. package/dist/ui/components/StreamingArea.test.js.map +1 -0
  180. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  181. package/dist/ui/components/ToolExecution.js +11 -27
  182. package/dist/ui/components/ToolExecution.js.map +1 -1
  183. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  184. package/dist/ui/components/ToolGroupExecution.js +9 -124
  185. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  186. package/dist/ui/components/UserMessage.d.ts.map +1 -1
  187. package/dist/ui/components/UserMessage.js +15 -10
  188. package/dist/ui/components/UserMessage.js.map +1 -1
  189. package/dist/ui/components/UserMessage.test.d.ts +2 -0
  190. package/dist/ui/components/UserMessage.test.d.ts.map +1 -0
  191. package/dist/ui/components/UserMessage.test.js +39 -0
  192. package/dist/ui/components/UserMessage.test.js.map +1 -0
  193. package/dist/ui/footer-status-layout.test.js +21 -7
  194. package/dist/ui/footer-status-layout.test.js.map +1 -1
  195. package/dist/ui/goal-events.d.ts +8 -0
  196. package/dist/ui/goal-events.d.ts.map +1 -1
  197. package/dist/ui/goal-events.js +28 -8
  198. package/dist/ui/goal-events.js.map +1 -1
  199. package/dist/ui/goal-events.test.js +40 -2
  200. package/dist/ui/goal-events.test.js.map +1 -1
  201. package/dist/ui/goal-lifecycle-orchestration.test.js +127 -34
  202. package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
  203. package/dist/ui/goal-overlay.test.js +122 -44
  204. package/dist/ui/goal-overlay.test.js.map +1 -1
  205. package/dist/ui/goal-summary.d.ts +14 -0
  206. package/dist/ui/goal-summary.d.ts.map +1 -0
  207. package/dist/ui/goal-summary.js +194 -0
  208. package/dist/ui/goal-summary.js.map +1 -0
  209. package/dist/ui/hooks/useAgentLoop.d.ts +8 -2
  210. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  211. package/dist/ui/hooks/useAgentLoop.js +20 -9
  212. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  213. package/dist/ui/hooks/useAgentLoop.test.d.ts +2 -0
  214. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +1 -0
  215. package/dist/ui/hooks/useAgentLoop.test.js +8 -0
  216. package/dist/ui/hooks/useAgentLoop.test.js.map +1 -0
  217. package/dist/ui/hooks/useTerminalSize.d.ts +5 -9
  218. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  219. package/dist/ui/hooks/useTerminalSize.js +9 -14
  220. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  221. package/dist/ui/live-item-flush.d.ts +2 -2
  222. package/dist/ui/live-item-flush.d.ts.map +1 -1
  223. package/dist/ui/live-item-flush.js +8 -4
  224. package/dist/ui/live-item-flush.js.map +1 -1
  225. package/dist/ui/long-prompt-regression-harness.test.d.ts +2 -0
  226. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +1 -0
  227. package/dist/ui/long-prompt-regression-harness.test.js +195 -0
  228. package/dist/ui/long-prompt-regression-harness.test.js.map +1 -0
  229. package/dist/ui/plan-overlay.test.js +7 -29
  230. package/dist/ui/plan-overlay.test.js.map +1 -1
  231. package/dist/ui/queued-message.test.d.ts.map +1 -1
  232. package/dist/ui/queued-message.test.js +76 -14
  233. package/dist/ui/queued-message.test.js.map +1 -1
  234. package/dist/ui/render.d.ts +21 -24
  235. package/dist/ui/render.d.ts.map +1 -1
  236. package/dist/ui/render.js +46 -28
  237. package/dist/ui/render.js.map +1 -1
  238. package/dist/ui/render.test.d.ts +2 -0
  239. package/dist/ui/render.test.d.ts.map +1 -0
  240. package/dist/ui/render.test.js +16 -0
  241. package/dist/ui/render.test.js.map +1 -0
  242. package/dist/ui/scroll-stabilization.test.js +1 -1
  243. package/dist/ui/scroll-stabilization.test.js.map +1 -1
  244. package/dist/ui/slash-command-images.test.js +79 -4
  245. package/dist/ui/slash-command-images.test.js.map +1 -1
  246. package/dist/ui/terminal-history.d.ts +26 -0
  247. package/dist/ui/terminal-history.d.ts.map +1 -0
  248. package/dist/ui/terminal-history.js +910 -0
  249. package/dist/ui/terminal-history.js.map +1 -0
  250. package/dist/ui/terminal-history.test.d.ts +2 -0
  251. package/dist/ui/terminal-history.test.d.ts.map +1 -0
  252. package/dist/ui/terminal-history.test.js +314 -0
  253. package/dist/ui/terminal-history.test.js.map +1 -0
  254. package/dist/ui/tool-group-summary.d.ts +16 -0
  255. package/dist/ui/tool-group-summary.d.ts.map +1 -0
  256. package/dist/ui/tool-group-summary.js +123 -0
  257. package/dist/ui/tool-group-summary.js.map +1 -0
  258. package/dist/ui/tui-history-parity.test.d.ts +2 -0
  259. package/dist/ui/tui-history-parity.test.d.ts.map +1 -0
  260. package/dist/ui/tui-history-parity.test.js +243 -0
  261. package/dist/ui/tui-history-parity.test.js.map +1 -0
  262. package/dist/ui/utils/assistant-stream-split.d.ts +6 -0
  263. package/dist/ui/utils/assistant-stream-split.d.ts.map +1 -0
  264. package/dist/ui/utils/assistant-stream-split.js +37 -0
  265. package/dist/ui/utils/assistant-stream-split.js.map +1 -0
  266. package/dist/ui/utils/assistant-stream-split.test.d.ts +2 -0
  267. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +1 -0
  268. package/dist/ui/utils/assistant-stream-split.test.js +58 -0
  269. package/dist/ui/utils/assistant-stream-split.test.js.map +1 -0
  270. package/dist/ui/utils/latex-to-unicode.d.ts +22 -0
  271. package/dist/ui/utils/latex-to-unicode.d.ts.map +1 -0
  272. package/dist/ui/utils/latex-to-unicode.js +538 -0
  273. package/dist/ui/utils/latex-to-unicode.js.map +1 -0
  274. package/dist/ui/utils/markdown-renderer.d.ts +20 -0
  275. package/dist/ui/utils/markdown-renderer.d.ts.map +1 -0
  276. package/dist/ui/utils/markdown-renderer.js +327 -0
  277. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  278. package/dist/ui/utils/markdown-table.d.ts +9 -0
  279. package/dist/ui/utils/markdown-table.d.ts.map +1 -0
  280. package/dist/ui/utils/markdown-table.js +95 -0
  281. package/dist/ui/utils/markdown-table.js.map +1 -0
  282. package/dist/ui/utils/text-utils.d.ts +8 -0
  283. package/dist/ui/utils/text-utils.d.ts.map +1 -0
  284. package/dist/ui/utils/text-utils.js +16 -0
  285. package/dist/ui/utils/text-utils.js.map +1 -0
  286. package/dist/ui/utils/token-to-ansi.js +19 -9
  287. package/dist/ui/utils/token-to-ansi.js.map +1 -1
  288. package/dist/ui/utils/user-message-display.d.ts +7 -0
  289. package/dist/ui/utils/user-message-display.d.ts.map +1 -0
  290. package/dist/ui/utils/user-message-display.js +26 -0
  291. package/dist/ui/utils/user-message-display.js.map +1 -0
  292. package/dist/utils/format.js +0 -9
  293. package/dist/utils/format.js.map +1 -1
  294. package/package.json +9 -5
  295. package/dist/tools/enter-plan.d.ts +0 -8
  296. package/dist/tools/enter-plan.d.ts.map +0 -1
  297. package/dist/tools/enter-plan.js +0 -30
  298. package/dist/tools/enter-plan.js.map +0 -1
  299. package/dist/tools/exit-plan.d.ts +0 -8
  300. package/dist/tools/exit-plan.d.ts.map +0 -1
  301. package/dist/tools/exit-plan.js +0 -36
  302. package/dist/tools/exit-plan.js.map +0 -1
  303. package/dist/tools/tasks.d.ts +0 -16
  304. package/dist/tools/tasks.d.ts.map +0 -1
  305. package/dist/tools/tasks.js +0 -133
  306. package/dist/tools/tasks.js.map +0 -1
  307. package/dist/ui/components/EyesOverlay.d.ts +0 -10
  308. package/dist/ui/components/EyesOverlay.d.ts.map +0 -1
  309. package/dist/ui/components/EyesOverlay.js +0 -220
  310. package/dist/ui/components/EyesOverlay.js.map +0 -1
  311. package/dist/ui/components/TaskOverlay.d.ts +0 -10
  312. package/dist/ui/components/TaskOverlay.d.ts.map +0 -1
  313. package/dist/ui/components/TaskOverlay.js +0 -267
  314. package/dist/ui/components/TaskOverlay.js.map +0 -1
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"goal-store.d.ts","sourceRoot":"","sources":["../../src/core/goal-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-store.d.ts","sourceRoot":"","sources":["../../src/core/goal-store.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createHash, randomUUID } from "node:crypto";
2
- import { mkdir, readdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { mkdir, open, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import { basename, join, resolve } from "node:path";
5
5
  const GOALS_BASE_ENV = "GG_GOALS_BASE";
@@ -49,6 +49,23 @@ function mergeGoalEvidence(existing, input) {
49
49
  }
50
50
  return merged;
51
51
  }
52
+ function mergeGoalReferences(existing, input) {
53
+ if (!input)
54
+ return existing;
55
+ const merged = [...existing];
56
+ const seen = new Set(existing
57
+ .map((item) => item.id)
58
+ .concat(existing.map((item) => `${item.kind}:${item.value ?? item.path ?? item.content ?? item.label}`)));
59
+ for (const item of input) {
60
+ const identity = `${item.kind}:${item.value ?? item.path ?? item.content ?? item.label}`;
61
+ if (seen.has(item.id) || seen.has(identity))
62
+ continue;
63
+ seen.add(item.id);
64
+ seen.add(identity);
65
+ merged.push(item);
66
+ }
67
+ return merged;
68
+ }
52
69
  function isObject(value) {
53
70
  return typeof value === "object" && value !== null && !Array.isArray(value);
54
71
  }
@@ -102,6 +119,14 @@ function isEvidenceMechanism(value) {
102
119
  value === "file" ||
103
120
  value === "manual");
104
121
  }
122
+ function isGoalReferenceKind(value) {
123
+ return (value === "prompt" ||
124
+ value === "url" ||
125
+ value === "repo" ||
126
+ value === "file" ||
127
+ value === "image" ||
128
+ value === "text");
129
+ }
105
130
  function isEvidencePlanStatus(value) {
106
131
  return value === "planned" || value === "ready" || value === "blocked";
107
132
  }
@@ -170,6 +195,24 @@ function normalizeEvidencePlanItem(value) {
170
195
  ...(optionalString(value.evidence) ? { evidence: optionalString(value.evidence) } : {}),
171
196
  };
172
197
  }
198
+ function normalizeReference(value) {
199
+ if (!isObject(value))
200
+ return null;
201
+ const label = typeof value.label === "string" ? value.label : "Goal reference";
202
+ return {
203
+ id: typeof value.id === "string" ? value.id : randomUUID(),
204
+ kind: isGoalReferenceKind(value.kind) ? value.kind : "text",
205
+ label,
206
+ ...(optionalString(value.value) ? { value: optionalString(value.value) } : {}),
207
+ ...(optionalString(value.path) ? { path: optionalString(value.path) } : {}),
208
+ ...(optionalString(value.mediaType) ? { mediaType: optionalString(value.mediaType) } : {}),
209
+ ...(optionalString(value.description)
210
+ ? { description: optionalString(value.description) }
211
+ : {}),
212
+ ...(optionalString(value.content) ? { content: optionalString(value.content) } : {}),
213
+ ...(optionalString(value.source) ? { source: optionalString(value.source) } : {}),
214
+ };
215
+ }
173
216
  function normalizeTask(value) {
174
217
  if (!isObject(value))
175
218
  return null;
@@ -215,6 +258,19 @@ function normalizeVerifier(value) {
215
258
  : {}),
216
259
  };
217
260
  }
261
+ function normalizeCompletionAudit(value) {
262
+ if (!isObject(value))
263
+ return undefined;
264
+ return {
265
+ status: isVerificationStatus(value.status) ? value.status : "unknown",
266
+ summary: typeof value.summary === "string" ? value.summary : "",
267
+ checkedAt: typeof value.checkedAt === "string" ? value.checkedAt : nowIso(),
268
+ ...(optionalString(value.verifierCheckedAt)
269
+ ? { verifierCheckedAt: optionalString(value.verifierCheckedAt) }
270
+ : {}),
271
+ ...(optionalString(value.outputPath) ? { outputPath: optionalString(value.outputPath) } : {}),
272
+ };
273
+ }
218
274
  function normalizeRun(value, fallbackProjectPath) {
219
275
  if (!isObject(value))
220
276
  return null;
@@ -249,12 +305,18 @@ function normalizeRun(value, fallbackProjectPath) {
249
305
  .map(normalizeEvidencePlanItem)
250
306
  .filter((item) => !!item)
251
307
  : [],
308
+ references: Array.isArray(value.references)
309
+ ? value.references.map(normalizeReference).filter((item) => !!item)
310
+ : [],
252
311
  tasks,
253
312
  evidence: Array.isArray(value.evidence)
254
313
  ? value.evidence.map(normalizeEvidence).filter((item) => !!item)
255
314
  : [],
256
315
  ...(normalizeVerifier(value.verifier) ? { verifier: normalizeVerifier(value.verifier) } : {}),
257
- blockers: stringArray(value.blockers),
316
+ ...(normalizeCompletionAudit(value.completionAudit)
317
+ ? { completionAudit: normalizeCompletionAudit(value.completionAudit) }
318
+ : {}),
319
+ blockers: dedupeGoalBlockers(stringArray(value.blockers)),
258
320
  ...(optionalString(value.activeWorkerId)
259
321
  ? { activeWorkerId: optionalString(value.activeWorkerId) }
260
322
  : {}),
@@ -272,10 +334,16 @@ function isActiveGoalRun(run) {
272
334
  run.activeWorkerId !== undefined ||
273
335
  run.tasks.some((task) => task.status === "running" || task.status === "verifying"));
274
336
  }
275
- function wouldEraseActiveGoalRuns(previousRuns, nextRuns) {
276
- if (nextRuns.length > 0)
277
- return false;
278
- return previousRuns.some(isActiveGoalRun);
337
+ function omittedActiveGoalRuns(previousRuns, nextRuns) {
338
+ const nextIds = new Set(nextRuns.map((run) => run.id));
339
+ return previousRuns.filter((run) => isActiveGoalRun(run) && !nextIds.has(run.id));
340
+ }
341
+ export function dedupeGoalBlockers(blockers) {
342
+ return Array.from(new Set(blockers.map((item) => item.trim()).filter(Boolean)));
343
+ }
344
+ export function appendGoalBlockers(blockers, nextBlockers) {
345
+ const additions = typeof nextBlockers === "string" ? [nextBlockers] : (nextBlockers ?? []);
346
+ return dedupeGoalBlockers([...blockers, ...additions]);
279
347
  }
280
348
  function deriveRunnableStatus(requestedStatus, prerequisites) {
281
349
  if (requestedStatus === "passed" ||
@@ -295,35 +363,66 @@ function enqueueWrite(fn) {
295
363
  async function writeGoalRunsFile(cwd, runs) {
296
364
  const normalizedCwd = normalizeProjectPath(cwd);
297
365
  const dir = projectDir(normalizedCwd);
366
+ await withGoalStoreLock(dir, async () => {
367
+ await mkdir(dir, { recursive: true });
368
+ const goalsPath = join(dir, "goals.json");
369
+ const existingRuns = await readGoalRunsFile(normalizedCwd);
370
+ const omittedActive = omittedActiveGoalRuns(existingRuns, runs);
371
+ if (omittedActive.length > 0) {
372
+ const timestamp = nowIso();
373
+ const rejectedIds = new Set(omittedActive.map((run) => run.id));
374
+ const repairedRuns = existingRuns.map((run) => rejectedIds.has(run.id)
375
+ ? {
376
+ ...run,
377
+ evidence: [
378
+ ...run.evidence,
379
+ createGoalEvidence({
380
+ kind: "summary",
381
+ label: "Goal store write rejected",
382
+ content: "Rejected an attempted Goal overwrite that omitted active work; preserving existing durable state.",
383
+ createdAt: timestamp,
384
+ }),
385
+ ],
386
+ updatedAt: timestamp,
387
+ }
388
+ : run);
389
+ await atomicWriteJson(goalsPath, sortNewestFirst(repairedRuns));
390
+ await Promise.all(repairedRuns.map((run) => writeGoalProgressJournalFromRun(normalizedCwd, run)));
391
+ return;
392
+ }
393
+ const sorted = sortNewestFirst([...runs]);
394
+ await atomicWriteJson(goalsPath, sorted);
395
+ await atomicWriteJson(join(dir, "meta.json"), {
396
+ path: normalizedCwd,
397
+ name: basename(normalizedCwd),
398
+ });
399
+ await Promise.all(sorted.map((run) => writeGoalProgressJournalFromRun(normalizedCwd, run)));
400
+ });
401
+ }
402
+ async function withGoalStoreLock(dir, fn) {
298
403
  await mkdir(dir, { recursive: true });
299
- const goalsPath = join(dir, "goals.json");
300
- const existingRuns = await readGoalRunsFile(normalizedCwd);
301
- if (wouldEraseActiveGoalRuns(existingRuns, runs)) {
302
- const timestamp = nowIso();
303
- const repairedRuns = existingRuns.map((run) => ({
304
- ...run,
305
- evidence: [
306
- ...run.evidence,
307
- createGoalEvidence({
308
- kind: "summary",
309
- label: "Goal store write rejected",
310
- content: "Rejected an attempted empty Goal overwrite while active work was present; preserving existing durable state.",
311
- createdAt: timestamp,
312
- }),
313
- ],
314
- updatedAt: timestamp,
315
- }));
316
- await atomicWriteJson(goalsPath, sortNewestFirst(repairedRuns));
317
- await Promise.all(repairedRuns.map((run) => writeGoalProgressJournalFromRun(normalizedCwd, run)));
318
- return;
404
+ const lockPath = join(dir, "goals.lock");
405
+ const deadline = Date.now() + 10_000;
406
+ for (;;) {
407
+ let handle;
408
+ try {
409
+ handle = await open(lockPath, "wx");
410
+ await handle.writeFile(`${process.pid}\n${new Date().toISOString()}\n`, "utf-8");
411
+ await handle.close();
412
+ try {
413
+ return await fn();
414
+ }
415
+ finally {
416
+ await rm(lockPath, { force: true });
417
+ }
418
+ }
419
+ catch (err) {
420
+ await handle?.close().catch(() => undefined);
421
+ if (err.code !== "EEXIST" || Date.now() > deadline)
422
+ throw err;
423
+ await new Promise((resolve) => setTimeout(resolve, 25));
424
+ }
319
425
  }
320
- const sorted = sortNewestFirst([...runs]);
321
- await atomicWriteJson(goalsPath, sorted);
322
- await atomicWriteJson(join(dir, "meta.json"), {
323
- path: normalizedCwd,
324
- name: basename(normalizedCwd),
325
- });
326
- await Promise.all(sorted.map((run) => writeGoalProgressJournalFromRun(normalizedCwd, run)));
327
426
  }
328
427
  async function atomicWriteJson(path, value) {
329
428
  const tmpPath = `${path}.${process.pid}.${Date.now()}.tmp`;
@@ -430,10 +529,12 @@ export function createGoalRun(cwd, input) {
430
529
  prerequisites,
431
530
  harness: input.harness ?? [],
432
531
  evidencePlan: input.evidencePlan ?? [],
532
+ references: input.references ?? [],
433
533
  tasks: input.tasks ?? [],
434
534
  evidence: input.evidence ?? [],
435
535
  ...(input.verifier ? { verifier: input.verifier } : {}),
436
- blockers: input.blockers ?? [],
536
+ ...(input.completionAudit ? { completionAudit: input.completionAudit } : {}),
537
+ blockers: dedupeGoalBlockers(input.blockers ?? []),
437
538
  ...(input.activeWorkerId ? { activeWorkerId: input.activeWorkerId } : {}),
438
539
  ...(input.continueRequestedAt ? { continueRequestedAt: input.continueRequestedAt } : {}),
439
540
  };
@@ -516,7 +617,7 @@ export async function reconcileActiveGoalRuns(cwd, options = {}) {
516
617
  return {
517
618
  ...next,
518
619
  evidence: [...next.evidence, ...evidence],
519
- blockers: [...blockers],
620
+ blockers: dedupeGoalBlockers([...blockers]),
520
621
  updatedAt: timestamp,
521
622
  };
522
623
  });
@@ -542,9 +643,12 @@ export async function upsertGoalRun(cwd, input) {
542
643
  prerequisites: input.prerequisites ?? existing.prerequisites,
543
644
  harness: input.harness ?? existing.harness,
544
645
  evidencePlan: input.evidencePlan ?? existing.evidencePlan,
646
+ references: mergeGoalReferences(existing.references ?? [], input.references),
545
647
  tasks: mergeGoalTasks(existing.tasks, input.tasks),
546
648
  evidence: mergeGoalEvidence(existing.evidence, input.evidence),
547
- blockers: input.blockers ?? existing.blockers,
649
+ blockers: input.blockers
650
+ ? dedupeGoalBlockers(input.blockers)
651
+ : dedupeGoalBlockers(existing.blockers),
548
652
  status: deriveRunnableStatus(input.status ?? existing.status, input.prerequisites ?? existing.prerequisites),
549
653
  }
550
654
  : createGoalRun(cwd, input);
@@ -655,7 +759,7 @@ export async function updateGoalTask(cwd, runId, taskId, patch) {
655
759
  });
656
760
  }
657
761
  export function isBlockingGoalPrerequisite(item) {
658
- return item.status === "missing" || (item.status === "unknown" && !item.evidence);
762
+ return item.status !== "met" || !item.evidence?.trim();
659
763
  }
660
764
  export function hasBlockingGoalPrerequisites(prerequisites) {
661
765
  return prerequisites.some(isBlockingGoalPrerequisite);
@@ -664,7 +768,16 @@ export function goalHasBlockingPrerequisites(run) {
664
768
  return hasBlockingGoalPrerequisites(run.prerequisites);
665
769
  }
666
770
  export function formatGoalPrerequisiteInstruction(item) {
667
- return item.instructions?.trim() || "User must provide this prerequisite.";
771
+ const instructions = item.instructions?.trim();
772
+ if (instructions)
773
+ return instructions;
774
+ if (item.status === "met" && !item.evidence?.trim()) {
775
+ return "Prerequisite is marked met but has no recorded check evidence; verify it locally and record non-secret evidence.";
776
+ }
777
+ if (item.status === "unknown") {
778
+ return "Check this prerequisite locally and record non-secret evidence before workers can start.";
779
+ }
780
+ return "User must provide this prerequisite.";
668
781
  }
669
782
  export function formatGoalBlockingPrerequisiteList(prerequisites) {
670
783
  const missing = prerequisites.filter(isBlockingGoalPrerequisite);
@@ -726,6 +839,11 @@ async function writeGoalProgressJournalFromRun(cwd, run) {
726
839
  ? run.prerequisites.map((item) => `- [${item.status}] ${item.label}${item.evidence ? ` — ${item.evidence}` : ""}`)
727
840
  : ["- none"]),
728
841
  "",
842
+ "## References",
843
+ ...(run.references?.length
844
+ ? run.references.map((item) => `- [${item.kind}] ${item.id}: ${item.label}${item.value ? ` — ${item.value}` : ""}${item.path ? ` (${item.path})` : ""}`)
845
+ : ["- none"]),
846
+ "",
729
847
  "## Tasks",
730
848
  ...(run.tasks.length
731
849
  ? run.tasks.map((task) => `- [${task.status}] ${task.title} (attempts: ${task.attempts})${task.lastSummary ? ` — ${task.lastSummary}` : ""}`)
@@ -736,6 +854,11 @@ async function writeGoalProgressJournalFromRun(cwd, run) {
736
854
  ? `- ${run.verifier.lastResult.status}: ${run.verifier.lastResult.summary}${run.verifier.lastResult.outputPath ? ` (${run.verifier.lastResult.outputPath})` : ""}`
737
855
  : `- ${run.verifier?.command ?? "none"}`,
738
856
  "",
857
+ "## Final completion audit",
858
+ run.completionAudit
859
+ ? `- ${run.completionAudit.status}: ${run.completionAudit.summary}${run.completionAudit.outputPath ? ` (${run.completionAudit.outputPath})` : ""}`
860
+ : "- none",
861
+ "",
739
862
  "## Blockers",
740
863
  ...(run.blockers.length ? run.blockers.map((item) => `- ${item}`) : ["- none"]),
741
864
  "",