@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.
- 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 +23 -0
- package/dist/core/goal-prerequisites.d.ts.map +1 -0
- package/dist/core/goal-prerequisites.js +114 -0
- package/dist/core/goal-prerequisites.js.map +1 -0
- package/dist/core/goal-prerequisites.test.d.ts +2 -0
- package/dist/core/goal-prerequisites.test.d.ts.map +1 -0
- package/dist/core/goal-prerequisites.test.js +118 -0
- package/dist/core/goal-prerequisites.test.js.map +1 -0
- 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 +161 -38
- package/dist/core/goal-store.js.map +1 -1
- package/dist/core/goal-store.test.js +33 -8
- 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 -845
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +40 -74
- 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 +385 -35
- package/dist/tools/goals.js.map +1 -1
- package/dist/tools/goals.test.js +389 -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 +146 -30
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +1202 -910
- 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 +181 -13
- 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 +8 -0
- package/dist/ui/goal-events.d.ts.map +1 -1
- package/dist/ui/goal-events.js +28 -8
- package/dist/ui/goal-events.js.map +1 -1
- package/dist/ui/goal-events.test.js +40 -2
- package/dist/ui/goal-events.test.js.map +1 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js +127 -34
- package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
- package/dist/ui/goal-overlay.test.js +122 -44
- 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 -5
- 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
|
@@ -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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"}
|
package/dist/core/goal-store.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
"",
|