@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.
Files changed (84) hide show
  1. package/dist/cli/autonav.d.ts +1 -0
  2. package/dist/cli/autonav.d.ts.map +1 -1
  3. package/dist/cli/autonav.js +7 -0
  4. package/dist/cli/autonav.js.map +1 -1
  5. package/dist/cli/nav-init.js +17 -3
  6. package/dist/cli/nav-init.js.map +1 -1
  7. package/dist/cli/nav-memento.d.ts +20 -0
  8. package/dist/cli/nav-memento.d.ts.map +1 -0
  9. package/dist/cli/nav-memento.js +179 -0
  10. package/dist/cli/nav-memento.js.map +1 -0
  11. package/dist/cli/nav-mend.js +7 -0
  12. package/dist/cli/nav-mend.js.map +1 -1
  13. package/dist/memento/git-operations.d.ts +95 -0
  14. package/dist/memento/git-operations.d.ts.map +1 -0
  15. package/dist/memento/git-operations.js +256 -0
  16. package/dist/memento/git-operations.js.map +1 -0
  17. package/dist/memento/index.d.ts +31 -0
  18. package/dist/memento/index.d.ts.map +1 -0
  19. package/dist/memento/index.js +38 -0
  20. package/dist/memento/index.js.map +1 -0
  21. package/dist/memento/loop.d.ts +33 -0
  22. package/dist/memento/loop.d.ts.map +1 -0
  23. package/dist/memento/loop.js +535 -0
  24. package/dist/memento/loop.js.map +1 -0
  25. package/dist/memento/matrix-animation.d.ts +77 -0
  26. package/dist/memento/matrix-animation.d.ts.map +1 -0
  27. package/dist/memento/matrix-animation.js +228 -0
  28. package/dist/memento/matrix-animation.js.map +1 -0
  29. package/dist/memento/nav-protocol.d.ts +30 -0
  30. package/dist/memento/nav-protocol.d.ts.map +1 -0
  31. package/dist/memento/nav-protocol.js +79 -0
  32. package/dist/memento/nav-protocol.js.map +1 -0
  33. package/dist/memento/prompts.d.ts +44 -0
  34. package/dist/memento/prompts.d.ts.map +1 -0
  35. package/dist/memento/prompts.js +168 -0
  36. package/dist/memento/prompts.js.map +1 -0
  37. package/dist/memento/state.d.ts +56 -0
  38. package/dist/memento/state.d.ts.map +1 -0
  39. package/dist/memento/state.js +156 -0
  40. package/dist/memento/state.js.map +1 -0
  41. package/dist/memento/types.d.ts +123 -0
  42. package/dist/memento/types.d.ts.map +1 -0
  43. package/dist/memento/types.js +30 -0
  44. package/dist/memento/types.js.map +1 -0
  45. package/dist/memento/worker-agent.d.ts +30 -0
  46. package/dist/memento/worker-agent.d.ts.map +1 -0
  47. package/dist/memento/worker-agent.js +109 -0
  48. package/dist/memento/worker-agent.js.map +1 -0
  49. package/dist/mend/index.d.ts +6 -0
  50. package/dist/mend/index.d.ts.map +1 -1
  51. package/dist/mend/index.js +92 -1
  52. package/dist/mend/index.js.map +1 -1
  53. package/dist/mend/llm-review.d.ts +18 -0
  54. package/dist/mend/llm-review.d.ts.map +1 -0
  55. package/dist/mend/llm-review.js +81 -0
  56. package/dist/mend/llm-review.js.map +1 -0
  57. package/dist/migrations/index.d.ts.map +1 -1
  58. package/dist/migrations/index.js +4 -0
  59. package/dist/migrations/index.js.map +1 -1
  60. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +18 -0
  61. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +1 -0
  62. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +207 -0
  63. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +1 -0
  64. package/dist/migrations/versions/v1.5.1-mend-instruction.d.ts +13 -0
  65. package/dist/migrations/versions/v1.5.1-mend-instruction.d.ts.map +1 -0
  66. package/dist/migrations/versions/v1.5.1-mend-instruction.js +156 -0
  67. package/dist/migrations/versions/v1.5.1-mend-instruction.js.map +1 -0
  68. package/package.json +1 -1
  69. package/dist/skill-generator/index.d.ts +0 -142
  70. package/dist/skill-generator/index.d.ts.map +0 -1
  71. package/dist/skill-generator/index.js +0 -510
  72. package/dist/skill-generator/index.js.map +0 -1
  73. package/dist/templates/.gitignore.template +0 -26
  74. package/dist/templates/CLAUDE-pack.md.template +0 -114
  75. package/dist/templates/CLAUDE.md.template +0 -153
  76. package/dist/templates/README.md.template +0 -174
  77. package/dist/templates/config-pack.json.template +0 -16
  78. package/dist/templates/config.json.template +0 -11
  79. package/dist/templates/index.d.ts +0 -22
  80. package/dist/templates/index.d.ts.map +0 -1
  81. package/dist/templates/index.js +0 -32
  82. package/dist/templates/index.js.map +0 -1
  83. package/dist/templates/plugins.json.template +0 -33
  84. 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"}