diff --git a/.gitignore b/.gitignore index 561aff08..0e5d1578 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,10 @@ backend/coverage_html/ backend/coverage.xml htmlcov/ +# Dead-code scan workspace (one-shot scratch — never committed) +.dead-code-scan/ +backend/scripts/dead_code_scan.py + # Editor noise — per-developer, never useful in repo .idea/ .vscode/ diff --git a/README.md b/README.md index 73ad2cfb..d11b0bff 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,6 @@ backend/ apps/ agents/ Agent lifecycle, streaming, worktree management dashboards/ Dashboard CRUD and layout persistence - dashboard_layout/ Card positions and spatial canvas state templates/ Prompt template CRUD skills/ Skills CRUD (synced to ~/.claude/skills/) tools_lib/ MCP tool configuration and discovery diff --git a/backend/apps/dashboard_layout/__init__.py b/backend/apps/dashboard_layout/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/apps/dashboard_layout/dashboard_layout.py b/backend/apps/dashboard_layout/dashboard_layout.py deleted file mode 100644 index 5d16b81b..00000000 --- a/backend/apps/dashboard_layout/dashboard_layout.py +++ /dev/null @@ -1,58 +0,0 @@ -import json -import os -import logging -from contextlib import asynccontextmanager -from backend.config.Apps import SubApp -from backend.apps.dashboard_layout.models import DashboardLayout, DashboardLayoutUpdate - -logger = logging.getLogger(__name__) - -from backend.config.paths import DASHBOARD_LAYOUT_DIR as DATA_DIR - -LAYOUT_FILE = os.path.join(DATA_DIR, "layout.json") - - -@asynccontextmanager -async def dashboard_layout_lifespan(): - os.makedirs(DATA_DIR, exist_ok=True) - yield - - -dashboard_layout = SubApp("dashboard_layout", dashboard_layout_lifespan) - - -def _default_layout() -> DashboardLayout: - return DashboardLayout(cards={}) - - -def _load() -> DashboardLayout: - if not os.path.exists(LAYOUT_FILE): - return _default_layout() - try: - with open(LAYOUT_FILE) as f: - data = json.load(f) - if "columns" in data and "cards" not in data: - logger.info("Detected old column-based layout format, resetting to empty canvas") - return _default_layout() - return DashboardLayout(**data) - except Exception: - logger.exception("Failed to load dashboard layout, returning default") - return _default_layout() - - -def _save(layout: DashboardLayout): - with open(LAYOUT_FILE, "w") as f: - json.dump(layout.model_dump(), f, indent=2) - - -@dashboard_layout.router.get("") -async def get_layout(): - layout = _load() - return layout.model_dump() - - -@dashboard_layout.router.put("") -async def update_layout(body: DashboardLayoutUpdate): - layout = DashboardLayout(cards=body.cards, view_cards=body.view_cards) - _save(layout) - return layout.model_dump() diff --git a/backend/apps/dashboard_layout/models.py b/backend/apps/dashboard_layout/models.py deleted file mode 100644 index 65193747..00000000 --- a/backend/apps/dashboard_layout/models.py +++ /dev/null @@ -1,27 +0,0 @@ -from pydantic import BaseModel, Field - - -class CardPosition(BaseModel): - session_id: str - x: float = 0 - y: float = 0 - width: float = 420 - height: float = 280 - - -class ViewCardPosition(BaseModel): - output_id: str - x: float = 0 - y: float = 0 - width: float = 480 - height: float = 360 - - -class DashboardLayout(BaseModel): - cards: dict[str, CardPosition] = Field(default_factory=dict) - view_cards: dict[str, ViewCardPosition] = Field(default_factory=dict) - - -class DashboardLayoutUpdate(BaseModel): - cards: dict[str, CardPosition] - view_cards: dict[str, ViewCardPosition] = Field(default_factory=dict) diff --git a/backend/apps/service/models.py b/backend/apps/service/models.py deleted file mode 100644 index 0e03455d..00000000 --- a/backend/apps/service/models.py +++ /dev/null @@ -1,5 +0,0 @@ -"""(Reserved for future use; intentionally empty.) - -The service-sync layer ships opaque payload dicts through `submit()` — -no Pydantic shape exposed in the public repo. -"""