command_graph.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from .commands import get_commands
  4. from .models import PortingModule
  5. @dataclass(frozen=True)
  6. class CommandGraph:
  7. builtins: tuple[PortingModule, ...]
  8. plugin_like: tuple[PortingModule, ...]
  9. skill_like: tuple[PortingModule, ...]
  10. def flattened(self) -> tuple[PortingModule, ...]:
  11. return self.builtins + self.plugin_like + self.skill_like
  12. def as_markdown(self) -> str:
  13. lines = [
  14. '# Command Graph',
  15. '',
  16. f'Builtins: {len(self.builtins)}',
  17. f'Plugin-like commands: {len(self.plugin_like)}',
  18. f'Skill-like commands: {len(self.skill_like)}',
  19. ]
  20. return '\n'.join(lines)
  21. def build_command_graph() -> CommandGraph:
  22. commands = get_commands()
  23. builtins = tuple(module for module in commands if 'plugin' not in module.source_hint.lower() and 'skills' not in module.source_hint.lower())
  24. plugin_like = tuple(module for module in commands if 'plugin' in module.source_hint.lower())
  25. skill_like = tuple(module for module in commands if 'skills' in module.source_hint.lower())
  26. return CommandGraph(builtins=builtins, plugin_like=plugin_like, skill_like=skill_like)