diff --git a/tito/commands/module/workflow.py b/tito/commands/module/workflow.py index 0ec23910..24da790b 100644 --- a/tito/commands/module/workflow.py +++ b/tito/commands/module/workflow.py @@ -19,8 +19,6 @@ from rich.progress import Progress, SpinnerColumn, TextColumn from rich.prompt import Confirm from ..base import BaseCommand -from ..view import ViewCommand -from ..test import TestCommand from ..export import ExportCommand from .reset import ModuleResetCommand from .test import ModuleTestCommand @@ -395,13 +393,33 @@ class ModuleWorkflowCommand(BaseCommand): def _open_jupyter(self, module_name: str) -> int: """Open Jupyter Lab for a module.""" - # Use the existing view command - fake_args = Namespace() - fake_args.module = module_name - fake_args.force = False - - view_command = ViewCommand(self.config) - return view_command.run(fake_args) + try: + module_dir = self.config.modules_dir / module_name + if not module_dir.exists(): + self.console.print(f"[yellow]⚠️ Module directory not found: {module_name}[/yellow]") + return 1 + + self.console.print(f"\n[cyan]🚀 Opening Jupyter Lab for module {module_name}...[/cyan]") + + # Launch Jupyter Lab in the module directory + subprocess.Popen( + ["jupyter", "lab", "--no-browser"], + cwd=str(module_dir), + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + self.console.print("[green]✅ Jupyter Lab started![/green]") + self.console.print(f"[dim]Working directory: {module_dir}[/dim]") + return 0 + + except FileNotFoundError: + self.console.print("[yellow]⚠️ Jupyter Lab not found. Install with:[/yellow]") + self.console.print("[dim]pip install jupyterlab[/dim]") + return 1 + except Exception as e: + self.console.print(f"[red]❌ Failed to launch Jupyter: {e}[/red]") + return 1 def complete_module(self, module_number: Optional[str] = None, skip_tests: bool = False, skip_export: bool = False) -> int: """Complete a module with enhanced visual feedback and celebration.""" diff --git a/tito/commands/system/system.py b/tito/commands/system/system.py index e4341369..ce2712ce 100644 --- a/tito/commands/system/system.py +++ b/tito/commands/system/system.py @@ -8,12 +8,7 @@ from rich.panel import Panel from ..base import BaseCommand from .info import InfoCommand from .health import HealthCommand -from ..check import CheckCommand -from ..version import VersionCommand -from ..clean_workspace import CleanWorkspaceCommand -from ..report import ReportCommand from .jupyter import JupyterCommand -from ..protect import ProtectCommand class SystemCommand(BaseCommand): @property @@ -47,37 +42,13 @@ class SystemCommand(BaseCommand): health_cmd = HealthCommand(self.config) health_cmd.add_arguments(health_parser) - # Check subcommand (comprehensive validation) - check_parser = subparsers.add_parser( - 'check', - help='Run comprehensive environment validation (60+ tests)' + # Doctor subcommand (alias for health - comprehensive validation) + doctor_parser = subparsers.add_parser( + 'doctor', + help='Comprehensive environment validation and diagnosis' ) - check_cmd = CheckCommand(self.config) - check_cmd.add_arguments(check_parser) - - # Version subcommand - version_parser = subparsers.add_parser( - 'version', - help='Show version information for TinyTorch and dependencies' - ) - version_cmd = VersionCommand(self.config) - version_cmd.add_arguments(version_parser) - - # Clean subcommand - clean_parser = subparsers.add_parser( - 'clean', - help='Clean up generated files, caches, and temporary files' - ) - clean_cmd = CleanWorkspaceCommand(self.config) - clean_cmd.add_arguments(clean_parser) - - # Report subcommand - report_parser = subparsers.add_parser( - 'report', - help='Generate comprehensive diagnostic report (JSON)' - ) - report_cmd = ReportCommand(self.config) - report_cmd.add_arguments(report_parser) + doctor_cmd = HealthCommand(self.config) + doctor_cmd.add_arguments(doctor_parser) # Jupyter subcommand jupyter_parser = subparsers.add_parser( @@ -87,14 +58,6 @@ class SystemCommand(BaseCommand): jupyter_cmd = JupyterCommand(self.config) jupyter_cmd.add_arguments(jupyter_parser) - # Protect subcommand - protect_parser = subparsers.add_parser( - 'protect', - help='🛡️ Student protection system to prevent core file edits' - ) - protect_cmd = ProtectCommand(self.config) - protect_cmd.add_arguments(protect_parser) - def run(self, args: Namespace) -> int: console = self.console @@ -104,13 +67,9 @@ class SystemCommand(BaseCommand): "Available subcommands:\n" " • [bold]info[/bold] - Show system/environment information\n" " • [bold]health[/bold] - Quick environment health check\n" - " • [bold]check[/bold] - Comprehensive validation (60+ tests)\n" - " • [bold]version[/bold] - Show version information\n" - " • [bold]clean[/bold] - Clean up workspace (caches, temp files)\n" - " • [bold]report[/bold] - Generate diagnostic report (JSON)\n" - " • [bold]jupyter[/bold] - Start Jupyter notebook server\n" - " • [bold]protect[/bold] - 🛡️ Student protection system management\n\n" - "[dim]Example: tito system health[/dim]", + " • [bold]doctor[/bold] - Comprehensive environment validation\n" + " • [bold]jupyter[/bold] - Start Jupyter notebook server\n\n" + "[dim]Example: tito system doctor[/dim]", title="System Command Group", border_style="bright_cyan" )) @@ -120,27 +79,12 @@ class SystemCommand(BaseCommand): if args.system_command == 'info': cmd = InfoCommand(self.config) return cmd.execute(args) - elif args.system_command == 'health': + elif args.system_command in ('health', 'doctor'): cmd = HealthCommand(self.config) return cmd.execute(args) - elif args.system_command == 'check': - cmd = CheckCommand(self.config) - return cmd.execute(args) - elif args.system_command == 'version': - cmd = VersionCommand(self.config) - return cmd.execute(args) - elif args.system_command == 'clean': - cmd = CleanWorkspaceCommand(self.config) - return cmd.execute(args) - elif args.system_command == 'report': - cmd = ReportCommand(self.config) - return cmd.execute(args) elif args.system_command == 'jupyter': cmd = JupyterCommand(self.config) return cmd.execute(args) - elif args.system_command == 'protect': - cmd = ProtectCommand(self.config) - return cmd.execute(args) else: console.print(Panel( f"[red]Unknown system subcommand: {args.system_command}[/red]",