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.
- package/bin/claude-evolve-edit +14 -6
- package/lib/evolve_ideate.py +5 -3
- package/lib/evolve_run.py +19 -11
- package/package.json +1 -1
package/bin/claude-evolve-edit
CHANGED
|
@@ -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
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
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"
|
package/lib/evolve_ideate.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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}")
|