loopforge 1.7.0 → 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.
Files changed (60) hide show
  1. package/README.md +64 -3
  2. package/dist/engine.d.ts +14 -0
  3. package/dist/engine.d.ts.map +1 -1
  4. package/dist/engine.js +102 -1
  5. package/dist/engine.js.map +1 -1
  6. package/dist/index.d.ts +6 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/loop-compiler.d.ts +23 -0
  11. package/dist/loop-compiler.d.ts.map +1 -1
  12. package/dist/loop-compiler.js +185 -19
  13. package/dist/loop-compiler.js.map +1 -1
  14. package/dist/mcp/server.d.ts.map +1 -1
  15. package/dist/mcp/server.js +6 -4
  16. package/dist/mcp/server.js.map +1 -1
  17. package/dist/mcp/session.d.ts +15 -3
  18. package/dist/mcp/session.d.ts.map +1 -1
  19. package/dist/mcp/session.js +199 -5
  20. package/dist/mcp/session.js.map +1 -1
  21. package/dist/mcp/tools.d.ts +32 -1
  22. package/dist/mcp/tools.d.ts.map +1 -1
  23. package/dist/mcp/tools.js +29 -10
  24. package/dist/mcp/tools.js.map +1 -1
  25. package/dist/memory-bridge.d.ts +47 -0
  26. package/dist/memory-bridge.d.ts.map +1 -0
  27. package/dist/memory-bridge.js +290 -0
  28. package/dist/memory-bridge.js.map +1 -0
  29. package/dist/policy.d.ts +57 -0
  30. package/dist/policy.d.ts.map +1 -1
  31. package/dist/policy.js +36 -0
  32. package/dist/policy.js.map +1 -1
  33. package/dist/protocol.d.ts +84 -3
  34. package/dist/protocol.d.ts.map +1 -1
  35. package/dist/protocol.js +5 -3
  36. package/dist/protocol.js.map +1 -1
  37. package/dist/runtime.d.ts +17 -0
  38. package/dist/runtime.d.ts.map +1 -1
  39. package/dist/runtime.js +427 -171
  40. package/dist/runtime.js.map +1 -1
  41. package/dist/tests/generate-schema.test.js +2 -2
  42. package/dist/tests/loop-compiler.test.js +237 -1
  43. package/dist/tests/loop-compiler.test.js.map +1 -1
  44. package/dist/tests/mcp.test.js +95 -95
  45. package/dist/tests/mcp.test.js.map +1 -1
  46. package/dist/tests/memory-bridge.test.d.ts +8 -0
  47. package/dist/tests/memory-bridge.test.d.ts.map +1 -0
  48. package/dist/tests/memory-bridge.test.js +384 -0
  49. package/dist/tests/memory-bridge.test.js.map +1 -0
  50. package/dist/tests/protocol.test.js +12 -1
  51. package/dist/tests/protocol.test.js.map +1 -1
  52. package/loop_policy.json +23 -0
  53. package/package.json +1 -1
  54. package/skills/perception/SKILL.md +52 -1
  55. package/dist/adapter.d.ts +0 -17
  56. package/dist/adapter.d.ts.map +0 -1
  57. package/dist/adapter.js +0 -228
  58. package/dist/adapter.js.map +0 -1
  59. package/dist/tests/adapter.test.d.ts +0 -2
  60. package/dist/tests/adapter.test.d.ts.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,7 +1,7 @@
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
6
  it("Mode has 2 values", () => {
7
7
  assert.equal(Object.values(Mode).length, 2);
@@ -57,5 +57,16 @@ describe("Protocol — Factory functions", () => {
57
57
  assert.equal(makeTaskId("Audit ERC20 token"), "audit-erc20-token");
58
58
  assert.equal(makeTaskId(""), "unnamed-task");
59
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
+ });
60
71
  });
61
72
  //# sourceMappingURL=protocol.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/tests/protocol.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/tests/protocol.test.ts"],"names":[],"mappings":"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"}
