loopforge 1.3.1 → 1.8.0
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 +64 -3
- package/dist/backends/fs.d.ts +5 -0
- package/dist/backends/fs.d.ts.map +1 -1
- package/dist/backends/fs.js +66 -16
- package/dist/backends/fs.js.map +1 -1
- package/dist/builder.d.ts +0 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +14 -25
- package/dist/builder.js.map +1 -1
- package/dist/engine.d.ts +28 -5
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +303 -105
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +9 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -10
- package/dist/index.js.map +1 -1
- package/dist/loop-compiler.d.ts +28 -2
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +718 -38
- package/dist/loop-compiler.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +6 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +24 -4
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +303 -34
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +165 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +144 -15
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory-bridge.d.ts +47 -0
- package/dist/memory-bridge.d.ts.map +1 -0
- package/dist/memory-bridge.js +290 -0
- package/dist/memory-bridge.js.map +1 -0
- package/dist/observability.d.ts +23 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +29 -0
- package/dist/observability.js.map +1 -0
- package/dist/policy.d.ts +72 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +44 -0
- package/dist/policy.js.map +1 -1
- package/dist/protocol.d.ts +197 -7
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +48 -5
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +446 -142
- package/dist/runtime.js.map +1 -1
- package/dist/tests/builder.test.js +1 -25
- package/dist/tests/builder.test.js.map +1 -1
- package/dist/tests/engine.test.js +213 -38
- package/dist/tests/engine.test.js.map +1 -1
- package/dist/tests/generate-schema.test.js +4 -4
- package/dist/tests/generate-schema.test.js.map +1 -1
- package/dist/tests/loop-compiler.test.js +427 -2
- package/dist/tests/loop-compiler.test.js.map +1 -1
- package/dist/tests/mcp.test.js +166 -79
- package/dist/tests/mcp.test.js.map +1 -1
- package/dist/tests/memory-bridge.test.d.ts +8 -0
- package/dist/tests/memory-bridge.test.d.ts.map +1 -0
- package/dist/tests/memory-bridge.test.js +384 -0
- package/dist/tests/memory-bridge.test.js.map +1 -0
- package/dist/tests/protocol.test.js +14 -5
- package/dist/tests/protocol.test.js.map +1 -1
- package/dist/tests/verification-gate.test.d.ts +2 -0
- package/dist/tests/verification-gate.test.d.ts.map +1 -0
- package/dist/tests/verification-gate.test.js +407 -0
- package/dist/tests/verification-gate.test.js.map +1 -0
- package/dist/verification-gate.d.ts +26 -0
- package/dist/verification-gate.d.ts.map +1 -0
- package/dist/verification-gate.js +232 -0
- package/dist/verification-gate.js.map +1 -0
- package/loop_policy.json +31 -0
- package/package.json +1 -2
- package/skills/perception/SKILL.md +147 -55
- package/dist/adapter.d.ts +0 -17
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js +0 -228
- package/dist/adapter.js.map +0 -1
- package/dist/cli.d.ts +0 -7
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -458
- package/dist/cli.js.map +0 -1
- package/dist/tests/adapter.test.d.ts +0 -2
- package/dist/tests/adapter.test.d.ts.map +0 -1
- package/dist/tests/adapter.test.js +0 -104
- package/dist/tests/adapter.test.js.map +0 -1
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/** Tests for Memory Bridge (v1.8).
|
|
2
|
+
*
|
|
3
|
+
* Covers: detection, computeProjectHash, createMemoryProvider (retrieval),
|
|
4
|
+
* createMemoryWriter (writeback), autoConfigureMemory, tryAutoConfigure,
|
|
5
|
+
* and edge cases (empty dirs, no matches, lock contention).
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, before, after } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { mkdirSync, writeFileSync, rmSync, readFileSync, existsSync, readdirSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { computeProjectHash, findGitRoot, detectClaudeMem, createMemoryProvider, createMemoryWriter, autoConfigureMemory, tryAutoConfigure, } from "../memory-bridge.js";
|
|
14
|
+
import { SessionManager } from "../mcp/session.js";
|
|
15
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
16
|
+
// Helpers
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
function makeMemDir() {
|
|
19
|
+
const dir = join(tmpdir(), `loopforge-mem-test-${randomUUID()}`);
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
function seedMemoryFile(dir, name, body) {
|
|
24
|
+
const content = [
|
|
25
|
+
"---",
|
|
26
|
+
`name: ${name}`,
|
|
27
|
+
`description: Test memory about ${name}`,
|
|
28
|
+
"metadata:",
|
|
29
|
+
" type: project",
|
|
30
|
+
"---",
|
|
31
|
+
"",
|
|
32
|
+
body,
|
|
33
|
+
].join("\n");
|
|
34
|
+
writeFileSync(join(dir, `${name}.md`), content, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
function makeProviderCtx(overrides) {
|
|
37
|
+
return {
|
|
38
|
+
loopId: "test-loop",
|
|
39
|
+
round: 1,
|
|
40
|
+
task: "Audit ERC20 token for reentrancy vulnerabilities",
|
|
41
|
+
domain: "solidity",
|
|
42
|
+
phase: 1,
|
|
43
|
+
progressEstimate: 0,
|
|
44
|
+
accumulatedContext: {
|
|
45
|
+
recurringIssues: [],
|
|
46
|
+
failedPatterns: [],
|
|
47
|
+
keyLessons: [],
|
|
48
|
+
remainingCriteria: [],
|
|
49
|
+
},
|
|
50
|
+
...overrides,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function makeWritebackPayload(overrides) {
|
|
54
|
+
return {
|
|
55
|
+
loopId: "test-wb",
|
|
56
|
+
task: "Audit ERC20 token for reentrancy vulnerabilities",
|
|
57
|
+
outcome: "completed",
|
|
58
|
+
roundsCompleted: 5,
|
|
59
|
+
qualityTrajectory: [1, 3, 3, 5, 5],
|
|
60
|
+
projectEntry: {
|
|
61
|
+
title: "ERC20 Audit — completed",
|
|
62
|
+
objective: "Find and fix all reentrancy bugs in the ERC20 token contract",
|
|
63
|
+
keyOutcome: "Completed successfully in 5 rounds.",
|
|
64
|
+
keyDiscoveries: ["withdraw() has reentrancy via external call before state update"],
|
|
65
|
+
date: "2026-07-01",
|
|
66
|
+
},
|
|
67
|
+
feedbackEntries: [
|
|
68
|
+
{
|
|
69
|
+
rule: "zero-shot failed consistently on Solidity audit — rotate to ToT after 2 low rounds",
|
|
70
|
+
why: "Solidity audits need structured reasoning; zero-shot misses multi-step vulnerabilities",
|
|
71
|
+
howToApply: "For security audit tasks, start with CoT; if quality <3 for 2 rounds, switch to ToT",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
referenceEntry: {
|
|
75
|
+
description: "LoopForge vault data for ERC20 audit",
|
|
76
|
+
vaultLocation: ".promptcraft/prompt_vault.json → loop:test-wb:*",
|
|
77
|
+
},
|
|
78
|
+
...overrides,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
82
|
+
// Detection
|
|
83
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
84
|
+
describe("computeProjectHash", () => {
|
|
85
|
+
it("replaces special chars with hyphens (Windows path)", () => {
|
|
86
|
+
const hash = computeProjectHash("C:\\Users\\Dell\\Desktop\\LoopForge");
|
|
87
|
+
assert.equal(hash, "C--Users-Dell-Desktop-LoopForge");
|
|
88
|
+
});
|
|
89
|
+
it("replaces special chars with hyphens (Unix path)", () => {
|
|
90
|
+
const hash = computeProjectHash("/home/user/my-project");
|
|
91
|
+
assert.equal(hash, "-home-user-my-project");
|
|
92
|
+
});
|
|
93
|
+
it("preserves alphanumeric characters", () => {
|
|
94
|
+
const hash = computeProjectHash("simple");
|
|
95
|
+
assert.equal(hash, "simple");
|
|
96
|
+
});
|
|
97
|
+
it("handles dots and hyphens in path", () => {
|
|
98
|
+
const hash = computeProjectHash("/home/user/.claude-mem/projects");
|
|
99
|
+
assert.ok(hash.includes("claude-mem"), `expected claude-mem in: ${hash}`);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("findGitRoot", () => {
|
|
103
|
+
it("returns a string when run inside a git repo", () => {
|
|
104
|
+
const root = findGitRoot();
|
|
105
|
+
assert.ok(root, "should find git root (test runs inside LoopForge repo)");
|
|
106
|
+
assert.ok(root.endsWith("LoopForge") || root.endsWith("loopforge"), `expected path ending with LoopForge, got: ${root}`);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("detectClaudeMem", () => {
|
|
110
|
+
it("returns memory directory for this project (claude-mem is active)", () => {
|
|
111
|
+
const detected = detectClaudeMem();
|
|
112
|
+
// This test runs inside LoopForge repo where claude-mem IS active
|
|
113
|
+
assert.ok(detected, "claude-mem should be detected for this project");
|
|
114
|
+
assert.ok(detected.memoryDir.endsWith("memory"), `expected memory dir, got: ${detected?.memoryDir}`);
|
|
115
|
+
assert.ok(detected.indexPath.endsWith("MEMORY.md"), `expected MEMORY.md, got: ${detected?.indexPath}`);
|
|
116
|
+
assert.ok(existsSync(detected.memoryDir));
|
|
117
|
+
assert.ok(existsSync(detected.indexPath));
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
121
|
+
// Retrieval
|
|
122
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
123
|
+
describe("createMemoryProvider — retrieval", () => {
|
|
124
|
+
let memDir;
|
|
125
|
+
before(() => {
|
|
126
|
+
memDir = makeMemDir();
|
|
127
|
+
writeFileSync(join(memDir, "MEMORY.md"), "", "utf-8");
|
|
128
|
+
});
|
|
129
|
+
after(() => {
|
|
130
|
+
rmSync(memDir, { recursive: true, force: true });
|
|
131
|
+
});
|
|
132
|
+
it("returns empty string for empty memory directory", async () => {
|
|
133
|
+
const provider = createMemoryProvider(memDir);
|
|
134
|
+
const result = await provider(makeProviderCtx());
|
|
135
|
+
assert.equal(result, "");
|
|
136
|
+
});
|
|
137
|
+
it("returns empty string when no memories match the task", async () => {
|
|
138
|
+
seedMemoryFile(memDir, "unrelated", "# Python async patterns\n\nUse asyncio for IO-bound tasks.");
|
|
139
|
+
const provider = createMemoryProvider(memDir);
|
|
140
|
+
const result = await provider(makeProviderCtx({
|
|
141
|
+
task: "ERC20 token audit",
|
|
142
|
+
}));
|
|
143
|
+
assert.equal(result, "");
|
|
144
|
+
});
|
|
145
|
+
it("returns relevant memories when keywords match", async () => {
|
|
146
|
+
seedMemoryFile(memDir, "erc20-reentrancy", "# ERC20 Reentrancy Pattern\n\nAlways update state before external calls. The withdraw() function is especially vulnerable.");
|
|
147
|
+
const provider = createMemoryProvider(memDir);
|
|
148
|
+
const result = await provider(makeProviderCtx({
|
|
149
|
+
task: "Audit ERC20 token for reentrancy vulnerabilities",
|
|
150
|
+
}));
|
|
151
|
+
assert.ok(result.includes("Reentrancy"), `expected reentrancy context, got: "${result.slice(0, 100)}"`);
|
|
152
|
+
assert.ok(result.includes("withdraw"), `expected withdraw mention, got: "${result.slice(0, 100)}"`);
|
|
153
|
+
});
|
|
154
|
+
it("ranks memories by keyword match count", async () => {
|
|
155
|
+
// High-match file
|
|
156
|
+
seedMemoryFile(memDir, "high-match", "# ERC20 Audit Guide\n\nCheck reentrancy in ERC20 token. Audit all external calls.");
|
|
157
|
+
// Low-match file
|
|
158
|
+
seedMemoryFile(memDir, "low-match", "# General Notes\n\nSolidity contracts sometimes have issues.");
|
|
159
|
+
const provider = createMemoryProvider(memDir);
|
|
160
|
+
const result = await provider(makeProviderCtx({
|
|
161
|
+
task: "Audit ERC20 token for reentrancy vulnerabilities",
|
|
162
|
+
}));
|
|
163
|
+
// The high-match file should appear first (lower index) in the result
|
|
164
|
+
const highIdx = result.indexOf("ERC20 Audit Guide");
|
|
165
|
+
const lowIdx = result.indexOf("General Notes");
|
|
166
|
+
assert.ok(highIdx >= 0, "high-match file should be present");
|
|
167
|
+
assert.ok(lowIdx < 0 || highIdx < lowIdx, `high-match should appear before low-match, got high@${highIdx} low@${lowIdx}`);
|
|
168
|
+
});
|
|
169
|
+
it("Phase 2 query includes recurring issues and failed patterns", async () => {
|
|
170
|
+
seedMemoryFile(memDir, "phase2-test", "# Gas Optimization\n\nUnchecked arithmetic can save gas in Solidity 0.8+.");
|
|
171
|
+
const provider = createMemoryProvider(memDir);
|
|
172
|
+
const result = await provider(makeProviderCtx({
|
|
173
|
+
phase: 2,
|
|
174
|
+
progressEstimate: 0.35,
|
|
175
|
+
accumulatedContext: {
|
|
176
|
+
recurringIssues: ["gas optimization needed for loops"],
|
|
177
|
+
failedPatterns: ["unchecked arithmetic missing"],
|
|
178
|
+
keyLessons: [],
|
|
179
|
+
remainingCriteria: [],
|
|
180
|
+
},
|
|
181
|
+
}));
|
|
182
|
+
// Should find gas-related content because "optimization" and "arithmetic" are in query
|
|
183
|
+
assert.ok(result.length > 0, "Phase 2 query should match gas-related memory");
|
|
184
|
+
});
|
|
185
|
+
it("Phase 3 query includes remaining criteria and key lessons", async () => {
|
|
186
|
+
seedMemoryFile(memDir, "phase3-test", "# Access Control\n\nUse Ownable and RBAC for permission management.");
|
|
187
|
+
const provider = createMemoryProvider(memDir);
|
|
188
|
+
const result = await provider(makeProviderCtx({
|
|
189
|
+
phase: 3,
|
|
190
|
+
progressEstimate: 0.65,
|
|
191
|
+
task: "Audit smart contract",
|
|
192
|
+
accumulatedContext: {
|
|
193
|
+
recurringIssues: [],
|
|
194
|
+
failedPatterns: [],
|
|
195
|
+
keyLessons: ["access control is critical for upgradeable proxies"],
|
|
196
|
+
remainingCriteria: ["verify role-based access control"],
|
|
197
|
+
},
|
|
198
|
+
}));
|
|
199
|
+
assert.ok(result.length > 0, "Phase 3 query should match access control memory");
|
|
200
|
+
});
|
|
201
|
+
it("strips YAML frontmatter from returned content", async () => {
|
|
202
|
+
seedMemoryFile(memDir, "frontmatter-test", "# Keep This Content\n\nThis should be in the output.");
|
|
203
|
+
const provider = createMemoryProvider(memDir);
|
|
204
|
+
const result = await provider(makeProviderCtx({
|
|
205
|
+
task: "frontmatter Keep Content output",
|
|
206
|
+
}));
|
|
207
|
+
assert.ok(result.includes("Keep This Content"), "body content should be present");
|
|
208
|
+
assert.ok(!result.includes("name:"), "YAML frontmatter should be stripped");
|
|
209
|
+
assert.ok(!result.includes("metadata:"), "YAML metadata should be stripped");
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
213
|
+
// Writeback
|
|
214
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
215
|
+
describe("createMemoryWriter — writeback", () => {
|
|
216
|
+
let memDir;
|
|
217
|
+
let indexPath;
|
|
218
|
+
before(() => {
|
|
219
|
+
memDir = makeMemDir();
|
|
220
|
+
indexPath = join(memDir, "MEMORY.md");
|
|
221
|
+
writeFileSync(indexPath, "", "utf-8");
|
|
222
|
+
});
|
|
223
|
+
after(() => {
|
|
224
|
+
rmSync(memDir, { recursive: true, force: true });
|
|
225
|
+
});
|
|
226
|
+
it("writes project entry file with correct frontmatter", async () => {
|
|
227
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
228
|
+
const payload = makeWritebackPayload({ feedbackEntries: [], referenceEntry: undefined });
|
|
229
|
+
await writer(payload);
|
|
230
|
+
const files = readdirSync(memDir).filter(f => f.endsWith(".md") && f !== "MEMORY.md");
|
|
231
|
+
const projectFile = files.find(f => f.includes("outcome"));
|
|
232
|
+
assert.ok(projectFile, `expected project file in: ${files.join(", ")}`);
|
|
233
|
+
const content = readFileSync(join(memDir, projectFile), "utf-8");
|
|
234
|
+
assert.ok(content.includes("name: loopforge-test-wb-outcome"), "should have correct name in frontmatter");
|
|
235
|
+
assert.ok(content.includes("type: project"), "should have project type");
|
|
236
|
+
assert.ok(content.includes("ERC20 Audit"), "should contain task title");
|
|
237
|
+
assert.ok(content.includes("reentrancy"), "should contain discovery content");
|
|
238
|
+
});
|
|
239
|
+
it("writes feedback entries with rule + Why + How to apply", async () => {
|
|
240
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
241
|
+
const payload = makeWritebackPayload();
|
|
242
|
+
await writer(payload);
|
|
243
|
+
const files = readdirSync(memDir).filter(f => f.endsWith(".md") && f !== "MEMORY.md");
|
|
244
|
+
const fbFile = files.find(f => f.includes("fb-1"));
|
|
245
|
+
assert.ok(fbFile, `expected feedback file in: ${files.join(", ")}`);
|
|
246
|
+
const content = readFileSync(join(memDir, fbFile), "utf-8");
|
|
247
|
+
assert.ok(content.includes("type: feedback"), "should have feedback type");
|
|
248
|
+
assert.ok(content.includes("**Why:**"), "should have Why section");
|
|
249
|
+
assert.ok(content.includes("**How to apply:**"), "should have How to apply section");
|
|
250
|
+
assert.ok(content.includes("zero-shot failed"), "should contain feedback rule");
|
|
251
|
+
});
|
|
252
|
+
it("writes reference entry", async () => {
|
|
253
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
254
|
+
const payload = makeWritebackPayload({ feedbackEntries: [] });
|
|
255
|
+
await writer(payload);
|
|
256
|
+
const files = readdirSync(memDir).filter(f => f.endsWith(".md") && f !== "MEMORY.md");
|
|
257
|
+
const refFile = files.find(f => f.includes("-ref"));
|
|
258
|
+
assert.ok(refFile, `expected reference file in: ${files.join(", ")}`);
|
|
259
|
+
const content = readFileSync(join(memDir, refFile), "utf-8");
|
|
260
|
+
assert.ok(content.includes("type: reference"), "should have reference type");
|
|
261
|
+
assert.ok(content.includes("Vault Location"), "should contain vault location");
|
|
262
|
+
});
|
|
263
|
+
it("appends entries to MEMORY.md index", async () => {
|
|
264
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
265
|
+
const payload = makeWritebackPayload();
|
|
266
|
+
await writer(payload);
|
|
267
|
+
const index = readFileSync(indexPath, "utf-8");
|
|
268
|
+
assert.ok(index.includes(`[LoopForge: ${payload.task.slice(0, 60)}]`), "index should link to project entry");
|
|
269
|
+
assert.ok(index.includes("LoopForge Feedback"), "index should link to feedback entries");
|
|
270
|
+
assert.ok(index.includes("LoopForge Reference"), "index should link to reference entry");
|
|
271
|
+
});
|
|
272
|
+
it("does not write duplicate project files (each write creates uniquely named files)", async () => {
|
|
273
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
274
|
+
const payload1 = makeWritebackPayload({ loopId: "write-1" });
|
|
275
|
+
const payload2 = makeWritebackPayload({ loopId: "write-2" });
|
|
276
|
+
await writer(payload1);
|
|
277
|
+
await writer(payload2);
|
|
278
|
+
const files = readdirSync(memDir).filter(f => f !== "MEMORY.md");
|
|
279
|
+
const outcomeFiles = files.filter(f => f.includes("-outcome.md") && (f.includes("write-1") || f.includes("write-2")));
|
|
280
|
+
assert.equal(outcomeFiles.length, 2, "should have 2 distinct outcome files");
|
|
281
|
+
});
|
|
282
|
+
it("handles empty feedback entries gracefully", async () => {
|
|
283
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
284
|
+
const payload = makeWritebackPayload({
|
|
285
|
+
loopId: "no-fb",
|
|
286
|
+
feedbackEntries: [],
|
|
287
|
+
});
|
|
288
|
+
await writer(payload);
|
|
289
|
+
const files = readdirSync(memDir).filter(f => f !== "MEMORY.md");
|
|
290
|
+
const fbFiles = files.filter(f => /-fb-\d+\.md$/.test(f) && f.includes("no-fb"));
|
|
291
|
+
assert.equal(fbFiles.length, 0, "should not create feedback files when empty");
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
295
|
+
// Integration entry points
|
|
296
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
297
|
+
describe("autoConfigureMemory", () => {
|
|
298
|
+
it("sets memoryProvider and memoryWriter on SessionManager when detected", () => {
|
|
299
|
+
// In this test environment, claude-mem IS active (we're in LoopForge repo)
|
|
300
|
+
const mgr = new SessionManager();
|
|
301
|
+
assert.equal(mgr.memoryProvider, undefined, "should start with no provider");
|
|
302
|
+
assert.equal(mgr.memoryWriter, undefined, "should start with no writer");
|
|
303
|
+
autoConfigureMemory(mgr);
|
|
304
|
+
// Since we're in a git repo with claude-mem active, it should detect
|
|
305
|
+
const detected = detectClaudeMem();
|
|
306
|
+
if (detected) {
|
|
307
|
+
assert.ok(mgr.memoryProvider, "provider should be set when claude-mem detected");
|
|
308
|
+
assert.ok(mgr.memoryWriter, "writer should be set when claude-mem detected");
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
// Outside git or claude-mem not active — still no provider (graceful degradation)
|
|
312
|
+
assert.equal(mgr.memoryProvider, undefined);
|
|
313
|
+
assert.equal(mgr.memoryWriter, undefined);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
describe("tryAutoConfigure", () => {
|
|
318
|
+
it("returns provider and writer when claude-mem is detected", () => {
|
|
319
|
+
const result = tryAutoConfigure();
|
|
320
|
+
const detected = detectClaudeMem();
|
|
321
|
+
if (detected) {
|
|
322
|
+
assert.ok(result.memoryProvider, "should return provider when detected");
|
|
323
|
+
assert.ok(result.memoryWriter, "should return writer when detected");
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
assert.equal(result.memoryProvider, undefined);
|
|
327
|
+
assert.equal(result.memoryWriter, undefined);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
it("returned provider works (integration smoke test)", async () => {
|
|
331
|
+
const result = tryAutoConfigure();
|
|
332
|
+
if (!result.memoryProvider)
|
|
333
|
+
return; // skip if claude-mem not active
|
|
334
|
+
const ctx = makeProviderCtx();
|
|
335
|
+
const context = await result.memoryProvider(ctx);
|
|
336
|
+
// May be empty if no matching memories, but should not throw
|
|
337
|
+
assert.equal(typeof context, "string");
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
341
|
+
// Edge cases
|
|
342
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
343
|
+
describe("Memory bridge edge cases", () => {
|
|
344
|
+
it("createMemoryProvider handles missing directory gracefully", async () => {
|
|
345
|
+
const provider = createMemoryProvider("/nonexistent/path/memory");
|
|
346
|
+
const result = await provider(makeProviderCtx());
|
|
347
|
+
assert.equal(result, "");
|
|
348
|
+
});
|
|
349
|
+
it("createMemoryProvider handles files without frontmatter", async () => {
|
|
350
|
+
const memDir = makeMemDir();
|
|
351
|
+
try {
|
|
352
|
+
writeFileSync(join(memDir, "MEMORY.md"), "", "utf-8");
|
|
353
|
+
writeFileSync(join(memDir, "plain.md"), "# No Frontmatter\n\nJust plain markdown content.", "utf-8");
|
|
354
|
+
const provider = createMemoryProvider(memDir);
|
|
355
|
+
const result = await provider(makeProviderCtx({ task: "plain markdown content frontmatter" }));
|
|
356
|
+
assert.ok(result.includes("No Frontmatter"), "should handle files without YAML frontmatter");
|
|
357
|
+
}
|
|
358
|
+
finally {
|
|
359
|
+
rmSync(memDir, { recursive: true, force: true });
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
it("createMemoryWriter handles concurrent lock gracefully (non-blocking)", async () => {
|
|
363
|
+
const memDir = makeMemDir();
|
|
364
|
+
const indexPath = join(memDir, "MEMORY.md");
|
|
365
|
+
writeFileSync(indexPath, "", "utf-8");
|
|
366
|
+
// Manually create the lock directory to simulate contention
|
|
367
|
+
const lockDir = join(memDir, ".loopforge-wb.lock");
|
|
368
|
+
mkdirSync(lockDir);
|
|
369
|
+
try {
|
|
370
|
+
const writer = createMemoryWriter(memDir, indexPath);
|
|
371
|
+
const payload = makeWritebackPayload({ loopId: "locked-test" });
|
|
372
|
+
// Should not throw — just skip quietly
|
|
373
|
+
await writer(payload);
|
|
374
|
+
// No files should be written since lock was held
|
|
375
|
+
const mdFiles = readdirSync(memDir).filter(f => f.endsWith(".md") && f !== "MEMORY.md");
|
|
376
|
+
assert.equal(mdFiles.length, 0, "should not write files when lock is held");
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
380
|
+
rmSync(memDir, { recursive: true, force: true });
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
//# sourceMappingURL=memory-bridge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge.test.js","sourceRoot":"","sources":["../../src/tests/memory-bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
/** Tests for protocol type factories and serialisation. */
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
|
-
import { Mode, AgentStatus, Technique, makeAnalysis, makeVaultConfig, makeLoopCompileRequest, makeLoopCompileResponse, makeTaskId, } from "../protocol.js";
|
|
4
|
+
import { Mode, AgentStatus, Technique, makeAnalysis, makeVaultConfig, makeLoopCompileRequest, makeLoopCompileResponse, makeTaskId, makeSelfEvaluation, } from "../protocol.js";
|
|
5
5
|
describe("Protocol — Enums", () => {
|
|
6
|
-
it("Mode has
|
|
7
|
-
assert.equal(Object.values(Mode).length,
|
|
6
|
+
it("Mode has 2 values", () => {
|
|
7
|
+
assert.equal(Object.values(Mode).length, 2);
|
|
8
8
|
assert.equal(Mode.LOOP_COMPILE, "loop_compile");
|
|
9
9
|
assert.equal(Mode.FEEDBACK, "feedback");
|
|
10
|
-
assert.equal(Mode.REVIEW, "review");
|
|
11
|
-
assert.equal(Mode.BUILD, "build");
|
|
12
10
|
});
|
|
13
11
|
it("AgentStatus has 3 values", () => {
|
|
14
12
|
assert.equal(AgentStatus.OK, "ok");
|
|
@@ -59,5 +57,16 @@ describe("Protocol — Factory functions", () => {
|
|
|
59
57
|
assert.equal(makeTaskId("Audit ERC20 token"), "audit-erc20-token");
|
|
60
58
|
assert.equal(makeTaskId(""), "unnamed-task");
|
|
61
59
|
});
|
|
60
|
+
it("makeSelfEvaluation includes worker_results default", () => {
|
|
61
|
+
const se = makeSelfEvaluation();
|
|
62
|
+
assert.deepEqual(se.worker_results, []);
|
|
63
|
+
});
|
|
64
|
+
it("makeSelfEvaluation accepts worker_results override", () => {
|
|
65
|
+
const wr = [{ agentId: "abc", subAgentType: "explore", subTask: "search", resultSummary: "found 3 bugs", success: true }];
|
|
66
|
+
const se = makeSelfEvaluation({ worker_results: wr });
|
|
67
|
+
assert.equal(se.worker_results.length, 1);
|
|
68
|
+
assert.equal(se.worker_results[0].agentId, "abc");
|
|
69
|
+
assert.equal(se.worker_results[0].success, true);
|
|
70
|
+
});
|
|
62
71
|
});
|
|
63
72
|
//# sourceMappingURL=protocol.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/tests/protocol.test.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,IAAI,EACJ,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EAOf,sBAAsB,EACtB,uBAAuB,EAEvB,UAAU,
|
|
1
|
+
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/tests/protocol.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-gate.test.d.ts","sourceRoot":"","sources":["../../src/tests/verification-gate.test.ts"],"names":[],"mappings":""}
|