loopforge 1.3.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/fs.d.ts +5 -0
- package/dist/backends/fs.d.ts.map +1 -1
- package/dist/backends/fs.js +66 -16
- package/dist/backends/fs.js.map +1 -1
- package/dist/builder.d.ts +0 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +14 -25
- package/dist/builder.js.map +1 -1
- package/dist/engine.d.ts +14 -5
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +202 -105
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +4 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -9
- package/dist/index.js.map +1 -1
- package/dist/loop-compiler.d.ts +5 -2
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +533 -19
- package/dist/loop-compiler.js.map +1 -1
- package/dist/mcp/session.d.ts +11 -3
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +106 -31
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +116 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/observability.d.ts +23 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +29 -0
- package/dist/observability.js.map +1 -0
- package/dist/policy.d.ts +15 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +8 -0
- package/dist/policy.js.map +1 -1
- package/dist/protocol.d.ts +114 -5
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +44 -3
- package/dist/protocol.js.map +1 -1
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +51 -3
- package/dist/runtime.js.map +1 -1
- package/dist/tests/builder.test.js +1 -25
- package/dist/tests/builder.test.js.map +1 -1
- package/dist/tests/engine.test.js +213 -38
- package/dist/tests/engine.test.js.map +1 -1
- package/dist/tests/generate-schema.test.js +4 -4
- package/dist/tests/generate-schema.test.js.map +1 -1
- package/dist/tests/loop-compiler.test.js +191 -2
- package/dist/tests/loop-compiler.test.js.map +1 -1
- package/dist/tests/mcp.test.js +87 -0
- package/dist/tests/mcp.test.js.map +1 -1
- package/dist/tests/protocol.test.js +2 -4
- package/dist/tests/protocol.test.js.map +1 -1
- package/dist/tests/verification-gate.test.d.ts +2 -0
- package/dist/tests/verification-gate.test.d.ts.map +1 -0
- package/dist/tests/verification-gate.test.js +407 -0
- package/dist/tests/verification-gate.test.js.map +1 -0
- package/dist/verification-gate.d.ts +26 -0
- package/dist/verification-gate.d.ts.map +1 -0
- package/dist/verification-gate.js +232 -0
- package/dist/verification-gate.js.map +1 -0
- package/loop_policy.json +8 -0
- package/package.json +1 -2
- package/skills/perception/SKILL.md +95 -54
- package/dist/cli.d.ts +0 -7
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -458
- package/dist/cli.js.map +0 -1
- package/dist/tests/adapter.test.js +0 -104
- package/dist/tests/adapter.test.js.map +0 -1
package/dist/cli.js
DELETED
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** LoopForge CLI — command-line interface for the loop compiler.
|
|
3
|
-
*
|
|
4
|
-
* v1.2 — npm install loopforge
|
|
5
|
-
*/
|
|
6
|
-
import { createEngine } from "./engine.js";
|
|
7
|
-
import { FSBackend } from "./backends/fs.js";
|
|
8
|
-
import { ReplayBackend } from "./replay.js";
|
|
9
|
-
import { Mode, makeExecutionFeedback, } from "./protocol.js";
|
|
10
|
-
import { LoopRuntime } from "./runtime.js";
|
|
11
|
-
import { SessionManager } from "./mcp/session.js";
|
|
12
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
13
|
-
// Constants
|
|
14
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
15
|
-
const VERSION = "1.2.0";
|
|
16
|
-
const VAULT_CONFIG = {
|
|
17
|
-
project_vault: ".promptcraft/prompt_vault.json",
|
|
18
|
-
global_vault: "~/.promptcraft/global_vault.json",
|
|
19
|
-
skills_dir: "skills",
|
|
20
|
-
no_global: false,
|
|
21
|
-
};
|
|
22
|
-
const USAGE = `LoopForge v${VERSION} — Loop-Time Intelligence Layer
|
|
23
|
-
|
|
24
|
-
Usage:
|
|
25
|
-
loopforge init Initialise .promptcraft vault
|
|
26
|
-
loopforge compile [json] Compile a loop prompt
|
|
27
|
-
loopforge feedback [json] Record execution feedback
|
|
28
|
-
loopforge run [json] Autonomous loop (event-driven runtime)
|
|
29
|
-
loopforge replay <loop-id> Show loop timeline
|
|
30
|
-
loopforge diff <loop-id> <a> <b> Diff two rounds
|
|
31
|
-
loopforge review <loop-id> <rN> Audit stored prompt
|
|
32
|
-
loopforge resume <loop-id> Resume loop from vault state
|
|
33
|
-
loopforge status Vault health summary
|
|
34
|
-
|
|
35
|
-
Flags:
|
|
36
|
-
--help, -h Show this help
|
|
37
|
-
--version, -V Show version
|
|
38
|
-
|
|
39
|
-
Pipe JSON via stdin: echo '{"task":"..."}' | loopforge compile
|
|
40
|
-
`;
|
|
41
|
-
const CMD_HELP = {
|
|
42
|
-
init: "loopforge init — create .promptcraft/prompt_vault.json if it doesn't exist.",
|
|
43
|
-
compile: "loopforge compile '<json>' — run loop_compile (L0/L1/L2).\n Required: task, loop_id, goal_id. Optional: round, domain, constraints_from_plan, new_since_last_round, force_level.",
|
|
44
|
-
feedback: "loopforge feedback '<json>' — record execution result.\n Flat: {loop_id, round, success, score, output}\n Nested: {loop_id, round, feedback: {success, score, output}}",
|
|
45
|
-
run: "loopforge run '<json>' — autonomous loop (v1.2).\n Required: task, loop_id. Optional: max_rounds (default 20), plan_source, domain.\n Outputs compiled prompt → reads agent output from stdin → continues until task complete or circuit breaker.",
|
|
46
|
-
replay: "loopforge replay <loop-id> — show timeline: round, recompile level, quality, technique, task.",
|
|
47
|
-
diff: "loopforge diff <loop-id> <round-a> <round-b> — field-level comparison between two rounds.",
|
|
48
|
-
review: "loopforge review <loop-id> <round-num> — structural audit of a stored prompt.",
|
|
49
|
-
resume: "loopforge resume <loop-id> — restore session from vault and compile the next round's prompt.\n Requires a session_state entry saved by a previous loopforge run or MCP session.",
|
|
50
|
-
status: "loopforge status — vault health: entry counts, active loops.",
|
|
51
|
-
};
|
|
52
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
53
|
-
// Helpers
|
|
54
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
55
|
-
function die(msg) {
|
|
56
|
-
process.stderr.write(`loopforge: ${msg}\n`);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
function showHelp(cmd) {
|
|
60
|
-
if (cmd && CMD_HELP[cmd]) {
|
|
61
|
-
console.log(CMD_HELP[cmd]);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
console.log(USAGE);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async function readStdin() {
|
|
68
|
-
return new Promise((resolve) => {
|
|
69
|
-
const chunks = [];
|
|
70
|
-
process.stdin.on("data", (chunk) => chunks.push(chunk));
|
|
71
|
-
process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
72
|
-
if (process.stdin.isTTY)
|
|
73
|
-
resolve("");
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
function parseJson(raw) {
|
|
77
|
-
try {
|
|
78
|
-
const data = JSON.parse(raw);
|
|
79
|
-
if (typeof data !== "object" || Array.isArray(data) || data === null) {
|
|
80
|
-
die("input must be a JSON object");
|
|
81
|
-
}
|
|
82
|
-
return data;
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
die(`invalid JSON: ${e instanceof Error ? e.message : e}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/** Normalise flat fields into feedback payload — accepts both formats. */
|
|
89
|
-
function normaliseFeedbackPayload(data) {
|
|
90
|
-
// Already nested: { feedback: { success, score, ... } }
|
|
91
|
-
if (data.feedback && typeof data.feedback === "object") {
|
|
92
|
-
return data.feedback;
|
|
93
|
-
}
|
|
94
|
-
// Flat format: { success, score, output, ... } — auto-nest
|
|
95
|
-
if (data.success !== undefined || data.score !== undefined) {
|
|
96
|
-
return {
|
|
97
|
-
output: data.output ?? "",
|
|
98
|
-
success: data.success ?? false,
|
|
99
|
-
constraint_violations: data.constraint_violations ?? [],
|
|
100
|
-
manual_fixes_needed: data.manual_fixes_needed ?? "",
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
106
|
-
// Commands
|
|
107
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
108
|
-
async function cmdInit() {
|
|
109
|
-
const backend = new FSBackend();
|
|
110
|
-
const vault = backend.readVault();
|
|
111
|
-
if (!vault.entries || !Array.isArray(vault.entries)) {
|
|
112
|
-
backend.writeVault({ entries: [] });
|
|
113
|
-
console.log("Initialised .promptcraft/prompt_vault.json");
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
const count = vault.entries.length;
|
|
117
|
-
console.log(`Vault already exists (${count} entries). Nothing to do.`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
async function cmdCompile(engine, jsonArg) {
|
|
121
|
-
let raw;
|
|
122
|
-
if (jsonArg === "--help" || jsonArg === "-h") {
|
|
123
|
-
showHelp("compile");
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (jsonArg) {
|
|
127
|
-
raw = jsonArg;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
raw = await readStdin();
|
|
131
|
-
}
|
|
132
|
-
if (!raw.trim())
|
|
133
|
-
die("compile requires JSON input (argument or stdin)");
|
|
134
|
-
const data = parseJson(raw);
|
|
135
|
-
const result = engine.invokeLoopCompile({
|
|
136
|
-
task: data.task ?? "",
|
|
137
|
-
mode: Mode.LOOP_COMPILE,
|
|
138
|
-
vault_config: { ...VAULT_CONFIG },
|
|
139
|
-
feedback: null,
|
|
140
|
-
skill_name: null,
|
|
141
|
-
task_id: null,
|
|
142
|
-
...data,
|
|
143
|
-
});
|
|
144
|
-
const prompt = result.response?.prompt ?? "Error: no prompt generated";
|
|
145
|
-
console.log(prompt);
|
|
146
|
-
}
|
|
147
|
-
async function cmdFeedback(engine, jsonArg) {
|
|
148
|
-
if (jsonArg === "--help" || jsonArg === "-h") {
|
|
149
|
-
showHelp("feedback");
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
let raw;
|
|
153
|
-
if (jsonArg) {
|
|
154
|
-
raw = jsonArg;
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
raw = await readStdin();
|
|
158
|
-
}
|
|
159
|
-
if (!raw.trim())
|
|
160
|
-
die("feedback requires JSON input (argument or stdin)");
|
|
161
|
-
const data = parseJson(raw);
|
|
162
|
-
const fbPayload = normaliseFeedbackPayload(data);
|
|
163
|
-
if (!fbPayload) {
|
|
164
|
-
die("feedback requires one of: {feedback:{success,score}} or {success,score} at top level");
|
|
165
|
-
}
|
|
166
|
-
const result = engine.invokeFeedback({
|
|
167
|
-
task: data.task ?? "",
|
|
168
|
-
mode: Mode.FEEDBACK,
|
|
169
|
-
vault_config: { ...VAULT_CONFIG },
|
|
170
|
-
feedback: makeExecutionFeedback({
|
|
171
|
-
output: fbPayload.output ?? "",
|
|
172
|
-
success: fbPayload.success ?? false,
|
|
173
|
-
constraint_violations: fbPayload.constraint_violations ?? [],
|
|
174
|
-
manual_fixes_needed: fbPayload.manual_fixes_needed ?? "",
|
|
175
|
-
}),
|
|
176
|
-
skill_name: null,
|
|
177
|
-
task_id: null,
|
|
178
|
-
...data,
|
|
179
|
-
});
|
|
180
|
-
console.log(result.response?.prompt ?? result.response?.error ?? "Error");
|
|
181
|
-
}
|
|
182
|
-
function cmdReplay(loopId) {
|
|
183
|
-
if (loopId === "--help" || loopId === "-h") {
|
|
184
|
-
showHelp("replay");
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
if (!loopId)
|
|
188
|
-
die("replay requires a loop-id");
|
|
189
|
-
const backend = new FSBackend();
|
|
190
|
-
const replay = new ReplayBackend(backend);
|
|
191
|
-
const tl = replay.timeline(loopId);
|
|
192
|
-
if (!tl.length) {
|
|
193
|
-
console.log(`No rounds found for loop "${loopId}".`);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
console.log(`Loop: ${loopId} (${tl.length} rounds)\n`);
|
|
197
|
-
console.log("Round Level Quality Technique Task");
|
|
198
|
-
console.log("----- ----- ------- -------------- ----");
|
|
199
|
-
for (const entry of tl) {
|
|
200
|
-
const rnd = String(entry.round).padStart(5);
|
|
201
|
-
const level = String(entry.recompile_level).padEnd(6);
|
|
202
|
-
const q = String(entry.quality_score ?? "-").padEnd(8);
|
|
203
|
-
const tech = String(entry.technique_used || "-").padEnd(15);
|
|
204
|
-
const task = String(entry.task || "").slice(0, 50);
|
|
205
|
-
console.log(`${rnd} ${level} ${q} ${tech} ${task}`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
function cmdDiff(loopId, roundA, roundB) {
|
|
209
|
-
if (loopId === "--help" || loopId === "-h") {
|
|
210
|
-
showHelp("diff");
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
if (!loopId || !roundA || !roundB) {
|
|
214
|
-
die("diff requires <loop-id> <round-a> <round-b>");
|
|
215
|
-
}
|
|
216
|
-
const backend = new FSBackend();
|
|
217
|
-
const replay = new ReplayBackend(backend);
|
|
218
|
-
const diff = replay.diff(loopId, parseInt(roundA, 10), parseInt(roundB, 10));
|
|
219
|
-
if (diff.missing) {
|
|
220
|
-
console.log(`Cannot diff: ${diff.missing} not found.`);
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
console.log(`Diff: ${loopId} round ${diff.round_a} → round ${diff.round_b}\n`);
|
|
224
|
-
const changes = diff.changes;
|
|
225
|
-
if (!changes.length) {
|
|
226
|
-
console.log("No changes detected.");
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
for (const c of changes) {
|
|
230
|
-
console.log(` ${c.label}:`);
|
|
231
|
-
if (c.field === "constraints_active") {
|
|
232
|
-
const added = c.added;
|
|
233
|
-
const removed = c.removed;
|
|
234
|
-
if (added?.length)
|
|
235
|
-
console.log(` + added: [${added.join(", ")}]`);
|
|
236
|
-
if (removed?.length)
|
|
237
|
-
console.log(` - removed: [${removed.join(", ")}]`);
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
console.log(` before: ${c.before}`);
|
|
241
|
-
console.log(` after: ${c.after}`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
const unchanged = diff.unchanged;
|
|
246
|
-
if (unchanged?.length) {
|
|
247
|
-
console.log(`\nUnchanged: ${unchanged.join(", ")}`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
function cmdReview(loopId, roundStr) {
|
|
251
|
-
if (loopId === "--help" || loopId === "-h") {
|
|
252
|
-
showHelp("review");
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
if (!loopId || !roundStr)
|
|
256
|
-
die("review requires <loop-id> <round-num>");
|
|
257
|
-
const roundNum = parseInt(roundStr, 10);
|
|
258
|
-
if (Number.isNaN(roundNum))
|
|
259
|
-
die(`invalid round number: ${roundStr}`);
|
|
260
|
-
const backend = new FSBackend();
|
|
261
|
-
const engine = createEngine("skills", backend);
|
|
262
|
-
const context = engine.hydrateLoopContext(loopId);
|
|
263
|
-
if (!context) {
|
|
264
|
-
console.log(`No entries found for loop "${loopId}".`);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
const results = context.results ?? [];
|
|
268
|
-
const target = results.find((r) => {
|
|
269
|
-
const lineage = (r.loop_lineage ?? {});
|
|
270
|
-
return lineage.round === roundNum;
|
|
271
|
-
});
|
|
272
|
-
if (!target) {
|
|
273
|
-
console.log(`Round ${roundNum} not found in loop "${loopId}".`);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
const result = engine.handleReview({
|
|
277
|
-
task: target.task ?? "review",
|
|
278
|
-
mode: Mode.REVIEW,
|
|
279
|
-
vault_config: { ...VAULT_CONFIG },
|
|
280
|
-
feedback: null,
|
|
281
|
-
skill_name: null,
|
|
282
|
-
task_id: null,
|
|
283
|
-
}, { results: [target], global_entries: [] });
|
|
284
|
-
console.log(result.response?.prompt ?? "Review produced no output.");
|
|
285
|
-
}
|
|
286
|
-
async function cmdRun(_engine, jsonArg) {
|
|
287
|
-
if (jsonArg === "--help" || jsonArg === "-h") {
|
|
288
|
-
showHelp("run");
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
let raw;
|
|
292
|
-
if (jsonArg) {
|
|
293
|
-
raw = jsonArg;
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
raw = await readStdin();
|
|
297
|
-
}
|
|
298
|
-
if (!raw.trim())
|
|
299
|
-
die("run requires JSON input (argument or stdin)");
|
|
300
|
-
const data = parseJson(raw);
|
|
301
|
-
const task = data.task ?? "";
|
|
302
|
-
const loopId = data.loop_id ?? "";
|
|
303
|
-
if (!task)
|
|
304
|
-
die("run requires 'task' field");
|
|
305
|
-
if (!loopId)
|
|
306
|
-
die("run requires 'loop_id' field");
|
|
307
|
-
const maxRounds = data.max_rounds ?? 20;
|
|
308
|
-
const runtime = new LoopRuntime({
|
|
309
|
-
task,
|
|
310
|
-
loopId,
|
|
311
|
-
maxRounds,
|
|
312
|
-
interactive: true,
|
|
313
|
-
goalId: data.goal_id ?? undefined,
|
|
314
|
-
planSource: data.plan_source ?? undefined,
|
|
315
|
-
constraintsFromPlan: data.constraints_from_plan ?? [],
|
|
316
|
-
domain: data.domain ?? "",
|
|
317
|
-
onRoundStart: (info) => {
|
|
318
|
-
console.log(`\n=== Round ${info.round} | Level: ${info.level.toUpperCase()} | ` +
|
|
319
|
-
`Technique: ${info.technique} ===\n`);
|
|
320
|
-
console.log(info.prompt);
|
|
321
|
-
console.log(`\n=== End Round ${info.round} Prompt ===\n` +
|
|
322
|
-
`[Paste agent output, then press Ctrl+D (Unix) or Ctrl+Z (Windows) to continue]\n`);
|
|
323
|
-
},
|
|
324
|
-
execute: async (_prompt, _ctx) => {
|
|
325
|
-
const output = await readStdin();
|
|
326
|
-
if (!output.trim()) {
|
|
327
|
-
throw new Error("No agent output provided.");
|
|
328
|
-
}
|
|
329
|
-
return output;
|
|
330
|
-
},
|
|
331
|
-
});
|
|
332
|
-
const result = await runtime.start();
|
|
333
|
-
console.log(`\n--- Loop stopped: ${result.stopReason} ---`);
|
|
334
|
-
console.log(`Rounds: ${result.roundsCompleted} | ` +
|
|
335
|
-
`Quality: [${result.qualityTrajectory.join(", ")}]`);
|
|
336
|
-
if (result.stopReason === "stalled" && result.qualityTrajectory.length > 0) {
|
|
337
|
-
const lastRound = result.roundsCompleted;
|
|
338
|
-
console.log(`WARNING: Could not extract self-evaluation from agent output in round ${lastRound}. ` +
|
|
339
|
-
"Ensure the agent outputs a ---loopforge-eval block.");
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
function cmdResume(loopId) {
|
|
343
|
-
if (loopId === "--help" || loopId === "-h") {
|
|
344
|
-
showHelp("resume");
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
if (!loopId)
|
|
348
|
-
die("resume requires a loop-id");
|
|
349
|
-
const backend = new FSBackend();
|
|
350
|
-
const mgr = new SessionManager(backend);
|
|
351
|
-
const result = mgr.resume(loopId);
|
|
352
|
-
if (!result) {
|
|
353
|
-
console.log(`No saved session found for loop "${loopId}". ` +
|
|
354
|
-
"Start the loop first with 'loopforge run' or 'loopforge start' (MCP).");
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
if (result.prompt === null) {
|
|
358
|
-
console.log(`Loop "${loopId}" is ${result.stopReason}. ` +
|
|
359
|
-
`Last round: ${result.round}. No further prompts to compile.`);
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
console.log(`=== LoopForge Resume: ${loopId} — Round ${result.round} ` +
|
|
363
|
-
`| Level: ${(result.level ?? "l2").toUpperCase()} ` +
|
|
364
|
-
`| Technique: ${result.technique ?? "zero-shot"} ===\n`);
|
|
365
|
-
console.log(result.prompt);
|
|
366
|
-
if (result.warnings?.length) {
|
|
367
|
-
console.log("\n### Resume Warnings");
|
|
368
|
-
for (const w of result.warnings)
|
|
369
|
-
console.log(`- ⚠️ ${w}`);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
function cmdStatus() {
|
|
373
|
-
const backend = new FSBackend();
|
|
374
|
-
const vault = backend.readVault();
|
|
375
|
-
const entries = vault.entries ?? [];
|
|
376
|
-
const loops = new Set();
|
|
377
|
-
let lineageCount = 0;
|
|
378
|
-
let feedbackCount = 0;
|
|
379
|
-
for (const e of entries) {
|
|
380
|
-
const taskId = String(e.task_id ?? "");
|
|
381
|
-
if (taskId.endsWith(":feedback")) {
|
|
382
|
-
feedbackCount++;
|
|
383
|
-
}
|
|
384
|
-
else if (taskId.startsWith("loop:")) {
|
|
385
|
-
lineageCount++;
|
|
386
|
-
}
|
|
387
|
-
const lid = e.loop_id ?? e.loop_lineage?.loop_id;
|
|
388
|
-
if (lid)
|
|
389
|
-
loops.add(String(lid));
|
|
390
|
-
}
|
|
391
|
-
console.log("LoopForge Vault Status");
|
|
392
|
-
console.log("=======================");
|
|
393
|
-
console.log(`Total entries: ${entries.length}`);
|
|
394
|
-
console.log(`Lineage entries: ${lineageCount}`);
|
|
395
|
-
console.log(`Feedback entries: ${feedbackCount}`);
|
|
396
|
-
console.log(`Active loops: ${loops.size}`);
|
|
397
|
-
if (loops.size > 0) {
|
|
398
|
-
console.log(`\nLoops: ${[...loops].sort().join(", ")}`);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
402
|
-
// Main
|
|
403
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
404
|
-
async function main() {
|
|
405
|
-
const args = process.argv.slice(2);
|
|
406
|
-
const cmd = args[0];
|
|
407
|
-
if (!cmd || cmd === "--help" || cmd === "-h") {
|
|
408
|
-
showHelp(args[1]); // "loopforge --help compile" shows compile help
|
|
409
|
-
process.exit(0);
|
|
410
|
-
}
|
|
411
|
-
if (cmd === "--version" || cmd === "-V") {
|
|
412
|
-
console.log(`loopforge v${VERSION}`);
|
|
413
|
-
process.exit(0);
|
|
414
|
-
}
|
|
415
|
-
const engine = createEngine("skills");
|
|
416
|
-
switch (cmd) {
|
|
417
|
-
case "init":
|
|
418
|
-
if (args[1] === "--help" || args[1] === "-h")
|
|
419
|
-
showHelp("init");
|
|
420
|
-
else
|
|
421
|
-
await cmdInit();
|
|
422
|
-
break;
|
|
423
|
-
case "compile":
|
|
424
|
-
await cmdCompile(engine, args[1]);
|
|
425
|
-
break;
|
|
426
|
-
case "feedback":
|
|
427
|
-
await cmdFeedback(engine, args[1]);
|
|
428
|
-
break;
|
|
429
|
-
case "run":
|
|
430
|
-
await cmdRun(engine, args[1]);
|
|
431
|
-
break;
|
|
432
|
-
case "replay":
|
|
433
|
-
cmdReplay(args[1]);
|
|
434
|
-
break;
|
|
435
|
-
case "diff":
|
|
436
|
-
cmdDiff(args[1], args[2], args[3]);
|
|
437
|
-
break;
|
|
438
|
-
case "review":
|
|
439
|
-
cmdReview(args[1], args[2]);
|
|
440
|
-
break;
|
|
441
|
-
case "resume":
|
|
442
|
-
cmdResume(args[1]);
|
|
443
|
-
break;
|
|
444
|
-
case "status":
|
|
445
|
-
if (args[1] === "--help" || args[1] === "-h")
|
|
446
|
-
showHelp("status");
|
|
447
|
-
else
|
|
448
|
-
cmdStatus();
|
|
449
|
-
break;
|
|
450
|
-
default:
|
|
451
|
-
die(`unknown command: ${cmd}\nUse --help for usage.`);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
main().catch((err) => {
|
|
455
|
-
process.stderr.write(`loopforge: fatal: ${err.message ?? err}\n`);
|
|
456
|
-
process.exit(1);
|
|
457
|
-
});
|
|
458
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/** Tests for adapter: mode routing, input parsing, health line. */
|
|
2
|
-
import { describe, it, beforeEach } from "node:test";
|
|
3
|
-
import assert from "node:assert/strict";
|
|
4
|
-
import { handle } from "../adapter.js";
|
|
5
|
-
import { createEngine } from "../engine.js";
|
|
6
|
-
import { resetPolicy } from "../policy.js";
|
|
7
|
-
describe("Adapter — handle()", () => {
|
|
8
|
-
beforeEach(() => resetPolicy());
|
|
9
|
-
it("returns error for unknown mode", () => {
|
|
10
|
-
const result = handle('{"task":"audit","mode":"unknown_mode"}');
|
|
11
|
-
const parsed = JSON.parse(result);
|
|
12
|
-
assert.equal(parsed.status, "error");
|
|
13
|
-
assert.ok(parsed.result.error.includes("Unknown mode"));
|
|
14
|
-
});
|
|
15
|
-
it("returns error for empty task", () => {
|
|
16
|
-
const result = handle('{"task":"","mode":"build"}');
|
|
17
|
-
const parsed = JSON.parse(result);
|
|
18
|
-
assert.equal(parsed.status, "error");
|
|
19
|
-
assert.ok(parsed.result.error.includes("Task is required"));
|
|
20
|
-
});
|
|
21
|
-
it("handles build mode", () => {
|
|
22
|
-
const result = handle('{"task":"Audit ERC20","mode":"build"}');
|
|
23
|
-
const parsed = JSON.parse(result);
|
|
24
|
-
assert.equal(parsed.status, "ok");
|
|
25
|
-
assert.ok(parsed.result.prompt_or_overlay.includes("LoopForge Build"));
|
|
26
|
-
assert.ok(parsed.health.startsWith("[PC:"));
|
|
27
|
-
});
|
|
28
|
-
it("handles loop_compile mode", () => {
|
|
29
|
-
const result = handle(JSON.stringify({
|
|
30
|
-
task: "Audit ERC20 token",
|
|
31
|
-
mode: "loop_compile",
|
|
32
|
-
loop_id: "audit-erc20",
|
|
33
|
-
round: 1,
|
|
34
|
-
goal_id: "audit-erc20",
|
|
35
|
-
}));
|
|
36
|
-
const parsed = JSON.parse(result);
|
|
37
|
-
assert.equal(parsed.status, "ok");
|
|
38
|
-
assert.ok(parsed.result.prompt_or_overlay.includes("L2 Compile"));
|
|
39
|
-
assert.ok(parsed.health.includes("PC:"));
|
|
40
|
-
});
|
|
41
|
-
it("handles feedback mode", () => {
|
|
42
|
-
const result = handle(JSON.stringify({
|
|
43
|
-
task: "Audit ERC20",
|
|
44
|
-
mode: "feedback",
|
|
45
|
-
feedback: {
|
|
46
|
-
success: true,
|
|
47
|
-
constraint_violations: [],
|
|
48
|
-
manual_fixes_needed: "",
|
|
49
|
-
output: "All tests passed",
|
|
50
|
-
},
|
|
51
|
-
}));
|
|
52
|
-
const parsed = JSON.parse(result);
|
|
53
|
-
assert.equal(parsed.status, "ok");
|
|
54
|
-
assert.ok(parsed.result.prompt_or_overlay.includes("Feedback Recorded"));
|
|
55
|
-
assert.ok(parsed.result.prompt_or_overlay.includes("5/5"));
|
|
56
|
-
});
|
|
57
|
-
it("returns error for feedback without payload", () => {
|
|
58
|
-
const result = handle('{"task":"Audit","mode":"feedback"}');
|
|
59
|
-
const parsed = JSON.parse(result);
|
|
60
|
-
assert.equal(parsed.status, "error");
|
|
61
|
-
});
|
|
62
|
-
it("handles dict input (not just JSON string)", () => {
|
|
63
|
-
const result = handle({
|
|
64
|
-
task: "Rename function",
|
|
65
|
-
mode: "build",
|
|
66
|
-
});
|
|
67
|
-
const parsed = JSON.parse(result);
|
|
68
|
-
assert.equal(parsed.status, "ok");
|
|
69
|
-
});
|
|
70
|
-
it("health line shows STALLED when circuit breaker tripped", () => {
|
|
71
|
-
// Run enough feedback rounds to trigger circuit breaker
|
|
72
|
-
const result = handle(JSON.stringify({
|
|
73
|
-
task: "Test",
|
|
74
|
-
mode: "feedback",
|
|
75
|
-
feedback: { success: false, constraint_violations: ["error"], manual_fixes_needed: "", output: "failed" },
|
|
76
|
-
}));
|
|
77
|
-
const parsed = JSON.parse(result);
|
|
78
|
-
assert.ok(parsed.health.startsWith("[PC:"));
|
|
79
|
-
});
|
|
80
|
-
it("accepts engine reuse across calls", () => {
|
|
81
|
-
const engine = createEngine();
|
|
82
|
-
const r1 = handle('{"task":"Test 1","mode":"build"}', engine);
|
|
83
|
-
const p1 = JSON.parse(r1);
|
|
84
|
-
assert.equal(p1.status, "ok");
|
|
85
|
-
const r2 = handle('{"task":"Test 2","mode":"build"}', engine);
|
|
86
|
-
const p2 = JSON.parse(r2);
|
|
87
|
-
assert.equal(p2.status, "ok");
|
|
88
|
-
// Engine state persists
|
|
89
|
-
assert.equal(engine.state.call_count, 0); // build doesn't increment call_count
|
|
90
|
-
});
|
|
91
|
-
it("output size guard truncates at 32KB", () => {
|
|
92
|
-
// Generate a large request that produces a large prompt
|
|
93
|
-
const largeTask = "Audit " + "the contract ".repeat(50) + "for security";
|
|
94
|
-
const result = handle(JSON.stringify({
|
|
95
|
-
task: largeTask,
|
|
96
|
-
mode: "build",
|
|
97
|
-
}));
|
|
98
|
-
const parsed = JSON.parse(result);
|
|
99
|
-
const promptLen = parsed.result.prompt_or_overlay.length;
|
|
100
|
-
// Should be under 32KB + some overhead
|
|
101
|
-
assert.ok(promptLen <= 33_000);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
//# sourceMappingURL=adapter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../src/tests/adapter.test.ts"],"names":[],"mappings":"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"}
|