WIP - adding first screen for tui
This commit is contained in:
parent
4152ecfc1f
commit
40b8f2b501
2 changed files with 168 additions and 0 deletions
|
|
@ -92,6 +92,7 @@ def _discover_commands() -> List[Type[SupportsCliCommand]]:
|
||||||
("cognee.cli.commands.cognify_command", "CognifyCommand"),
|
("cognee.cli.commands.cognify_command", "CognifyCommand"),
|
||||||
("cognee.cli.commands.delete_command", "DeleteCommand"),
|
("cognee.cli.commands.delete_command", "DeleteCommand"),
|
||||||
("cognee.cli.commands.config_command", "ConfigCommand"),
|
("cognee.cli.commands.config_command", "ConfigCommand"),
|
||||||
|
("cognee.cli.commands.tui_command", "TuiCommand"),
|
||||||
]
|
]
|
||||||
|
|
||||||
for module_path, class_name in command_modules:
|
for module_path, class_name in command_modules:
|
||||||
|
|
|
||||||
167
cognee/cli/commands/tui_command.py
Normal file
167
cognee/cli/commands/tui_command.py
Normal file
|
|
@ -0,0 +1,167 @@
|
||||||
|
import argparse
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from cognee.cli import SupportsCliCommand
|
||||||
|
from cognee.cli.config import DEFAULT_DOCS_URL
|
||||||
|
import cognee.cli.echo as fmt
|
||||||
|
from cognee.cli.exceptions import CliCommandException
|
||||||
|
|
||||||
|
|
||||||
|
class TuiCommand(SupportsCliCommand):
|
||||||
|
@property
|
||||||
|
def command_string(self) -> str:
|
||||||
|
return "tui"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def help_string(self) -> str:
|
||||||
|
return "Launch the interactive Textual TUI for cognee commands"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def docs_url(self) -> str:
|
||||||
|
return f"{DEFAULT_DOCS_URL}/usage/tui"
|
||||||
|
|
||||||
|
def configure_parser(self, parser: argparse.ArgumentParser) -> None:
|
||||||
|
# No additional arguments for now
|
||||||
|
pass
|
||||||
|
|
||||||
|
def execute(self, args: argparse.Namespace) -> None:
|
||||||
|
try:
|
||||||
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.widgets import Header, Footer, ListView, ListItem, Static
|
||||||
|
from textual.containers import Container, Vertical
|
||||||
|
from textual.binding import Binding
|
||||||
|
|
||||||
|
class CommandItem(Static):
|
||||||
|
"""A custom widget for command items with icon and description."""
|
||||||
|
|
||||||
|
def __init__(self, icon: str, command: str, description: str):
|
||||||
|
self.icon = icon
|
||||||
|
self.command = command
|
||||||
|
self.description = description
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
def render(self) -> str:
|
||||||
|
return f"{self.icon} {self.command:<12} {self.description}"
|
||||||
|
|
||||||
|
class CogneeTUI(App):
|
||||||
|
"""A k9s-style TUI for cognee commands."""
|
||||||
|
|
||||||
|
CSS = """
|
||||||
|
Screen {
|
||||||
|
background: $surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
dock: top;
|
||||||
|
height: 3;
|
||||||
|
background: $boost;
|
||||||
|
color: $text;
|
||||||
|
content-align: center middle;
|
||||||
|
border: solid $primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-container {
|
||||||
|
height: 100%;
|
||||||
|
border: thick $primary;
|
||||||
|
background: $surface;
|
||||||
|
padding: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#title {
|
||||||
|
text-align: center;
|
||||||
|
color: $accent;
|
||||||
|
text-style: bold;
|
||||||
|
padding: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
height: auto;
|
||||||
|
background: $surface;
|
||||||
|
border: none;
|
||||||
|
padding: 0 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListItem {
|
||||||
|
background: $surface;
|
||||||
|
color: $text;
|
||||||
|
padding: 0 1;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListItem:hover {
|
||||||
|
background: $surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListItem.--highlight {
|
||||||
|
background: $primary;
|
||||||
|
color: $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandItem {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer-info {
|
||||||
|
dock: bottom;
|
||||||
|
height: 3;
|
||||||
|
background: $boost;
|
||||||
|
color: $text-muted;
|
||||||
|
content-align: center middle;
|
||||||
|
border: solid $primary;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
BINDINGS = [
|
||||||
|
Binding("q", "quit", "Quit", priority=True),
|
||||||
|
Binding("escape", "quit", "Quit", priority=True),
|
||||||
|
Binding("enter", "select", "Select", priority=True),
|
||||||
|
]
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
yield Static("🧠 cognee v1.0.0", id="header")
|
||||||
|
|
||||||
|
with Container(id="main-container"):
|
||||||
|
yield Static("Select Command", id="title")
|
||||||
|
yield ListView(
|
||||||
|
ListItem(CommandItem("📥", "add", "Add data to cognee")),
|
||||||
|
ListItem(CommandItem("🔍", "search", "Search data in cognee")),
|
||||||
|
ListItem(CommandItem("⚡", "cognify", "Process data in cognee")),
|
||||||
|
ListItem(CommandItem("🗑️", "delete", "Delete data from cognee")),
|
||||||
|
ListItem(CommandItem("⚙️", "config", "Configure cognee settings")),
|
||||||
|
)
|
||||||
|
|
||||||
|
yield Static(
|
||||||
|
"↑↓: Navigate • Enter: Select • q/Esc: Quit",
|
||||||
|
id="footer-info"
|
||||||
|
)
|
||||||
|
|
||||||
|
def on_mount(self) -> None:
|
||||||
|
"""Focus the list view on mount."""
|
||||||
|
self.query_one(ListView).index = 0
|
||||||
|
|
||||||
|
def on_list_view_selected(self, event: ListView.Selected) -> None:
|
||||||
|
"""Handle command selection."""
|
||||||
|
command_item = event.item.query_one(CommandItem)
|
||||||
|
command = command_item.command
|
||||||
|
fmt.echo(f"Selected command: {command}")
|
||||||
|
self.exit()
|
||||||
|
|
||||||
|
def action_select(self) -> None:
|
||||||
|
"""Select the current item."""
|
||||||
|
list_view = self.query_one(ListView)
|
||||||
|
list_view.action_select_cursor()
|
||||||
|
|
||||||
|
app = CogneeTUI()
|
||||||
|
app.run()
|
||||||
|
fmt.success("TUI exited successfully!")
|
||||||
|
except ImportError:
|
||||||
|
raise CliCommandException(
|
||||||
|
"Textual is not installed. Install with: pip install textual",
|
||||||
|
docs_url=self.docs_url,
|
||||||
|
)
|
||||||
|
except Exception as ex:
|
||||||
|
raise CliCommandException(
|
||||||
|
f"Failed to launch TUI: {str(ex)}",
|
||||||
|
docs_url=self.docs_url,
|
||||||
|
raiseable_exception=ex,
|
||||||
|
)
|
||||||
Loading…
Add table
Reference in a new issue