from __future__ import annotations
from dataclasses import dataclass
from .commands import get_commands
from .legacy_porting_types import PortingModule
@dataclass(frozen=True)
class CommandGraph:
builtins: tuple[PortingModule, ...]
plugin_like: tuple[PortingModule, ...]
skill_like: tuple[PortingModule, ...]
def flattened(self) -> tuple[PortingModule, ...]:
return self.builtins + self.plugin_like + self.skill_like
def as_markdown(self) -> str:
lines = [
"# Command Graph",
"",
f"Builtins: {len(self.builtins)}",
f"Plugin-like commands: {len(self.plugin_like)}",
f"Skill-like commands: {len(self.skill_like)}",
]
return "\n".join(lines)
def build_command_graph() -> CommandGraph:
commands = get_commands()
builtins = tuple(
module
for module in commands
if "plugin" not in module.source_hint.lower() and "skills" not in module.source_hint.lower()
)
plugin_like = tuple(module for module in commands if "plugin" in module.source_hint.lower())
skill_like = tuple(module for module in commands if "skills" in module.source_hint.lower())
return CommandGraph(builtins=builtins, plugin_like=plugin_like, skill_like=skill_like)