claude-overnight 1.25.5 → 1.25.7
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/_version.d.ts +1 -1
- package/dist/_version.js +1 -1
- package/dist/index.js +3 -3
- package/dist/state.d.ts +3 -1
- package/dist/state.js +46 -31
- package/package.json +1 -1
- package/plugins/claude-overnight/.claude-plugin/plugin.json +1 -1
package/dist/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.25.
|
|
1
|
+
export declare const VERSION = "1.25.7";
|
package/dist/_version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by build — do not edit manually.
|
|
2
|
-
export const VERSION = "1.25.
|
|
2
|
+
export const VERSION = "1.25.7";
|
package/dist/index.js
CHANGED
|
@@ -332,7 +332,7 @@ async function main() {
|
|
|
332
332
|
if (action === "q")
|
|
333
333
|
process.exit(0);
|
|
334
334
|
if (action === "h") {
|
|
335
|
-
showRunHistory(allRuns, cwd);
|
|
335
|
+
await showRunHistory(allRuns, cwd, incompleteRuns);
|
|
336
336
|
continue;
|
|
337
337
|
}
|
|
338
338
|
if (action === "c") {
|
|
@@ -385,7 +385,7 @@ async function main() {
|
|
|
385
385
|
break;
|
|
386
386
|
}
|
|
387
387
|
if (action === "h") {
|
|
388
|
-
showRunHistory(allRuns, cwd);
|
|
388
|
+
await showRunHistory(allRuns, cwd, incompleteRuns);
|
|
389
389
|
continue;
|
|
390
390
|
}
|
|
391
391
|
resuming = true;
|
|
@@ -429,7 +429,7 @@ async function main() {
|
|
|
429
429
|
break;
|
|
430
430
|
}
|
|
431
431
|
if (action === "h") {
|
|
432
|
-
showRunHistory(allRuns, cwd);
|
|
432
|
+
await showRunHistory(allRuns, cwd, incompleteRuns);
|
|
433
433
|
continue;
|
|
434
434
|
}
|
|
435
435
|
const idx = parseInt(action) - 1;
|
package/dist/state.d.ts
CHANGED
|
@@ -53,7 +53,9 @@ export declare function formatTimeAgo(isoStr: string): string;
|
|
|
53
53
|
export declare function showRunHistory(allRuns: {
|
|
54
54
|
dir: string;
|
|
55
55
|
state: RunState;
|
|
56
|
-
}[], filterCwd: string
|
|
56
|
+
}[], filterCwd: string, resumable?: {
|
|
57
|
+
dir: string;
|
|
58
|
+
}[]): Promise<void>;
|
|
57
59
|
export declare function readPreviousRunKnowledge(rootDir: string): string;
|
|
58
60
|
export declare function createRunDir(rootDir: string): string;
|
|
59
61
|
export declare function updateLatestSymlink(rootDir: string, runDir: string): void;
|
package/dist/state.js
CHANGED
|
@@ -4,6 +4,7 @@ import { join } from "path";
|
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import { forceMergeOverlay } from "./merge.js";
|
|
6
6
|
import { FALLBACK_MODEL } from "./models.js";
|
|
7
|
+
import { selectKey } from "./cli.js";
|
|
7
8
|
// ── File I/O helpers ──
|
|
8
9
|
export function readMdDir(dir) {
|
|
9
10
|
try {
|
|
@@ -193,14 +194,6 @@ export function findIncompleteRuns(rootDir, filterCwd) {
|
|
|
193
194
|
const state = loadRunState(runDir);
|
|
194
195
|
if (!state || state.phase === "done" || state.cwd !== filterCwd)
|
|
195
196
|
continue;
|
|
196
|
-
// Planning-phase runs are resumable if: tasks.json exists (orchestrate
|
|
197
|
-
// completed), design docs exist (thinking wave produced output), or the
|
|
198
|
-
// run already consumed tokens (thinking wave started but was killed).
|
|
199
|
-
if (state.phase === "planning"
|
|
200
|
-
&& !existsSync(join(runDir, "tasks.json"))
|
|
201
|
-
&& !readMdDir(join(runDir, "designs"))
|
|
202
|
-
&& state.accCompleted === 0 && state.accCost === 0)
|
|
203
|
-
continue;
|
|
204
197
|
results.push({ dir: runDir, state });
|
|
205
198
|
}
|
|
206
199
|
return results;
|
|
@@ -304,34 +297,56 @@ export function formatTimeAgo(isoStr) {
|
|
|
304
297
|
return `${hours}h ago`;
|
|
305
298
|
return `${Math.floor(hours / 24)}d ago`;
|
|
306
299
|
}
|
|
307
|
-
export function showRunHistory(allRuns, filterCwd) {
|
|
308
|
-
const
|
|
300
|
+
export async function showRunHistory(allRuns, filterCwd, resumable = []) {
|
|
301
|
+
const resumableDirs = new Set(resumable.map(r => r.dir));
|
|
302
|
+
const runs = allRuns.filter(r => r.state.cwd === filterCwd && !resumableDirs.has(r.dir));
|
|
309
303
|
if (runs.length === 0) {
|
|
310
304
|
console.log(chalk.dim("\n No run history.\n"));
|
|
311
305
|
return;
|
|
312
306
|
}
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
let
|
|
316
|
-
|
|
317
|
-
const
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
status =
|
|
307
|
+
const PAGE = 5;
|
|
308
|
+
const pages = Math.ceil(runs.length / PAGE);
|
|
309
|
+
let page = 0;
|
|
310
|
+
while (true) {
|
|
311
|
+
const w = Math.min((process.stdout.columns ?? 80) - 6, 50);
|
|
312
|
+
const pageLabel = pages > 1 ? ` (${page + 1}/${pages})` : "";
|
|
313
|
+
console.log(chalk.dim(`\n ── Run History${pageLabel} ${"─".repeat(Math.max(0, w - 16 - pageLabel.length))}\n`));
|
|
314
|
+
for (const run of runs.slice(page * PAGE, (page + 1) * PAGE)) {
|
|
315
|
+
const s = run.state;
|
|
316
|
+
const date = s.startedAt?.slice(0, 16).replace("T", " ") || "unknown";
|
|
317
|
+
const cost = s.accCost > 0 ? ` · $${s.accCost.toFixed(2)}` : "";
|
|
318
|
+
const obj = s.objective?.slice(0, 50) || "";
|
|
319
|
+
const merged = s.branches.filter(b => b.status === "merged").length;
|
|
320
|
+
const icon = s.phase === "done" ? chalk.green("✓") : chalk.dim("·");
|
|
321
|
+
console.log(` ${icon} ${chalk.dim(date)} · ${s.phase} · ${s.accCompleted}/${s.budget}${cost}${merged ? ` · ${merged} merged` : ""}`);
|
|
322
|
+
console.log(` ${obj}${obj.length >= 50 ? "…" : ""}`);
|
|
323
|
+
let status = "";
|
|
324
|
+
try {
|
|
325
|
+
status = readFileSync(join(run.dir, "status.md"), "utf-8").trim().split("\n")[0].slice(0, 70);
|
|
326
|
+
}
|
|
327
|
+
catch { }
|
|
328
|
+
if (status)
|
|
329
|
+
console.log(chalk.dim(` ${status}`));
|
|
330
|
+
console.log("");
|
|
331
|
+
}
|
|
332
|
+
if (pages === 1)
|
|
333
|
+
break;
|
|
334
|
+
const opts = [];
|
|
335
|
+
if (page < pages - 1)
|
|
336
|
+
opts.push({ key: "n", desc: "ext" });
|
|
337
|
+
if (page > 0)
|
|
338
|
+
opts.push({ key: "p", desc: "rev" });
|
|
339
|
+
opts.push({ key: "b", desc: "ack" });
|
|
340
|
+
const action = await selectKey("", opts);
|
|
341
|
+
if (action === "n") {
|
|
342
|
+
page++;
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (action === "p") {
|
|
346
|
+
page--;
|
|
347
|
+
continue;
|
|
330
348
|
}
|
|
331
|
-
|
|
332
|
-
if (status)
|
|
333
|
-
console.log(chalk.dim(` ${status}`));
|
|
334
|
-
console.log("");
|
|
349
|
+
break;
|
|
335
350
|
}
|
|
336
351
|
}
|
|
337
352
|
export function readPreviousRunKnowledge(rootDir) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.7",
|
|
4
4
|
"description": "Parallel Claude agents in git worktrees with a usage cap that reserves headroom for your interactive Claude Code. Crash-safe resume. Provider-agnostic model catalog (Anthropic, Cursor, OpenAI, Gemini, DeepSeek, Llama, Qwen) with capability-based task scoping.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.7",
|
|
4
4
|
"description": "Claude Code skill for understanding, installing, and inspecting claude-overnight runs -- parallel Claude agents in git worktrees with thinking waves, multi-wave steering, and crash-safe resume. Supports Cursor API Proxy, Qwen, OpenRouter.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Francesco Fornace"
|