claude-evolve 1.11.2 → 1.11.4

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.
@@ -31,6 +31,7 @@ USAGE:
31
31
 
32
32
  OPTIONS:
33
33
  --recent-generations=N Limit operations to the most recent N generations only
34
+ --force Skip confirmation prompts (for delete action)
34
35
 
35
36
  SELECTORS:
36
37
  gen01, gen02, etc. Target specific generation
@@ -80,6 +81,7 @@ EOF
80
81
 
81
82
  # Parse arguments
82
83
  recent_generations=""
84
+ force_delete=""
83
85
  args=()
84
86
 
85
87
  while [[ $# -gt 0 ]]; do
@@ -92,6 +94,10 @@ while [[ $# -gt 0 ]]; do
92
94
  fi
93
95
  shift
94
96
  ;;
97
+ --force|-f)
98
+ force_delete="true"
99
+ shift
100
+ ;;
95
101
  --help|-h)
96
102
  show_help
97
103
  exit 0
@@ -633,13 +639,15 @@ case "$ACTION" in
633
639
  echo "[INFO] Reboot complete: files deleted, scores cleared, status set to pending"
634
640
  ;;
635
641
  delete)
636
- # Ask for confirmation
637
- read -p "[WARNING] This will permanently delete candidates matching '$SELECTOR' from CSV and remove their .py files. Are you sure? (yes/no): " confirmation
638
- if [[ "$confirmation" != "yes" ]]; then
639
- echo "[INFO] Delete operation cancelled"
640
- exit 0
642
+ # Ask for confirmation unless --force is specified
643
+ if [[ "$force_delete" != "true" ]]; then
644
+ read -p "[WARNING] This will permanently delete candidates matching '$SELECTOR' from CSV and remove their .py files. Are you sure? (yes/no): " confirmation
645
+ if [[ "$confirmation" != "yes" ]]; then
646
+ echo "[INFO] Delete operation cancelled"
647
+ exit 0
648
+ fi
641
649
  fi
642
-
650
+
643
651
  echo "[INFO] Performing delete of '$SELECTOR'..."
644
652
  delete_evolution_files "$SELECTOR"
645
653
  delete_candidates_from_csv "$SELECTOR"
@@ -164,11 +164,12 @@ class IdeationStrategy(ABC):
164
164
  if claimed_ids is None:
165
165
  claimed_ids = []
166
166
 
167
- print(f"[IDEATE] Running {self.name} strategy for {count} ideas", file=sys.stderr, flush=True)
167
+ print(f"[IDEATE] Running {self.name} strategy for {count} ideas...", file=sys.stderr, flush=True)
168
168
 
169
169
  # Get next IDs, avoiding any already claimed in this ideation run
170
170
  ids = self.csv.get_next_ids(context.generation, count, claimed_ids=claimed_ids)
171
171
  print(f"[IDEATE] Using IDs: {', '.join(ids)}", file=sys.stderr, flush=True)
172
+ print(f"[IDEATE] Calling AI...", file=sys.stderr, flush=True)
172
173
 
173
174
  # Immediately claim these IDs (even if AI fails, don't reuse them)
174
175
  claimed_ids.extend(ids)
@@ -518,9 +519,10 @@ class Ideator:
518
519
 
519
520
  def run(self) -> int:
520
521
  """Run ideation. Returns number of ideas generated."""
522
+ print(f"[IDEATE] Building context...", file=sys.stderr, flush=True)
521
523
  context = self.get_context()
522
- print(f"[IDEATE] Starting generation {context.generation}", file=sys.stderr)
523
- print(f"[IDEATE] Top performers: {len(context.top_performers)}", file=sys.stderr)
524
+ print(f"[IDEATE] Starting generation {context.generation}", file=sys.stderr, flush=True)
525
+ print(f"[IDEATE] Top performers: {len(context.top_performers)}", file=sys.stderr, flush=True)
524
526
 
525
527
  all_ideas: List[Idea] = []
526
528
  claimed_ids: List[str] = [] # Track IDs claimed across all strategies
package/lib/evolve_run.py CHANGED
@@ -220,22 +220,30 @@ class EvolutionRunner:
220
220
  cmd.extend(['--config', self.config.config_path])
221
221
 
222
222
  try:
223
- result = subprocess.run(
223
+ # Stream output in real-time instead of buffering
224
+ # AIDEV-NOTE: Using Popen to stream stderr so user sees which model is being called
225
+ process = subprocess.Popen(
224
226
  cmd,
225
- capture_output=True,
227
+ stdout=subprocess.PIPE,
228
+ stderr=subprocess.PIPE,
226
229
  text=True,
227
- cwd=self.config.evolution_dir
230
+ cwd=self.config.evolution_dir,
231
+ bufsize=1 # Line buffered
228
232
  )
229
233
 
230
- # Forward ideation output (already has timestamps from ideate module)
231
- if result.stdout:
232
- for line in result.stdout.strip().split('\n'):
233
- print(line, file=sys.stderr, flush=True)
234
- if result.stderr:
235
- for line in result.stderr.strip().split('\n'):
236
- print(line, file=sys.stderr, flush=True)
234
+ # Stream stderr in real-time (where ideation logs go)
235
+ # readline() blocks until a full line is available, which is what we want
236
+ for line in iter(process.stderr.readline, ''):
237
+ print(line.rstrip(), file=sys.stderr, flush=True)
237
238
 
238
- return result.returncode == 0
239
+ # Wait for process to finish and get stdout
240
+ stdout, _ = process.communicate()
241
+ if stdout:
242
+ for line in stdout.strip().split('\n'):
243
+ if line:
244
+ print(line, file=sys.stderr, flush=True)
245
+
246
+ return process.returncode == 0
239
247
 
240
248
  except Exception as e:
241
249
  log_error(f"Ideation failed: {e}")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-evolve",
3
- "version": "1.11.2",
3
+ "version": "1.11.4",
4
4
  "bin": {
5
5
  "claude-evolve": "bin/claude-evolve",
6
6
  "claude-evolve-main": "bin/claude-evolve-main",