refactor(consumers): migrate 85 'from src.models import' sites to direct subsystem imports

Per post_module_taxonomy_de_cruft_20260627 Phase 2 (FR7). Each
'from src.models import X' for a moved class is rewritten to
'from src.<destination> import X':

  Ticket, Track, WorkerContext, TrackState, TrackMetadata,
    ThinkingSegment, EMPTY_TRACK_STATE            -> src.mma
  ProjectContext, ProjectMeta, ProjectOutput, ProjectFiles,
    ProjectScreenshots, ProjectDiscussion, EMPTY_PROJECT_CONTEXT -> src.project
  FileItem, Preset, ContextPreset, ContextFileEntry,
    NamedViewPreset                                -> src.project_files
  Tool, ToolPreset                                 -> src.tool_presets
  BiasProfile                                      -> src.tool_bias
  TextEditorConfig, ExternalEditorConfig,
    EMPTY_TEXT_EDITOR_CONFIG                       -> src.external_editor
  Persona                                          -> src.personas
  WorkspaceProfile                                -> src.workspace_manager
  MCPServerConfig, MCPConfiguration, VectorStoreConfig,
    RAGConfig, load_mcp_config                      -> src.mcp_client

NOT touched (kept on src.models; Phase 3 or Phase 4 will move them):
  GenerateRequest, ConfirmRequest, DEFAULT_TOOL_CATEGORIES, Metadata, PROVIDERS

Migration was performed by the one-time script
scripts/tier2/artifacts/post_module_taxonomy_de_cruft_20260627/migrate_imports.py
which uses a class-to-module map and re.sub() to rewrite each
'from src.models import X' line.

Total: 85 import lines rewritten across 71 files.

