From 11325cce62d95cc84efcdc5a0bb023b3dd081772 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 6 Mar 2026 10:12:29 -0500 Subject: [PATCH] del --- add_ai_status.py | 72 ----------------------- add_debug.py | 38 ------------ add_debug2.py | 30 ---------- add_debug3.py | 24 -------- add_more_debug.py | 35 ----------- add_waits.py | 28 --------- debug3.py | 15 ----- debug_api_hooks.py | 26 --------- debug_gen.py | 27 --------- debug_gui2.py | 22 ------- debug_resp.py | 20 ------- debug_tasks.py | 28 --------- fix_epic_debug.py | 51 ---------------- fix_json_parsing.py | 40 ------------- fix_orch.py | 52 ----------------- fix_parsing.py | 37 ------------ fix_provider.py | 30 ---------- fix_provider2.py | 22 ------- fix_show_track.py | 29 ---------- run_repro.py | 67 ---------------------- run_tests.py | 113 ------------------------------------ simplify_test.py | 58 ------------------- temp_conftest.py | Bin 18660 -> 0 bytes temp_conftest2.py | Bin 18660 -> 0 bytes temp_gui_old.py | Bin 174204 -> 0 bytes temp_gui_old2.py | Bin 174204 -> 0 bytes test_callback_output.txt | 1 - test_edit.py | 8 --- test_err.txt | 1 - test_error.txt | 0 test_error2.txt | 0 test_migration_sanity.py | 26 --------- test_mma_persistence.py | 30 ---------- test_out.txt | 118 -------------------------------------- test_output.txt | 15 ----- test_output2.txt | 16 ------ test_project.toml | 61 -------------------- test_project_history.toml | 17 ------ 38 files changed, 1157 deletions(-) delete mode 100644 add_ai_status.py delete mode 100644 add_debug.py delete mode 100644 add_debug2.py delete mode 100644 add_debug3.py delete mode 100644 add_more_debug.py delete mode 100644 add_waits.py delete mode 100644 debug3.py delete mode 100644 debug_api_hooks.py delete mode 100644 debug_gen.py delete mode 100644 debug_gui2.py delete mode 100644 debug_resp.py delete mode 100644 debug_tasks.py delete mode 100644 fix_epic_debug.py delete mode 100644 fix_json_parsing.py delete mode 100644 fix_orch.py delete mode 100644 fix_parsing.py delete mode 100644 fix_provider.py delete mode 100644 fix_provider2.py delete mode 100644 fix_show_track.py delete mode 100644 run_repro.py delete mode 100644 run_tests.py delete mode 100644 simplify_test.py delete mode 100644 temp_conftest.py delete mode 100644 temp_conftest2.py delete mode 100644 temp_gui_old.py delete mode 100644 temp_gui_old2.py delete mode 100644 test_callback_output.txt delete mode 100644 test_edit.py delete mode 100644 test_err.txt delete mode 100644 test_error.txt delete mode 100644 test_error2.txt delete mode 100644 test_migration_sanity.py delete mode 100644 test_mma_persistence.py delete mode 100644 test_out.txt delete mode 100644 test_output.txt delete mode 100644 test_output2.txt delete mode 100644 test_project.toml delete mode 100644 test_project_history.toml diff --git a/add_ai_status.py b/add_ai_status.py deleted file mode 100644 index 7fa961d..0000000 --- a/add_ai_status.py +++ /dev/null @@ -1,72 +0,0 @@ -with open("tests/test_visual_orchestration.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add more explicit debug - check ai_status for errors -content = content.replace( - '''# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - # Check both proposed_tracks AND comms log for tracks - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - tier_usage = mma_status.get("mma_tier_usage", {}) - - # Also check the comms log directly - session = client.get_session() - entries = session.get("session", {}).get("entries", []) - - # Check for track generation evidence - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks found in proposed_tracks after {i}s: {proposed}") - break - elif tier_usage.get("Tier 1", {}).get("input", 0) > 0: - # AI was called, check comms log for track JSON - for entry in entries: - content = str(entry.get("content", "")) - if "track" in content.lower() and ("id" in content or "goal" in content): - tracks_generated = True - print(f"[Test] Tracks found in comms log after {i}s") - break - if i % 10 == 0: - print(f"[Test] Debug: tier_usage={tier_usage}, proposed={proposed}, entries_count={len(entries)}") - time.sleep(1) - assert tracks_generated, f"Tier 1 failed to generate tracks within 120 seconds."''', - '''# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - # Check both proposed_tracks AND comms log for tracks - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - tier_usage = mma_status.get("mma_tier_usage", {}) - ai_status = mma_status.get("mma_status", "unknown") - - # Also check the comms log directly - session = client.get_session() - entries = session.get("session", {}).get("entries", []) - - # Check for track generation evidence - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks found in proposed_tracks after {i}s: {proposed}") - break - elif tier_usage.get("Tier 1", {}).get("input", 0) > 0: - # AI was called, check comms log for track JSON - for entry in entries: - content = str(entry.get("content", "")) - if "track" in content.lower() and ("id" in content or "goal" in content): - tracks_generated = True - print(f"[Test] Tracks found in comms log after {i}s: {content[:100]}") - break - if i % 10 == 0: - print(f"[Test] Debug: ai_status={ai_status}, tier_usage={tier_usage}, proposed={proposed}, entries={len(entries)}") - time.sleep(1) - assert tracks_generated, f"Tier 1 failed to generate tracks within 120 seconds. Status: {ai_status}"''', -) - -with open("tests/test_visual_orchestration.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added ai_status debug") diff --git a/add_debug.py b/add_debug.py deleted file mode 100644 index f69a210..0000000 --- a/add_debug.py +++ /dev/null @@ -1,38 +0,0 @@ -with open("tests/test_visual_orchestration.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug polling -content = content.replace( - """# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks generated after {i}s") - break - time.sleep(1)""", - """# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks generated after {i}s") - print(f"[Test] Proposed tracks: {proposed}") - break - # Debug: also check tier usage - if i % 10 == 0: - tier_usage = mma_status.get("mma_tier_usage", {}) - print(f"[Test] Debug: tier_usage={tier_usage}, proposed={proposed}") - time.sleep(1)""", -) - -with open("tests/test_visual_orchestration.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to test") diff --git a/add_debug2.py b/add_debug2.py deleted file mode 100644 index 0e7b0a4..0000000 --- a/add_debug2.py +++ /dev/null @@ -1,30 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to _cb_plan_epic -old = """def _cb_plan_epic(self) -> None: - def _bg_task() -> None: - sys.stderr.write("[DEBUG] _cb_plan_epic _bg_task started\\n") - sys.stderr.flush() - try: - self._set_status("Planning Epic (Tier 1)...") - history = orchestrator_pm.get_track_history_summary()""" - -new = """def _cb_plan_epic(self) -> None: - def _bg_task() -> None: - sys.stderr.write("[DEBUG] _cb_plan_epic _bg_task started\\n") - sys.stderr.flush() - try: - self._set_status("Planning Epic (Tier 1)...") - # DEBUG: Check provider - import src.ai_client as ai_client - sys.stderr.write(f"[DEBUG] _cb_plan_epic: ai_client._provider={ai_client._provider}, _model={ai_client._model}\\n") - sys.stderr.flush() - history = orchestrator_pm.get_track_history_summary()""" - -content = content.replace(old, new) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to _cb_plan_epic") diff --git a/add_debug3.py b/add_debug3.py deleted file mode 100644 index ff98ef0..0000000 --- a/add_debug3.py +++ /dev/null @@ -1,24 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to show_track_proposal handling -old = """elif action == "show_track_proposal": - self.proposed_tracks = task.get("payload", []) - self._show_track_proposal_modal = True""" - -new = """elif action == "show_track_proposal": - payload = task.get("payload", []) - sys.stderr.write(f"[DEBUG] show_track_proposal: task={task}, payload={payload}\\n") - sys.stderr.flush() - if isinstance(payload, list): - self.proposed_tracks = payload - else: - self.proposed_tracks = [] - self._show_track_proposal_modal = True""" - -content = content.replace(old, new) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to show_track_proposal") diff --git a/add_more_debug.py b/add_more_debug.py deleted file mode 100644 index 21eee7c..0000000 --- a/add_more_debug.py +++ /dev/null @@ -1,35 +0,0 @@ -with open("tests/test_visual_orchestration.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add more waits and verify provider was set -content = content.replace( - """# Setup provider - client.set_value("current_provider", "gemini_cli") - time.sleep(0.5) - client.set_value( - "gcli_path", - f'"{sys.executable}" "{os.path.abspath("tests/mock_gemini_cli.py")}"', - ) - time.sleep(0.5) - client.set_value("manual_approve", True) - time.sleep(0.5)""", - """# Setup provider - verify it took - client.set_value("current_provider", "gemini_cli") - time.sleep(1) - # Verify provider is set correctly - mma = client.get_mma_status() - print(f"[Test] After setting provider: {mma.get('mma_tier_usage', {})}") - client.set_value( - "gcli_path", - f'"{sys.executable}" "{os.path.abspath("tests/mock_gemini_cli.py")}"', - ) - time.sleep(1) - client.set_value("manual_approve", True) - time.sleep(1) - print(f"[Test] After all setup: {client.get_mma_status().get('mma_tier_usage', {})}")""", -) - -with open("tests/test_visual_orchestration.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added more debug to test") diff --git a/add_waits.py b/add_waits.py deleted file mode 100644 index 266a15f..0000000 --- a/add_waits.py +++ /dev/null @@ -1,28 +0,0 @@ -with open("tests/test_visual_orchestration.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add a wait and debug after setting provider -content = content.replace( - """# Setup provider - client.set_value("current_provider", "gemini_cli") - client.set_value( - "gcli_path", - f'"{sys.executable}" "{os.path.abspath("tests/mock_gemini_cli.py")}"', - ) - client.set_value("manual_approve", True)""", - """# Setup provider - client.set_value("current_provider", "gemini_cli") - time.sleep(0.5) # Wait for provider to be set - client.set_value( - "gcli_path", - f'"{sys.executable}" "{os.path.abspath("tests/mock_gemini_cli.py")}"', - ) - time.sleep(0.5) # Wait for gcli_path to be set - client.set_value("manual_approve", True) - time.sleep(0.5) # Wait for all settings""", -) - -with open("tests/test_visual_orchestration.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added waits to test") diff --git a/debug3.py b/debug3.py deleted file mode 100644 index 1a5ee60..0000000 --- a/debug3.py +++ /dev/null @@ -1,15 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to see tracks -old = """tracks = orchestrator_pm.generate_tracks(self.ui_epic_input, flat, file_items, history_summary=history)""" -new = """tracks = orchestrator_pm.generate_tracks(self.ui_epic_input, flat, file_items, history_summary=history) - sys.stderr.write(f"[DEBUG] generate_tracks returned: {tracks}\\n") - sys.stderr.flush()""" - -content = content.replace(old, new) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug") diff --git a/debug_api_hooks.py b/debug_api_hooks.py deleted file mode 100644 index a044f3d..0000000 --- a/debug_api_hooks.py +++ /dev/null @@ -1,26 +0,0 @@ -with open("src/api_hooks.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug when receiving /api/gui -old = """elif self.path == "/api/gui": - lock = _get_app_attr(app, "_pending_gui_tasks_lock") - tasks = _get_app_attr(app, "_pending_gui_tasks") - if lock and tasks is not None: - with lock: tasks.append(data)""" - -new = """elif self.path == "/api/gui": - sys.stderr.write(f"[DEBUG api_hooks] /api/gui received: {data}\\n") - sys.stderr.flush() - lock = _get_app_attr(app, "_pending_gui_tasks_lock") - tasks = _get_app_attr(app, "_pending_gui_tasks") - if lock and tasks is not None: - with lock: tasks.append(data) - sys.stderr.write(f"[DEBUG api_hooks] Added task, total: {len(tasks)}\\n") - sys.stderr.flush()""" - -content = content.replace(old, new) - -with open("src/api_hooks.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to api_hooks") diff --git a/debug_gen.py b/debug_gen.py deleted file mode 100644 index 1737a4f..0000000 --- a/debug_gen.py +++ /dev/null @@ -1,27 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to see actual response in generate_tracks -old = """response = ai_client.send( - md_content="", # We pass everything in user_message for clarity - user_message=user_message, - enable_tools=False, - )""" - -new = """import sys -sys.stderr.write(f"[DEBUG generate_tracks] Calling ai_client.send with provider={ai_client._provider}, model={ai_client._model}\\n") -sys.stderr.flush() -response = ai_client.send( - md_content="", # We pass everything in user_message for clarity - user_message=user_message, - enable_tools=False, - ) -sys.stderr.write(f"[DEBUG generate_tracks] Got response: {response[:200]}\\n") -sys.stderr.flush()""" - -content = content.replace(old, new) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to generate_tracks") diff --git a/debug_gui2.py b/debug_gui2.py deleted file mode 100644 index 7c03253..0000000 --- a/debug_gui2.py +++ /dev/null @@ -1,22 +0,0 @@ -with open("src/gui_2.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to _gui_func to see if tasks are being processed -old = """# Process GUI task queue - self._process_pending_gui_tasks()""" - -new = """# Process GUI task queue - # DEBUG: Check if tasks exist before processing - if hasattr(self, 'controller') and hasattr(self.controller, '_pending_gui_tasks'): - pending_count = len(self.controller._pending_gui_tasks) - if pending_count > 0: - sys.stderr.write(f"[DEBUG gui_2] _gui_func: found {pending_count} pending tasks\\n") - sys.stderr.flush() - self._process_pending_gui_tasks()""" - -content = content.replace(old, new) - -with open("src/gui_2.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to gui_2.py") diff --git a/debug_resp.py b/debug_resp.py deleted file mode 100644 index d929bfa..0000000 --- a/debug_resp.py +++ /dev/null @@ -1,20 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to see what response looks like -old = """# 4. Parse JSON Output - try: - json_match = response.strip()""" - -new = """# 4. Parse JSON Output - try: - sys.stderr.write(f"[DEBUG] generate_tracks response: {response[:300]}\\n") - sys.stderr.flush() - json_match = response.strip()""" - -content = content.replace(old, new) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to see response") diff --git a/debug_tasks.py b/debug_tasks.py deleted file mode 100644 index 18de66f..0000000 --- a/debug_tasks.py +++ /dev/null @@ -1,28 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add debug to _process_pending_gui_tasks to see what's happening -old = """def _process_pending_gui_tasks(self) -> None: - if not self._pending_gui_tasks: - return - with self._pending_gui_tasks_lock: - tasks = self._pending_gui_tasks[:] - self._pending_gui_tasks.clear()""" - -new = """def _process_pending_gui_tasks(self) -> None: - if not self._pending_gui_tasks: - return - with self._pending_gui_tasks_lock: - tasks = self._pending_gui_tasks[:] - sys.stderr.write(f"[DEBUG] _process_pending_gui_tasks: processing {len(tasks)} tasks\\n") - for t in tasks: - sys.stderr.write(f"[DEBUG] task action: {t.get('action')}\\n") - sys.stderr.flush() - self._pending_gui_tasks.clear()""" - -content = content.replace(old, new) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added debug to _process_pending_gui_tasks") diff --git a/fix_epic_debug.py b/fix_epic_debug.py deleted file mode 100644 index 97de7a3..0000000 --- a/fix_epic_debug.py +++ /dev/null @@ -1,51 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Fix _cb_plan_epic to catch and print exceptions properly -old = """def _cb_plan_epic(self) -> None: - def _bg_task() -> None: - sys.stderr.write("[DEBUG] _cb_plan_epic _bg_task started\\n") - sys.stderr.flush() - try: - self._set_status("Planning Epic (Tier 1)...") - # DEBUG: Check provider - import src.ai_client as ai_client - sys.stderr.write(f"[DEBUG] _cb_plan_epic: ai_client._provider={ai_client._provider}, _model={ai_client._model}\\n") - sys.stderr.flush() - history = orchestrator_pm.get_track_history_summary()""" - -new = """def _cb_plan_epic(self) -> None: - def _bg_task() -> None: - import traceback - sys.stderr.write("[DEBUG] _cb_plan_epic _bg_task started\\n") - sys.stderr.flush() - try: - self._set_status("Planning Epic (Tier 1)...") - # DEBUG: Check provider - import src.ai_client as ai_client - sys.stderr.write(f"[DEBUG] _cb_plan_epic: ai_client._provider={ai_client._provider}, _model={ai_client._model}\\n") - sys.stderr.flush() - history = orchestrator_pm.get_track_history_summary() - sys.stderr.write(f"[DEBUG] _cb_plan_epic: calling generate_tracks with epic_input={self.ui_epic_input[:50]}\\n") - sys.stderr.flush()""" - -content = content.replace(old, new) - -# Also catch the exception and print traceback -old2 = """except Exception as e: - self._set_status(f"Epic plan error: {e}") - print(f"ERROR in _cb_plan_epic background task: {e}")""" - -new2 = """except Exception as e: - self._set_status(f"Epic plan error: {e}") - tb = traceback.format_exc() - sys.stderr.write(f"ERROR in _cb_plan_epic background task: {e}\\n{tb}\\n") - sys.stderr.flush() - print(f"ERROR in _cb_plan_epic background task: {e}")""" - -content = content.replace(old2, new2) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Added more debug to _cb_plan_epic") diff --git a/fix_json_parsing.py b/fix_json_parsing.py deleted file mode 100644 index e1bfd6b..0000000 --- a/fix_json_parsing.py +++ /dev/null @@ -1,40 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Fix JSON parsing to handle mock's wrapped format -old = """# 4. Parse JSON Output - try: - # The prompt asks for a JSON array. We need to extract it if the AI added markdown blocks. - json_match = response.strip() - if "```json" in json_match: - json_match = json_match.split("```json")[1].split("```")[0].strip() - elif "```" in json_match: - json_match = json_match.split("```")[1].split("```")[0].strip() - tracks: list[dict[str, Any]] = json.loads(json_match)""" - -new = """# 4. Parse JSON Output - try: - json_match = response.strip() - # Handle mock_gemini_cli.py format: {"type": "message", "content": "[...]"} - if '"content": "' in json_match or "'content': '" in json_match: - import re - match = re.search(r'"content"\\s*:\\s*"(\\[.*?\\])"', json_match) - if match: - json_match = match.group(1) - elif '"content":' in json_match: - match = re.search(r'"content":\\s*(\\[.*?\\])', json_match) - if match: - json_match = match.group(1) - # Handle markdown code blocks - if "```json" in json_match: - json_match = json_match.split("```json")[1].split("```")[0].strip() - elif "```" in json_match: - json_match = json_match.split("```")[1].split("```")[0].strip() - tracks: list[dict[str, Any]] = json.loads(json_match)""" - -content = content.replace(old, new) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Fixed JSON parsing in orchestrator_pm.py") diff --git a/fix_orch.py b/fix_orch.py deleted file mode 100644 index 3405c75..0000000 --- a/fix_orch.py +++ /dev/null @@ -1,52 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - lines = f.readlines() - -# Find and replace the JSON parsing section -new_lines = [] -i = 0 -while i < len(lines): - line = lines[i] - # Replace the old parsing section - if "# 4. Parse JSON Output" in line: - # Add new parsing code - new_lines.append(" # 4. Parse JSON Output\n") - new_lines.append(" try:\n") - new_lines.append(" import sys\n") - new_lines.append( - ' sys.stderr.write(f"[DEBUG] generate_tracks response: {response[:300]}\\n")\n' - ) - new_lines.append(" sys.stderr.flush()\n") - new_lines.append(" json_match = response.strip()\n") - new_lines.append( - ' # Handle mock_gemini_cli.py format: {"type": "message", "content": "[...]"}\n' - ) - new_lines.append(' if \'"content": "\' in json_match:\n') - new_lines.append(" import re\n") - new_lines.append( - ' match = re.search(r\'"content"\\s*:\\s*"(\\[.*?\\])"\', json_match)\n' - ) - new_lines.append(" if match:\n") - new_lines.append(" json_match = match.group(1)\n") - new_lines.append(" # Handle markdown code blocks\n") - new_lines.append(' if "```json" in json_match:\n') - new_lines.append( - ' json_match = json_match.split("```json")[1].split("```")[0].strip()\n' - ) - new_lines.append(' elif "```" in json_match:\n') - new_lines.append( - ' json_match = json_match.split("```")[1].split("```")[0].strip()\n' - ) - new_lines.append(" tracks: list[dict[str, Any]] = json.loads(json_match)\n") - - # Skip the old lines - i += 1 - while i < len(lines) and "tracks:" not in lines[i]: - i += 1 - else: - new_lines.append(line) - i += 1 - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.writelines(new_lines) - -print("Fixed orchestrator_pm.py") diff --git a/fix_parsing.py b/fix_parsing.py deleted file mode 100644 index 062157d..0000000 --- a/fix_parsing.py +++ /dev/null @@ -1,37 +0,0 @@ -import re - -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Replace the JSON parsing section -old = """ # 4. Parse JSON Output - try: - # The prompt asks for a JSON array. We need to extract it if the AI added markdown blocks. - json_match = response.strip() - if "```json" in json_match: - json_match = json_match.split("```json")[1].split("```")[0].strip() - elif "```" in json_match: - json_match = json_match.split("```")[1].split("```")[0].strip() - tracks: list[dict[str, Any]] = json.loads(json_match)""" - -new = """ # 4. Parse JSON Output - try: - json_match = response.strip() - # Handle mock_gemini_cli.py format: {"type": "message", "content": "[...]"} - if '"content": "' in json_match: - match = re.search(r'"content"\\s*:\\s*"(\\[.*?\\])"', json_match) - if match: - json_match = match.group(1) - # Handle markdown code blocks - if "```json" in json_match: - json_match = json_match.split("```json")[1].split("```")[0].strip() - elif "```" in json_match: - json_match = json_match.split("```")[1].split("```")[0].strip() - tracks: list[dict[str, Any]] = json.loads(json_match)""" - -content = content.replace(old, new) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Fixed JSON parsing in orchestrator_pm.py") diff --git a/fix_provider.py b/fix_provider.py deleted file mode 100644 index 7453d3b..0000000 --- a/fix_provider.py +++ /dev/null @@ -1,30 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Add provider setup before ai_client.send() -old_code = """ # Set custom system prompt for this call - old_system_prompt = ai_client._custom_system_prompt - ai_client.set_custom_system_prompt(system_prompt or "") - try: - # 3. Call Tier 1 Model (Strategic - Pro) - # Note: We use gemini-1.5-pro or similar high-reasoning model for Tier 1 - response = ai_client.send(""" - -new_code = """ # Set custom system prompt for this call - old_system_prompt = ai_client._custom_system_prompt - ai_client.set_custom_system_prompt(system_prompt or "") - # Ensure we use the current provider from ai_client state - current_provider = ai_client.get_provider() - current_model = ai_client._model if hasattr(ai_client, '_model') else 'gemini-2.5-flash-lite' - ai_client.set_provider(current_provider, current_model) - try: - # 3. Call Tier 1 Model (Strategic - Pro) - # Note: We use gemini-1.5-pro or similar high-reasoning model for Tier 1 - response = ai_client.send(""" - -content = content.replace(old_code, new_code) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Fixed provider in orchestrator_pm.py") diff --git a/fix_provider2.py b/fix_provider2.py deleted file mode 100644 index 46500e4..0000000 --- a/fix_provider2.py +++ /dev/null @@ -1,22 +0,0 @@ -with open("src/orchestrator_pm.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Fix the provider/model setting in generate_tracks -old = """# Ensure we use the current provider from ai_client state - current_provider = ai_client.get_provider() - current_model = ai_client._model if hasattr(ai_client, '_model') else 'gemini-2.5-flash-lite' - ai_client.set_provider(current_provider, current_model)""" - -new = """# Ensure we use the current provider from ai_client state - # Import ai_client module-level to access globals - import src.ai_client as ai_client_module - current_provider = ai_client_module._provider - current_model = ai_client_module._model - ai_client.set_provider(current_provider, current_model)""" - -content = content.replace(old, new) - -with open("src/orchestrator_pm.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Fixed provider/model in orchestrator_pm.py") diff --git a/fix_show_track.py b/fix_show_track.py deleted file mode 100644 index 69422dc..0000000 --- a/fix_show_track.py +++ /dev/null @@ -1,29 +0,0 @@ -with open("src/app_controller.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Fix show_track_proposal handler to debug and handle properly -old = """elif action == "show_track_proposal": - self.proposed_tracks = task.get("payload", []) - self._show_track_proposal_modal = True""" - -new = """elif action == "show_track_proposal": - # Handle both nested payload and direct list - raw_payload = task.get("payload") - sys.stderr.write(f"[DEBUG] show_track_proposal: raw_payload type={type(raw_payload)}, task={task}\\n") - sys.stderr.flush() - if isinstance(raw_payload, list): - self.proposed_tracks = raw_payload - elif isinstance(raw_payload, dict) and "tracks" in raw_payload: - self.proposed_tracks = raw_payload.get("tracks", []) - else: - self.proposed_tracks = [] - sys.stderr.write(f"[DEBUG] show_track_proposal: final proposed_tracks={self.proposed_tracks}\\n") - sys.stderr.flush() - self._show_track_proposal_modal = True""" - -content = content.replace(old, new) - -with open("src/app_controller.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Fixed show_track_proposal handler") diff --git a/run_repro.py b/run_repro.py deleted file mode 100644 index ca20f0b..0000000 --- a/run_repro.py +++ /dev/null @@ -1,67 +0,0 @@ -import time -import requests -import sys -import os - -# Ensure src/ is in path -project_root = os.path.dirname(os.path.abspath(__file__)) -src_path = os.path.join(project_root, "src") -sys.path.insert(0, src_path) - -from api_hook_client import ApiHookClient - -def run_repro(): - client = ApiHookClient("http://127.0.0.1:8999") - if not client.wait_for_server(timeout=15): - print("Failed to connect to GUI Hook Server.") - return - - print("[REPRO] Connected to GUI.") - - # 1. Reset and Setup - client.click("btn_reset") - time.sleep(1) - client.set_value("auto_add_history", True) - client.set_value("manual_approve", False) # Auto-approve for simulation - client.set_value("current_provider", "gemini_cli") - - mock_script = os.path.abspath("tests/mock_gemini_cli.py") - client.set_value("gcli_path", f'"{sys.executable}" "{mock_script}"') - - # 2. Trigger Chat - msg = "What is the current date and time? Answer in one sentence." - print(f"[REPRO] Sending message: {msg}") - client.set_value("ai_input", msg) - client.click("btn_gen_send") - - # 3. Wait and Monitor - start_time = time.time() - while time.time() - start_time < 30: - status = client.get_value("ai_status") - print(f"[REPRO] Status: {status}") - - if status == "error": - print("[REPRO] DETECTED ERROR STATUS!") - # Try to get more info if possible - break - - if status == "done": - print("[REPRO] Success! Status is done.") - break - - # Check events - events = client.get_events() - for ev in events: - print(f"[REPRO] Received Event: {ev.get('type')}") - - time.sleep(1) - - # 4. Check Session - session = client.get_session() - entries = session.get('session', {}).get('entries', []) - print(f"[REPRO] History Entries: {len(entries)}") - for i, entry in enumerate(entries): - print(f" {i}: [{entry.get('role')}] {entry.get('content')[:100]}...") - -if __name__ == "__main__": - run_repro() diff --git a/run_tests.py b/run_tests.py deleted file mode 100644 index afa3db2..0000000 --- a/run_tests.py +++ /dev/null @@ -1,113 +0,0 @@ -import argparse -import sys -import tomllib -import pytest -from typing import Dict, List, Any - -def load_manifest(path: str) -> Dict[str, Any]: - """ - Loads a manifest file (expected to be in TOML format) from the given path. - - Args: - path: The path to the TOML manifest file. - - Returns: - A dictionary representing the loaded manifest. - - Raises: - FileNotFoundError: If the manifest file does not exist. - tomllib.TOMLDecodeError: If the manifest file is not valid TOML. - """ - try: - with open(path, 'rb') as f: - return tomllib.load(f) - except FileNotFoundError: - print(f"Error: Manifest file not found at {path}", file=sys.stderr) - raise - except tomllib.TOMLDecodeError: - print(f"Error: Could not decode TOML from {path}", file=sys.stderr) - raise - -def get_test_files(manifest: Dict[str, Any], category: str) -> List[str]: - """ - Determines the list of test files based on the manifest and a specified category. - - Args: - manifest: The loaded manifest dictionary. - category: The category of tests to retrieve. - - Returns: - A list of file paths corresponding to the tests in the given category. - Returns an empty list if the category is not found or has no tests. - """ - print(f"DEBUG: Looking for category '{category}' in manifest.", file=sys.stderr) - files = manifest.get("categories", {}).get(category, {}).get("files", []) - print(f"DEBUG: Found test files for category '{category}': {files}", file=sys.stderr) - return files - -def main() -> None: - parser = argparse.ArgumentParser( - description="Run tests with optional manifest and category filtering, passing additional pytest arguments.", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog="""\ -Example usage: - python run_tests.py --manifest tests.toml --category unit -- --verbose --cov=my_module - python run_tests.py --manifest tests.toml --category integration - python run_tests.py --manifest tests.toml --category core - python run_tests.py --manifest tests.toml # Runs tests from default_categories - python run_tests.py -- --capture=no # Runs all tests with pytest args -""" - ) - parser.add_argument( - "--manifest", - type=str, - help="Path to the TOML manifest file containing test configurations." - ) - parser.add_argument( - "--category", - type=str, - help="Category of tests to run (e.g., 'unit', 'integration')." - ) - # Parse known arguments for the script itself, then parse remaining args for pytest - args, remaining_pytest_args = parser.parse_known_args(sys.argv[1:]) - selected_test_files = [] - manifest_data = None - if args.manifest: - try: - manifest_data = load_manifest(args.manifest) - except (FileNotFoundError, tomllib.TOMLDecodeError): - # Error message already printed by load_manifest - sys.exit(1) - if args.category: - # Case 1: --manifest and --category provided - files = get_test_files(manifest_data, args.category) - selected_test_files.extend(files) - else: - # Case 2: --manifest provided, but no --category - # Load default categories from manifest['execution']['default_categories'] - default_categories = manifest_data.get("execution", {}).get("default_categories", []) - if not default_categories: - print(f"Error: --manifest provided without --category, and no 'default_categories' found in manifest '{args.manifest}'.", file=sys.stderr) - parser.print_help(sys.stderr) - sys.exit(1) - print(f"DEBUG: Using default categories from manifest '{args.manifest}': {default_categories}", file=sys.stderr) - for cat in default_categories: - files = get_test_files(manifest_data, cat) - selected_test_files.extend(files) - elif args.category: - # Case 3: --category provided without --manifest - print("Error: --category requires --manifest to be specified.", file=sys.stderr) - parser.print_help(sys.stderr) - sys.exit(1) - # Combine selected test files with any remaining pytest arguments that were not parsed by this script. - # We also filter out the literal '--' if it was passed by the user to avoid pytest errors if it appears multiple times. - pytest_command_args = selected_test_files + [arg for arg in remaining_pytest_args if arg != '--'] - # Filter out any empty strings that might have been included. - final_pytest_args = [arg for arg in pytest_command_args if arg] - # If no specific tests were selected from manifest/category and no manifest was provided, - # and no other pytest args were given, pytest.main([]) runs default test discovery. - print(f"Running pytest with arguments: {final_pytest_args}", file=sys.stderr) - sys.exit(pytest.main(final_pytest_args)) - -if __name__ == "__main__": - main() diff --git a/simplify_test.py b/simplify_test.py deleted file mode 100644 index 712d6f0..0000000 --- a/simplify_test.py +++ /dev/null @@ -1,58 +0,0 @@ -with open("tests/test_visual_orchestration.py", "r", encoding="utf-8", newline="") as f: - content = f.read() - -# Simplify test - check comms log instead of proposed_tracks popup -content = content.replace( - '''# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks generated after {i}s") - print(f"[Test] Proposed tracks: {proposed}") - break - # Debug: also check tier usage - if i % 10 == 0: - tier_usage = mma_status.get("mma_tier_usage", {}) - print(f"[Test] Debug: tier_usage={tier_usage}, proposed={proposed}") - time.sleep(1) - assert tracks_generated, "Tier 1 failed to generate tracks within 60 seconds."''', - '''# 3. Verify that Tier 1 generates tracks - print("[Test] Polling for Tier 1 tracks...") - tracks_generated = False - for i in range(120): - # Check both proposed_tracks AND comms log for tracks - mma_status = client.get_mma_status() - proposed = mma_status.get("proposed_tracks", []) - tier_usage = mma_status.get("mma_tier_usage", {}) - - # Also check the comms log directly - session = client.get_session() - entries = session.get("session", {}).get("entries", []) - - # Check for track generation evidence - if proposed and len(proposed) > 0: - tracks_generated = True - print(f"[Test] Tracks found in proposed_tracks after {i}s: {proposed}") - break - elif tier_usage.get("Tier 1", {}).get("input", 0) > 0: - # AI was called, check comms log for track JSON - for entry in entries: - content = str(entry.get("content", "")) - if "track" in content.lower() and ("id" in content or "goal" in content): - tracks_generated = True - print(f"[Test] Tracks found in comms log after {i}s") - break - if i % 10 == 0: - print(f"[Test] Debug: tier_usage={tier_usage}, proposed={proposed}, entries_count={len(entries)}") - time.sleep(1) - assert tracks_generated, f"Tier 1 failed to generate tracks within 120 seconds."''', -) - -with open("tests/test_visual_orchestration.py", "w", encoding="utf-8", newline="") as f: - f.write(content) - -print("Simplified test to check comms log") diff --git a/temp_conftest.py b/temp_conftest.py deleted file mode 100644 index 7138a3d4938dc9d21400d642c85928c646da6aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18660 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 V$0`MHr{x&3$Ig7r&dtSq`47`D)o}m- diff --git a/temp_conftest2.py b/temp_conftest2.py deleted file mode 100644 index 7138a3d4938dc9d21400d642c85928c646da6aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18660 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 V$0`MHr{x&3$Ig7r&dtSq`47`D)o}m- diff --git a/temp_gui_old.py b/temp_gui_old.py deleted file mode 100644 index 4b27e6949ef3f6af6f45518facf92d487784b9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174204 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 diff --git a/temp_gui_old2.py b/temp_gui_old2.py deleted file mode 100644 index 4b27e6949ef3f6af6f45518facf92d487784b9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174204 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 diff --git a/test_callback_output.txt b/test_callback_output.txt deleted file mode 100644 index da222da..0000000 --- a/test_callback_output.txt +++ /dev/null @@ -1 +0,0 @@ -Callback executed: f1fa1f15-2d76-40f8-8d75-960476ceec85 \ No newline at end of file diff --git a/test_edit.py b/test_edit.py deleted file mode 100644 index 0c7e86f..0000000 --- a/test_edit.py +++ /dev/null @@ -1,8 +0,0 @@ -from src.mcp_client import edit_file - -result = edit_file( - "src/app_controller.py", - " tracks = orchestrator_pm.generate_tracks(self.ui_epic_input, flat, file_items, history_summary=history)\n _t1_new = ai_client.get_comms_log()[_t1_baseline:]", - ' tracks = orchestrator_pm.generate_tracks(self.ui_epic_input, flat, file_items, history_summary=history)\n import sys\n sys.stderr.write(f"[DEBUG] generate_tracks returned: {tracks}\\n")\n sys.stderr.flush()\n _t1_new = ai_client.get_comms_log()[_t1_baseline:]', -) -print(result) diff --git a/test_err.txt b/test_err.txt deleted file mode 100644 index 18b515a..0000000 --- a/test_err.txt +++ /dev/null @@ -1 +0,0 @@ -[DEBUG] _process_event_queue entered diff --git a/test_error.txt b/test_error.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test_error2.txt b/test_error2.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test_migration_sanity.py b/test_migration_sanity.py deleted file mode 100644 index cb15c74..0000000 --- a/test_migration_sanity.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import sys - -# Ensure src/ is in path -project_root = os.path.dirname(os.path.abspath(__file__)) -src_path = os.path.join(project_root, "src") -sys.path.insert(0, src_path) - -# Mock ImGui bundle to avoid needing a window for simple state check -from unittest.mock import MagicMock -import sys -sys.modules['imgui_bundle'] = MagicMock() -sys.modules['imgui_bundle.imgui'] = MagicMock() -sys.modules['imgui_bundle.hello_imgui'] = MagicMock() -sys.modules['imgui_bundle.immapp'] = MagicMock() - -try: - from gui_2 import App - app = App() - print("App instantiated successfully!") - print(f"Controller active_project_path: {app.controller.active_project_path}") - print(f"App config: {app.config is app.controller.config}") # Should be True via __getattr__ -except Exception as e: - print(f"Failed to instantiate App: {e}") - import traceback - traceback.print_exc() diff --git a/test_mma_persistence.py b/test_mma_persistence.py deleted file mode 100644 index e2cd411..0000000 --- a/test_mma_persistence.py +++ /dev/null @@ -1,30 +0,0 @@ - -import unittest -from pathlib import Path -import project_manager - -class TestMMAPersistence(unittest.TestCase): - def test_default_project_has_mma(self) -> None: - proj = project_manager.default_project("test") - self.assertIn("mma", proj) - self.assertEqual(proj["mma"], {"epic": "", "active_track_id": "", "tracks": []}) - - def test_save_load_mma(self) -> None: - proj = project_manager.default_project("test") - proj["mma"] = {"epic": "Test Epic", "tracks": [{"id": "track_1"}]} - test_file = Path("test_mma_proj.toml") - try: - project_manager.save_project(proj, test_file) - loaded = project_manager.load_project(test_file) - self.assertIn("mma", loaded) - self.assertEqual(loaded["mma"]["epic"], "Test Epic") - self.assertEqual(len(loaded["mma"]["tracks"]), 1) - finally: - if test_file.exists(): - test_file.unlink() - hist_file = Path("test_mma_proj_history.toml") - if hist_file.exists(): - hist_file.unlink() - -if __name__ == "__main__": - unittest.main() diff --git a/test_out.txt b/test_out.txt deleted file mode 100644 index 892752c..0000000 --- a/test_out.txt +++ /dev/null @@ -1,118 +0,0 @@ -============================= test session starts ============================= -platform win32 -- Python 3.11.6, pytest-9.0.2, pluggy-1.6.0 -- C:\projects\manual_slop\.venv\Scripts\python.exe -cachedir: .pytest_cache -rootdir: C:\projects\manual_slop -configfile: pyproject.toml -plugins: anyio-4.12.1, asyncio-1.3.0, cov-7.0.0, timeout-2.4.0 -asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function -timeout: 120.0s -timeout method: thread -timeout func_only: False -collecting ... collected 330 items - -tests/test_agent_capabilities.py::test_agent_capabilities_listing PASSED [ 0%] -tests/test_agent_tools_wiring.py::test_set_agent_tools PASSED [ 0%] -tests/test_agent_tools_wiring.py::test_build_anthropic_tools_conversion PASSED [ 0%] -tests/test_ai_client_cli.py::test_ai_client_send_gemini_cli PASSED [ 1%] -tests/test_ai_client_list_models.py::test_list_models_gemini_cli PASSED [ 1%] -tests/test_ai_style_formatter.py::test_basic_indentation PASSED [ 1%] -tests/test_ai_style_formatter.py::test_top_level_blank_lines PASSED [ 2%] -tests/test_ai_style_formatter.py::test_inner_blank_lines PASSED [ 2%] -tests/test_ai_style_formatter.py::test_multiline_string_safety PASSED [ 2%] -tests/test_ai_style_formatter.py::test_continuation_indentation PASSED [ 3%] -tests/test_ai_style_formatter.py::test_multiple_top_level_definitions PASSED [ 3%] -tests/test_api_events.py::test_ai_client_event_emitter_exists PASSED [ 3%] -tests/test_api_events.py::test_event_emission PASSED [ 3%] -tests/test_api_events.py::test_send_emits_events_proper PASSED [ 4%] -tests/test_api_events.py::test_send_emits_tool_events PASSED [ 4%] -tests/test_api_hook_client.py::test_get_status_success PASSED [ 4%] -tests/test_api_hook_client.py::test_get_project_success PASSED [ 5%] -tests/test_api_hook_client.py::test_get_session_success PASSED [ 5%] -tests/test_api_hook_client.py::test_post_gui_success PASSED [ 5%] -tests/test_api_hook_client.py::test_get_performance_success PASSED [ 6%] -tests/test_api_hook_client.py::test_unsupported_method_error PASSED [ 6%] -tests/test_api_hook_client.py::test_get_text_value PASSED [ 6%] -tests/test_api_hook_client.py::test_get_node_status PASSED [ 6%] -tests/test_api_hook_extensions.py::test_api_client_has_extensions PASSED [ 7%] -tests/test_api_hook_extensions.py::test_select_tab_integration PASSED [ 7%] -tests/test_api_hook_extensions.py::test_select_list_item_integration PASSED [ 7%] -tests/test_api_hook_extensions.py::test_get_indicator_state_integration PASSED [ 8%] -tests/test_api_hook_extensions.py::test_app_processes_new_actions PASSED [ 8%] -tests/test_arch_boundary_phase1.py::TestArchBoundaryPhase1::test_claude_mma_exec_no_hardcoded_path PASSED [ 8%] -tests/test_arch_boundary_phase1.py::TestArchBoundaryPhase1::test_mcp_client_whitelist_enforcement PASSED [ 9%] -tests/test_arch_boundary_phase1.py::TestArchBoundaryPhase1::test_mma_exec_no_hardcoded_path PASSED [ 9%] -tests/test_arch_boundary_phase1.py::TestArchBoundaryPhase1::test_unfettered_modules_constant_removed PASSED [ 9%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_mcp_client_dispatch_completeness PASSED [ 10%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_mutating_tool_triggers_callback PASSED [ 10%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_non_mutating_tool_skips_callback PASSED [ 10%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_rejection_prevents_dispatch PASSED [ 10%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_toml_exposes_all_dispatch_tools PASSED [ 11%] -tests/test_arch_boundary_phase2.py::TestArchBoundaryPhase2::test_toml_mutating_tools_disabled_by_default PASSED [ 11%] -tests/test_arch_boundary_phase3.py::TestArchBoundaryPhase3::test_cascade_blocks_multi_hop PASSED [ 11%] -tests/test_arch_boundary_phase3.py::TestArchBoundaryPhase3::test_cascade_blocks_simple PASSED [ 12%] -tests/test_arch_boundary_phase3.py::TestArchBoundaryPhase3::test_execution_engine_tick_cascades_blocks PASSED [ 12%] -tests/test_arch_boundary_phase3.py::TestArchBoundaryPhase3::test_in_progress_not_blocked PASSED [ 12%] -tests/test_arch_boundary_phase3.py::TestArchBoundaryPhase3::test_manual_unblock_restores_todo PASSED [ 13%] -tests/test_ast_parser.py::test_ast_parser_initialization PASSED [ 13%] -tests/test_ast_parser.py::test_ast_parser_parse PASSED [ 13%] -tests/test_ast_parser.py::test_ast_parser_get_skeleton_python PASSED [ 13%] -tests/test_ast_parser.py::test_ast_parser_invalid_language PASSED [ 14%] -tests/test_ast_parser.py::test_ast_parser_get_curated_view PASSED [ 14%] -tests/test_auto_whitelist.py::test_auto_whitelist_keywords PASSED [ 14%] -tests/test_auto_whitelist.py::test_auto_whitelist_message_count PASSED [ 15%] -tests/test_auto_whitelist.py::test_auto_whitelist_large_size PASSED [ 15%] -tests/test_auto_whitelist.py::test_no_auto_whitelist_insignificant PASSED [ 15%] -tests/test_cli_tool_bridge.py::TestCliToolBridge::test_allow_decision PASSED [ 16%] -tests/test_cli_tool_bridge.py::TestCliToolBridge::test_deny_decision PASSED [ 16%] -tests/test_cli_tool_bridge.py::TestCliToolBridge::test_unreachable_hook_server PASSED [ 16%] -tests/test_cli_tool_bridge_mapping.py::TestCliToolBridgeMapping::test_mapping_from_api_format PASSED [ 16%] -tests/test_conductor_api_hook_integration.py::test_conductor_integrates_api_hook_client_for_verification PASSED [ 17%] -tests/test_conductor_api_hook_integration.py::test_conductor_handles_api_hook_failure PASSED [ 17%] -tests/test_conductor_api_hook_integration.py::test_conductor_handles_api_hook_connection_error PASSED [ 17%] -tests/test_conductor_engine_v2.py::test_conductor_engine_initialization PASSED [ 18%] -tests/test_conductor_engine_v2.py::test_conductor_engine_run_executes_tickets_in_order PASSED [ 18%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_calls_ai_client_send PASSED [ 18%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_context_injection PASSED [ 19%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_handles_blocked_response PASSED [ 19%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_step_mode_confirmation PASSED [ 19%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_step_mode_rejection PASSED [ 20%] -tests/test_conductor_engine_v2.py::test_conductor_engine_dynamic_parsing_and_execution PASSED [ 20%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_pushes_response_via_queue PASSED [ 20%] -tests/test_conductor_engine_v2.py::test_run_worker_lifecycle_token_usage_from_comms_log PASSED [ 20%] -tests/test_conductor_tech_lead.py::TestConductorTechLead::test_generate_tickets_parse_error PASSED [ 21%] -tests/test_conductor_tech_lead.py::TestConductorTechLead::test_generate_tickets_success PASSED [ 21%] -tests/test_conductor_tech_lead.py::TestTopologicalSort::test_topological_sort_complex PASSED [ 21%] -tests/test_conductor_tech_lead.py::TestTopologicalSort::test_topological_sort_cycle PASSED [ 22%] -tests/test_conductor_tech_lead.py::TestTopologicalSort::test_topological_sort_empty PASSED [ 22%] -tests/test_conductor_tech_lead.py::TestTopologicalSort::test_topological_sort_linear PASSED [ 22%] -tests/test_conductor_tech_lead.py::TestTopologicalSort::test_topological_sort_missing_dependency PASSED [ 23%] -tests/test_conductor_tech_lead.py::test_topological_sort_vlog PASSED [ 23%] -tests/test_cost_tracker.py::test_estimate_cost PASSED [ 23%] -tests/test_dag_engine.py::test_get_ready_tasks_linear PASSED [ 23%] -tests/test_dag_engine.py::test_get_ready_tasks_branching PASSED [ 24%] -tests/test_dag_engine.py::test_has_cycle_no_cycle PASSED [ 24%] -tests/test_dag_engine.py::test_has_cycle_direct_cycle PASSED [ 24%] -tests/test_dag_engine.py::test_has_cycle_indirect_cycle PASSED [ 25%] -tests/test_dag_engine.py::test_has_cycle_complex_no_cycle PASSED [ 25%] -tests/test_dag_engine.py::test_get_ready_tasks_multiple_deps PASSED [ 25%] -tests/test_dag_engine.py::test_topological_sort PASSED [ 26%] -tests/test_dag_engine.py::test_topological_sort_cycle PASSED [ 26%] -tests/test_deepseek_infra.py::test_credentials_error_mentions_deepseek PASSED [ 26%] -tests/test_deepseek_infra.py::test_default_project_includes_reasoning_role PASSED [ 26%] -tests/test_deepseek_infra.py::test_gui_providers_list PASSED [ 27%] -tests/test_deepseek_infra.py::test_deepseek_model_listing PASSED [ 27%] -tests/test_deepseek_infra.py::test_gui_provider_list_via_hooks PASSED [ 27%] -tests/test_deepseek_provider.py::test_deepseek_model_selection PASSED [ 28%] -tests/test_deepseek_provider.py::test_deepseek_completion_logic PASSED [ 28%] -tests/test_deepseek_provider.py::test_deepseek_reasoning_logic PASSED [ 28%] -tests/test_deepseek_provider.py::test_deepseek_tool_calling PASSED [ 29%] -tests/test_deepseek_provider.py::test_deepseek_streaming PASSED [ 29%] -tests/test_execution_engine.py::test_execution_engine_basic_flow PASSED [ 29%] -tests/test_execution_engine.py::test_execution_engine_update_nonexistent_task PASSED [ 30%] -tests/test_execution_engine.py::test_execution_engine_status_persistence PASSED [ 30%] -tests/test_execution_engine.py::test_execution_engine_auto_queue PASSED [ 30%] -tests/test_execution_engine.py::test_execution_engine_step_mode PASSED [ 30%] -tests/test_execution_engine.py::test_execution_engine_approve_task PASSED [ 31%] -tests/test_extended_sims.py::test_context_sim_live PASSED [ 31%] -tests/test_extended_sims.py::test_ai_settings_sim_live PASSED [ 31%] -tests/test_extended_sims.py::test_tools_sim_live \ No newline at end of file diff --git a/test_output.txt b/test_output.txt deleted file mode 100644 index 89556ce..0000000 --- a/test_output.txt +++ /dev/null @@ -1,15 +0,0 @@ -============================= test session starts ============================= -platform win32 -- Python 3.11.6, pytest-9.0.2, pluggy-1.6.0 -- C:\projects\manual_slop\.venv\Scripts\python.exe -cachedir: .pytest_cache -rootdir: C:\projects\manual_slop -configfile: pyproject.toml -plugins: anyio-4.12.1, asyncio-1.3.0, cov-7.0.0, timeout-2.4.0 -asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function -timeout: 60.0s -timeout method: thread -timeout func_only: False -collecting ... collected 1 item - -tests/test_gui_stress_performance.py::test_comms_volume_stress_performance PASSED [100%] - -============================= 1 passed in 12.78s ============================== diff --git a/test_output2.txt b/test_output2.txt deleted file mode 100644 index 77e36b8..0000000 --- a/test_output2.txt +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================= -platform win32 -- Python 3.11.6, pytest-9.0.2, pluggy-1.6.0 -- C:\projects\manual_slop\.venv\Scripts\python.exe -cachedir: .pytest_cache -rootdir: C:\projects\manual_slop -configfile: pyproject.toml -plugins: anyio-4.12.1, asyncio-1.3.0, cov-7.0.0, timeout-2.4.0 -asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function -timeout: 60.0s -timeout method: thread -timeout func_only: False -collecting ... collected 4 items - -tests/test_extended_sims.py::test_context_sim_live PASSED [ 25%] -tests/test_extended_sims.py::test_ai_settings_sim_live PASSED [ 50%] -tests/test_extended_sims.py::test_tools_sim_live PASSED [ 75%] -tests/test_extended_sims.py::test_execution_sim_live \ No newline at end of file diff --git a/test_project.toml b/test_project.toml deleted file mode 100644 index 267f935..0000000 --- a/test_project.toml +++ /dev/null @@ -1,61 +0,0 @@ -[project] -name = "temp_project" -git_dir = "C:\\projects\\manual_slop" -system_prompt = "" -main_context = "" -word_wrap = true -summary_only = false -auto_scroll_comms = true -auto_scroll_tool_calls = true - -[output] -output_dir = "./md_gen" - -[files] -base_dir = "." -paths = [] - -[files.tier_assignments] - -[screenshots] -base_dir = "." -paths = [] - -[gemini_cli] -binary_path = "\"C:\\projects\\manual_slop\\.venv\\Scripts\\python.exe\" \"C:\\projects\\manual_slop\\tests\\mock_gemini_cli.py\"" - -[deepseek] -reasoning_effort = "medium" - -[agent.tools] -run_powershell = true -read_file = true -list_directory = true -search_files = true -get_file_summary = true -web_search = true -fetch_url = true -py_get_skeleton = true -py_get_code_outline = true -get_file_slice = true -py_get_definition = true -py_get_signature = true -py_get_class_summary = true -py_get_var_declaration = true -get_git_diff = true -py_find_usages = true -py_get_imports = true -py_check_syntax = true -py_get_hierarchy = true -py_get_docstring = true -get_tree = true -get_ui_performance = true -set_file_slice = false -py_update_definition = false -py_set_signature = false -py_set_var_declaration = false - -[mma] -epic = "Develop a new feature" -active_track_id = "" -tracks = [] diff --git a/test_project_history.toml b/test_project_history.toml deleted file mode 100644 index a418952..0000000 --- a/test_project_history.toml +++ /dev/null @@ -1,17 +0,0 @@ -roles = [ - "User", - "AI", - "Vendor API", - "System", - "Reasoning", -] -active = "main" -auto_add = true - -[discussions.main] -git_commit = "" -last_updated = "2026-03-04T21:34:40" -history = [ - "@2026-03-04T21:34:16\nUser:\nHello! This is an automated test. Just say 'Acknowledged'.", - "@2026-03-04T21:34:16\nAI:\nAcknowledged.", -]