diff --git a/.github/scripts/security_ci_guard.py b/.github/scripts/security_ci_guard.py index 81c0eaff..731510a6 100644 --- a/.github/scripts/security_ci_guard.py +++ b/.github/scripts/security_ci_guard.py @@ -2,9 +2,9 @@ from __future__ import annotations +import re from dataclasses import dataclass from pathlib import Path -import re from typing import Mapping import yaml diff --git a/scripts/quest_antigravity_probe.py b/scripts/quest_antigravity_probe.py index f2497b7c..c6aa9d8f 100644 --- a/scripts/quest_antigravity_probe.py +++ b/scripts/quest_antigravity_probe.py @@ -10,11 +10,9 @@ import argparse import json -from quest_runtime.antigravity_runner import ( - DEFAULT_AGY_BINARY, - run_antigravity_probe, - positive_finite_timeout, -) +from quest_runtime.antigravity_runner import (DEFAULT_AGY_BINARY, + positive_finite_timeout, + run_antigravity_probe) def parse_args() -> argparse.Namespace: diff --git a/scripts/quest_antigravity_runner.py b/scripts/quest_antigravity_runner.py index 41a57b80..63b5d151 100644 --- a/scripts/quest_antigravity_runner.py +++ b/scripts/quest_antigravity_runner.py @@ -12,11 +12,9 @@ import argparse import json -from quest_runtime.antigravity_runner import ( - DEFAULT_AGY_BINARY, - run_antigravity_role, - positive_finite_timeout, -) +from quest_runtime.antigravity_runner import (DEFAULT_AGY_BINARY, + positive_finite_timeout, + run_antigravity_role) from quest_runtime.artifacts import expected_artifacts_for_role diff --git a/scripts/quest_backfill_journal.py b/scripts/quest_backfill_journal.py index 49962d14..c54f2833 100644 --- a/scripts/quest_backfill_journal.py +++ b/scripts/quest_backfill_journal.py @@ -10,20 +10,18 @@ from pathlib import Path try: - from quest_celebrate.quest_data import extract_metadata_value, load_quest_data - from quest_complete import ( - build_celebration_data_section, - build_celebration_section, - build_quest_brief_section, - ) + from quest_celebrate.quest_data import (extract_metadata_value, + load_quest_data) + from quest_complete import (build_celebration_data_section, + build_celebration_section, + build_quest_brief_section) except ImportError: sys.path.insert(0, str(Path(__file__).resolve().parent)) - from quest_celebrate.quest_data import extract_metadata_value, load_quest_data - from quest_complete import ( - build_celebration_data_section, - build_celebration_section, - build_quest_brief_section, - ) + from quest_celebrate.quest_data import (extract_metadata_value, + load_quest_data) + from quest_complete import (build_celebration_data_section, + build_celebration_section, + build_quest_brief_section) UTC = timezone.utc diff --git a/scripts/quest_celebrate/animations.py b/scripts/quest_celebrate/animations.py index e01d20c3..b4df6007 100644 --- a/scripts/quest_celebrate/animations.py +++ b/scripts/quest_celebrate/animations.py @@ -7,24 +7,18 @@ from pathlib import Path from typing import Dict, List, Optional, TextIO, Tuple -from quest_celebrate.ascii_art import ( - block_letter_title, - get_credits_lines, - get_movie_credits_lines, - gremlin_battle_art, - gremlin_retirement_art, - render_achievements, - render_quality_score, - rocket_launch_art, - trophy_art, -) +from quest_celebrate.ascii_art import (block_letter_title, get_credits_lines, + get_movie_credits_lines, + gremlin_battle_art, + gremlin_retirement_art, + render_achievements, + render_quality_score, rocket_launch_art, + trophy_art) from quest_celebrate.config import CelebrationConfig -from quest_celebrate.progress import ( - animate_progress_bars, - render_phase_progress, - scroll_credits, -) -from quest_celebrate.quest_data import QUALITY_TIERS, QuestData, load_quest_data +from quest_celebrate.progress import (animate_progress_bars, + render_phase_progress, scroll_credits) +from quest_celebrate.quest_data import (QUALITY_TIERS, QuestData, + load_quest_data) from quest_runtime.quest_ids import parse_quest_id diff --git a/scripts/quest_celebrate/persist.py b/scripts/quest_celebrate/persist.py index e2b21e1f..50e74e3e 100644 --- a/scripts/quest_celebrate/persist.py +++ b/scripts/quest_celebrate/persist.py @@ -8,7 +8,8 @@ from pathlib import Path from quest_celebrate.ascii_art import ansi_shadow_title, render_quality_score -from quest_celebrate.quest_data import QUALITY_TIERS, QuestData, friendly_model_name +from quest_celebrate.quest_data import (QUALITY_TIERS, QuestData, + friendly_model_name) @dataclass(frozen=True) diff --git a/scripts/quest_claude_bg_run.py b/scripts/quest_claude_bg_run.py index 52e2be86..6d3f0579 100755 --- a/scripts/quest_claude_bg_run.py +++ b/scripts/quest_claude_bg_run.py @@ -68,7 +68,7 @@ import sys import time import uuid -from dataclasses import dataclass, field, asdict +from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Any diff --git a/scripts/quest_claude_probe.py b/scripts/quest_claude_probe.py index 9dbf4504..7cea84d4 100644 --- a/scripts/quest_claude_probe.py +++ b/scripts/quest_claude_probe.py @@ -10,13 +10,9 @@ import argparse import json -from quest_runtime.claude_runner import ( - DEFAULT_BG_RUNNER_SCRIPT, - DEFAULT_BRIDGE_SCRIPT, - resolve_path, - run_bg_probe, - run_bridge_probe, -) +from quest_runtime.claude_runner import (DEFAULT_BG_RUNNER_SCRIPT, + DEFAULT_BRIDGE_SCRIPT, resolve_path, + run_bg_probe, run_bridge_probe) def parse_args() -> argparse.Namespace: diff --git a/scripts/quest_claude_runner.py b/scripts/quest_claude_runner.py index 9a183540..b394f688 100644 --- a/scripts/quest_claude_runner.py +++ b/scripts/quest_claude_runner.py @@ -20,13 +20,10 @@ from pathlib import Path from quest_runtime.artifacts import expected_artifacts_for_role -from quest_runtime.claude_runner import ( - DEFAULT_BG_RUNNER_SCRIPT, - DEFAULT_BRIDGE_SCRIPT, - resolve_claude_transport, - resolve_path, - run_claude_role, -) +from quest_runtime.claude_runner import (DEFAULT_BG_RUNNER_SCRIPT, + DEFAULT_BRIDGE_SCRIPT, + resolve_claude_transport, + resolve_path, run_claude_role) _TELEMETRY_ENV = "QUEST_RUNNER_TELEMETRY_LOG" diff --git a/scripts/quest_complete.py b/scripts/quest_complete.py index 97e05f77..33c882f8 100644 --- a/scripts/quest_complete.py +++ b/scripts/quest_complete.py @@ -26,12 +26,10 @@ # Add scripts/ to path so we can import quest_celebrate sys.path.insert(0, str(Path(__file__).resolve().parent)) -from quest_celebrate.quest_data import ( - QuestData, - friendly_model_name, - load_quest_data, -) -from quest_celebrate.persist import CelebrationWriteResult, write_celebration_file +from quest_celebrate.persist import (CelebrationWriteResult, + write_celebration_file) +from quest_celebrate.quest_data import (QuestData, friendly_model_name, + load_quest_data) from quest_runtime.claude_runner import sweep_left_survivor from quest_runtime.quest_ids import parse_quest_id from quest_runtime.state import StateError, load_state diff --git a/scripts/quest_dashboard/loaders.py b/scripts/quest_dashboard/loaders.py index d5af1a42..19f7efe0 100644 --- a/scripts/quest_dashboard/loaders.py +++ b/scripts/quest_dashboard/loaders.py @@ -13,12 +13,13 @@ from datetime import date, datetime, timezone from pathlib import Path -from quest_celebrate.quest_data import ( - QUALITY_TIERS, - extract_celebration_data_from_journal as _extract_celebration_data, - extract_metadata_value as _extract_metadata, - friendly_model_name as _friendly_model_name, -) +from quest_celebrate.quest_data import QUALITY_TIERS +from quest_celebrate.quest_data import \ + extract_celebration_data_from_journal as _extract_celebration_data +from quest_celebrate.quest_data import \ + extract_metadata_value as _extract_metadata +from quest_celebrate.quest_data import \ + friendly_model_name as _friendly_model_name from quest_runtime.quest_ids import parse_quest_id from .models import ActiveQuest, DashboardData, JournalEntry diff --git a/scripts/quest_parse_overrides.py b/scripts/quest_parse_overrides.py index 0e9f63fe..a6401722 100644 --- a/scripts/quest_parse_overrides.py +++ b/scripts/quest_parse_overrides.py @@ -6,7 +6,8 @@ import json import sys -from quest_runtime.orchestration import OverrideParseError, parse_override_input +from quest_runtime.orchestration import (OverrideParseError, + parse_override_input) def main() -> int: diff --git a/scripts/quest_plan_iteration.py b/scripts/quest_plan_iteration.py index 52d75c67..35447201 100644 --- a/scripts/quest_plan_iteration.py +++ b/scripts/quest_plan_iteration.py @@ -7,13 +7,10 @@ import json import sys -from quest_runtime.plan_iterations import ( - PlanIterationError, - cleanup_current, - publish_refinement, - snapshot_plan_iteration, - verify_refinement, -) +from quest_runtime.plan_iterations import (PlanIterationError, cleanup_current, + publish_refinement, + snapshot_plan_iteration, + verify_refinement) from quest_runtime.state import StateError diff --git a/scripts/quest_pr_shepherd_collect_intake.py b/scripts/quest_pr_shepherd_collect_intake.py index d779c103..23530525 100644 --- a/scripts/quest_pr_shepherd_collect_intake.py +++ b/scripts/quest_pr_shepherd_collect_intake.py @@ -10,12 +10,8 @@ from pathlib import Path from typing import Any -from quest_runtime.pr_shepherd import ( - SUMMARY_MARKER, - activity_state, - has_marker, - stable_fingerprint, -) +from quest_runtime.pr_shepherd import (SUMMARY_MARKER, activity_state, + has_marker, stable_fingerprint) PER_PAGE = 100 CHECK_FAILURE_STATES = { diff --git a/scripts/quest_pr_shepherd_post_reply.py b/scripts/quest_pr_shepherd_post_reply.py index a02fec52..9b2e6c7e 100644 --- a/scripts/quest_pr_shepherd_post_reply.py +++ b/scripts/quest_pr_shepherd_post_reply.py @@ -10,14 +10,9 @@ from pathlib import Path from typing import Any -from quest_runtime.pr_shepherd import ( - ADDRESSED_MARKER, - FOLLOWUP_MARKER, - SUMMARY_MARKER, - append_marker, - compact_summary_body, - has_marker, -) +from quest_runtime.pr_shepherd import (ADDRESSED_MARKER, FOLLOWUP_MARKER, + SUMMARY_MARKER, append_marker, + compact_summary_body, has_marker) PER_PAGE = 100 diff --git a/scripts/quest_review_intelligence.py b/scripts/quest_review_intelligence.py index 86251259..80404375 100644 --- a/scripts/quest_review_intelligence.py +++ b/scripts/quest_review_intelligence.py @@ -8,25 +8,20 @@ from pathlib import Path from typing import Any -from quest_runtime.pr_review_cycle import ( - allowlist_path_from_context, - build_fix_batches, - classify_pr_operational_state, - classify_pr_loop_stop, - normalize_pr_review_intake, - retag_backlog_at_cap, - select_validation_steps, -) -from quest_runtime.review_intelligence import ( - append_deferred_findings, - build_review_backlog, - merge_and_dedupe, - scan_deferred_backlog, - utc_now_iso, - validate_plan_phase_defaults, - validate_review_backlog, - validate_findings, -) +from quest_runtime.pr_review_cycle import (allowlist_path_from_context, + build_fix_batches, + classify_pr_loop_stop, + classify_pr_operational_state, + normalize_pr_review_intake, + retag_backlog_at_cap, + select_validation_steps) +from quest_runtime.review_intelligence import (append_deferred_findings, + build_review_backlog, + merge_and_dedupe, + scan_deferred_backlog, + utc_now_iso, validate_findings, + validate_plan_phase_defaults, + validate_review_backlog) def _load_json(path: Path) -> Any: diff --git a/scripts/quest_runtime/__init__.py b/scripts/quest_runtime/__init__.py index a3a2d456..1c7896ae 100644 --- a/scripts/quest_runtime/__init__.py +++ b/scripts/quest_runtime/__init__.py @@ -1,59 +1,32 @@ """Quest runtime helpers for orchestration scripts.""" -from .orchestration import ( - CANONICAL_ROLES, - CLAUDE_ROLE_TRANSPORTS, - DEFAULT_CLAUDE_ROLE_TRANSPORT, - ORCHESTRATION_VERSION, - SOLO_UNUSED_ROLES, - Override, - OverrideParseError, - active_roles_for_mode, - apply_overrides, - build_default_models, - build_snapshot_models, - is_antigravity_model, - is_claude_model, - runtime_for_model, - is_model_available, - is_model_available_for_orchestrator, - load_codex_available_from_cache, - migrate_from_snapshot, - parse_override_input, - parse_override_line, - validate_or_remap_models_for_orchestrator, - write_default_from_allowlist, - write_orchestration_json, -) -from .artifacts import ( - ROLE_ARTIFACTS, - any_artifact_missing_or_empty, - check_artifact_paths, - default_quest_dir, - expected_artifacts_for_role, - is_workspace_local, - prepare_artifact_files, -) -from .quest_ids import ( - DATE_FIRST, - DEFAULT_QUEST_ID_FORMAT, - SLUG_FIRST, - VALID_QUEST_ID_FORMATS, - ParsedQuestId, - format_quest_id, - is_quest_id, - load_quest_id_format, - normalize_quest_id_format, - parse_quest_id, -) -from .plan_iterations import ( - PlanIterationError, - cleanup_current_plan_iteration, - publish_refinement, - snapshot_plan_iteration, - verify_plan_iteration_snapshot, - verify_refinement, -) +from .artifacts import (ROLE_ARTIFACTS, any_artifact_missing_or_empty, + check_artifact_paths, default_quest_dir, + expected_artifacts_for_role, is_workspace_local, + prepare_artifact_files) +from .orchestration import (CANONICAL_ROLES, CLAUDE_ROLE_TRANSPORTS, + DEFAULT_CLAUDE_ROLE_TRANSPORT, + ORCHESTRATION_VERSION, SOLO_UNUSED_ROLES, Override, + OverrideParseError, active_roles_for_mode, + apply_overrides, build_default_models, + build_snapshot_models, is_antigravity_model, + is_claude_model, is_model_available, + is_model_available_for_orchestrator, + load_codex_available_from_cache, + migrate_from_snapshot, parse_override_input, + parse_override_line, runtime_for_model, + validate_or_remap_models_for_orchestrator, + write_default_from_allowlist, + write_orchestration_json) +from .plan_iterations import (PlanIterationError, + cleanup_current_plan_iteration, + publish_refinement, snapshot_plan_iteration, + verify_plan_iteration_snapshot, + verify_refinement) +from .quest_ids import (DATE_FIRST, DEFAULT_QUEST_ID_FORMAT, SLUG_FIRST, + VALID_QUEST_ID_FORMATS, ParsedQuestId, format_quest_id, + is_quest_id, load_quest_id_format, + normalize_quest_id_format, parse_quest_id) __all__ = [ "CANONICAL_ROLES", diff --git a/scripts/quest_runtime/antigravity_runner.py b/scripts/quest_runtime/antigravity_runner.py index ea9354f5..50e293a0 100644 --- a/scripts/quest_runtime/antigravity_runner.py +++ b/scripts/quest_runtime/antigravity_runner.py @@ -26,20 +26,14 @@ from pathlib import Path from typing import Iterable -from quest_runtime.artifacts import ( - any_artifact_missing_or_empty, - prepare_artifact_files, -) -from quest_runtime.claude_runner import ( - RunResult, - append_context_health_log, - classify_handoff_file, - extract_text_handoff, - extract_text_status, - read_handoff_status, - resolve_path, - unique_dirs, -) +from quest_runtime.artifacts import (any_artifact_missing_or_empty, + prepare_artifact_files) +from quest_runtime.claude_runner import (RunResult, append_context_health_log, + classify_handoff_file, + extract_text_handoff, + extract_text_status, + read_handoff_status, resolve_path, + unique_dirs) from quest_runtime.plan_iterations import PlanIterationError from quest_runtime.state import StateError diff --git a/scripts/quest_runtime/claude_runner.py b/scripts/quest_runtime/claude_runner.py index 282c14ee..aadb9a1d 100644 --- a/scripts/quest_runtime/claude_runner.py +++ b/scripts/quest_runtime/claude_runner.py @@ -19,11 +19,9 @@ from pathlib import Path from typing import Iterable -from quest_runtime.artifacts import ( - any_artifact_missing_or_empty, - check_artifact_paths, - prepare_artifact_files, -) +from quest_runtime.artifacts import (any_artifact_missing_or_empty, + check_artifact_paths, + prepare_artifact_files) from quest_runtime.orchestration import runtime_for_model from quest_runtime.plan_iterations import PlanIterationError from quest_runtime.state import StateError, utc_now_iso diff --git a/scripts/quest_runtime/plan_iterations.py b/scripts/quest_runtime/plan_iterations.py index 93856001..134e6b07 100644 --- a/scripts/quest_runtime/plan_iterations.py +++ b/scripts/quest_runtime/plan_iterations.py @@ -10,8 +10,8 @@ import tempfile from pathlib import Path -from .state import _lock_file, load_state from .review_intelligence import validate_findings +from .state import _lock_file, load_state class PlanIterationError(Exception): diff --git a/scripts/quest_runtime/pr_review_cycle.py b/scripts/quest_runtime/pr_review_cycle.py index b82826f6..727a2588 100644 --- a/scripts/quest_runtime/pr_review_cycle.py +++ b/scripts/quest_runtime/pr_review_cycle.py @@ -6,19 +6,15 @@ import json from pathlib import Path, PurePosixPath -from quest_runtime.review_intelligence import ( - ALLOWED_DECISIONS, - _batch_from_finding, - merge_and_dedupe, - review_local_index_from_value, - select_decision, - validate_findings, -) -from quest_runtime.pr_shepherd import ( - classify_operational_state, - merge_activity_state, - stable_fingerprint, -) +from quest_runtime.pr_shepherd import (classify_operational_state, + merge_activity_state, + stable_fingerprint) +from quest_runtime.review_intelligence import (ALLOWED_DECISIONS, + _batch_from_finding, + merge_and_dedupe, + review_local_index_from_value, + select_decision, + validate_findings) INTAKE_SOURCES = ( "ci_check", diff --git a/scripts/quest_state.py b/scripts/quest_state.py index 8e45c45d..3110b1b3 100644 --- a/scripts/quest_state.py +++ b/scripts/quest_state.py @@ -25,14 +25,9 @@ import sys from pathlib import Path -from quest_runtime.state import ( - PhaseMismatchError, - ReplanError, - StateError, - record_user_replan_feedback, - transition_state, - update_state, -) +from quest_runtime.state import (PhaseMismatchError, ReplanError, StateError, + record_user_replan_feedback, transition_state, + update_state) def find_validator() -> Path: diff --git a/tests/unit/test_antigravity_runner.py b/tests/unit/test_antigravity_runner.py index 3512dd6a..bba48e59 100644 --- a/tests/unit/test_antigravity_runner.py +++ b/tests/unit/test_antigravity_runner.py @@ -2,28 +2,25 @@ from __future__ import annotations -import stat -from pathlib import Path - import argparse import json +import stat import subprocess import sys +from pathlib import Path -from quest_runtime.antigravity_runner import ( - AGY_MODE_READ_ONLY, - AGY_MODE_WRITE, - MAX_PROMPT_ARGV_BYTES, - MAX_TIMEOUT_SECONDS, - agy_mode_for_agent, - build_agy_cmd, - classify_agy_result_kind, - normalize_agy_cli_model, - parse_agy_envelope, - positive_finite_timeout, - rejected_model_for, - run_antigravity_role, -) +from quest_runtime.antigravity_runner import (AGY_MODE_READ_ONLY, + AGY_MODE_WRITE, + MAX_PROMPT_ARGV_BYTES, + MAX_TIMEOUT_SECONDS, + agy_mode_for_agent, + build_agy_cmd, + classify_agy_result_kind, + normalize_agy_cli_model, + parse_agy_envelope, + positive_finite_timeout, + rejected_model_for, + run_antigravity_role) def _fake_agy(path: Path, body: str) -> str: diff --git a/tests/unit/test_artifacts.py b/tests/unit/test_artifacts.py index 512187da..b530e15f 100644 --- a/tests/unit/test_artifacts.py +++ b/tests/unit/test_artifacts.py @@ -7,26 +7,17 @@ from pathlib import Path import pytest - import quest_runtime.claude_runner as claude_runner_module +from quest_runtime.artifacts import (ROLE_ARTIFACTS, SOLO_DISABLED_AGENTS, + any_artifact_missing_or_empty, + check_artifact_paths, default_quest_dir, + expected_artifacts_for_role, + is_workspace_local, + prepare_artifact_files) +from quest_runtime.claude_runner import (RunResult, classify_failure_kind, + classify_result_kind, run_claude_role) from quest_runtime.plan_iterations import PlanIterationError from quest_runtime.state import StateError -from quest_runtime.artifacts import ( - ROLE_ARTIFACTS, - SOLO_DISABLED_AGENTS, - any_artifact_missing_or_empty, - check_artifact_paths, - default_quest_dir, - expected_artifacts_for_role, - is_workspace_local, - prepare_artifact_files, -) -from quest_runtime.claude_runner import ( - RunResult, - classify_failure_kind, - classify_result_kind, - run_claude_role, -) # --------------------------------------------------------------------------- # Artifact resolution diff --git a/tests/unit/test_canonical_role_lockstep.py b/tests/unit/test_canonical_role_lockstep.py index 1dbafd3f..df8a2792 100644 --- a/tests/unit/test_canonical_role_lockstep.py +++ b/tests/unit/test_canonical_role_lockstep.py @@ -22,16 +22,10 @@ import re from pathlib import Path -from quest_runtime.artifacts import ( - ROLE_ARTIFACTS, - ROLE_PHASE_ALIASES, - SOLO_DISABLED_AGENTS, -) -from quest_runtime.orchestration import ( - CANONICAL_ROLES, - DEFAULT_MODELS, - SOLO_UNUSED_ROLES, -) +from quest_runtime.artifacts import (ROLE_ARTIFACTS, ROLE_PHASE_ALIASES, + SOLO_DISABLED_AGENTS) +from quest_runtime.orchestration import (CANONICAL_ROLES, DEFAULT_MODELS, + SOLO_UNUSED_ROLES) CANONICAL = set(CANONICAL_ROLES) @@ -148,10 +142,8 @@ def test_shipped_model_defaults_are_generated_from_allowlist() -> None: def test_codex_effort_is_pinned_and_legacy_snapshot_stays_unset(tmp_path: Path) -> None: - from quest_runtime.orchestration import ( - write_default_from_allowlist, - migrate_from_snapshot, - ) + from quest_runtime.orchestration import (migrate_from_snapshot, + write_default_from_allowlist) path = tmp_path / "new" / "orchestration.json" write_default_from_allowlist(path, DEFAULT_MODELS, codex_reasoning_effort="medium") @@ -181,6 +173,7 @@ def test_invalid_codex_effort_does_not_write_orchestration(tmp_path: Path) -> No def test_generator_updates_policy_without_changing_permissions(tmp_path: Path) -> None: import shutil + from quest_sync_model_defaults import sync paths = [ @@ -237,6 +230,7 @@ def test_resume_preserves_snapshot_effort_and_rejects_invalid_effort( def test_generator_rejects_invalid_policy_before_writing(tmp_path: Path) -> None: import shutil + import pytest from quest_sync_model_defaults import sync diff --git a/tests/unit/test_documented_phase_lockstep.py b/tests/unit/test_documented_phase_lockstep.py index b44b1435..b8c7cb54 100644 --- a/tests/unit/test_documented_phase_lockstep.py +++ b/tests/unit/test_documented_phase_lockstep.py @@ -23,7 +23,6 @@ from pathlib import Path import pytest - from quest_runtime.artifacts import expected_artifacts_for_role from quest_runtime.orchestration import CANONICAL_ROLES diff --git a/tests/unit/test_plan_iteration_lifecycle.py b/tests/unit/test_plan_iteration_lifecycle.py index 4c36a163..e67fa780 100644 --- a/tests/unit/test_plan_iteration_lifecycle.py +++ b/tests/unit/test_plan_iteration_lifecycle.py @@ -10,17 +10,14 @@ from pathlib import Path import pytest - import quest_runtime.plan_iterations as plan_iterations_module from quest_runtime.artifacts import prepare_artifact_files -from quest_runtime.plan_iterations import ( - PlanIterationError, - cleanup_current_plan_iteration, - publish_refinement, - snapshot_plan_iteration, - verify_plan_iteration_snapshot, - verify_refinement, -) +from quest_runtime.plan_iterations import (PlanIterationError, + cleanup_current_plan_iteration, + publish_refinement, + snapshot_plan_iteration, + verify_plan_iteration_snapshot, + verify_refinement) from quest_runtime.state import update_state REPO_ROOT = Path(__file__).resolve().parents[2] diff --git a/tests/unit/test_pr_review_cycle.py b/tests/unit/test_pr_review_cycle.py index f3e02f2b..eda5c847 100644 --- a/tests/unit/test_pr_review_cycle.py +++ b/tests/unit/test_pr_review_cycle.py @@ -3,20 +3,18 @@ from __future__ import annotations import json -from pathlib import Path import random import subprocess import sys +from pathlib import Path import pytest - -from quest_runtime.pr_review_cycle import ( - build_fix_batches, - classify_pr_operational_state, - classify_pr_loop_stop, - normalize_pr_review_intake, -) -from quest_runtime.review_intelligence import build_review_backlog, validate_findings +from quest_runtime.pr_review_cycle import (build_fix_batches, + classify_pr_loop_stop, + classify_pr_operational_state, + normalize_pr_review_intake) +from quest_runtime.review_intelligence import (build_review_backlog, + validate_findings) def _validation_step(target: str, *, level: int = 1) -> list[dict[str, object]]: diff --git a/tests/unit/test_pr_shepherd.py b/tests/unit/test_pr_shepherd.py index ff6e5b91..ded959db 100644 --- a/tests/unit/test_pr_shepherd.py +++ b/tests/unit/test_pr_shepherd.py @@ -4,22 +4,17 @@ from pathlib import Path import pytest - import quest_pr_shepherd_annotate_scope import quest_pr_shepherd_checkout import quest_pr_shepherd_collect_intake import quest_pr_shepherd_fetch_failed_logs import quest_pr_shepherd_post_reply -from quest_runtime.pr_shepherd import ( - ADDRESSED_MARKER, - FOLLOWUP_MARKER, - SUMMARY_MARKER, - append_marker, - activity_state, - classify_operational_state, - compact_summary_body, - stable_fingerprint, -) +from quest_runtime.pr_shepherd import (ADDRESSED_MARKER, FOLLOWUP_MARKER, + SUMMARY_MARKER, activity_state, + append_marker, + classify_operational_state, + compact_summary_body, + stable_fingerprint) class _Result: diff --git a/tests/unit/test_quest_celebrate.py b/tests/unit/test_quest_celebrate.py index 9d2b58f8..b2c9fe53 100644 --- a/tests/unit/test_quest_celebrate.py +++ b/tests/unit/test_quest_celebrate.py @@ -11,63 +11,36 @@ from unittest.mock import patch import pytest - -from quest_celebrate.animations import ( - QuestStats, - celebrate, - load_quest_stats, - render_end_credits, - render_epic, - render_minimal, - render_silly, - render_standard, -) -from quest_celebrate.ascii_art import ( - ansi_shadow_title, - block_letter_title, - box_banner, - get_credits_lines, - get_movie_credits_lines, - gremlin_battle_art, - gremlin_retirement_art, - render_achievements, - render_impact_metrics, - render_quality_score, - rocket_launch_art, - trophy_art, -) +from quest_celebrate.animations import (QuestStats, celebrate, + load_quest_stats, render_end_credits, + render_epic, render_minimal, + render_silly, render_standard) +from quest_celebrate.ascii_art import (ansi_shadow_title, block_letter_title, + box_banner, get_credits_lines, + get_movie_credits_lines, + gremlin_battle_art, + gremlin_retirement_art, + render_achievements, + render_impact_metrics, + render_quality_score, rocket_launch_art, + trophy_art) from quest_celebrate.config import CelebrationConfig, load_config -from quest_celebrate.quest_data import ( - QUALITY_TIERS, - CarryoverFindings, - _load_allowlist_quality_defaults, - extract_celebration_data_from_journal, - compute_quality_tier, - friendly_model_name, - load_quest_data_from_journal, -) -from quest_celebrate.progress import ( - render_progress_bar, - render_phase_progress, - scroll_credits, -) -from quest_celebrate.quest_data import ( - Achievement, - AgentInfo, - QuestData, - load_quest_data, -) -from quest_celebrate.persist import ( - extract_what_started_this, - render_persisted_celebration, - select_quest_quote, - write_celebration_file, -) -from quest_celebrate.terminal import ( - TerminalCaps, - detect_terminal_capabilities, - is_safe_mode, -) +from quest_celebrate.persist import (extract_what_started_this, + render_persisted_celebration, + select_quest_quote, + write_celebration_file) +from quest_celebrate.progress import (render_phase_progress, + render_progress_bar, scroll_credits) +from quest_celebrate.quest_data import (QUALITY_TIERS, Achievement, AgentInfo, + CarryoverFindings, QuestData, + _load_allowlist_quality_defaults, + compute_quality_tier, + extract_celebration_data_from_journal, + friendly_model_name, load_quest_data, + load_quest_data_from_journal) +from quest_celebrate.terminal import (TerminalCaps, + detect_terminal_capabilities, + is_safe_mode) class TestRenderMinimal: diff --git a/tests/unit/test_quest_claude_bg_run.py b/tests/unit/test_quest_claude_bg_run.py index 967f4c23..9a2a1d55 100644 --- a/tests/unit/test_quest_claude_bg_run.py +++ b/tests/unit/test_quest_claude_bg_run.py @@ -21,7 +21,6 @@ from pathlib import Path import pytest - import quest_claude_bg_run as bg # Captured at import, BEFORE the autouse `kills` fixture patches bg.os.kill: diff --git a/tests/unit/test_quest_claude_bridge.py b/tests/unit/test_quest_claude_bridge.py index 871f5d03..56bf846f 100644 --- a/tests/unit/test_quest_claude_bridge.py +++ b/tests/unit/test_quest_claude_bridge.py @@ -4,7 +4,6 @@ import subprocess import pytest - import quest_claude_bg_run as bg import quest_claude_bridge as bridge diff --git a/tests/unit/test_quest_complete.py b/tests/unit/test_quest_complete.py index 05ddac7e..d4a6ccf4 100644 --- a/tests/unit/test_quest_complete.py +++ b/tests/unit/test_quest_complete.py @@ -1,16 +1,15 @@ """Unit tests for quest_complete journal rendering.""" -from datetime import date import json -from pathlib import Path import sys +from datetime import date +from pathlib import Path from types import SimpleNamespace import pytest - import quest_complete -from quest_complete import build_journal_entry from quest_celebrate.quest_data import QuestData +from quest_complete import build_journal_entry def test_generate_journal_entry_prefers_full_original_prompt(): diff --git a/tests/unit/test_quest_dashboard_loaders.py b/tests/unit/test_quest_dashboard_loaders.py index f0384b60..e70dc669 100644 --- a/tests/unit/test_quest_dashboard_loaders.py +++ b/tests/unit/test_quest_dashboard_loaders.py @@ -5,20 +5,14 @@ from datetime import date, datetime from pathlib import Path -from quest_dashboard.loaders import ( - _extract_celebration_data, - _extract_iterations, - _extract_metadata, - _extract_outcome_pitch, - _extract_summary_pitch, - _friendly_model_name, - _normalize_status, - _parse_active_quest, - _parse_journal_entry, - load_active_quests, - load_dashboard_data, - load_journal_entries, -) +from quest_dashboard.loaders import (_extract_celebration_data, + _extract_iterations, _extract_metadata, + _extract_outcome_pitch, + _extract_summary_pitch, + _friendly_model_name, _normalize_status, + _parse_active_quest, _parse_journal_entry, + load_active_quests, load_dashboard_data, + load_journal_entries) def test_load_journal_entry_extracts_all_fields(tmp_path): diff --git a/tests/unit/test_quest_ids.py b/tests/unit/test_quest_ids.py index 7ee1059c..0f5eb246 100644 --- a/tests/unit/test_quest_ids.py +++ b/tests/unit/test_quest_ids.py @@ -7,17 +7,10 @@ from pathlib import Path import pytest - -from quest_runtime.quest_ids import ( - DATE_FIRST, - DEFAULT_QUEST_ID_FORMAT, - SLUG_FIRST, - format_quest_id, - is_quest_id, - load_quest_id_format, - normalize_quest_id_format, - parse_quest_id, -) +from quest_runtime.quest_ids import (DATE_FIRST, DEFAULT_QUEST_ID_FORMAT, + SLUG_FIRST, format_quest_id, is_quest_id, + load_quest_id_format, + normalize_quest_id_format, parse_quest_id) def test_format_quest_id_defaults_to_slug_first() -> None: diff --git a/tests/unit/test_quest_runtime.py b/tests/unit/test_quest_runtime.py index cd896183..69f53ee4 100644 --- a/tests/unit/test_quest_runtime.py +++ b/tests/unit/test_quest_runtime.py @@ -2,28 +2,22 @@ from __future__ import annotations +import json import stat import subprocess -import json from argparse import Namespace from pathlib import Path import quest_claude_probe import quest_claude_runner import quest_runtime.claude_runner as claude_runner_module -from quest_runtime.claude_runner import ( - CODEX_LED_CODEX_VIOLATION_GUIDANCE, - run_bridge_probe, - run_claude_role, - select_role_runtime, -) +from quest_runtime.claude_runner import (CODEX_LED_CODEX_VIOLATION_GUIDANCE, + run_bridge_probe, run_claude_role, + select_role_runtime) from quest_runtime.orchestration import ( - is_antigravity_model, - is_model_available, - is_model_available_for_orchestrator, - runtime_for_model, - validate_or_remap_models_for_orchestrator, -) + is_antigravity_model, is_model_available, + is_model_available_for_orchestrator, runtime_for_model, + validate_or_remap_models_for_orchestrator) def _write_executable(path: Path, body: str) -> None: @@ -2471,7 +2465,8 @@ class CP: def test_validate_or_remap_treats_unset_active_model_as_unavailable(): - from quest_runtime.orchestration import validate_or_remap_models_for_orchestrator + from quest_runtime.orchestration import \ + validate_or_remap_models_for_orchestrator models = {"planner": None, "builder": "", "arbiter": "claude"} @@ -2511,10 +2506,8 @@ def test_default_helper_script_paths_are_absolute_and_resolve_off_package(): # ideas/2026-06-15-bug-report-... bg-transport-step2. import os - from quest_runtime.claude_runner import ( - DEFAULT_BG_RUNNER_SCRIPT, - DEFAULT_BRIDGE_SCRIPT, - ) + from quest_runtime.claude_runner import (DEFAULT_BG_RUNNER_SCRIPT, + DEFAULT_BRIDGE_SCRIPT) for path in (DEFAULT_BRIDGE_SCRIPT, DEFAULT_BG_RUNNER_SCRIPT): assert os.path.isabs(path), f"{path} should be absolute" @@ -2527,7 +2520,6 @@ def test_cli_probe_requires_explicit_model_and_default_bridge_script_is_absolute # The probe's argparse default must be the absolute sibling path, not the # legacy cwd-relative "scripts/quest_claude_bridge.py". import os - import sys import quest_claude_probe diff --git a/tests/unit/test_quest_startup_symlink.py b/tests/unit/test_quest_startup_symlink.py index d9fbff65..b06e6b1e 100644 --- a/tests/unit/test_quest_startup_symlink.py +++ b/tests/unit/test_quest_startup_symlink.py @@ -8,9 +8,9 @@ from pathlib import Path import pytest - import quest_startup_branch -from quest_startup_branch import apply_quest_symlink, ensure_shared_quest_symlink +from quest_startup_branch import (apply_quest_symlink, + ensure_shared_quest_symlink) SCRIPT = Path(quest_startup_branch.__file__).resolve() diff --git a/tests/unit/test_quest_state.py b/tests/unit/test_quest_state.py index ce14cb1d..5810552c 100644 --- a/tests/unit/test_quest_state.py +++ b/tests/unit/test_quest_state.py @@ -7,15 +7,14 @@ from __future__ import annotations -import json import hashlib +import json import stat import subprocess import sys from pathlib import Path import pytest - import quest_state from quest_runtime import state as state_runtime diff --git a/tests/unit/test_review_intelligence.py b/tests/unit/test_review_intelligence.py index dd1f2baf..a6d135ee 100644 --- a/tests/unit/test_review_intelligence.py +++ b/tests/unit/test_review_intelligence.py @@ -4,9 +4,9 @@ import argparse import json -from pathlib import Path import subprocess import sys +from pathlib import Path import pytest @@ -17,23 +17,13 @@ sys.path.insert(0, _scripts_dir) import quest_review_intelligence -from quest_runtime.pr_review_cycle import ( - normalize_pr_review_intake, - retag_backlog_at_cap, -) +from quest_runtime.pr_review_cycle import (normalize_pr_review_intake, + retag_backlog_at_cap) from quest_runtime.review_intelligence import ( - ALLOWED_BACKLOG_PHASES, - append_deferred_findings, - build_review_backlog, - merge_and_dedupe, - scan_deferred_backlog, - select_decision, - synthesize_findings_from_review_markdown, - synthesize_plan_review_findings, - validate_plan_phase_defaults, - validate_review_backlog, - validate_findings, -) + ALLOWED_BACKLOG_PHASES, append_deferred_findings, build_review_backlog, + merge_and_dedupe, scan_deferred_backlog, select_decision, + synthesize_findings_from_review_markdown, synthesize_plan_review_findings, + validate_findings, validate_plan_phase_defaults, validate_review_backlog) def _finding( diff --git a/tests/unit/test_ux_findings_schema.py b/tests/unit/test_ux_findings_schema.py index 0fe3663b..ee8be5ff 100644 --- a/tests/unit/test_ux_findings_schema.py +++ b/tests/unit/test_ux_findings_schema.py @@ -34,7 +34,8 @@ def _extract_example_finding() -> dict: def test_ux_example_finding_validates_against_canonical_schema() -> None: sys.path.insert(0, str(_repo_root() / "scripts")) - from quest_runtime.review_intelligence import validate_finding # noqa: E402 + from quest_runtime.review_intelligence import \ + validate_finding # noqa: E402 finding = _extract_example_finding() # Coerce any placeholder strings into valid example values.