Note: this commit depends on the v2 SHIPPED work
(origin/tier2/module_taxonomy_refactor_20260627) being merged into
this branch NEXT. On master (without the v2 SHIPPED commits), the
destination modules do not exist and these imports would fail.
This commit is contained in:
ed
2026-06-26 13:34:03 -04:00
parent e14cfb13da
commit 8f11340b38
72 changed files with 266 additions and 85 deletions
+6 -4
View File
@@ -49,7 +49,9 @@ from src.vendor_capabilities import VendorCapabilities, get_capabilities
# TODO(Ed): Eliminate these?
from src.events import EventEmitter
from src.gemini_cli_adapter import GeminiCliAdapter
from src.models import FileItem, ToolPreset, BiasProfile, Tool
from src.project_files import FileItem
from src.tool_bias import BiasProfile
from src.tool_presets import ToolPreset, Tool
from src.paths import get_credentials_path
from src.tool_bias import ToolBiasEngine
from src.tool_presets import ToolPresetManager
@@ -2561,7 +2563,7 @@ def _send_grok(md_content: str, user_message: str, base_dir: str,
if file_items:
for fi in file_items:
if fi.get("is_image") and fi.get("base64_data"):
from src.models import FileItem as _FIC
from src.project_files import FileItem as _FIC
fi_item = fi if isinstance(fi, _FIC) else _FIC.from_dict(fi)
user_content = f"[IMAGE: {fi_item.path or 'attachment'}]\n{user_content}"
if discussion_history and not history:
@@ -2805,7 +2807,7 @@ def _send_qwen(md_content: str, user_message: str, base_dir: str,
if file_items:
for fi in file_items:
if fi.get("is_image") and fi.get("base64_data"):
from src.models import FileItem as _FIC
from src.project_files import FileItem as _FIC
fi_item = fi if isinstance(fi, _FIC) else _FIC.from_dict(fi)
user_content = f"[IMAGE: {fi_item.path or 'attachment'}]\n{user_content}"
if discussion_history and not history:
@@ -2898,7 +2900,7 @@ def _send_llama(md_content: str, user_message: str, base_dir: str,
if file_items:
for fi in file_items:
if fi.get("is_image") and fi.get("base64_data"):
from src.models import FileItem as _FIC
from src.project_files import FileItem as _FIC
fi_item = fi if isinstance(fi, _FIC) else _FIC.from_dict(fi)
user_content = f"[IMAGE: {fi_item.path or 'attachment'}]\n{user_content}"
if discussion_history and not history:
+1 -1
View File
@@ -101,7 +101,7 @@ def generate_tickets(track_brief: str, module_skeletons: str) -> list[dict[str,
ai_client.set_current_tier(None)
from src.dag_engine import TrackDAG
from src.models import Ticket
from src.mma import Ticket
from src.result_types import ErrorInfo, ErrorKind, Result
def topological_sort(tickets: list[Ticket]) -> list[Ticket]:
+1 -1
View File
@@ -1,6 +1,6 @@
from typing import Dict, Any
from src.models import ContextPreset
from src.project_files import ContextPreset
from src.result_types import Result, ErrorInfo, ErrorKind
+1 -1
View File
@@ -28,7 +28,7 @@ See Also:
"""
from typing import List
from src.models import Ticket
from src.mma import Ticket
from src.performance_monitor import get_monitor
+3 -3
View File
@@ -9,7 +9,7 @@ import tempfile
from pathlib import Path
from typing import Optional, List, Dict, Any
from src.models import ExternalEditorConfig, TextEditorConfig
from src.external_editor import ExternalEditorConfig, TextEditorConfig
from src.result_types import ErrorInfo, ErrorKind, Result
@@ -24,7 +24,7 @@ class ExternalEditorLauncher:
"""
[C: tests/test_external_editor.py:TestExternalEditorLauncher.test_get_editor_by_name, tests/test_external_editor.py:TestExternalEditorLauncher.test_get_editor_returns_default, tests/test_external_editor.py:TestExternalEditorLauncher.test_get_editor_unknown_name]
"""
from src.models import EMPTY_TEXT_EDITOR_CONFIG
from src.external_editor import EMPTY_TEXT_EDITOR_CONFIG
if editor_name:
return self.config.editors.get(editor_name) or EMPTY_TEXT_EDITOR_CONFIG
return self.config.get_default()
@@ -96,7 +96,7 @@ def _find_vscode_common_paths() -> str:
def auto_detect_vscode() -> TextEditorConfig:
from src.models import EMPTY_TEXT_EDITOR_CONFIG
from src.external_editor import EMPTY_TEXT_EDITOR_CONFIG
global _cached_vscode_config
if _cached_vscode_config is not None:
return _cached_vscode_config
+1 -1
View File
@@ -44,7 +44,7 @@ from src import paths
from src import summarize
from src.dag_engine import TrackDAG, ExecutionEngine
from src.models import Ticket, Track, WorkerContext
from src.mma import Ticket, Track, WorkerContext
from src.personas import PersonaManager
from src.result_types import ErrorInfo, ErrorKind, Result
+1 -1
View File
@@ -8,7 +8,7 @@ from src import ai_client
from src import mma_prompts
from src import paths
from src import summarize
from src.models import FileItem
from src.project_files import FileItem
from src.result_types import Result, ErrorInfo, ErrorKind
from src.type_aliases import Metadata
+1 -1
View File
@@ -4,7 +4,7 @@ import tomli_w
from pathlib import Path
from typing import Dict, Any, Optional
from src.models import Persona
from src.personas import Persona
from src import paths
class PersonaManager:
+1 -1
View File
@@ -5,7 +5,7 @@ import tomli_w
from pathlib import Path
from typing import Dict, Any, Optional
from src.models import Preset
from src.project_files import Preset
from src.paths import get_global_presets_path, get_project_presets_path
from src.result_types import ErrorInfo, ErrorKind, Result
+3 -3
View File
@@ -32,7 +32,7 @@ from src.type_aliases import (
)
if TYPE_CHECKING:
from src.models import TrackState
from src.mma import TrackState
TS_FMT: str = "%Y-%m-%dT%H:%M:%S"
@@ -270,7 +270,7 @@ def flat_config(proj: Metadata, disc_name: Optional[str] = None, track_id: Optio
The returned dataclass supports dict-compat (__getitem__ / get) so
existing consumers using .get() and [] continue to work unchanged
(Phase 2 Option A per SPEC_CORRECTION_phase_2.md)."""
from src.models import ProjectContext, ProjectMeta, ProjectOutput, ProjectFiles, ProjectScreenshots, ProjectDiscussion
from src.project import ProjectContext, ProjectMeta, ProjectOutput, ProjectFiles, ProjectScreenshots, ProjectDiscussion
disc_sec = proj.get("discussion", {})
if track_id:
history = load_track_history(track_id, proj.get("files", {}).get("base_dir", "."))
@@ -321,7 +321,7 @@ def load_track_state(track_id: str, base_dir: Union[str, Path] = ".") -> "TrackS
Returns empty TrackState (zero-init) if not found.
[C: tests/test_track_state_persistence.py:test_track_state_persistence]
"""
from src.models import TrackState, EMPTY_TRACK_STATE
from src.mma import TrackState, EMPTY_TRACK_STATE
state_file = paths.get_track_state_dir(track_id, project_path=str(base_dir)) / 'state.toml'
if not state_file.exists(): return EMPTY_TRACK_STATE
try:
+1 -1
View File
@@ -2,7 +2,7 @@ import re
from typing import List, Tuple
from src.models import ThinkingSegment
from src.mma import ThinkingSegment
def parse_thinking_trace(text: str) -> Tuple[List[ThinkingSegment], str]:
+3 -1
View File
@@ -1,6 +1,8 @@
from typing import List, Dict, Any, Optional
from src.models import Tool, ToolPreset, BiasProfile
from src.tool_bias import BiasProfile
from src.tool_presets import Tool, ToolPreset
class ToolBiasEngine:
+2 -1
View File
@@ -5,7 +5,8 @@ from pathlib import Path
from typing import Dict, List, Optional, Union, Any
from src import paths
from src.models import ToolPreset, BiasProfile
from src.tool_bias import BiasProfile
from src.tool_presets import ToolPreset
class ToolPresetManager:
+1 -1
View File
@@ -4,7 +4,7 @@ import tomli_w
from pathlib import Path
from typing import Dict, Any, Optional, Union
from src.models import WorkspaceProfile
from src.workspace_manager import WorkspaceProfile
from src import paths