del
This commit is contained in:
@@ -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")
|
|
||||||
38
add_debug.py
38
add_debug.py
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
28
add_waits.py
28
add_waits.py
@@ -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")
|
|
||||||
15
debug3.py
15
debug3.py
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
27
debug_gen.py
27
debug_gen.py
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
52
fix_orch.py
52
fix_orch.py
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
@@ -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")
|
|
||||||
67
run_repro.py
67
run_repro.py
@@ -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()
|
|
||||||
113
run_tests.py
113
run_tests.py
@@ -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()
|
|
||||||
@@ -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")
|
|
||||||
BIN
temp_conftest.py
BIN
temp_conftest.py
Binary file not shown.
Binary file not shown.
BIN
temp_gui_old.py
BIN
temp_gui_old.py
Binary file not shown.
BIN
temp_gui_old2.py
BIN
temp_gui_old2.py
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
Callback executed: f1fa1f15-2d76-40f8-8d75-960476ceec85
|
|
||||||
@@ -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)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[DEBUG] _process_event_queue entered
|
|
||||||
@@ -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()
|
|
||||||
@@ -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()
|
|
||||||
118
test_out.txt
118
test_out.txt
@@ -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
|
|
||||||
@@ -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 ==============================
|
|
||||||
@@ -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
|
|
||||||
@@ -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 = []
|
|
||||||
@@ -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.",
|
|
||||||
]
|
|
||||||
Reference in New Issue
Block a user