@autonav/core 1.4.0 → 1.6.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/cli/autonav.d.ts +1 -0
- package/dist/cli/autonav.d.ts.map +1 -1
- package/dist/cli/autonav.js +7 -0
- package/dist/cli/autonav.js.map +1 -1
- package/dist/cli/nav-init.js +17 -3
- package/dist/cli/nav-init.js.map +1 -1
- package/dist/cli/nav-memento.d.ts +20 -0
- package/dist/cli/nav-memento.d.ts.map +1 -0
- package/dist/cli/nav-memento.js +179 -0
- package/dist/cli/nav-memento.js.map +1 -0
- package/dist/cli/nav-mend.js +7 -0
- package/dist/cli/nav-mend.js.map +1 -1
- package/dist/memento/git-operations.d.ts +95 -0
- package/dist/memento/git-operations.d.ts.map +1 -0
- package/dist/memento/git-operations.js +256 -0
- package/dist/memento/git-operations.js.map +1 -0
- package/dist/memento/index.d.ts +31 -0
- package/dist/memento/index.d.ts.map +1 -0
- package/dist/memento/index.js +38 -0
- package/dist/memento/index.js.map +1 -0
- package/dist/memento/loop.d.ts +33 -0
- package/dist/memento/loop.d.ts.map +1 -0
- package/dist/memento/loop.js +535 -0
- package/dist/memento/loop.js.map +1 -0
- package/dist/memento/matrix-animation.d.ts +77 -0
- package/dist/memento/matrix-animation.d.ts.map +1 -0
- package/dist/memento/matrix-animation.js +228 -0
- package/dist/memento/matrix-animation.js.map +1 -0
- package/dist/memento/nav-protocol.d.ts +30 -0
- package/dist/memento/nav-protocol.d.ts.map +1 -0
- package/dist/memento/nav-protocol.js +79 -0
- package/dist/memento/nav-protocol.js.map +1 -0
- package/dist/memento/prompts.d.ts +44 -0
- package/dist/memento/prompts.d.ts.map +1 -0
- package/dist/memento/prompts.js +168 -0
- package/dist/memento/prompts.js.map +1 -0
- package/dist/memento/state.d.ts +56 -0
- package/dist/memento/state.d.ts.map +1 -0
- package/dist/memento/state.js +156 -0
- package/dist/memento/state.js.map +1 -0
- package/dist/memento/types.d.ts +123 -0
- package/dist/memento/types.d.ts.map +1 -0
- package/dist/memento/types.js +30 -0
- package/dist/memento/types.js.map +1 -0
- package/dist/memento/worker-agent.d.ts +30 -0
- package/dist/memento/worker-agent.d.ts.map +1 -0
- package/dist/memento/worker-agent.js +109 -0
- package/dist/memento/worker-agent.js.map +1 -0
- package/dist/mend/index.d.ts +6 -0
- package/dist/mend/index.d.ts.map +1 -1
- package/dist/mend/index.js +92 -1
- package/dist/mend/index.js.map +1 -1
- package/dist/mend/llm-review.d.ts +18 -0
- package/dist/mend/llm-review.d.ts.map +1 -0
- package/dist/mend/llm-review.js +81 -0
- package/dist/mend/llm-review.js.map +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +4 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +18 -0
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +1 -0
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +207 -0
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +1 -0
- package/dist/migrations/versions/v1.5.1-mend-instruction.d.ts +13 -0
- package/dist/migrations/versions/v1.5.1-mend-instruction.d.ts.map +1 -0
- package/dist/migrations/versions/v1.5.1-mend-instruction.js +156 -0
- package/dist/migrations/versions/v1.5.1-mend-instruction.js.map +1 -0
- package/package.json +1 -1
- package/dist/skill-generator/index.d.ts +0 -142
- package/dist/skill-generator/index.d.ts.map +0 -1
- package/dist/skill-generator/index.js +0 -510
- package/dist/skill-generator/index.js.map +0 -1
- package/dist/templates/.gitignore.template +0 -26
- package/dist/templates/CLAUDE-pack.md.template +0 -114
- package/dist/templates/CLAUDE.md.template +0 -153
- package/dist/templates/README.md.template +0 -174
- package/dist/templates/config-pack.json.template +0 -16
- package/dist/templates/config.json.template +0 -11
- package/dist/templates/index.d.ts +0 -22
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -32
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/plugins.json.template +0 -33
- package/dist/templates/system-configuration.md.template +0 -70
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memento Loop Core Logic
|
|
3
|
+
*
|
|
4
|
+
* The main loop that coordinates navigator planning and worker implementation
|
|
5
|
+
* in a context-clearing iterative development pattern.
|
|
6
|
+
*
|
|
7
|
+
* Design principle: The WORKER forgets between iterations (memento pattern).
|
|
8
|
+
* The NAVIGATOR maintains its own memory and knowledge base. We provide git
|
|
9
|
+
* history as context about what the worker has accomplished so far.
|
|
10
|
+
*/
|
|
11
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
12
|
+
import * as fs from "node:fs";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import * as readline from "node:readline";
|
|
15
|
+
import chalk from "chalk";
|
|
16
|
+
import { ensureGitRepo, createBranch, getCurrentBranch, getRecentGitLog, getRecentDiff, getLastCommitDiffStats, hasUncommittedChanges, stageAllChanges, commitChanges, pushBranch, createPullRequest, isGhAvailable, } from "./git-operations.js";
|
|
17
|
+
import { createNavProtocolMcpServer } from "./nav-protocol.js";
|
|
18
|
+
import { buildNavPlanPrompt, buildNavSystemPrompt } from "./prompts.js";
|
|
19
|
+
import { MatrixAnimation } from "./matrix-animation.js";
|
|
20
|
+
/**
|
|
21
|
+
* Load navigator config from config.json
|
|
22
|
+
*/
|
|
23
|
+
function loadNavConfig(navDirectory) {
|
|
24
|
+
const configPath = path.join(navDirectory, "config.json");
|
|
25
|
+
if (!fs.existsSync(configPath)) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
30
|
+
if (config.name && config.description) {
|
|
31
|
+
return {
|
|
32
|
+
name: config.name,
|
|
33
|
+
description: config.description,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Ignore parse errors
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load navigator system prompt from CLAUDE.md
|
|
44
|
+
*/
|
|
45
|
+
function loadNavSystemPrompt(navDirectory) {
|
|
46
|
+
const claudeMdPath = path.join(navDirectory, "CLAUDE.md");
|
|
47
|
+
if (!fs.existsSync(claudeMdPath)) {
|
|
48
|
+
throw new Error(`Navigator CLAUDE.md not found at: ${claudeMdPath}`);
|
|
49
|
+
}
|
|
50
|
+
return fs.readFileSync(claudeMdPath, "utf-8");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Prompt user for input
|
|
54
|
+
*/
|
|
55
|
+
function promptUser(question) {
|
|
56
|
+
const rl = readline.createInterface({
|
|
57
|
+
input: process.stdin,
|
|
58
|
+
output: process.stdout,
|
|
59
|
+
});
|
|
60
|
+
return new Promise((resolve) => {
|
|
61
|
+
rl.question(question, (answer) => {
|
|
62
|
+
rl.close();
|
|
63
|
+
resolve(answer.trim().toLowerCase());
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle uncommitted changes in the code directory
|
|
69
|
+
*
|
|
70
|
+
* The memento loop provides git history to the navigator as context about
|
|
71
|
+
* what the worker has accomplished. Uncommitted changes won't appear in
|
|
72
|
+
* that summary, which could cause confusion.
|
|
73
|
+
*/
|
|
74
|
+
async function handleUncommittedChanges(codeDirectory, verbose) {
|
|
75
|
+
if (!hasUncommittedChanges({ cwd: codeDirectory })) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Show warning
|
|
79
|
+
console.log("\n⚠️ WARNING: Uncommitted changes detected!\n");
|
|
80
|
+
console.log("The memento loop provides git history as context to the navigator.");
|
|
81
|
+
console.log("Uncommitted changes won't appear in that summary.\n");
|
|
82
|
+
if (verbose) {
|
|
83
|
+
const diff = getRecentDiff({ cwd: codeDirectory });
|
|
84
|
+
if (diff) {
|
|
85
|
+
console.log("Changes detected:");
|
|
86
|
+
console.log("─".repeat(40));
|
|
87
|
+
// Show truncated diff
|
|
88
|
+
const lines = diff.split("\n").slice(0, 20);
|
|
89
|
+
console.log(lines.join("\n"));
|
|
90
|
+
if (diff.split("\n").length > 20) {
|
|
91
|
+
console.log(`... (${diff.split("\n").length - 20} more lines)`);
|
|
92
|
+
}
|
|
93
|
+
console.log("─".repeat(40) + "\n");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log("How would you like to proceed?\n");
|
|
97
|
+
console.log(" [c] Commit changes (recommended)");
|
|
98
|
+
console.log(" [i] Add to .gitignore");
|
|
99
|
+
console.log(" [d] Discard changes (⚠️ DANGEROUS - cannot be undone!)");
|
|
100
|
+
console.log(" [q] Quit\n");
|
|
101
|
+
const answer = await promptUser("Choice [c/i/d/q]: ");
|
|
102
|
+
switch (answer) {
|
|
103
|
+
case "c":
|
|
104
|
+
case "commit": {
|
|
105
|
+
const message = await promptUser("Commit message: ");
|
|
106
|
+
if (!message) {
|
|
107
|
+
throw new Error("Commit message required");
|
|
108
|
+
}
|
|
109
|
+
stageAllChanges({ cwd: codeDirectory });
|
|
110
|
+
const hash = commitChanges(message, { cwd: codeDirectory, verbose });
|
|
111
|
+
if (hash) {
|
|
112
|
+
console.log(`\n✅ Committed: ${hash}\n`);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
case "i":
|
|
117
|
+
case "ignore": {
|
|
118
|
+
console.log("\nTo gitignore specific files, add them to .gitignore manually.");
|
|
119
|
+
console.log("Then re-run this command.\n");
|
|
120
|
+
throw new Error("Please update .gitignore and re-run");
|
|
121
|
+
}
|
|
122
|
+
case "d":
|
|
123
|
+
case "discard": {
|
|
124
|
+
console.log("\n⚠️ THIS WILL PERMANENTLY DELETE YOUR UNCOMMITTED CHANGES!");
|
|
125
|
+
const confirm = await promptUser("Type 'yes' to confirm: ");
|
|
126
|
+
if (confirm !== "yes") {
|
|
127
|
+
throw new Error("Discard cancelled");
|
|
128
|
+
}
|
|
129
|
+
// Discard all changes
|
|
130
|
+
const { execSync } = await import("node:child_process");
|
|
131
|
+
execSync("git checkout -- . && git clean -fd", {
|
|
132
|
+
cwd: codeDirectory,
|
|
133
|
+
stdio: verbose ? "inherit" : "pipe",
|
|
134
|
+
});
|
|
135
|
+
console.log("\n✅ Changes discarded\n");
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case "q":
|
|
139
|
+
case "quit":
|
|
140
|
+
default:
|
|
141
|
+
throw new Error("Aborted by user");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Query the navigator for an implementation plan (with stats tracking)
|
|
146
|
+
*/
|
|
147
|
+
async function queryNavForPlanWithStats(codeDirectory, navDirectory, task, iteration, maxIterations, navSystemPrompt, navIdentity, gitLog, options, animation, verbose) {
|
|
148
|
+
// Navigator uses opus by default for better planning
|
|
149
|
+
const { navModel: model = "claude-opus-4-5", maxTurns = 50 } = options;
|
|
150
|
+
// Create MCP server with plan submission tool
|
|
151
|
+
const navProtocol = createNavProtocolMcpServer();
|
|
152
|
+
const prompt = buildNavPlanPrompt({ codeDirectory, task, iteration, maxIterations, branch: options.branch }, gitLog, navIdentity);
|
|
153
|
+
const systemPrompt = buildNavSystemPrompt(navSystemPrompt);
|
|
154
|
+
if (verbose) {
|
|
155
|
+
console.log("\n[Nav] Querying navigator for plan...");
|
|
156
|
+
}
|
|
157
|
+
const queryIterator = query({
|
|
158
|
+
prompt,
|
|
159
|
+
options: {
|
|
160
|
+
model,
|
|
161
|
+
maxTurns,
|
|
162
|
+
systemPrompt,
|
|
163
|
+
cwd: navDirectory,
|
|
164
|
+
mcpServers: {
|
|
165
|
+
"autonav-nav-protocol": navProtocol.server,
|
|
166
|
+
},
|
|
167
|
+
permissionMode: "bypassPermissions",
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
let resultMessage;
|
|
171
|
+
let lastTool;
|
|
172
|
+
for await (const message of queryIterator) {
|
|
173
|
+
if (message.type === "assistant") {
|
|
174
|
+
const content = message.message.content;
|
|
175
|
+
for (const block of content) {
|
|
176
|
+
if (block.type === "tool_use") {
|
|
177
|
+
const toolName = block.name.split("__").pop() || block.name;
|
|
178
|
+
lastTool = toolName;
|
|
179
|
+
if (verbose) {
|
|
180
|
+
console.log(`[Nav] Tool: ${toolName}`);
|
|
181
|
+
}
|
|
182
|
+
// Update animation
|
|
183
|
+
animation.setMessage(`Navigator: ${toolName}...`);
|
|
184
|
+
animation.setLastTool(toolName);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (message.type === "result") {
|
|
189
|
+
resultMessage = message;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Extract token usage from result (input + output = total)
|
|
193
|
+
const usage = resultMessage?.usage;
|
|
194
|
+
const tokensUsed = (usage?.input_tokens ?? 0) + (usage?.output_tokens ?? 0);
|
|
195
|
+
if (!resultMessage || resultMessage.subtype !== "success") {
|
|
196
|
+
const errorDetails = resultMessage && "errors" in resultMessage
|
|
197
|
+
? resultMessage.errors.join(", ")
|
|
198
|
+
: "Unknown error";
|
|
199
|
+
throw new Error(`Navigator query failed: ${errorDetails}`);
|
|
200
|
+
}
|
|
201
|
+
// Get the captured plan from the MCP server
|
|
202
|
+
const plan = navProtocol.getCapturedPlan();
|
|
203
|
+
if (!plan) {
|
|
204
|
+
throw new Error("Navigator did not submit a plan. The navigator must use the submit_implementation_plan tool.");
|
|
205
|
+
}
|
|
206
|
+
if (verbose) {
|
|
207
|
+
console.log(`[Nav] Plan received: ${plan.summary}`);
|
|
208
|
+
console.log(`[Nav] Steps: ${plan.steps.length}`);
|
|
209
|
+
console.log(`[Nav] Complete: ${plan.isComplete}`);
|
|
210
|
+
}
|
|
211
|
+
return { plan, tokensUsed, lastTool };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Run worker agent with stats tracking
|
|
215
|
+
*/
|
|
216
|
+
async function runWorkerAgentWithStats(context, plan, options, animation) {
|
|
217
|
+
// Worker uses haiku by default for faster/cheaper implementation
|
|
218
|
+
const { verbose = false, model = "claude-haiku-4-5", maxTurns = 50 } = options;
|
|
219
|
+
const { buildWorkerPrompt, buildWorkerSystemPrompt } = await import("./prompts.js");
|
|
220
|
+
const prompt = buildWorkerPrompt(context.codeDirectory, plan);
|
|
221
|
+
const systemPrompt = buildWorkerSystemPrompt(context.codeDirectory);
|
|
222
|
+
if (verbose) {
|
|
223
|
+
console.log("\n[Worker] Starting implementation...");
|
|
224
|
+
}
|
|
225
|
+
const queryIterator = query({
|
|
226
|
+
prompt,
|
|
227
|
+
options: {
|
|
228
|
+
model,
|
|
229
|
+
maxTurns,
|
|
230
|
+
systemPrompt,
|
|
231
|
+
cwd: context.codeDirectory,
|
|
232
|
+
permissionMode: "bypassPermissions",
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
const filesModified = [];
|
|
236
|
+
let lastAssistantText = "";
|
|
237
|
+
let resultMessage;
|
|
238
|
+
let lastTool;
|
|
239
|
+
for await (const message of queryIterator) {
|
|
240
|
+
if (message.type === "assistant") {
|
|
241
|
+
const content = message.message.content;
|
|
242
|
+
for (const block of content) {
|
|
243
|
+
if (block.type === "tool_use") {
|
|
244
|
+
const toolName = block.name;
|
|
245
|
+
lastTool = toolName;
|
|
246
|
+
if (verbose) {
|
|
247
|
+
console.log(`[Worker] Tool: ${toolName}`);
|
|
248
|
+
}
|
|
249
|
+
// Update animation
|
|
250
|
+
animation.setMessage(`Worker: ${toolName}...`);
|
|
251
|
+
animation.setLastTool(toolName);
|
|
252
|
+
// Track file operations
|
|
253
|
+
if (toolName === "Write" ||
|
|
254
|
+
toolName === "Edit" ||
|
|
255
|
+
toolName === "str_replace_based_edit_tool") {
|
|
256
|
+
const input = block.input;
|
|
257
|
+
const filePath = input.file_path || input.path;
|
|
258
|
+
if (typeof filePath === "string" && !filesModified.includes(filePath)) {
|
|
259
|
+
filesModified.push(filePath);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else if (block.type === "text") {
|
|
264
|
+
lastAssistantText = block.text;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (message.type === "result") {
|
|
269
|
+
resultMessage = message;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Extract token usage (input + output = total)
|
|
273
|
+
const usage = resultMessage?.usage;
|
|
274
|
+
const tokensUsed = (usage?.input_tokens ?? 0) + (usage?.output_tokens ?? 0);
|
|
275
|
+
if (!resultMessage) {
|
|
276
|
+
return {
|
|
277
|
+
success: false,
|
|
278
|
+
summary: "No result message received",
|
|
279
|
+
filesModified,
|
|
280
|
+
errors: ["No result message received"],
|
|
281
|
+
tokensUsed,
|
|
282
|
+
lastTool,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (resultMessage.subtype !== "success") {
|
|
286
|
+
const errorDetails = "errors" in resultMessage ? resultMessage.errors.join(", ") : "Unknown error";
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
summary: `Worker failed: ${resultMessage.subtype}`,
|
|
290
|
+
filesModified,
|
|
291
|
+
errors: [errorDetails],
|
|
292
|
+
tokensUsed,
|
|
293
|
+
lastTool,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
success: true,
|
|
298
|
+
summary: resultMessage.result || lastAssistantText || "Implementation completed",
|
|
299
|
+
filesModified,
|
|
300
|
+
tokensUsed,
|
|
301
|
+
lastTool,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Print iteration summary
|
|
306
|
+
*/
|
|
307
|
+
function printIterationSummary(iteration, data) {
|
|
308
|
+
const added = data.linesAdded > 0 ? chalk.green(`+${data.linesAdded}`) : chalk.dim("+0");
|
|
309
|
+
const removed = data.linesRemoved > 0 ? chalk.red(`-${data.linesRemoved}`) : chalk.dim("-0");
|
|
310
|
+
console.log(chalk.dim("─".repeat(50)));
|
|
311
|
+
console.log(`${chalk.bold(`Iteration ${iteration}`)} │ ` +
|
|
312
|
+
`${chalk.dim("Diff:")} ${added}/${removed} │ ` +
|
|
313
|
+
`${chalk.dim("Tokens:")} ${chalk.cyan(data.tokensUsed.toLocaleString())} │ ` +
|
|
314
|
+
`${chalk.dim("Tool:")} ${chalk.yellow(data.lastTool || "--")}`);
|
|
315
|
+
if (data.commitHash) {
|
|
316
|
+
console.log(`${chalk.dim("Commit:")} ${chalk.green(data.commitHash)} - ${data.plan || ""}`);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
console.log(`${chalk.dim("No changes committed")}`);
|
|
320
|
+
}
|
|
321
|
+
if (data.isComplete && data.completionMessage) {
|
|
322
|
+
console.log(`\n${chalk.blue("📋 Navigator:")} ${data.completionMessage}`);
|
|
323
|
+
console.log(chalk.dim(" (Loop continues - use --max-iterations to limit)"));
|
|
324
|
+
}
|
|
325
|
+
console.log("");
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Run the memento loop
|
|
329
|
+
*
|
|
330
|
+
* Coordinates navigator planning and worker implementation in iterations
|
|
331
|
+
* until the task is complete or max iterations reached.
|
|
332
|
+
*
|
|
333
|
+
* All state is in-memory. Git history is the only persistent context
|
|
334
|
+
* visible to the agents.
|
|
335
|
+
*/
|
|
336
|
+
export async function runMementoLoop(codeDirectory, navDirectory, task, options) {
|
|
337
|
+
const startTime = Date.now();
|
|
338
|
+
const { verbose = false, pr = false, maxIterations = 0 } = options;
|
|
339
|
+
// Resolve paths
|
|
340
|
+
codeDirectory = path.resolve(codeDirectory);
|
|
341
|
+
navDirectory = path.resolve(navDirectory);
|
|
342
|
+
// Validate directories exist
|
|
343
|
+
if (!fs.existsSync(codeDirectory)) {
|
|
344
|
+
throw new Error(`Code directory not found: ${codeDirectory}`);
|
|
345
|
+
}
|
|
346
|
+
if (!fs.existsSync(navDirectory)) {
|
|
347
|
+
throw new Error(`Navigator directory not found: ${navDirectory}`);
|
|
348
|
+
}
|
|
349
|
+
// Load navigator config and system prompt
|
|
350
|
+
const navIdentity = loadNavConfig(navDirectory);
|
|
351
|
+
const navSystemPrompt = loadNavSystemPrompt(navDirectory);
|
|
352
|
+
// In-memory state
|
|
353
|
+
const state = {
|
|
354
|
+
iteration: 0,
|
|
355
|
+
planHistory: [],
|
|
356
|
+
stats: {
|
|
357
|
+
linesAdded: 0,
|
|
358
|
+
linesRemoved: 0,
|
|
359
|
+
tokensUsed: 0,
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
if (verbose) {
|
|
363
|
+
console.log(`\n[Memento] Starting loop`);
|
|
364
|
+
console.log(`[Memento] Task: ${task.substring(0, 100)}...`);
|
|
365
|
+
console.log(`[Memento] Code dir: ${codeDirectory}`);
|
|
366
|
+
console.log(`[Memento] Nav dir: ${navDirectory}`);
|
|
367
|
+
}
|
|
368
|
+
// Ensure code directory is a git repo
|
|
369
|
+
ensureGitRepo({ cwd: codeDirectory, verbose });
|
|
370
|
+
// Check for uncommitted changes - navigator can't see them!
|
|
371
|
+
await handleUncommittedChanges(codeDirectory, verbose);
|
|
372
|
+
// Create or switch to branch if specified
|
|
373
|
+
if (options.branch) {
|
|
374
|
+
createBranch(options.branch, { cwd: codeDirectory, verbose });
|
|
375
|
+
}
|
|
376
|
+
const errors = [];
|
|
377
|
+
try {
|
|
378
|
+
// Main loop - only max-iterations stops the loop (0 = unlimited = run forever)
|
|
379
|
+
while (maxIterations === 0 || state.iteration < maxIterations) {
|
|
380
|
+
state.iteration += 1;
|
|
381
|
+
if (verbose) {
|
|
382
|
+
console.log(`\n${"=".repeat(60)}`);
|
|
383
|
+
console.log(`[Memento] Iteration ${state.iteration}`);
|
|
384
|
+
console.log(`${"=".repeat(60)}`);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
console.log(`\nIteration ${state.iteration}...`);
|
|
388
|
+
}
|
|
389
|
+
// Get git log to show the navigator what the worker has accomplished
|
|
390
|
+
const gitLog = getRecentGitLog({ cwd: codeDirectory, count: 20 });
|
|
391
|
+
// Create animation with cumulative stats
|
|
392
|
+
const animation = new MatrixAnimation({
|
|
393
|
+
message: `Consulting ${navIdentity?.name || "navigator"}...`,
|
|
394
|
+
width: 50,
|
|
395
|
+
lines: 3,
|
|
396
|
+
});
|
|
397
|
+
// Initialize animation with cumulative stats
|
|
398
|
+
animation.setStats({
|
|
399
|
+
linesAdded: state.stats.linesAdded,
|
|
400
|
+
linesRemoved: state.stats.linesRemoved,
|
|
401
|
+
tokensUsed: state.stats.tokensUsed,
|
|
402
|
+
lastTool: state.stats.lastTool,
|
|
403
|
+
});
|
|
404
|
+
if (!verbose) {
|
|
405
|
+
animation.start();
|
|
406
|
+
}
|
|
407
|
+
let plan = null;
|
|
408
|
+
let iterationTokens = 0;
|
|
409
|
+
try {
|
|
410
|
+
// Query navigator for plan
|
|
411
|
+
const navResult = await queryNavForPlanWithStats(codeDirectory, navDirectory, task, state.iteration, maxIterations, navSystemPrompt, navIdentity, gitLog, options, animation, verbose);
|
|
412
|
+
plan = navResult.plan;
|
|
413
|
+
iterationTokens += navResult.tokensUsed;
|
|
414
|
+
state.stats.tokensUsed += navResult.tokensUsed;
|
|
415
|
+
if (navResult.lastTool) {
|
|
416
|
+
state.stats.lastTool = navResult.lastTool;
|
|
417
|
+
}
|
|
418
|
+
animation.setTokens(state.stats.tokensUsed);
|
|
419
|
+
if (!plan) {
|
|
420
|
+
errors.push(`Iteration ${state.iteration}: Navigator did not provide a plan`);
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
// Record plan in memory (for PR body)
|
|
424
|
+
state.planHistory.push({ iteration: state.iteration, summary: plan.summary });
|
|
425
|
+
// Log if navigator thinks task is complete (advisory only - doesn't stop loop)
|
|
426
|
+
if (plan.isComplete) {
|
|
427
|
+
state.completionMessage = plan.completionMessage;
|
|
428
|
+
}
|
|
429
|
+
// Update animation for worker phase
|
|
430
|
+
animation.setMessage("Worker implementing...");
|
|
431
|
+
// Run worker to implement the plan
|
|
432
|
+
const workerResult = await runWorkerAgentWithStats({ codeDirectory, task }, plan, {
|
|
433
|
+
verbose,
|
|
434
|
+
model: options.model,
|
|
435
|
+
maxTurns: options.maxTurns,
|
|
436
|
+
}, animation);
|
|
437
|
+
iterationTokens += workerResult.tokensUsed;
|
|
438
|
+
state.stats.tokensUsed += workerResult.tokensUsed;
|
|
439
|
+
if (workerResult.lastTool) {
|
|
440
|
+
state.stats.lastTool = workerResult.lastTool;
|
|
441
|
+
}
|
|
442
|
+
animation.setTokens(state.stats.tokensUsed);
|
|
443
|
+
if (!workerResult.success) {
|
|
444
|
+
errors.push(`Iteration ${state.iteration}: Worker failed - ${workerResult.errors?.join(", ") || "Unknown error"}`);
|
|
445
|
+
// Continue to next iteration - navigator can see the state and adjust
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
finally {
|
|
449
|
+
if (!verbose) {
|
|
450
|
+
animation.stop();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Commit changes - nav will see this in git history on next iteration
|
|
454
|
+
// Use plan summary directly - navigator should provide conventional commit style
|
|
455
|
+
const commitMessage = plan?.summary || `memento: iteration ${state.iteration}`;
|
|
456
|
+
const commitHash = commitChanges(commitMessage, { cwd: codeDirectory, verbose });
|
|
457
|
+
// Get diff stats from the commit
|
|
458
|
+
if (commitHash) {
|
|
459
|
+
const diffStats = getLastCommitDiffStats({ cwd: codeDirectory });
|
|
460
|
+
state.stats.linesAdded += diffStats.linesAdded;
|
|
461
|
+
state.stats.linesRemoved += diffStats.linesRemoved;
|
|
462
|
+
}
|
|
463
|
+
// Print iteration summary
|
|
464
|
+
printIterationSummary(state.iteration, {
|
|
465
|
+
commitHash,
|
|
466
|
+
plan: plan?.summary,
|
|
467
|
+
linesAdded: state.stats.linesAdded,
|
|
468
|
+
linesRemoved: state.stats.linesRemoved,
|
|
469
|
+
tokensUsed: state.stats.tokensUsed,
|
|
470
|
+
lastTool: state.stats.lastTool,
|
|
471
|
+
isComplete: plan?.isComplete,
|
|
472
|
+
completionMessage: plan?.completionMessage,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
// Loop exited - must have hit max iterations
|
|
476
|
+
console.log(`\nMax iterations (${maxIterations}) reached.`);
|
|
477
|
+
// Handle PR creation if requested
|
|
478
|
+
let prUrl;
|
|
479
|
+
if (pr && options.branch) {
|
|
480
|
+
if (!isGhAvailable()) {
|
|
481
|
+
console.warn("\nWarning: gh CLI not available. Cannot create PR. Install and authenticate gh CLI.");
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
console.log("\nCreating pull request...");
|
|
485
|
+
// Push branch
|
|
486
|
+
pushBranch(options.branch, {
|
|
487
|
+
cwd: codeDirectory,
|
|
488
|
+
verbose,
|
|
489
|
+
setUpstream: true,
|
|
490
|
+
});
|
|
491
|
+
// Create PR
|
|
492
|
+
const prBody = `## Summary
|
|
493
|
+
|
|
494
|
+
${state.completionMessage || task}
|
|
495
|
+
|
|
496
|
+
## Iterations
|
|
497
|
+
|
|
498
|
+
${state.planHistory.map((h) => `- **${h.iteration}**: ${h.summary}`).join("\n")}
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
*Created by autonav memento loop*`;
|
|
502
|
+
prUrl = createPullRequest({
|
|
503
|
+
cwd: codeDirectory,
|
|
504
|
+
verbose,
|
|
505
|
+
title: task.length > 70 ? `${task.substring(0, 67)}...` : task,
|
|
506
|
+
body: prBody,
|
|
507
|
+
});
|
|
508
|
+
console.log(`PR created: ${prUrl}`);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
const durationMs = Date.now() - startTime;
|
|
512
|
+
return {
|
|
513
|
+
success: true, // Completed max iterations without fatal error
|
|
514
|
+
iterations: state.iteration,
|
|
515
|
+
completionMessage: state.completionMessage,
|
|
516
|
+
prUrl,
|
|
517
|
+
branch: options.branch || getCurrentBranch({ cwd: codeDirectory }),
|
|
518
|
+
durationMs,
|
|
519
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
const durationMs = Date.now() - startTime;
|
|
524
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
525
|
+
errors.push(errorMessage);
|
|
526
|
+
return {
|
|
527
|
+
success: false,
|
|
528
|
+
iterations: state.iteration,
|
|
529
|
+
branch: options.branch || getCurrentBranch({ cwd: codeDirectory }),
|
|
530
|
+
durationMs,
|
|
531
|
+
errors,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/memento/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matrix-style Digital Rain Animation for CLI
|
|
3
|
+
*
|
|
4
|
+
* A non-React version of the matrix animation for use in pure CLI scripts.
|
|
5
|
+
* Uses direct stdout writes with ANSI escape codes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Stats displayed in status line
|
|
9
|
+
*/
|
|
10
|
+
export interface AnimationStats {
|
|
11
|
+
lastTool?: string;
|
|
12
|
+
linesAdded: number;
|
|
13
|
+
linesRemoved: number;
|
|
14
|
+
tokensUsed: number;
|
|
15
|
+
tokensMax: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Matrix animation controller with status line
|
|
19
|
+
*/
|
|
20
|
+
export declare class MatrixAnimation {
|
|
21
|
+
private strips;
|
|
22
|
+
private tick;
|
|
23
|
+
private timer;
|
|
24
|
+
private message;
|
|
25
|
+
private width;
|
|
26
|
+
private lines;
|
|
27
|
+
private interval;
|
|
28
|
+
private stats;
|
|
29
|
+
private totalLines;
|
|
30
|
+
constructor(options?: {
|
|
31
|
+
message?: string;
|
|
32
|
+
width?: number;
|
|
33
|
+
lines?: number;
|
|
34
|
+
interval?: number;
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Start the animation
|
|
38
|
+
*/
|
|
39
|
+
start(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Update the message
|
|
42
|
+
*/
|
|
43
|
+
setMessage(message: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Update stats
|
|
46
|
+
*/
|
|
47
|
+
setStats(stats: Partial<AnimationStats>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Update last tool
|
|
50
|
+
*/
|
|
51
|
+
setLastTool(tool: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Add to line counts
|
|
54
|
+
*/
|
|
55
|
+
addLines(added: number, removed: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* Update token usage
|
|
58
|
+
*/
|
|
59
|
+
setTokens(used: number, max?: number): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get current stats
|
|
62
|
+
*/
|
|
63
|
+
getStats(): AnimationStats;
|
|
64
|
+
/**
|
|
65
|
+
* Render current state
|
|
66
|
+
*/
|
|
67
|
+
private render;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the animation and show final message
|
|
70
|
+
*/
|
|
71
|
+
stop(finalMessage?: string): void;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Run animation while a promise executes
|
|
75
|
+
*/
|
|
76
|
+
export declare function withMatrixAnimation<T>(promise: Promise<T>, message: string): Promise<T>;
|
|
77
|
+
//# sourceMappingURL=matrix-animation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-animation.d.ts","sourceRoot":"","sources":["../../src/memento/matrix-animation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2BH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACd;IAmBN;;OAEG;IACH,KAAK,IAAI,IAAI;IAiBb;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAI9C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9C;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAO3C;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,OAAO,CAAC,MAAM;IAyBd;;OAEG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAqBlC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAYZ"}
|