borisxdave 0.3.5__tar.gz → 0.3.6__tar.gz
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.
- {borisxdave-0.3.5/borisxdave.egg-info → borisxdave-0.3.6}/PKG-INFO +1 -1
- {borisxdave-0.3.5 → borisxdave-0.3.6}/boris.py +28 -13
- {borisxdave-0.3.5 → borisxdave-0.3.6/borisxdave.egg-info}/PKG-INFO +1 -1
- {borisxdave-0.3.5 → borisxdave-0.3.6}/engine.py +29 -14
- {borisxdave-0.3.5 → borisxdave-0.3.6}/setup.py +1 -1
- {borisxdave-0.3.5 → borisxdave-0.3.6}/MANIFEST.in +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/boris_prompt.md +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/boris_prompt_data.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/borisxdave.egg-info/SOURCES.txt +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/borisxdave.egg-info/dependency_links.txt +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/borisxdave.egg-info/entry_points.txt +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/borisxdave.egg-info/top_level.txt +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/config.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/file_lock.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/git_manager.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/planner.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/prompts.py +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/requirements.txt +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/setup.cfg +0 -0
- {borisxdave-0.3.5 → borisxdave-0.3.6}/state.py +0 -0
|
@@ -1181,21 +1181,36 @@ def main():
|
|
|
1181
1181
|
# Process verdicts sequentially (corrections/retries run sequentially)
|
|
1182
1182
|
batch_summary = {}
|
|
1183
1183
|
for milestone, result in parallel_results:
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1184
|
+
try:
|
|
1185
|
+
print(f"[Boris] TURBO: Checking verdict for {milestone.id}...", flush=True)
|
|
1186
|
+
verdict_result = engine.check(result, milestone)
|
|
1187
|
+
logger.info(
|
|
1188
|
+
"TURBO milestone %s verdict: %s - %s",
|
|
1189
|
+
milestone.id,
|
|
1190
|
+
verdict_result.verdict.value,
|
|
1191
|
+
verdict_result.reason,
|
|
1192
|
+
)
|
|
1193
|
+
|
|
1194
|
+
_process_milestone_verdict(
|
|
1195
|
+
verdict_result, result, milestone, plan, st,
|
|
1196
|
+
project_dir, args, logger, prompt_map[milestone.id]
|
|
1197
|
+
)
|
|
1198
|
+
except Exception as e:
|
|
1199
|
+
print(f"[Boris] TURBO: Error processing verdict for {milestone.id}: {e}", flush=True)
|
|
1200
|
+
logger.error("Verdict processing error for %s: %s", milestone.id, e)
|
|
1201
|
+
milestone.status = "skipped"
|
|
1202
|
+
state_module.save(st)
|
|
1197
1203
|
batch_summary[milestone.id] = milestone.status.upper()
|
|
1198
1204
|
|
|
1205
|
+
# Safety net: any milestone still in_progress after batch must be marked skipped
|
|
1206
|
+
for m in ready:
|
|
1207
|
+
if m.status == "in_progress":
|
|
1208
|
+
print(f"[Boris] TURBO: {m.id} still in_progress after batch - marking skipped", flush=True)
|
|
1209
|
+
logger.warning("Milestone %s stuck in_progress after batch, marking skipped", m.id)
|
|
1210
|
+
m.status = "skipped"
|
|
1211
|
+
batch_summary[m.id] = "SKIPPED"
|
|
1212
|
+
state_module.save(st)
|
|
1213
|
+
|
|
1199
1214
|
# Convergence phase: reconcile type conflicts from parallel workers
|
|
1200
1215
|
if not getattr(args, 'no_converge', False):
|
|
1201
1216
|
completed_in_batch = [m for m, r in parallel_results if m.status == "completed"]
|
|
@@ -609,19 +609,27 @@ def run_parallel(tasks: list, project_dir: str, max_iterations: int = None,
|
|
|
609
609
|
with concurrent.futures.ThreadPoolExecutor(max_workers=len(tasks)) as executor:
|
|
610
610
|
futures = {executor.submit(_run_one_worktree, t): t for t in tasks}
|
|
611
611
|
for future in concurrent.futures.as_completed(futures):
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
612
|
+
try:
|
|
613
|
+
milestone, result = future.result()
|
|
614
|
+
# Merge worktree back if it was used
|
|
615
|
+
wt_info = worktree_map.get(milestone.id)
|
|
616
|
+
if wt_info and result.resolved:
|
|
617
|
+
wt_path, branch = wt_info
|
|
618
|
+
merge_ok = _merge_worktree(project_dir, wt_path, branch, milestone.id)
|
|
619
|
+
if not merge_ok:
|
|
620
|
+
print(f" [Boris] WARNING: Merge conflict for {milestone.id} worktree", flush=True)
|
|
621
|
+
logger.warning("Worktree merge conflict for %s", milestone.id)
|
|
622
|
+
elif wt_info:
|
|
623
|
+
# Failed milestone - just clean up worktree
|
|
624
|
+
_cleanup_worktree(project_dir, wt_info[0], wt_info[1])
|
|
625
|
+
results.append((milestone, result))
|
|
626
|
+
except Exception as e:
|
|
627
|
+
# Worker crashed - return a failed result
|
|
628
|
+
_, crashed_milestone = futures[future]
|
|
629
|
+
print(f" [Boris] Worker for {crashed_milestone.id} crashed: {e}", flush=True)
|
|
630
|
+
logger.error("Worker crashed for %s: %s", crashed_milestone.id, e)
|
|
631
|
+
failed_result = ExecutionResult(output=f"Worker crashed: {e}", resolved=False, exit_code=1)
|
|
632
|
+
results.append((crashed_milestone, failed_result))
|
|
625
633
|
|
|
626
634
|
else:
|
|
627
635
|
# No isolation or single task - original behavior
|
|
@@ -633,7 +641,14 @@ def run_parallel(tasks: list, project_dir: str, max_iterations: int = None,
|
|
|
633
641
|
with concurrent.futures.ThreadPoolExecutor(max_workers=len(tasks)) as executor:
|
|
634
642
|
futures = {executor.submit(_run_one, t): t for t in tasks}
|
|
635
643
|
for future in concurrent.futures.as_completed(futures):
|
|
636
|
-
|
|
644
|
+
try:
|
|
645
|
+
results.append(future.result())
|
|
646
|
+
except Exception as e:
|
|
647
|
+
_, crashed_milestone = futures[future]
|
|
648
|
+
print(f" [Boris] Worker for {crashed_milestone.id} crashed: {e}", flush=True)
|
|
649
|
+
logger.error("Worker crashed for %s: %s", crashed_milestone.id, e)
|
|
650
|
+
failed_result = ExecutionResult(output=f"Worker crashed: {e}", resolved=False, exit_code=1)
|
|
651
|
+
results.append((crashed_milestone, failed_result))
|
|
637
652
|
|
|
638
653
|
return results
|
|
639
654
|
|
|
@@ -2,7 +2,7 @@ from setuptools import setup
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="borisxdave",
|
|
5
|
-
version="0.3.
|
|
5
|
+
version="0.3.6",
|
|
6
6
|
description="Boris - Autonomous Project Orchestrator",
|
|
7
7
|
py_modules=["boris", "engine", "git_manager", "prompts", "state", "planner", "config", "file_lock", "boris_prompt_data"],
|
|
8
8
|
python_requires=">=3.8",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|