@kenkaiiii/ggcoder 5.26.0 → 5.26.2
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/dist/app-sidecar.js +71 -52
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +0 -12
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-session-queue.test.js +65 -0
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +11 -13
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +34 -64
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/event-bus.d.ts +7 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/run-claim.d.ts +37 -0
- package/dist/core/run-claim.d.ts.map +1 -0
- package/dist/core/run-claim.js +46 -0
- package/dist/core/run-claim.js.map +1 -0
- package/dist/core/run-claim.test.d.ts +2 -0
- package/dist/core/run-claim.test.d.ts.map +1 -0
- package/dist/core/run-claim.test.js +107 -0
- package/dist/core/run-claim.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +0 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +0 -7
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/ui/App.d.ts +0 -2
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +1 -35
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/render.d.ts +0 -2
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +0 -1
- package/dist/ui/render.js.map +1 -1
- package/package.json +4 -4
- package/dist/core/memory/compaction-notes.d.ts +0 -31
- package/dist/core/memory/compaction-notes.d.ts.map +0 -1
- package/dist/core/memory/compaction-notes.js +0 -162
- package/dist/core/memory/compaction-notes.js.map +0 -1
- package/dist/core/memory/compaction-notes.test.d.ts +0 -2
- package/dist/core/memory/compaction-notes.test.d.ts.map +0 -1
- package/dist/core/memory/compaction-notes.test.js +0 -110
- package/dist/core/memory/compaction-notes.test.js.map +0 -1
- package/dist/core/memory/journal.d.ts +0 -55
- package/dist/core/memory/journal.d.ts.map +0 -1
- package/dist/core/memory/journal.js +0 -212
- package/dist/core/memory/journal.js.map +0 -1
- package/dist/core/memory/journal.test.d.ts +0 -2
- package/dist/core/memory/journal.test.d.ts.map +0 -1
- package/dist/core/memory/journal.test.js +0 -184
- package/dist/core/memory/journal.test.js.map +0 -1
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { ProjectJournal, buildJournalPromptTail, ENTRY_MAX_CHARS, JOURNAL_RELATIVE_PATH, PROMPT_ENTRY_LIMIT, } from "./journal.js";
|
|
6
|
-
const projects = [];
|
|
7
|
-
function project() {
|
|
8
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "gg-journal-"));
|
|
9
|
-
projects.push(dir);
|
|
10
|
-
return dir;
|
|
11
|
-
}
|
|
12
|
-
const FIXED_DATE = () => new Date("2026-07-27T10:00:00Z");
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
for (const dir of projects.splice(0))
|
|
15
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
16
|
-
});
|
|
17
|
-
describe("ProjectJournal", () => {
|
|
18
|
-
it("writes a reviewable markdown file inside the project", async () => {
|
|
19
|
-
const cwd = project();
|
|
20
|
-
const journal = new ProjectJournal(cwd, FIXED_DATE);
|
|
21
|
-
await journal.append([{ tag: "request", text: "Was asked to: add retry logic" }]);
|
|
22
|
-
const filePath = path.join(cwd, JOURNAL_RELATIVE_PATH);
|
|
23
|
-
expect(fs.existsSync(filePath)).toBe(true);
|
|
24
|
-
const body = fs.readFileSync(filePath, "utf-8");
|
|
25
|
-
// Human-facing: a header explaining the file, and one diffable line per entry.
|
|
26
|
-
expect(body).toContain("# Project memory");
|
|
27
|
-
expect(body).toContain("- 2026-07-27 [request] Was asked to: add retry logic");
|
|
28
|
-
});
|
|
29
|
-
it("round-trips entries it wrote", async () => {
|
|
30
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
31
|
-
await journal.append([
|
|
32
|
-
{ tag: "request", text: "Was asked to: ship the parser" },
|
|
33
|
-
{ tag: "files", text: "Edited: src/parse.ts" },
|
|
34
|
-
]);
|
|
35
|
-
expect(journal.read()).toEqual([
|
|
36
|
-
{ date: "2026-07-27", tag: "request", text: "Was asked to: ship the parser" },
|
|
37
|
-
{ date: "2026-07-27", tag: "files", text: "Edited: src/parse.ts" },
|
|
38
|
-
]);
|
|
39
|
-
});
|
|
40
|
-
it("reads back hand-edited entries and preserves human edits on append", async () => {
|
|
41
|
-
const cwd = project();
|
|
42
|
-
const journal = new ProjectJournal(cwd, FIXED_DATE);
|
|
43
|
-
await journal.append([{ tag: "summary", text: "Original machine entry" }]);
|
|
44
|
-
// A human corrects the file and adds a note of their own — the whole point
|
|
45
|
-
// of using markdown in the repo instead of a binary log in ~/.gg.
|
|
46
|
-
const filePath = path.join(cwd, JOURNAL_RELATIVE_PATH);
|
|
47
|
-
const edited = fs
|
|
48
|
-
.readFileSync(filePath, "utf-8")
|
|
49
|
-
.replace("Original machine entry", "Corrected by a human")
|
|
50
|
-
.concat("- 2026-07-26 [note] Hand-written by the reviewer\n");
|
|
51
|
-
fs.writeFileSync(filePath, edited);
|
|
52
|
-
await journal.append([{ tag: "files", text: "Edited: src/new.ts" }]);
|
|
53
|
-
const texts = journal.read().map((entry) => entry.text);
|
|
54
|
-
expect(texts).toEqual([
|
|
55
|
-
"Corrected by a human",
|
|
56
|
-
"Hand-written by the reviewer",
|
|
57
|
-
"Edited: src/new.ts",
|
|
58
|
-
]);
|
|
59
|
-
expect(fs.readFileSync(filePath, "utf-8")).not.toContain("Original machine entry");
|
|
60
|
-
});
|
|
61
|
-
it("skips entries whose text is already recorded", async () => {
|
|
62
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
63
|
-
await journal.append([{ tag: "files", text: "Edited: src/a.ts" }]);
|
|
64
|
-
expect(await journal.append([{ tag: "files", text: "Edited: src/a.ts" }])).toBe(0);
|
|
65
|
-
expect(journal.read()).toHaveLength(1);
|
|
66
|
-
});
|
|
67
|
-
it("clamps entry text and drops empty entries", async () => {
|
|
68
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
69
|
-
const written = await journal.append([
|
|
70
|
-
{ tag: "summary", text: "z".repeat(5000) },
|
|
71
|
-
{ tag: "summary", text: " " },
|
|
72
|
-
]);
|
|
73
|
-
expect(written).toBe(1);
|
|
74
|
-
const [entry] = journal.read();
|
|
75
|
-
expect(entry.text.length).toBeLessThanOrEqual(ENTRY_MAX_CHARS);
|
|
76
|
-
expect(entry.text.endsWith("\u2026")).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
it("collapses newlines so one entry can never become two lines", async () => {
|
|
79
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
80
|
-
await journal.append([{ tag: "summary", text: "line one\nline two\n- fake entry" }]);
|
|
81
|
-
expect(journal.read()).toHaveLength(1);
|
|
82
|
-
expect(journal.read()[0].text).toBe("line one line two - fake entry");
|
|
83
|
-
});
|
|
84
|
-
it("cuts a long entry at a sentence boundary, not mid-word", async () => {
|
|
85
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
86
|
-
// Comfortably over ENTRY_MAX_CHARS so truncation actually engages.
|
|
87
|
-
const sentences = "Replaced the naive lowercase call in the slug helper with a regex substitution. " +
|
|
88
|
-
"The first attempt dropped unicode characters entirely and broke two fixtures. " +
|
|
89
|
-
"Fixed it by switching to an explicit character class. " +
|
|
90
|
-
"Then rewrote the helper so it also trims leading hyphens from the output value. " +
|
|
91
|
-
"Also updated the docblock to describe the new normalisation order in detail. " +
|
|
92
|
-
"Finally confirmed the behaviour against the existing suite of unit tests today.";
|
|
93
|
-
await journal.append([{ tag: "summary", text: sentences }]);
|
|
94
|
-
const text = journal.read()[0].text;
|
|
95
|
-
expect(text.length).toBeLessThanOrEqual(ENTRY_MAX_CHARS);
|
|
96
|
-
// Ends on a complete sentence, with the truncation still visible.
|
|
97
|
-
expect(text.endsWith(". \u2026")).toBe(true);
|
|
98
|
-
expect(text).toContain("explicit character class.");
|
|
99
|
-
// The severed sentence is absent rather than present as a fragment.
|
|
100
|
-
expect(text).not.toContain("Finally confirmed");
|
|
101
|
-
});
|
|
102
|
-
it("falls back to a word boundary when no sentence end fits", async () => {
|
|
103
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
104
|
-
// One long clause: no terminal punctuation to cut back to.
|
|
105
|
-
const words = Array.from({ length: 120 }, (_, i) => `token${i}`).join(" ");
|
|
106
|
-
await journal.append([{ tag: "summary", text: words }]);
|
|
107
|
-
const text = journal.read()[0].text;
|
|
108
|
-
expect(text.length).toBeLessThanOrEqual(ENTRY_MAX_CHARS);
|
|
109
|
-
// A whole token, never a severed one like "token4" cut from "token42".
|
|
110
|
-
const lastToken = text
|
|
111
|
-
.replace(/\u2026$/, "")
|
|
112
|
-
.trim()
|
|
113
|
-
.split(" ")
|
|
114
|
-
.pop();
|
|
115
|
-
expect(words.split(" ")).toContain(lastToken);
|
|
116
|
-
});
|
|
117
|
-
it("never severs a file path in the middle", async () => {
|
|
118
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
119
|
-
const paths = Array.from({ length: 40 }, (_, i) => `packages/ggcoder/src/module-${i}.ts`);
|
|
120
|
-
await journal.append([{ tag: "files", text: `Edited: ${paths.join(", ")}` }]);
|
|
121
|
-
const text = journal.read()[0].text;
|
|
122
|
-
const listed = text
|
|
123
|
-
.replace(/^Edited:\s*/, "")
|
|
124
|
-
.replace(/\u2026$/, "")
|
|
125
|
-
.split(",")
|
|
126
|
-
.map((entry) => entry.trim())
|
|
127
|
-
.filter(Boolean);
|
|
128
|
-
for (const entry of listed)
|
|
129
|
-
expect(paths).toContain(entry);
|
|
130
|
-
});
|
|
131
|
-
it("leaves text that already fits completely untouched", async () => {
|
|
132
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
133
|
-
await journal.append([{ tag: "summary", text: "Short and complete." }]);
|
|
134
|
-
expect(journal.read()[0].text).toBe("Short and complete.");
|
|
135
|
-
});
|
|
136
|
-
it("returns nothing for a project with no journal", () => {
|
|
137
|
-
expect(new ProjectJournal(project()).read()).toEqual([]);
|
|
138
|
-
});
|
|
139
|
-
it("survives concurrent appends without losing entries", async () => {
|
|
140
|
-
const cwd = project();
|
|
141
|
-
// Separate instances, as two daemons sharing one project would be.
|
|
142
|
-
const writers = Array.from({ length: 5 }, () => new ProjectJournal(cwd, FIXED_DATE));
|
|
143
|
-
await Promise.all(writers.map((w, i) => w.append([{ tag: "files", text: `Edited: f${i}.ts` }])));
|
|
144
|
-
expect(new ProjectJournal(cwd).read()).toHaveLength(5);
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
describe("buildJournalPromptTail", () => {
|
|
148
|
-
it("costs nothing when the journal is empty", () => {
|
|
149
|
-
expect(buildJournalPromptTail(new ProjectJournal(project()))).toBe("");
|
|
150
|
-
});
|
|
151
|
-
it("renders recent entries and points at the file for older ones", async () => {
|
|
152
|
-
const cwd = project();
|
|
153
|
-
const journal = new ProjectJournal(cwd, FIXED_DATE);
|
|
154
|
-
for (let i = 0; i < PROMPT_ENTRY_LIMIT + 5; i++) {
|
|
155
|
-
await journal.append([{ tag: "summary", text: `Entry number ${i}` }]);
|
|
156
|
-
}
|
|
157
|
-
const tail = buildJournalPromptTail(journal);
|
|
158
|
-
expect(tail).toContain("## Project memory");
|
|
159
|
-
// Newest entries are present, oldest are not.
|
|
160
|
-
expect(tail).toContain(`Entry number ${PROMPT_ENTRY_LIMIT + 4}`);
|
|
161
|
-
expect(tail).not.toContain("Entry number 0 ");
|
|
162
|
-
// Older material is reachable, not silently dropped.
|
|
163
|
-
expect(tail).toContain(JOURNAL_RELATIVE_PATH);
|
|
164
|
-
expect(tail).toContain("5 older entries");
|
|
165
|
-
});
|
|
166
|
-
it("frames entries as past events, not current state", async () => {
|
|
167
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
168
|
-
await journal.append([{ tag: "files", text: "Edited: src/a.ts" }]);
|
|
169
|
-
const tail = buildJournalPromptTail(journal);
|
|
170
|
-
// Bench G: the model will not verify on its own, so the framing must at
|
|
171
|
-
// least never present these as a description of how things are now.
|
|
172
|
-
expect(tail).toContain("records of past events");
|
|
173
|
-
expect(tail).toContain("check the code");
|
|
174
|
-
});
|
|
175
|
-
it("respects the char budget", async () => {
|
|
176
|
-
const journal = new ProjectJournal(project(), FIXED_DATE);
|
|
177
|
-
for (let i = 0; i < 8; i++) {
|
|
178
|
-
await journal.append([{ tag: "summary", text: `${i} ${"long body ".repeat(30)}` }]);
|
|
179
|
-
}
|
|
180
|
-
const tail = buildJournalPromptTail(journal, { charBudget: 300 });
|
|
181
|
-
expect(tail.length).toBeLessThan(700);
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
//# sourceMappingURL=journal.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"journal.test.js","sourceRoot":"","sources":["../../../src/core/memory/journal.test.ts"],"names":[],"mappings":"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"}
|