package/loop_policy.json CHANGED
@@ -55,5 +55,28 @@
55
55
  "progress_stall_threshold": 0.05,
56
56
  "progress_stall_rounds": 2,
57
57
  "progress_mismatch_threshold": 0.3
58
+ },
59
+ "memory_injection": {
60
+ "enabled": true,
61
+ "min_rounds_between_injections": 1,
62
+ "phase_thresholds": {
63
+ "phase1": { "trigger": "round_1" },
64
+ "phase2": { "trigger": "progress", "threshold": 0.40 },
65
+ "phase3": { "trigger": "progress", "threshold": 0.70 }
66
+ },
67
+ "round_tiers": [
68
+ { "max_rounds": 10, "allowed_phases": [1] },
69
+ { "max_rounds": 20, "allowed_phases": [1, 3] },
70
+ { "max_rounds": 30, "allowed_phases": [1, 2, 3] }
71
+ ],
72
+ "dedup_threshold": 0.6,
73
+ "max_context_length": 2000,
74
+ "section_title": "### Background Context (Long-Term Memory)"
75
+ },
76
+ "memory_writeback": {
77
+ "enabled": true,
78
+ "max_feedback_entries": 5,
79
+ "max_discoveries_in_project": 3,
80
+ "write_on_outcomes": ["completed", "circuit_breaker", "max_rounds"]
58
81
  }
59
82
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loopforge",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Loop-Time Intelligence Layer for AI coding agents — per-iteration prompt compiler with structured memory, constraint inheritance, and drift correction.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: perception
3
- description: Multi-round autonomous loop driver powered by LoopForge MCP. Compiles context-aware prompts per iteration, tracks quality, inherits constraints, and stops when work is done — not when rounds run out.
3
+ description: Multi-round autonomous loop driver powered by LoopForge MCP. Compiles context-aware prompts per iteration, tracks quality, inherits constraints, and stops when work is done — not when rounds run out. Supports single-agent and multi-agent (AgentTool / Coordinator) scenarios.
4
4
  ---
5
5
 
6
6
  # Perception — Loop-Time Intelligence Skill
@@ -13,6 +13,11 @@ detection — maintaining cognitive stability across long-horizon loops.
13
13
  Works with Claude Code, Codex, and any MCP-capable host. Zero configuration
14
14
  beyond having `loopforge-mcp` registered as an MCP server.
15
15
 
16
+ **Multi-Agent:** When you spawn sub-agents (AgentTool) or orchestrate Workers
17
+ (Coordinator mode), LoopForge tracks delegation history, inherits constraints
18
+ across Workers, and injects structured summaries into subsequent prompts.
19
+ No separate mode required — LoopForge treats all agents the same.
20
+
16
21
  ## When to Activate
17
22
 
18
23
  Activate when the user says any of:
@@ -107,6 +112,7 @@ is preferred — it's validated by the MCP client before reaching the server.
107
112
  | `retracted_constraints` | string[] | **P5 (optional)** — Constraints you now believe are wrong. Removed from active guardrails. Only retract with evidence. Empty `[]` if none. |
108
113
  | `revised_success_criteria` | object[] | **P5 (optional)** — Success criteria that need reformulation. Array of `{old: string, new: string}`. Applied to Loop Objective. Empty `[]` if none. |
109
114
  | `wrong_assumptions` | string[] | **P5 (optional)** — Assumptions from earlier rounds that turned out to be incorrect. Recorded as key lessons. Empty `[]` if none. |
115
+ | `worker_results` | object[] | **Multi-Agent (optional)** — Results of sub-agent / Worker delegations this round. Each entry: `{ agentId, subAgentType, subTask, resultSummary, success, discoveredConstraints? }`. Engine auto-records to delegation journal. Empty `[]` if no delegations. |
110
116
 
111
117
  **Why this matters:** The evaluation is validated by the MCP client before
112
118
  reaching the server — a missing or malformed evaluation causes an immediate
