@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.
- package/README.md +5 -8
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -61
- package/dist/cli.js.map +1 -1
- package/dist/core/continue-replay-inventory.test.d.ts +2 -0
- package/dist/core/continue-replay-inventory.test.d.ts.map +1 -0
- package/dist/core/continue-replay-inventory.test.js +42 -0
- package/dist/core/continue-replay-inventory.test.js.map +1 -0
- package/dist/core/goal-controller.d.ts +2 -0
- package/dist/core/goal-controller.d.ts.map +1 -1
- package/dist/core/goal-controller.js +283 -24
- package/dist/core/goal-controller.js.map +1 -1
- package/dist/core/goal-controller.test.js +413 -16
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/goal-lifecycle-smoke.test.js +48 -6
- package/dist/core/goal-lifecycle-smoke.test.js.map +1 -1
- package/dist/core/goal-prerequisites.d.ts +5 -0
- package/dist/core/goal-prerequisites.d.ts.map +1 -1
- package/dist/core/goal-prerequisites.js +37 -0
- package/dist/core/goal-prerequisites.js.map +1 -1
- package/dist/core/goal-prerequisites.test.js +29 -1
- package/dist/core/goal-prerequisites.test.js.map +1 -1
- package/dist/core/goal-references.d.ts +14 -0
- package/dist/core/goal-references.d.ts.map +1 -0
- package/dist/core/goal-references.js +153 -0
- package/dist/core/goal-references.js.map +1 -0
- package/dist/core/goal-references.test.d.ts +2 -0
- package/dist/core/goal-references.test.d.ts.map +1 -0
- package/dist/core/goal-references.test.js +77 -0
- package/dist/core/goal-references.test.js.map +1 -0
- package/dist/core/goal-store.d.ts +25 -0
- package/dist/core/goal-store.d.ts.map +1 -1
- package/dist/core/goal-store.js +150 -36
- package/dist/core/goal-store.js.map +1 -1
- package/dist/core/goal-store.test.js +19 -2
- package/dist/core/goal-store.test.js.map +1 -1
- package/dist/core/goal-verifier.d.ts.map +1 -1
- package/dist/core/goal-verifier.js +4 -1
- package/dist/core/goal-verifier.js.map +1 -1
- package/dist/core/goal-verifier.test.js +43 -0
- package/dist/core/goal-verifier.test.js.map +1 -1
- package/dist/core/goal-worker.d.ts +2 -0
- package/dist/core/goal-worker.d.ts.map +1 -1
- package/dist/core/goal-worker.js +33 -9
- package/dist/core/goal-worker.js.map +1 -1
- package/dist/core/goal-worker.test.js +49 -1
- package/dist/core/goal-worker.test.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +28 -846
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +40 -78
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/runtime-mode.d.ts +14 -0
- package/dist/core/runtime-mode.d.ts.map +1 -0
- package/dist/core/runtime-mode.js +10 -0
- package/dist/core/runtime-mode.js.map +1 -0
- package/dist/core/session-restore-display.test.d.ts +2 -0
- package/dist/core/session-restore-display.test.d.ts.map +1 -0
- package/dist/core/session-restore-display.test.js +100 -0
- package/dist/core/session-restore-display.test.js.map +1 -0
- package/dist/core/verify-commands.js +4 -4
- package/dist/core/verify-commands.js.map +1 -1
- package/dist/system-prompt.d.ts +2 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +51 -37
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +147 -40
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/bash.d.ts +3 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +11 -4
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +5 -3
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +14 -4
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +0 -10
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/goal-mode.test.d.ts +2 -0
- package/dist/tools/goal-mode.test.d.ts.map +1 -0
- package/dist/tools/goal-mode.test.js +121 -0
- package/dist/tools/goal-mode.test.js.map +1 -0
- package/dist/tools/goals.d.ts +15 -3
- package/dist/tools/goals.d.ts.map +1 -1
- package/dist/tools/goals.js +336 -26
- package/dist/tools/goals.js.map +1 -1
- package/dist/tools/goals.test.js +346 -6
- package/dist/tools/goals.test.js.map +1 -1
- package/dist/tools/index.d.ts +7 -10
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -19
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-mode.test.js +34 -224
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -6
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/subagent.d.ts +3 -2
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +4 -9
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/write.d.ts +5 -3
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +14 -13
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +0 -16
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +145 -28
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +1153 -864
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/activity-phrases.d.ts.map +1 -1
- package/dist/ui/activity-phrases.js +0 -2
- package/dist/ui/activity-phrases.js.map +1 -1
- package/dist/ui/app-state-persistence.test.js +173 -5
- package/dist/ui/app-state-persistence.test.js.map +1 -1
- package/dist/ui/chat-layout-pinning.test.d.ts +2 -0
- package/dist/ui/chat-layout-pinning.test.d.ts.map +1 -0
- package/dist/ui/chat-layout-pinning.test.js +407 -0
- package/dist/ui/chat-layout-pinning.test.js.map +1 -0
- package/dist/ui/components/ActivityIndicator.d.ts +1 -2
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +63 -94
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/AssistantMessage.d.ts +6 -2
- package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
- package/dist/ui/components/AssistantMessage.js +9 -4
- package/dist/ui/components/AssistantMessage.js.map +1 -1
- package/dist/ui/components/AssistantMessage.test.d.ts +2 -0
- package/dist/ui/components/AssistantMessage.test.d.ts.map +1 -0
- package/dist/ui/components/AssistantMessage.test.js +369 -0
- package/dist/ui/components/AssistantMessage.test.js.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts +1 -3
- package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
- package/dist/ui/components/BackgroundTasksBar.js +2 -4
- package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
- package/dist/ui/components/Banner.d.ts +1 -3
- package/dist/ui/components/Banner.d.ts.map +1 -1
- package/dist/ui/components/Banner.js +7 -3
- package/dist/ui/components/Banner.js.map +1 -1
- package/dist/ui/components/Footer.d.ts +26 -4
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +73 -21
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/GoalOverlay.d.ts +28 -20
- package/dist/ui/components/GoalOverlay.d.ts.map +1 -1
- package/dist/ui/components/GoalOverlay.js +283 -253
- package/dist/ui/components/GoalOverlay.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts +2 -6
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +40 -32
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/InputArea.test.js +11 -1
- package/dist/ui/components/InputArea.test.js.map +1 -1
- package/dist/ui/components/Markdown.d.ts +11 -11
- package/dist/ui/components/Markdown.d.ts.map +1 -1
- package/dist/ui/components/Markdown.js +25 -198
- package/dist/ui/components/Markdown.js.map +1 -1
- package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
- package/dist/ui/components/PlanOverlay.js +1 -1
- package/dist/ui/components/PlanOverlay.js.map +1 -1
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ServerToolExecution.js +3 -2
- package/dist/ui/components/ServerToolExecution.js.map +1 -1
- package/dist/ui/components/SlashCommandMenu.d.ts +4 -3
- package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
- package/dist/ui/components/SlashCommandMenu.js +38 -26
- package/dist/ui/components/SlashCommandMenu.js.map +1 -1
- package/dist/ui/components/StreamingArea.d.ts +11 -2
- package/dist/ui/components/StreamingArea.d.ts.map +1 -1
- package/dist/ui/components/StreamingArea.js +20 -23
- package/dist/ui/components/StreamingArea.js.map +1 -1
- package/dist/ui/components/StreamingArea.test.d.ts +2 -0
- package/dist/ui/components/StreamingArea.test.d.ts.map +1 -0
- package/dist/ui/components/StreamingArea.test.js +18 -0
- package/dist/ui/components/StreamingArea.test.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +11 -27
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolGroupExecution.js +9 -124
- package/dist/ui/components/ToolGroupExecution.js.map +1 -1
- package/dist/ui/components/UserMessage.d.ts.map +1 -1
- package/dist/ui/components/UserMessage.js +15 -10
- package/dist/ui/components/UserMessage.js.map +1 -1
- package/dist/ui/components/UserMessage.test.d.ts +2 -0
- package/dist/ui/components/UserMessage.test.d.ts.map +1 -0
- package/dist/ui/components/UserMessage.test.js +39 -0
- package/dist/ui/components/UserMessage.test.js.map +1 -0
- package/dist/ui/footer-status-layout.test.js +21 -7
- package/dist/ui/footer-status-layout.test.js.map +1 -1
- package/dist/ui/goal-events.d.ts +13 -0
- package/dist/ui/goal-events.d.ts.map +1 -1
- package/dist/ui/goal-events.js +81 -16
- package/dist/ui/goal-events.js.map +1 -1
- package/dist/ui/goal-events.test.js +76 -2
- package/dist/ui/goal-events.test.js.map +1 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js +131 -34
- package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
- package/dist/ui/goal-overlay.test.js +121 -43
- package/dist/ui/goal-overlay.test.js.map +1 -1
- package/dist/ui/goal-summary.d.ts +14 -0
- package/dist/ui/goal-summary.d.ts.map +1 -0
- package/dist/ui/goal-summary.js +194 -0
- package/dist/ui/goal-summary.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +8 -2
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +20 -9
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.test.d.ts +2 -0
- package/dist/ui/hooks/useAgentLoop.test.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentLoop.test.js +8 -0
- package/dist/ui/hooks/useAgentLoop.test.js.map +1 -0
- package/dist/ui/hooks/useTerminalSize.d.ts +5 -9
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalSize.js +9 -14
- package/dist/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/ui/live-item-flush.d.ts +2 -2
- package/dist/ui/live-item-flush.d.ts.map +1 -1
- package/dist/ui/live-item-flush.js +8 -4
- package/dist/ui/live-item-flush.js.map +1 -1
- package/dist/ui/long-prompt-regression-harness.test.d.ts +2 -0
- package/dist/ui/long-prompt-regression-harness.test.d.ts.map +1 -0
- package/dist/ui/long-prompt-regression-harness.test.js +195 -0
- package/dist/ui/long-prompt-regression-harness.test.js.map +1 -0
- package/dist/ui/plan-overlay.test.js +7 -29
- package/dist/ui/plan-overlay.test.js.map +1 -1
- package/dist/ui/queued-message.test.d.ts.map +1 -1
- package/dist/ui/queued-message.test.js +76 -14
- package/dist/ui/queued-message.test.js.map +1 -1
- package/dist/ui/render.d.ts +21 -24
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +46 -28
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/render.test.d.ts +2 -0
- package/dist/ui/render.test.d.ts.map +1 -0
- package/dist/ui/render.test.js +16 -0
- package/dist/ui/render.test.js.map +1 -0
- package/dist/ui/scroll-stabilization.test.js +1 -1
- package/dist/ui/scroll-stabilization.test.js.map +1 -1
- package/dist/ui/slash-command-images.test.js +79 -4
- package/dist/ui/slash-command-images.test.js.map +1 -1
- package/dist/ui/terminal-history.d.ts +26 -0
- package/dist/ui/terminal-history.d.ts.map +1 -0
- package/dist/ui/terminal-history.js +910 -0
- package/dist/ui/terminal-history.js.map +1 -0
- package/dist/ui/terminal-history.test.d.ts +2 -0
- package/dist/ui/terminal-history.test.d.ts.map +1 -0
- package/dist/ui/terminal-history.test.js +314 -0
- package/dist/ui/terminal-history.test.js.map +1 -0
- package/dist/ui/tool-group-summary.d.ts +16 -0
- package/dist/ui/tool-group-summary.d.ts.map +1 -0
- package/dist/ui/tool-group-summary.js +123 -0
- package/dist/ui/tool-group-summary.js.map +1 -0
- package/dist/ui/tui-history-parity.test.d.ts +2 -0
- package/dist/ui/tui-history-parity.test.d.ts.map +1 -0
- package/dist/ui/tui-history-parity.test.js +243 -0
- package/dist/ui/tui-history-parity.test.js.map +1 -0
- package/dist/ui/utils/assistant-stream-split.d.ts +6 -0
- package/dist/ui/utils/assistant-stream-split.d.ts.map +1 -0
- package/dist/ui/utils/assistant-stream-split.js +37 -0
- package/dist/ui/utils/assistant-stream-split.js.map +1 -0
- package/dist/ui/utils/assistant-stream-split.test.d.ts +2 -0
- package/dist/ui/utils/assistant-stream-split.test.d.ts.map +1 -0
- package/dist/ui/utils/assistant-stream-split.test.js +58 -0
- package/dist/ui/utils/assistant-stream-split.test.js.map +1 -0
- package/dist/ui/utils/latex-to-unicode.d.ts +22 -0
- package/dist/ui/utils/latex-to-unicode.d.ts.map +1 -0
- package/dist/ui/utils/latex-to-unicode.js +538 -0
- package/dist/ui/utils/latex-to-unicode.js.map +1 -0
- package/dist/ui/utils/markdown-renderer.d.ts +20 -0
- package/dist/ui/utils/markdown-renderer.d.ts.map +1 -0
- package/dist/ui/utils/markdown-renderer.js +327 -0
- package/dist/ui/utils/markdown-renderer.js.map +1 -0
- package/dist/ui/utils/markdown-table.d.ts +9 -0
- package/dist/ui/utils/markdown-table.d.ts.map +1 -0
- package/dist/ui/utils/markdown-table.js +95 -0
- package/dist/ui/utils/markdown-table.js.map +1 -0
- package/dist/ui/utils/text-utils.d.ts +8 -0
- package/dist/ui/utils/text-utils.d.ts.map +1 -0
- package/dist/ui/utils/text-utils.js +16 -0
- package/dist/ui/utils/text-utils.js.map +1 -0
- package/dist/ui/utils/token-to-ansi.js +19 -9
- package/dist/ui/utils/token-to-ansi.js.map +1 -1
- package/dist/ui/utils/user-message-display.d.ts +7 -0
- package/dist/ui/utils/user-message-display.d.ts.map +1 -0
- package/dist/ui/utils/user-message-display.js +26 -0
- package/dist/ui/utils/user-message-display.js.map +1 -0
- package/dist/utils/format.js +0 -9
- package/dist/utils/format.js.map +1 -1
- package/package.json +9 -4
- package/dist/tools/enter-plan.d.ts +0 -8
- package/dist/tools/enter-plan.d.ts.map +0 -1
- package/dist/tools/enter-plan.js +0 -30
- package/dist/tools/enter-plan.js.map +0 -1
- package/dist/tools/exit-plan.d.ts +0 -8
- package/dist/tools/exit-plan.d.ts.map +0 -1
- package/dist/tools/exit-plan.js +0 -36
- package/dist/tools/exit-plan.js.map +0 -1
- package/dist/tools/tasks.d.ts +0 -16
- package/dist/tools/tasks.d.ts.map +0 -1
- package/dist/tools/tasks.js +0 -133
- package/dist/tools/tasks.js.map +0 -1
- package/dist/ui/components/EyesOverlay.d.ts +0 -10
- package/dist/ui/components/EyesOverlay.d.ts.map +0 -1
- package/dist/ui/components/EyesOverlay.js +0 -220
- package/dist/ui/components/EyesOverlay.js.map +0 -1
- package/dist/ui/components/TaskOverlay.d.ts +0 -10
- package/dist/ui/components/TaskOverlay.d.ts.map +0 -1
- package/dist/ui/components/TaskOverlay.js +0 -267
- 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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,IAAI,OAAe,CAAC;AACpB,IAAI,UAAkB,CAAC;AAEvB,KAAK,UAAU,KAAK,CAClB,IAAkE;IAElE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;QAC/C,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QACpC,UAAU,EAAE,sBAAsB;KACnC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,kDAAkD,CAAC,CAAC,UAAU,EAAE,CAAC;IACjF,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACjF,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,+BAA+B,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACjC,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,4GAA4G,EAAE,KAAK,IAAI,EAAE;QAC1H,MAAM,KAAK,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,mEAAmE;YACzE,gBAAgB,EAAE;gBAChB,wBAAwB;gBACxB,kCAAkC;gBAClC,gCAAgC;aACjC;YACD,aAAa,EAAE;gBACb,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE;aAClF;YACD,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,eAAe;oBACnB,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,8BAA8B;oBACvC,IAAI,EAAE,uBAAuB;oBAC7B,WAAW,EAAE,gDAAgD;iBAC9D;aACF;YACD,aAAa,EAAE;gBACb;oBACE,EAAE,EAAE,aAAa;oBACjB,KAAK,EAAE,uBAAuB;oBAC9B,SAAS,EAAE,MAAM;oBACjB,WAAW,EAAE,iDAAiD;oBAC9D,MAAM,EAAE,
|
|
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,
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,CAAC,MAAM,0CAA0C,GAAG,MAAM,CAAC;AACjE,MAAM,+BAA+B,GAAG,GAAG,CAAC;
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,8BAA8B,
|
|
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 @@
|
|
|
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;
|