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