@@ -146,6 +152,51 @@ If the result has a non-null `prompt`, execute it and repeat from Step 2.
146
152
  | `loopforge_resume` | Resume a loop after process restart | `loopId` | next `prompt` or `null` + `stopReason` |
147
153
  | `loopforge_health` | Check loop health mid-run | `loopId` | goal alignment, constraint integrity, drift, strategy |
148
154
 
155
+ ## Delegation Helpers (AgentTool Mode)
156
+
157
+ When you spawn sub-agents via `AgentTool` (Explore, General-purpose, Plan)
158
+ during a loop round, use these helpers to improve delegation quality:
159
+
160
+ **Before delegating:**
161
+ 1. **Filter constraints** — not all active constraints apply to every sub-agent.
162
+ An Explore agent searching for deprecated APIs doesn't need "all files must
163
+ have a license header." Use `filterConstraintsForSubTask(allConstraints, subTask)`
164
+ to get only the relevant subset.
165
+ 2. **Format the prompt** — use `formatDelegationPrompt(subTask, subAgentType,
166
+ relevantConstraints, options?)` to produce a self-contained prompt. This is
167
+ critical: sub-agents cannot see your conversation. Every prompt must stand
168
+ alone — no "based on above," no "continue from previous."
169
+
170
+ **After delegating (in your self-evaluation):**
171
+ Include `worker_results` in your evaluation to record what you delegated.
172
+ The engine auto-detects this field and writes delegation journals to the vault:
173
+
174
+ ```json
175
+ {
176
+ "worker_results": [
177
+ {
178
+ "agentId": "abc123",
179
+ "subAgentType": "explore",
180
+ "subTask": "Search for deprecated API usage in src/",
181
+ "resultSummary": "Found 12 deprecated calls across 8 files",
182
+ "success": true,
183
+ "discoveredConstraints": ["All API calls must be versioned"]
184
+ }
185
+ ]
186
+ }
187
+ ```
188
+
189
+ This feeds into the delegation history table displayed in future rounds.
190
+ Constraints discovered by sub-agents flow into the active constraint set
191
+ automatically — they appear in future prompts alongside main-agent constraints.
192
+ Delegation recording is lightweight — it's the main agent's memory,
193
+ not sub-agent memory.
194
+
195
+ **Important:** These helpers are optional. If your sub-task is trivial (e.g.
196
+ "read file X and report line 42"), a raw prompt is fine. Use the helpers when
197
+ sub-tasks involve constraints, specific output formats, or results worth
198
+ remembering across rounds.
199
+
149
200
  ## Quality Signals (Read the Room)
150
201
 
151
202
  The prompt changes between rounds based on your trajectory. Pay attention to:
package/dist/adapter.d.ts DELETED
@@ -1,17 +0,0 @@
1
- /** LoopForge-loop_compile — Sub-agent adapter (unified entry point).
2
- *
3
- * This is the single entry point when LoopForge is invoked as a sub-agent.
4
- * It wraps the Engine, routes by mode, and always prepends a compact health line.
5
- *
6
- * Three modes (v1.0):
7
- * loop_compile — Per-iteration prompt compiler (primary entry point)
8
- * feedback — Record execution results → quality scoring → vault persistence
9
- * review — Audit prompt quality (structural checks + constraint compliance)
10
- *
11
- * build is an internal path (loop_compile L2 delegation) — not an exposed mode.
12
- */
13
- import { type LoopForgeRequest } from "./protocol.js";
14
- import { LoopForgeEngine } from "./engine.js";
15
- export declare function handle(requestInput: string | Record<string, unknown> | LoopForgeRequest, engine?: LoopForgeEngine): string;
16
- export declare function main(): void;
17
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EAGhB,MAAM,aAAa,CAAC;AAiBrB,wBAAgB,MAAM,CACpB,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,EACjE,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAwER;AAsJD,wBAAgB,IAAI,IAAI,IAAI,CA8B3B"}