loopforge 1.15.1 → 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 (185) 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.map +1 -1
  15. package/dist/enforcement-gate.js +28 -10
  16. package/dist/enforcement-gate.js.map +1 -1
  17. package/dist/engine.d.ts +7 -4
  18. package/dist/engine.d.ts.map +1 -1
  19. package/dist/engine.js +78 -138
  20. package/dist/engine.js.map +1 -1
  21. package/dist/evidence-provider.d.ts +113 -0
  22. package/dist/evidence-provider.d.ts.map +1 -0
  23. package/dist/evidence-provider.js +419 -0
  24. package/dist/evidence-provider.js.map +1 -0
  25. package/dist/index.d.ts +18 -10
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +15 -9
  28. package/dist/index.js.map +1 -1
  29. package/dist/init.d.ts +15 -0
  30. package/dist/init.d.ts.map +1 -0
  31. package/dist/init.js +49 -0
  32. package/dist/init.js.map +1 -0
  33. package/dist/interop.d.ts +30 -0
  34. package/dist/interop.d.ts.map +1 -0
  35. package/dist/interop.js +29 -0
  36. package/dist/interop.js.map +1 -0
  37. package/dist/loop-compiler.d.ts +14 -64
  38. package/dist/loop-compiler.d.ts.map +1 -1
  39. package/dist/loop-compiler.js +303 -2206
  40. package/dist/loop-compiler.js.map +1 -1
  41. package/dist/loop-store.d.ts +82 -0
  42. package/dist/loop-store.d.ts.map +1 -0
  43. package/dist/loop-store.js +332 -0
  44. package/dist/loop-store.js.map +1 -0
  45. package/dist/mcp/server.d.ts +9 -6
  46. package/dist/mcp/server.d.ts.map +1 -1
  47. package/dist/mcp/server.js +109 -73
  48. package/dist/mcp/server.js.map +1 -1
  49. package/dist/mcp/session.d.ts +75 -19
  50. package/dist/mcp/session.d.ts.map +1 -1
  51. package/dist/mcp/session.js +707 -361
  52. package/dist/mcp/session.js.map +1 -1
  53. package/dist/mcp/tools.d.ts +18 -268
  54. package/dist/mcp/tools.d.ts.map +1 -1
  55. package/dist/mcp/tools.js +225 -12
  56. package/dist/mcp/tools.js.map +1 -1
  57. package/dist/observability.d.ts +36 -16
  58. package/dist/observability.d.ts.map +1 -1
  59. package/dist/observability.js +82 -23
  60. package/dist/observability.js.map +1 -1
  61. package/dist/policy-metrics.d.ts +46 -0
  62. package/dist/policy-metrics.d.ts.map +1 -0
  63. package/dist/policy-metrics.js +146 -0
  64. package/dist/policy-metrics.js.map +1 -0
  65. package/dist/policy.d.ts +53 -140
  66. package/dist/policy.d.ts.map +1 -1
  67. package/dist/policy.js +119 -184
  68. package/dist/policy.js.map +1 -1
  69. package/dist/prompt-assembler.d.ts +30 -0
  70. package/dist/prompt-assembler.d.ts.map +1 -0
  71. package/dist/prompt-assembler.js +257 -0
  72. package/dist/prompt-assembler.js.map +1 -0
  73. package/dist/prompt-policy.d.ts +29 -0
  74. package/dist/prompt-policy.d.ts.map +1 -0
  75. package/dist/prompt-policy.js +51 -0
  76. package/dist/prompt-policy.js.map +1 -0
  77. package/dist/protocol.d.ts +88 -93
  78. package/dist/protocol.d.ts.map +1 -1
  79. package/dist/protocol.js +23 -39
  80. package/dist/protocol.js.map +1 -1
  81. package/dist/replay.d.ts.map +1 -1
  82. package/dist/replay.js +1 -27
  83. package/dist/replay.js.map +1 -1
  84. package/dist/round-coordinator.d.ts +90 -0
  85. package/dist/round-coordinator.d.ts.map +1 -0
  86. package/dist/round-coordinator.js +186 -0
  87. package/dist/round-coordinator.js.map +1 -0
  88. package/dist/round-driver.d.ts +53 -0
  89. package/dist/round-driver.d.ts.map +1 -0
  90. package/dist/round-driver.js +101 -0
  91. package/dist/round-driver.js.map +1 -0
  92. package/dist/round-transaction.d.ts +70 -0
  93. package/dist/round-transaction.d.ts.map +1 -0
  94. package/dist/round-transaction.js +290 -0
  95. package/dist/round-transaction.js.map +1 -0
  96. package/dist/runtime.d.ts +33 -19
  97. package/dist/runtime.d.ts.map +1 -1
  98. package/dist/runtime.js +355 -336
  99. package/dist/runtime.js.map +1 -1
  100. package/dist/storage.d.ts +38 -0
  101. package/dist/storage.d.ts.map +1 -0
  102. package/dist/storage.js +201 -0
  103. package/dist/storage.js.map +1 -0
  104. package/dist/verification-gate.d.ts +33 -7
  105. package/dist/verification-gate.d.ts.map +1 -1
  106. package/dist/verification-gate.js +195 -7
  107. package/dist/verification-gate.js.map +1 -1
  108. package/loop_policy.json +22 -48
  109. package/package.json +13 -10
  110. package/skills/perception/SKILL.md +80 -267
  111. package/dist/backends/fs.d.ts +0 -36
  112. package/dist/backends/fs.d.ts.map +0 -1
  113. package/dist/backends/fs.js +0 -362
  114. package/dist/backends/fs.js.map +0 -1
  115. package/dist/builder.d.ts +0 -19
  116. package/dist/builder.d.ts.map +0 -1
  117. package/dist/builder.js +0 -215
  118. package/dist/builder.js.map +0 -1
  119. package/dist/mcp-server.d.ts +0 -12
  120. package/dist/mcp-server.d.ts.map +0 -1
  121. package/dist/mcp-server.js +0 -14
  122. package/dist/mcp-server.js.map +0 -1
  123. package/dist/memory-bridge.d.ts +0 -47
  124. package/dist/memory-bridge.d.ts.map +0 -1
  125. package/dist/memory-bridge.js +0 -290
  126. package/dist/memory-bridge.js.map +0 -1
  127. package/dist/tests/_helpers.d.ts +0 -25
  128. package/dist/tests/_helpers.d.ts.map +0 -1
  129. package/dist/tests/_helpers.js +0 -47
  130. package/dist/tests/_helpers.js.map +0 -1
  131. package/dist/tests/builder.test.d.ts +0 -2
  132. package/dist/tests/builder.test.d.ts.map +0 -1
  133. package/dist/tests/builder.test.js +0 -112
  134. package/dist/tests/builder.test.js.map +0 -1
  135. package/dist/tests/enforcement-gate.test.d.ts +0 -2
  136. package/dist/tests/enforcement-gate.test.d.ts.map +0 -1
  137. package/dist/tests/enforcement-gate.test.js +0 -328
  138. package/dist/tests/enforcement-gate.test.js.map +0 -1
  139. package/dist/tests/engine.test.d.ts +0 -2
  140. package/dist/tests/engine.test.d.ts.map +0 -1
  141. package/dist/tests/engine.test.js +0 -375
  142. package/dist/tests/engine.test.js.map +0 -1
  143. package/dist/tests/generate-schema.test.d.ts +0 -8
  144. package/dist/tests/generate-schema.test.d.ts.map +0 -1
  145. package/dist/tests/generate-schema.test.js +0 -199
  146. package/dist/tests/generate-schema.test.js.map +0 -1
  147. package/dist/tests/loop-compiler.test.d.ts +0 -2
  148. package/dist/tests/loop-compiler.test.d.ts.map +0 -1
  149. package/dist/tests/loop-compiler.test.js +0 -1059
  150. package/dist/tests/loop-compiler.test.js.map +0 -1
  151. package/dist/tests/mcp.test.d.ts +0 -7
  152. package/dist/tests/mcp.test.d.ts.map +0 -1
  153. package/dist/tests/mcp.test.js +0 -505
  154. package/dist/tests/mcp.test.js.map +0 -1
  155. package/dist/tests/memory-bridge.test.d.ts +0 -8
  156. package/dist/tests/memory-bridge.test.d.ts.map +0 -1
  157. package/dist/tests/memory-bridge.test.js +0 -383
  158. package/dist/tests/memory-bridge.test.js.map +0 -1
  159. package/dist/tests/policy.test.d.ts +0 -2
  160. package/dist/tests/policy.test.d.ts.map +0 -1
  161. package/dist/tests/policy.test.js +0 -49
  162. package/dist/tests/policy.test.js.map +0 -1
  163. package/dist/tests/protocol.test.d.ts +0 -2
  164. package/dist/tests/protocol.test.d.ts.map +0 -1
  165. package/dist/tests/protocol.test.js +0 -73
  166. package/dist/tests/protocol.test.js.map +0 -1
  167. package/dist/tests/replay.test.d.ts +0 -2
  168. package/dist/tests/replay.test.d.ts.map +0 -1
  169. package/dist/tests/replay.test.js +0 -222
  170. package/dist/tests/replay.test.js.map +0 -1
  171. package/dist/tests/runtime.test.d.ts +0 -7
  172. package/dist/tests/runtime.test.d.ts.map +0 -1
  173. package/dist/tests/runtime.test.js +0 -337
  174. package/dist/tests/runtime.test.js.map +0 -1
  175. package/dist/tests/verification-gate.test.d.ts +0 -2
  176. package/dist/tests/verification-gate.test.d.ts.map +0 -1
  177. package/dist/tests/verification-gate.test.js +0 -407
  178. package/dist/tests/verification-gate.test.js.map +0 -1
  179. package/skills/prompt-techniques/SKILL.md +0 -52
  180. package/skills/prompt-techniques/references/chain-of-thought.md +0 -207
  181. package/skills/prompt-techniques/references/few-shot.md +0 -174
  182. package/skills/prompt-techniques/references/least-to-most.md +0 -182
  183. package/skills/prompt-techniques/references/step-back.md +0 -160
  184. package/skills/prompt-techniques/references/tree-of-thought.md +0 -191
  185. package/skills/prompt-techniques/references/zero-shot.md +0 -97
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- /** LoopForge MCP server — entry point.
3
- *
4
- * Usage:
5
- * npx loopforge-mcp
6
- * node dist/mcp-server.js
7
- *
8
- * Registers with Claude Code via:
9
- * claude mcp add loopforge -- npx loopforge-mcp
10
- */
11
- import { McpServer } from "./mcp/server.js";
12
- const server = new McpServer();
13
- server.start();
14
- //# sourceMappingURL=mcp-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/B,MAAM,CAAC,KAAK,EAAE,CAAC"}
@@ -1,47 +0,0 @@
1
- /** LoopForge — Memory Bridge (v1.8).
2
- *
3
- * Zero-config auto-detection bridge between LoopForge and claude-mem.
4
- * Detects claude-mem via the local filesystem, provides memoryProvider
5
- * (file-based retrieval) and memoryWriter (Markdown file writeback).
6
- *
7
- * Two integration paths:
8
- * MCP: autoConfigureMemory(sessionMgr) — sets provider/writer on SessionManager
9
- * Lib: tryAutoConfigure() → { memoryProvider?, memoryWriter? } — for resolveConfig()
10
- *
11
- * If claude-mem is not installed or the project has no memory directory,
12
- * both functions return without side effects — silent graceful degradation.
13
- */
14
- import type { MemoryProviderContext, LoopMemoryWriteback } from "./protocol.js";
15
- import type { SessionManager } from "./mcp/session.js";
16
- /** Compute the project directory name the same way claude-mem does:
17
- * replace every non-alphanumeric character with `-`.
18
- * e.g. `C:\Users\Dell\Desktop\LoopForge` → `C--Users-Dell-Desktop-LoopForge` */
19
- export declare function computeProjectHash(gitRoot: string): string;
20
- /** Walk upward from cwd looking for a `.git` directory.
21
- * Returns the git root path, or null if not found within 20 levels. */
22
- export declare function findGitRoot(): string | null;
23
- /** Check whether claude-mem has a memory directory for the current project.
24
- * Returns the memory directory path and MEMORY.md path, or null. */
25
- export declare function detectClaudeMem(): {
26
- memoryDir: string;
27
- indexPath: string;
28
- } | null;
29
- /** Create a memoryProvider callback bound to a specific memory directory.
30
- * Reads .md files directly — no REST API dependency. */
31
- export declare function createMemoryProvider(memoryDir: string): (ctx: MemoryProviderContext) => Promise<string>;
32
- /** Create a memoryWriter callback bound to a specific memory directory.
33
- * Writes .md files directly + appends to MEMORY.md index. */
34
- export declare function createMemoryWriter(memoryDir: string, indexPath: string): (payload: LoopMemoryWriteback) => Promise<void>;
35
- /** Auto-detect claude-mem and wire memoryProvider / memoryWriter onto a
36
- * SessionManager instance. Called once at MCP server startup.
37
- * If claude-mem is not available, this is a no-op. */
38
- export declare function autoConfigureMemory(mgr: SessionManager): void;
39
- /** Auto-detect claude-mem and return provider/writer callbacks.
40
- * Used by the runtime library path (resolveConfig). Callers should
41
- * only invoke this when the user has NOT provided explicit callbacks —
42
- * explicit callbacks always take precedence. */
43
- export declare function tryAutoConfigure(): {
44
- memoryProvider?: (ctx: MemoryProviderContext) => Promise<string>;
45
- memoryWriter?: (payload: LoopMemoryWriteback) => Promise<void>;
46
- };
47
- //# sourceMappingURL=memory-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-bridge.d.ts","sourceRoot":"","sources":["../src/memory-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD;;iFAEiF;AACjF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;wEACwE;AACxE,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAS3C;AAED;qEACqE;AACrE,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQjF;AA8FD;yDACyD;AACzD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAChB,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,CAKjD;AAiDD;8DAC8D;AAC9D,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAuGjD;AAMD;;uDAEuD;AACvD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAM7D;AAED;;;iDAGiD;AACjD,wBAAgB,gBAAgB,IAAI;IAClC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAQA"}
@@ -1,290 +0,0 @@
1
- /** LoopForge — Memory Bridge (v1.8).
2
- *
3
- * Zero-config auto-detection bridge between LoopForge and claude-mem.
4
- * Detects claude-mem via the local filesystem, provides memoryProvider
5
- * (file-based retrieval) and memoryWriter (Markdown file writeback).
6
- *
7
- * Two integration paths:
8
- * MCP: autoConfigureMemory(sessionMgr) — sets provider/writer on SessionManager
9
- * Lib: tryAutoConfigure() → { memoryProvider?, memoryWriter? } — for resolveConfig()
10
- *
11
- * If claude-mem is not installed or the project has no memory directory,
12
- * both functions return without side effects — silent graceful degradation.
13
- */
14
- import { homedir } from "node:os";
15
- import { join, dirname } from "node:path";
16
- import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, appendFileSync, rmSync, } from "node:fs";
17
- // ═══════════════════════════════════════════════════════════════════════════
18
- // Detection
19
- // ═══════════════════════════════════════════════════════════════════════════
20
- /** Compute the project directory name the same way claude-mem does:
21
- * replace every non-alphanumeric character with `-`.
22
- * e.g. `C:\Users\Dell\Desktop\LoopForge` → `C--Users-Dell-Desktop-LoopForge` */
23
- export function computeProjectHash(gitRoot) {
24
- return gitRoot.replace(/[^a-zA-Z0-9]/g, "-");
25
- }
26
- /** Walk upward from cwd looking for a `.git` directory.
27
- * Returns the git root path, or null if not found within 20 levels. */
28
- export function findGitRoot() {
29
- let dir = process.cwd();
30
- for (let i = 0; i < 20; i++) {
31
- if (existsSync(join(dir, ".git")))
32
- return dir;
33
- const parent = dirname(dir);
34
- if (parent === dir)
35
- break;
36
- dir = parent;
37
- }
38
- return null;
39
- }
40
- /** Check whether claude-mem has a memory directory for the current project.
41
- * Returns the memory directory path and MEMORY.md path, or null. */
42
- export function detectClaudeMem() {
43
- const gitRoot = findGitRoot();
44
- if (!gitRoot)
45
- return null;
46
- const hash = computeProjectHash(gitRoot);
47
- const memoryDir = join(homedir(), ".claude", "projects", hash, "memory");
48
- const indexPath = join(memoryDir, "MEMORY.md");
49
- if (!existsSync(memoryDir) || !existsSync(indexPath))
50
- return null;
51
- return { memoryDir, indexPath };
52
- }
53
- // ═══════════════════════════════════════════════════════════════════════════
54
- // Retrieval
55
- // ═══════════════════════════════════════════════════════════════════════════
56
- /** Split text into lowercase words ≥4 chars for keyword matching. */
57
- function keywords(text) {
58
- return text
59
- .toLowerCase()
60
- .split(/[^a-z0-9]+/)
61
- .filter((w) => w.length >= 4);
62
- }
63
- /** Build a phase-aware set of query terms from the provider context.
64
- * Phase 1: task terms only (initial anchoring).
65
- * Phase 2: task + recurring issues + failed patterns (mid-loop breakout).
66
- * Phase 3: task + remaining criteria + key lessons (late-stage edge cases). */
67
- function buildQueryTerms(ctx) {
68
- const terms = new Set();
69
- for (const w of keywords(ctx.task))
70
- terms.add(w);
71
- if (ctx.domain)
72
- for (const w of keywords(ctx.domain))
73
- terms.add(w);
74
- if (ctx.phase === 2) {
75
- for (const issue of ctx.accumulatedContext.recurringIssues) {
76
- for (const w of keywords(issue))
77
- terms.add(w);
78
- }
79
- for (const pat of ctx.accumulatedContext.failedPatterns) {
80
- for (const w of keywords(pat))
81
- terms.add(w);
82
- }
83
- }
84
- else if (ctx.phase === 3) {
85
- for (const crit of ctx.accumulatedContext.remainingCriteria) {
86
- for (const w of keywords(crit))
87
- terms.add(w);
88
- }
89
- for (const lesson of ctx.accumulatedContext.keyLessons) {
90
- for (const w of keywords(lesson))
91
- terms.add(w);
92
- }
93
- }
94
- return [...terms];
95
- }
96
- /** Strip YAML frontmatter (--- ... ---) from a markdown file and return the body. */
97
- function stripFrontmatter(md) {
98
- const match = md.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/);
99
- if (!match)
100
- return md;
101
- return md.slice(match[0].length).trim();
102
- }
103
- /** Scan all .md memory files (excluding MEMORY.md) and return the top-N
104
- * most relevant memories concatenated, scored by keyword overlap. */
105
- function retrieveFromFiles(memoryDir, queryTerms, maxFiles, maxCharsPerFile) {
106
- let files;
107
- try {
108
- files = readdirSync(memoryDir).filter((f) => f.endsWith(".md") && f !== "MEMORY.md");
109
- }
110
- catch {
111
- return "";
112
- }
113
- if (files.length === 0 || queryTerms.length === 0)
114
- return "";
115
- const scored = [];
116
- for (const file of files) {
117
- let content;
118
- try {
119
- content = readFileSync(join(memoryDir, file), "utf-8");
120
- }
121
- catch {
122
- continue;
123
- }
124
- const lower = content.toLowerCase();
125
- let score = 0;
126
- for (const term of queryTerms) {
127
- if (lower.includes(term))
128
- score++;
129
- }
130
- if (score > 0) {
131
- scored.push({ body: stripFrontmatter(content), score });
132
- }
133
- }
134
- if (scored.length === 0)
135
- return "";
136
- scored.sort((a, b) => b.score - a.score);
137
- return scored
138
- .slice(0, maxFiles)
139
- .map((s) => s.body.slice(0, maxCharsPerFile))
140
- .join("\n\n---\n\n");
141
- }
142
- /** Create a memoryProvider callback bound to a specific memory directory.
143
- * Reads .md files directly — no REST API dependency. */
144
- export function createMemoryProvider(memoryDir) {
145
- return async (ctx) => {
146
- const queryTerms = buildQueryTerms(ctx);
147
- return retrieveFromFiles(memoryDir, queryTerms, 3, 600);
148
- };
149
- }
150
- // ═══════════════════════════════════════════════════════════════════════════
151
- // Writeback
152
- // ═══════════════════════════════════════════════════════════════════════════
153
- const LOCK_RETRY_MS = 50;
154
- /** Minimal mkdir-based mutex for safguarding MEMORY.md writes.
155
- * Non-blocking: returns true if lock was acquired, false if held by another process. */
156
- function acquireLock(lockDir) {
157
- try {
158
- mkdirSync(lockDir);
159
- return true;
160
- }
161
- catch {
162
- return false;
163
- }
164
- }
165
- function releaseLock(lockDir) {
166
- try {
167
- rmSync(lockDir, { recursive: true });
168
- }
169
- catch {
170
- // lock dir already removed — ignore
171
- }
172
- }
173
- /** Write a single .md memory file with claude-mem-compatible YAML frontmatter. */
174
- function writeMemoryFile(memoryDir, name, description, memType, body) {
175
- const filename = `${name}.md`;
176
- const frontmatter = [
177
- "---",
178
- `name: ${name}`,
179
- `description: ${description.slice(0, 100)}`,
180
- "metadata:",
181
- ` type: ${memType}`,
182
- "---",
183
- "",
184
- ].join("\n");
185
- writeFileSync(join(memoryDir, filename), frontmatter + body, "utf-8");
186
- return filename;
187
- }
188
- /** Create a memoryWriter callback bound to a specific memory directory.
189
- * Writes .md files directly + appends to MEMORY.md index. */
190
- export function createMemoryWriter(memoryDir, indexPath) {
191
- return async (payload) => {
192
- const lockDir = join(memoryDir, ".loopforge-wb.lock");
193
- // Non-blocking lock acquire — skip if claude-mem is writing concurrently
194
- for (let attempt = 0; attempt < 3; attempt++) {
195
- if (acquireLock(lockDir))
196
- break;
197
- if (attempt === 2)
198
- return; // could not acquire after 3 attempts — skip
199
- await new Promise((r) => setTimeout(r, LOCK_RETRY_MS));
200
- }
201
- try {
202
- const date = new Date().toISOString().split("T")[0];
203
- const indexLines = [];
204
- // 1. Project entry
205
- const projectName = `loopforge-${payload.loopId}-outcome`;
206
- const projectBody = [
207
- `# ${payload.projectEntry.title}`,
208
- "",
209
- `**Outcome**: ${payload.projectEntry.keyOutcome}`,
210
- `**Date**: ${date}`,
211
- `**Rounds**: ${payload.roundsCompleted}`,
212
- `**Rounds Completed**: ${payload.roundsCompleted}`,
213
- "",
214
- payload.projectEntry.objective
215
- ? `**Objective**: ${payload.projectEntry.objective}\n`
216
- : "",
217
- payload.projectEntry.keyDiscoveries.length > 0
218
- ? [
219
- "**Key Discoveries**:",
220
- ...payload.projectEntry.keyDiscoveries.map((d) => `- ${d}`),
221
- "",
222
- ].join("\n")
223
- : "",
224
- ]
225
- .filter(Boolean)
226
- .join("\n");
227
- const projectFile = writeMemoryFile(memoryDir, projectName, payload.projectEntry.title.slice(0, 100), "project", projectBody);
228
- indexLines.push(`- [LoopForge: ${payload.task.slice(0, 60)}](${projectFile}) — ${payload.outcome} (${date})`);
229
- // 2. Feedback entries
230
- for (let i = 0; i < payload.feedbackEntries.length; i++) {
231
- const fb = payload.feedbackEntries[i];
232
- const fbName = `loopforge-${payload.loopId}-fb-${i + 1}`;
233
- const fbBody = [
234
- `# ${fb.rule}`,
235
- "",
236
- `**Why:** ${fb.why}`,
237
- "",
238
- `**How to apply:** ${fb.howToApply}`,
239
- "",
240
- ].join("\n");
241
- const fbFile = writeMemoryFile(memoryDir, fbName, fb.rule.slice(0, 100), "feedback", fbBody);
242
- indexLines.push(`- [LoopForge Feedback](${fbFile}) — ${payload.outcome} (${date})`);
243
- }
244
- // 3. Reference entry
245
- if (payload.referenceEntry) {
246
- const refName = `loopforge-${payload.loopId}-ref`;
247
- const refBody = [
248
- `# ${payload.referenceEntry.description}`,
249
- "",
250
- `**Vault Location**: ${payload.referenceEntry.vaultLocation}`,
251
- "",
252
- ].join("\n");
253
- const refFile = writeMemoryFile(memoryDir, refName, payload.referenceEntry.description.slice(0, 100), "reference", refBody);
254
- indexLines.push(`- [LoopForge Reference](${refFile}) — ${payload.outcome} (${date})`);
255
- }
256
- // 4. Append to MEMORY.md index
257
- appendFileSync(indexPath, indexLines.join("\n") + "\n", "utf-8");
258
- }
259
- finally {
260
- releaseLock(lockDir);
261
- }
262
- };
263
- }
264
- // ═══════════════════════════════════════════════════════════════════════════
265
- // Integration entry points
266
- // ═══════════════════════════════════════════════════════════════════════════
267
- /** Auto-detect claude-mem and wire memoryProvider / memoryWriter onto a
268
- * SessionManager instance. Called once at MCP server startup.
269
- * If claude-mem is not available, this is a no-op. */
270
- export function autoConfigureMemory(mgr) {
271
- const detected = detectClaudeMem();
272
- if (!detected)
273
- return;
274
- mgr.memoryProvider = createMemoryProvider(detected.memoryDir);
275
- mgr.memoryWriter = createMemoryWriter(detected.memoryDir, detected.indexPath);
276
- }
277
- /** Auto-detect claude-mem and return provider/writer callbacks.
278
- * Used by the runtime library path (resolveConfig). Callers should
279
- * only invoke this when the user has NOT provided explicit callbacks —
280
- * explicit callbacks always take precedence. */
281
- export function tryAutoConfigure() {
282
- const detected = detectClaudeMem();
283
- if (!detected)
284
- return {};
285
- return {
286
- memoryProvider: createMemoryProvider(detected.memoryDir),
287
- memoryWriter: createMemoryWriter(detected.memoryDir, detected.indexPath),
288
- };
289
- }
290
- //# sourceMappingURL=memory-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-bridge.js","sourceRoot":"","sources":["../src/memory-bridge.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- /** Shared test utilities — in-memory backend, test data factories.
2
- *
3
- * Imported by replay.test.ts and mcp.test.ts to avoid ~50 lines of
4
- * duplicated MemoryBackend implementation.
5
- */
6
- import type { VaultBackend, VaultEntry } from "../backends/interface.js";
7
- /** In-memory backend for testing — implements VaultBackend without filesystem. */
8
- export declare class MemoryBackend implements VaultBackend {
9
- entries: VaultEntry[];
10
- markdownFiles: Map<string, string>;
11
- markdownScans: Map<string, VaultEntry[]>;
12
- readVault(): Record<string, unknown>;
13
- writeVault(data: Record<string, unknown>): void;
14
- queryEntries(opts?: {
15
- prefix?: string;
16
- taskIdPattern?: string;
17
- feedbackOnly?: boolean;
18
- }): VaultEntry[];
19
- appendEntry(entry: VaultEntry): void;
20
- appendEntries(entries: VaultEntry[]): number;
21
- writeLineageMd(_loopId: string, roundNum: number, content: string, _metadata: Record<string, unknown>): string | null;
22
- readLineageMd(loopId: string, roundNum: number): string | null;
23
- scanLineageMd(loopId: string): VaultEntry[];
24
- }
25
- //# sourceMappingURL=_helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/tests/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEzE,kFAAkF;AAClF,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,EAAE,UAAU,EAAE,CAAM;IAC3B,aAAa,sBAA6B;IAC1C,aAAa,4BAAmC;IAEhD,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAGpC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAG/C,YAAY,CAAC,IAAI,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,UAAU,EAAE;IAShB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAGpC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IAI5C,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,GAAG,IAAI;IAIhB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAG9D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;CAG5C"}
@@ -1,47 +0,0 @@
1
- /** Shared test utilities — in-memory backend, test data factories.
2
- *
3
- * Imported by replay.test.ts and mcp.test.ts to avoid ~50 lines of
4
- * duplicated MemoryBackend implementation.
5
- */
6
- /** In-memory backend for testing — implements VaultBackend without filesystem. */
7
- export class MemoryBackend {
8
- entries = [];
9
- markdownFiles = new Map();
10
- markdownScans = new Map();
11
- readVault() {
12
- return { entries: this.entries };
13
- }
14
- writeVault(data) {
15
- this.entries = data.entries || [];
16
- }
17
- queryEntries(opts) {
18
- return this.entries.filter((entry) => {
19
- const taskId = String(entry.task_id ?? "");
20
- if (opts?.feedbackOnly && !taskId.endsWith(":feedback"))
21
- return false;
22
- if (!opts?.feedbackOnly && taskId.endsWith(":feedback"))
23
- return false;
24
- if (opts?.prefix && !taskId.startsWith(opts.prefix))
25
- return false;
26
- return true;
27
- });
28
- }
29
- appendEntry(entry) {
30
- this.entries.push(entry);
31
- }
32
- appendEntries(entries) {
33
- this.entries.push(...entries);
34
- return entries.length;
35
- }
36
- writeLineageMd(_loopId, roundNum, content, _metadata) {
37
- this.markdownFiles.set(`${_loopId}:r${roundNum}`, content);
38
- return `/fake/${_loopId}/r${roundNum}.md`;
39
- }
40
- readLineageMd(loopId, roundNum) {
41
- return this.markdownFiles.get(`${loopId}:r${roundNum}`) ?? null;
42
- }
43
- scanLineageMd(loopId) {
44
- return this.markdownScans.get(loopId) ?? [];
45
- }
46
- }
47
- //# sourceMappingURL=_helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../src/tests/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,kFAAkF;AAClF,MAAM,OAAO,aAAa;IACxB,OAAO,GAAiB,EAAE,CAAC;IAC3B,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,SAAS;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IACD,UAAU,CAAC,IAA6B;QACtC,IAAI,CAAC,OAAO,GAAI,IAAI,CAAC,OAAwB,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,YAAY,CAAC,IAIZ;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3C,IAAI,IAAI,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtE,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtE,IAAI,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IACD,WAAW,CAAC,KAAiB;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,aAAa,CAAC,OAAqB;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,cAAc,CACZ,OAAe,EACf,QAAgB,EAChB,OAAe,EACf,SAAkC;QAElC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,SAAS,OAAO,KAAK,QAAQ,KAAK,CAAC;IAC5C,CAAC;IACD,aAAa,CAAC,MAAc,EAAE,QAAgB;QAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC;IAClE,CAAC;IACD,aAAa,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=builder.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builder.test.d.ts","sourceRoot":"","sources":["../../src/tests/builder.test.ts"],"names":[],"mappings":""}
@@ -1,112 +0,0 @@
1
- /** Tests for technique routing and quality scoring. */
2
- import { describe, it, beforeEach } from "node:test";
3
- import assert from "node:assert/strict";
4
- import { routeTechnique, routeTechniqueAdaptive, } from "../builder.js";
5
- import { resetPolicy } from "../policy.js";
6
- describe("Builder — Route Technique", () => {
7
- beforeEach(() => resetPolicy());
8
- it("routes audit tasks to tree-of-thought (independent, high load)", () => {
9
- // "audit" is HIGH_LOAD but not CONTINUOUS → independent + high → tree-of-thought
10
- const analysis = routeTechnique("Audit the ERC20 token for security vulnerabilities");
11
- assert.equal(analysis.technique, "tree-of-thought");
12
- assert.equal(analysis.independence, "independent");
13
- assert.equal(analysis.cognitive_load, "high");
14
- });
15
- it("routes rename tasks to zero-shot (independent, low load)", () => {
16
- const analysis = routeTechnique("Rename getCwd to getCurrentWorkingDirectory");
17
- assert.equal(analysis.technique, "zero-shot");
18
- assert.equal(analysis.independence, "independent");
19
- assert.equal(analysis.cognitive_load, "low");
20
- });
21
- it("routes fix tasks to zero-shot (continuous, low load, short task)", () => {
22
- const analysis = routeTechnique("Fix the bug"); // only 3 words → load low
23
- assert.equal(analysis.technique, "zero-shot");
24
- assert.equal(analysis.independence, "continuous");
25
- });
26
- it("routes crypto tasks to few-shot-cot (continuous, high)", () => {
27
- const analysis = routeTechnique("Fix the encryption protocol memory leak in the concurrent handler");
28
- assert.equal(analysis.technique, "few-shot-cot");
29
- assert.equal(analysis.independence, "continuous");
30
- assert.equal(analysis.cognitive_load, "high");
31
- });
32
- it("routes simple independent tasks to zero-shot", () => {
33
- const analysis = routeTechnique("Write a README for the project with basic setup instructions");
34
- assert.equal(analysis.technique, "zero-shot");
35
- assert.equal(analysis.independence, "independent");
36
- assert.equal(analysis.cognitive_load, "low");
37
- });
38
- it("includes reference_file in analysis", () => {
39
- const analysis = routeTechnique("Fix the encryption protocol");
40
- assert.ok(analysis.reference_file.includes("chain-of-thought"));
41
- });
42
- it("defaults to zero-shot on unrecognised combination", () => {
43
- const analysis = routeTechnique(""); // empty task
44
- assert.equal(analysis.technique, "zero-shot");
45
- });
46
- });
47
- describe("Builder — Tier-gated routing", () => {
48
- it("uses keyword heuristic when no vault context (Tier 1 default)", () => {
49
- const analysis = routeTechniqueAdaptive("Fix the encryption protocol security audit", null, "");
50
- assert.equal(analysis.technique, "few-shot-cot");
51
- assert.equal(analysis.was_rotated, false);
52
- });
53
- it("uses keyword heuristic when no loop_id (Tier 1 default)", () => {
54
- const analysis = routeTechniqueAdaptive("Fix the encryption protocol security audit", { results: [] }, "");
55
- assert.equal(analysis.technique, "few-shot-cot");
56
- assert.equal(analysis.was_rotated, false);
57
- });
58
- it("stays in Tier 1 by default", () => {
59
- const vaultContext = {
60
- results: [
61
- {
62
- loop_lineage: {
63
- loop_id: "test-loop",
64
- round: 1,
65
- success: true,
66
- },
67
- technique_used: "few-shot-cot",
68
- success: true,
69
- },
70
- ],
71
- };
72
- const analysis = routeTechniqueAdaptive("Fix the encryption protocol security audit", vaultContext, "test-loop");
73
- assert.equal(analysis.technique, "few-shot-cot");
74
- assert.equal(analysis.was_rotated, false);
75
- });
76
- it("allows Tier 2 on checkpoint boundary", () => {
77
- // Task triggers step-back keyword → Tier 2, normally downgraded
78
- // But with isCheckpoint=true, should be allowed
79
- const analysis = routeTechniqueAdaptive("重构 legacy 系统", null, "", true);
80
- assert.equal(analysis.technique, "step-back");
81
- });
82
- it("downgrades Tier 2 to Tier 1 in normal round", () => {
83
- // "重构 legacy 系统" triggers step-back (Tier 2), but without checkpoint it downgrades
84
- const analysis = routeTechniqueAdaptive("重构 legacy 系统");
85
- // step-back downgrades to few-shot-cot
86
- assert.ok(["zero-shot", "few-shot", "zero-shot-cot", "few-shot-cot"].includes(analysis.technique));
87
- });
88
- // v1.15: Tier escalation removed — Agent freely chooses at L2.
89
- // Consecutive failures no longer force Tier 2 techniques.
90
- it("stays in Tier 1 after consecutive failures (v1.15 — escalation removed)", () => {
91
- const vaultContext = {
92
- results: [
93
- {
94
- loop_lineage: { loop_id: "test-loop", round: 1 },
95
- success: false,
96
- },
97
- {
98
- loop_lineage: { loop_id: "test-loop", round: 2 },
99
- success: false,
100
- },
101
- {
102
- loop_lineage: { loop_id: "test-loop", round: 3 },
103
- success: false,
104
- },
105
- ],
106
- };
107
- const analysis = routeTechniqueAdaptive("Fix the encryption protocol security audit", vaultContext, "test-loop");
108
- // Tier 1 only in normal round (no escalation)
109
- assert.ok(["zero-shot", "few-shot", "zero-shot-cot", "few-shot-cot"].includes(analysis.technique));
110
- });
111
- });
112
- //# sourceMappingURL=builder.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builder.test.js","sourceRoot":"","sources":["../../src/tests/builder.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=enforcement-gate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enforcement-gate.test.d.ts","sourceRoot":"","sources":["../../src/tests/enforcement-gate.test.ts"],"names":[],"mappings":""}