claude-overnight 1.2.0 → 1.2.1

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/README.md CHANGED
@@ -43,15 +43,16 @@ claude-overnight
43
43
  │ sonnet · budget 200 · 5× · flex · cap 90% · no extra │
44
44
  ╰──────────────────────────────────────────────────╯
45
45
 
46
+ ⠹ 8s · $0.04 · 12% · identifying themes ← every phase shows cost + usage
46
47
  ✓ 5 themes → review, press Run, walk away
47
48
 
48
- ◆ Thinking: 5 agents exploring... ← architects analyze your codebase
49
- ◆ Orchestrating plan... ← synthesizes 50 concrete tasks
50
- ◆ Wave 1 · 50 tasks ← fully autonomous from here
49
+ ◆ Thinking: 5 agents exploring... ← architects analyze your codebase
50
+ ◆ Orchestrating plan... ← synthesizes 50 concrete tasks
51
+ ◆ Wave 1 · 50 tasks · $4.20 spent ← fully autonomous from here
51
52
  ◆ Assessing... how close to amazing?
52
- ◆ Wave 2 · 30 tasks ← improvements from assessment
53
- ◆ Reflection: 2 agents reviewing ← deep quality audit
54
- ◆ Wave 3 · 20 tasks ← fixes from review findings
53
+ ◆ Wave 2 · 30 tasks · $18.50 spent ← improvements from assessment
54
+ ◆ Reflection: 2 agents reviewing ← deep quality audit
55
+ ◆ Wave 3 · 20 tasks · $31.00 spent ← fixes from review findings
55
56
  ◆ Assessing... ✓ Vision met
56
57
  ```
57
58
 
package/dist/index.js CHANGED
@@ -852,18 +852,8 @@ async function main() {
852
852
  try {
853
853
  if (useThinking) {
854
854
  // Phase 1: Quick theme identification → review → then autonomous
855
- let themeFrame = 0;
856
- const themeSpinner = setInterval(() => {
857
- const spin = chalk.cyan(BRAILLE[themeFrame++ % BRAILLE.length]);
858
- process.stdout.write(`\x1B[2K\r ${spin} ${chalk.dim("identifying themes...")}`);
859
- }, 120);
860
855
  let themes;
861
- try {
862
- themes = await identifyThemes(objective, thinkingCount, plannerModel, permissionMode);
863
- }
864
- finally {
865
- clearInterval(themeSpinner);
866
- }
856
+ themes = await identifyThemes(objective, thinkingCount, plannerModel, permissionMode, makeProgressLog());
867
857
  process.stdout.write(`\x1B[2K\r ${chalk.green(`\u2713 ${themes.length} themes`)}\n\n`);
868
858
  // Show themes for review — this is the LAST user interaction
869
859
  planRestore();
@@ -888,7 +878,7 @@ async function main() {
888
878
  break;
889
879
  process.stdout.write("\x1B[?25l");
890
880
  try {
891
- themes = await identifyThemes(`${objective}\n\nUser feedback: ${feedback}`, thinkingCount, plannerModel, permissionMode);
881
+ themes = await identifyThemes(`${objective}\n\nUser feedback: ${feedback}`, thinkingCount, plannerModel, permissionMode, makeProgressLog());
892
882
  process.stdout.write(`\x1B[2K\r ${chalk.green(`\u2713 ${themes.length} themes`)}\n\n`);
893
883
  }
894
884
  catch (err) {
package/dist/planner.d.ts CHANGED
@@ -38,7 +38,7 @@ export type ModelTier = "opus" | "sonnet" | "haiku" | "unknown";
38
38
  export declare function detectModelTier(model: string): ModelTier;
39
39
  export declare function getPlannerRateLimitInfo(): PlannerRateLimitInfo;
40
40
  export declare function planTasks(objective: string, cwd: string, plannerModel: string, workerModel: string, permissionMode: PermMode, budget: number | undefined, concurrency: number, onLog: (text: string) => void, flexNote?: string, outFile?: string): Promise<Task[]>;
41
- export declare function identifyThemes(objective: string, count: number, model: string, permissionMode: PermMode): Promise<string[]>;
41
+ export declare function identifyThemes(objective: string, count: number, model: string, permissionMode: PermMode, onLog?: (text: string) => void): Promise<string[]>;
42
42
  export declare function buildThinkingTasks(objective: string, themes: string[], designDir: string, plannerModel: string, previousKnowledge?: string): Task[];
43
43
  export declare function buildReflectionTasks(objective: string, goal: string, reflectionDir: string, waveNum: number, plannerModel: string): Task[];
44
44
  export declare function orchestrate(objective: string, designDocs: string, cwd: string, plannerModel: string, workerModel: string, permissionMode: PermMode, budget: number, concurrency: number, onLog: (text: string) => void, flexNote?: string, outFile?: string): Promise<Task[]>;
package/dist/planner.js CHANGED
@@ -366,24 +366,8 @@ export async function planTasks(objective, cwd, plannerModel, workerModel, permi
366
366
  return tasks;
367
367
  }
368
368
  // ── Thinking wave ──
369
- export async function identifyThemes(objective, count, model, permissionMode) {
370
- let resultText = "";
371
- for await (const msg of query({
372
- prompt: `Split this objective into exactly ${count} independent research angles for architects exploring a codebase. Each angle should cover a distinct aspect.
373
-
374
- Objective: ${objective}
375
-
376
- Return ONLY a JSON object: {"themes": ["angle description", ...]}`,
377
- options: {
378
- model,
379
- permissionMode,
380
- ...(permissionMode === "bypassPermissions" && { allowDangerouslySkipPermissions: true }),
381
- persistSession: false,
382
- },
383
- })) {
384
- if (msg.type === "result" && msg.subtype === "success")
385
- resultText = msg.result || "";
386
- }
369
+ export async function identifyThemes(objective, count, model, permissionMode, onLog = () => { }) {
370
+ const resultText = await runPlannerQuery(`Split this objective into exactly ${count} independent research angles for architects exploring a codebase. Each angle should cover a distinct aspect.\n\nObjective: ${objective}\n\nReturn ONLY a JSON object: {"themes": ["angle description", ...]}`, { cwd: process.cwd(), model, permissionMode }, onLog);
387
371
  const parsed = attemptJsonParse(resultText);
388
372
  if (parsed?.themes && Array.isArray(parsed.themes))
389
373
  return parsed.themes.slice(0, count);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-overnight",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Run 10, 100, or 1000 Claude agents overnight. Parallel autonomous AI coding with thinking waves, iterative quality steering, crash recovery, and rate limit handling. Built on the Claude Agent SDK.",
5
5
  "type": "module",
6
6
  "bin": {