c8a17e3a29b1a9052d91d5df486e02e8de1af78b
4
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ee763eea98 |
fix(imports): complete migration from 'from src import models' to direct subsystem imports
Replaces the broken-script-generated imports in src/ and tests/ with clean direct imports from the destination modules. Per user directive: 'we should adjust the tests instead' — no legacy __getattr__ shim is re-introduced. Key fixes: - src/mcp_client.py: remove self-import (MCPServerConfig etc. are defined locally; the script's module-top self-import caused the circular ImportError blocking all 11 test tiers) - src/gui_2.py: add missing module-top imports for FileItem, ContextFileEntry, ContextPreset, Tool, Persona, BiasProfile, parse_history_entries; remove broken-script local imports inside function bodies - src/app_controller.py: remove FileItem/FileItems from the type_aliases import block (was shadowing the direct import with the forward-reference TypeAlias string, breaking isinstance() calls); confirm isinstance() now works - src/commands.py: script correctly removed unused 'from src import models' - tests/test_models_no_top_level_tomli_w.py: import save_config_to_disk from src.project (no legacy shim back in models.py) - tests/test_rag_engine_ready_status_bug.py: import RAGConfig and VectorStoreConfig from src.mcp_client - tests/test_gui_2_result.py: patch src.gui_2.Persona/BiasProfile (gui_2 binds at module load; src.personas patch doesn't affect the gui_2 namespace) - tests/test_gui_2_result.py: patch src.gui_2.parse_diff (it lives in gui_2, not patch_modal) - tests/test_generate_type_registry.py: Metadata is now a dataclass in src_type_aliases.md (not a TypeAlias in type_aliases.md); src_models.md is no longer generated (src/models.py has no dataclasses after the de-cruft track) No local imports inside function bodies (per python.md §17.9a). All new imports are at module top with surgical edits. |
||
|
|
e430df86f1 |
refactor(project): create src/project.py with ProjectContext + 5 sub + config IO (split from models.py)
Per the 4-criteria decision rule (C1=cross-system, C3=tests, C4=size);
ProjectContext is the typed return of project_manager.flat_config();
the 5 sub-dataclasses model the actual nested dict structure of
flat_config()'s return; load_config_from_disk / save_config_to_disk
are the canonical config I/O primitives (renamed from the private
_load_config_from_disk / _save_config_to_disk).
This commit:
1. Creates src/project.py with ProjectContext + 5 sub (ProjectMeta,
ProjectOutput, ProjectFiles, ProjectScreenshots, ProjectDiscussion)
+ EMPTY_PROJECT_CONTEXT + _clean_nones + load_config_from_disk +
save_config_to_disk + parse_history_entries.
2. Removes the original class + function definitions from src/models.py.
3. Adds backward-compat re-exports in src/models.py (the same pattern
used by Phase 3a mma.py and Phase 3g personas.py).
4. Updates src/app_controller.py to use the new public function names
(load_config_from_disk / save_config_to_disk).
5. Updates tests/test_models_no_top_level_tomli_w.py to use the new
public name (the test still asserts lazy-loading; the lazy load
happens in the new project.py module).
6. Updates scripts/audit_no_models_config_io.py FORBIDDEN_PATTERNS to
reference the new public names (models.load_config_from_disk /
models.save_config_to_disk) + the new src.project path.
Verification: VC6
uv run python -c 'from src.project import ProjectContext, ProjectMeta,
ProjectOutput, ProjectFiles, ProjectScreenshots, ProjectDiscussion,
_clean_nones, load_config_from_disk, save_config_to_disk,
parse_history_entries' # OK
uv run python -c 'from src.models import ProjectContext, ...' # OK
(re-exports work)
Pre-existing test regression (NOT caused by this commit):
tests/test_models_no_top_level_tomli_w.py::test_models_does_not_import_tomli_w_at_module_level
was already failing because the Phase 3g 'from src.personas import Persona'
re-export in src/models.py loads src.personas at module level, which
loads tomli_w. The Phase 5 reduce-models.py pass moves the persona
import into __getattr__ (lazy), which will make this test pass again.
Tests verified: tests/test_project_context_20260627.py (10/10 PASS),
tests/test_project_serialization.py (2/2 PASS), tests/test_thinking_persistence.py
(4/4 PASS), tests/test_presets.py (3/3 PASS), tests/test_persona_models.py
(2/2 PASS), tests/test_ticket_queue.py (PASS), tests/test_dag_engine.py
(PASS), tests/test_orchestration_logic.py (PASS).
|
||
|
|
7bcb5a8c07 |
refactor(config): Route all config I/O through AppController
Eliminates 22 call sites that bypassed the AppController state owner
and read/wrote config.toml directly. AppController is now the single
source of truth for self.config; gui_2.py, commands.py, etc. go
through controller.save_config() / controller.load_config().
Production changes:
- src/models.py: rename load_config -> _load_config_from_disk,
save_config -> _save_config_to_disk (private I/O primitives)
- src/app_controller.py: add public load_config()/save_config() methods
that own the state. Update 3 internal call sites and 3 ConductorEngine
call sites to pass max_workers from self.config
- src/multi_agent_conductor.py: ConductorEngine.__init__ now takes
max_workers as a parameter (caller responsibility, not I/O primitive)
- src/external_editor.py: get_default_launcher() takes config as a
parameter; gui_2.py:1311,4776 pass app.config
- src/gui_2.py: 17 sites of models.save_config(X.config) replaced with
X.save_config() (delegates via __getattr__ to controller)
- src/commands.py: save_all() uses app.save_config()
Test changes (route through controller, not I/O primitive):
- tests/conftest.py: mock_app and app_instance fixtures now patch
AppController.load_config/save_config instead of models I/O primitives
- 18 other test files: patches renamed from models._save_config_to_disk
to AppController.save_config (and same for load_config)
- tests/test_app_controller_mcp.py: use SLOP_CONFIG env var instead of
patching removed CONFIG_PATH module constant
- tests/test_parallel_execution.py: pass max_workers=2 explicitly to
ConductorEngine (caller no longer reads config)
- tests/test_gui_paths.py: add save_config=MagicMock() to MockApp;
assert on controller method, not I/O primitive
- tests/test_models_no_top_level_tomli_w.py: still calls private
_save_config_to_disk directly (the only allowed exception; tests
the lazy-load behavior of the primitive itself)
New files:
- scripts/audit_no_models_config_io.py: enforces the rule (--strict,
--json modes; AST-based docstring detection to avoid false positives)
- conductor/code_styleguides/config_state_owner.md: documents the rule
Verification:
- 67 targeted tests pass
- scripts/audit_no_models_config_io.py --strict returns 0
This is the architectural cleanup that surfaced during the
audit_architectural_cheats_20260607 review. Closes the smoke-gun
CONFIG_PATH module constant (already done in
|
||
|
|
ae3b433e5e |
refactor(models): lazy-load tomli_w (sub-track 2 partial)
Sub-track 2 of startup_speedup_20260606. Removes the top-level 'import tomli_w' from src/models.py and moves it inside save_config(). tomli_w (~30ms cold load) is now loaded only when the user saves config, not on every src.models import. This drops the audit violation count from 63 to 62. Pydantic BaseModel (the other src/models.py violation) is left for a future sub-track: deferring a class base requires a metaclass or proxy pattern that's higher risk for the small (~50ms) saving. 3 new tests in tests/test_models_no_top_level_tomli_w.py: - tomli_w NOT in sys.modules after import src.models - save_config() still works (because tomli_w loads on-demand) - save_config() actually triggers the import on first call 17 existing model tests pass (test_persona_models, test_bias_models, test_context_presets_models, test_per_ticket_model, test_file_item_model). |