from __future__ import annotations import json from functools import lru_cache from pathlib import Path from .models import PortingBacklog, PortingModule SNAPSHOT_PATH = Path(__file__).resolve().parent / 'reference_data' / 'commands_snapshot.json' @lru_cache(maxsize=1) def load_command_snapshot() -> tuple[PortingModule, ...]: raw_entries = json.loads(SNAPSHOT_PATH.read_text()) return tuple( PortingModule( name=entry['name'], responsibility=entry['responsibility'], source_hint=entry['source_hint'], status='mirrored', ) for entry in raw_entries ) PORTED_COMMANDS = load_command_snapshot() def build_command_backlog() -> PortingBacklog: return PortingBacklog(title='Command surface', modules=list(PORTED_COMMANDS)) def command_names() -> list[str]: return [module.name for module in PORTED_COMMANDS] def get_command(name: str) -> PortingModule | None: needle = name.lower() for module in PORTED_COMMANDS: if module.name.lower() == needle: return module return None def find_commands(query: str, limit: int = 20) -> list[PortingModule]: needle = query.lower() matches = [module for module in PORTED_COMMANDS if needle in module.name.lower() or needle in module.source_hint.lower()] return matches[:limit] def render_command_index(limit: int = 20, query: str | None = None) -> str: modules = find_commands(query, limit) if query else list(PORTED_COMMANDS[:limit]) lines = [f'Command entries: {len(PORTED_COMMANDS)}', ''] if query: lines.append(f'Filtered by: {query}') lines.append('') lines.extend(f'- {module.name} — {module.source_hint}' for module in modules) return '\n'.join(lines)