#!/usr/bin/env python3 """Trace Stores — Find unused store actions/state in frontend.""" from __future__ import annotations import re, sys, json from pathlib import Path from collections import defaultdict ROOT = Path(__file__).resolve().parent.parent.parent FRONTEND = ROOT / "frontend" / "src" def find_store_actions() -> dict[str, list[str]]: stores = {} store_dir = FRONTEND / "store" if not store_dir.exists(): return stores for ts in store_dir.glob("*.ts"): try: content = ts.read_text() except: continue store_name = ts.stem actions = [] # Find action names in zustand store definitions for m in re.finditer(r'(\w+)\s*:', content): name = m.group(1) if name not in ('state', 'set', 'get', 'name', 'storage', 'partialize') and len(name) > 3: actions.append(name) stores[store_name] = list(set(actions)) return stores def find_store_usage() -> dict[str, set[str]]: usage = defaultdict(set) for ts in FRONTEND.rglob("*.ts"): try: content = ts.read_text() except: continue for store_name in ['authStore', 'uiStore', 'themeStore', 'workspaceStore', 'pluginStore', 'commStore', 'calendarStore', 'commandPaletteStore', 'onboardingStore', 'windowStore', 'aiUIControlStore', 'pluginToolbarStore']: if store_name in content: # Find which actions/state are accessed for m in re.finditer(rf'{store_name}\.*(\w+)', content): usage[store_name].add(m.group(1)) return usage def main(): print("=" * 70) print("TRACE STORES — Unused Store Actions/State") print("=" * 70) stores = find_store_actions() usage = find_store_usage() unused = {} total_unused = 0 for store_name, actions in stores.items(): used = usage.get(store_name, set()) unused_actions = [a for a in actions if a not in used] if unused_actions: unused[store_name] = unused_actions total_unused += len(unused_actions) print(f"\nStores found: {len(stores)}") for name, actions in stores.items(): used = len(usage.get(name, set())) print(f" {name}: {len(actions)} defined, {used} used, {len(unused.get(name, []))} unused") print(f"\nTotal unused store actions: {total_unused}") if unused: print("\n--- Unused store actions ---") for store, actions in unused.items(): for a in actions[:10]: print(f" {store}.{a}") results = {"stores": stores, "usage": {k: list(v) for k, v in usage.items()}, "unused": unused} with open(ROOT / "scripts" / "test_suite" / "results_trace_stores.json", "w") as f: json.dump(results, f, indent=2, default=str) return total_unused if __name__ == "__main__": sys.exit(main())