mirror of
https://github.com/MLSysBook/TinyTorch.git
synced 2026-05-01 18:12:48 -05:00
Reorganize TinyTorch CLI from flat structure to hierarchical organization with subfolders for complex commands with subcommands. Changes: - Create subfolders: module/, system/, package/ - Move module commands: module_workflow.py → module/workflow.py - Move module_reset.py → module/reset.py - Move system commands: system.py → system/system.py - Move system subcommands: info.py, health.py, jupyter.py → system/ - Move package commands: package.py → package/package.py - Move package helpers: reset.py, nbdev.py → package/ - Archive deprecated files: clean.py, help.py, notebooks.py, status.py - Update all imports in moved files and main.py - Add __init__.py exports for each subfolder - Create comprehensive CLI test suite (52 tests) - test_cli_registry.py: Validate command registration - test_cli_execution.py: Smoke tests for all commands - test_cli_help_consistency.py: Help text validation - Update tests to match new structure Benefits: - Clear ownership: Easy to see which helpers belong to which commands - Better organization: Related files grouped together - Scales cleanly: Adding subcommands is straightforward - Zero user impact: All commands work exactly the same All 52 tests passing ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
234 lines
5.1 KiB
Markdown
234 lines
5.1 KiB
Markdown
# CLI Hierarchy Refactor - COMPLETE ✅
|
|
|
|
## Summary
|
|
|
|
Successfully refactored TinyTorch CLI from flat structure to hierarchical organization with subfolders for complex commands.
|
|
|
|
**Date**: 2025-11-28
|
|
**Tests Passing**: 52/52 ✅
|
|
**User Impact**: ZERO (completely internal)
|
|
|
|
---
|
|
|
|
## What Changed
|
|
|
|
### Before (Flat Structure)
|
|
```
|
|
tito/commands/
|
|
├── module_workflow.py
|
|
├── module_reset.py
|
|
├── system.py
|
|
├── info.py
|
|
├── health.py
|
|
├── jupyter.py
|
|
├── package.py
|
|
├── reset.py
|
|
├── nbdev.py
|
|
├── ... (34 files total, hard to navigate)
|
|
```
|
|
|
|
### After (Hierarchical Structure)
|
|
```
|
|
tito/commands/
|
|
├── module/
|
|
│ ├── __init__.py
|
|
│ ├── workflow.py # Main module command
|
|
│ └── reset.py # Module reset subcommand
|
|
├── system/
|
|
│ ├── __init__.py
|
|
│ ├── system.py # Main system command
|
|
│ ├── info.py # system info
|
|
│ ├── health.py # system doctor
|
|
│ └── jupyter.py # system jupyter
|
|
├── package/
|
|
│ ├── __init__.py
|
|
│ ├── package.py # Main package command
|
|
│ ├── reset.py # package reset
|
|
│ └── nbdev.py # package nbdev
|
|
├── _archived/ # Deprecated files
|
|
│ ├── clean.py
|
|
│ ├── help.py
|
|
│ ├── notebooks.py
|
|
│ └── status.py
|
|
├── setup.py # Simple commands stay flat
|
|
├── test.py
|
|
├── export.py
|
|
└── ... (15 simple commands)
|
|
```
|
|
|
|
---
|
|
|
|
## Benefits
|
|
|
|
### ✅ Clear Ownership
|
|
- Easy to see that `module/reset.py` belongs to module command
|
|
- No confusion about which files are helpers vs top-level commands
|
|
|
|
### ✅ Better Organization
|
|
- Related files grouped together
|
|
- Subfolders scale as commands grow
|
|
- Clear separation between simple and complex commands
|
|
|
|
### ✅ Easier Maintenance
|
|
- Tests validate structure automatically
|
|
- Adding new subcommands is straightforward
|
|
- No orphaned files hiding in flat structure
|
|
|
|
### ✅ Zero User Impact
|
|
```bash
|
|
# These still work EXACTLY the same:
|
|
tito module complete 01
|
|
tito system info
|
|
tito package export
|
|
```
|
|
|
|
---
|
|
|
|
## Files Changed
|
|
|
|
### Moved Files (10)
|
|
```
|
|
module_workflow.py → module/workflow.py
|
|
module_reset.py → module/reset.py
|
|
system.py → system/system.py
|
|
info.py → system/info.py
|
|
health.py → system/health.py
|
|
jupyter.py → system/jupyter.py
|
|
package.py → package/package.py
|
|
reset.py → package/reset.py
|
|
nbdev.py → package/nbdev.py
|
|
```
|
|
|
|
### Created Files (4)
|
|
```
|
|
module/__init__.py
|
|
system/__init__.py
|
|
package/__init__.py
|
|
_archived/README.md
|
|
```
|
|
|
|
### Updated Files (3)
|
|
```
|
|
tito/main.py # Updated imports
|
|
tito/commands/__init__.py # Updated imports
|
|
tests/cli/test_cli_registry.py # Updated file path expectations
|
|
```
|
|
|
|
### Archived Files (4)
|
|
```
|
|
Moved to _archived/:
|
|
- clean.py (deprecated)
|
|
- help.py (deprecated)
|
|
- notebooks.py (deprecated)
|
|
- status.py (deprecated)
|
|
```
|
|
|
|
---
|
|
|
|
## Test Results
|
|
|
|
### Before Refactor
|
|
```
|
|
52 tests passing ✅
|
|
```
|
|
|
|
### After Refactor
|
|
```
|
|
52 tests passing ✅
|
|
```
|
|
|
|
### Test Coverage
|
|
- ✅ All commands are BaseCommand subclasses
|
|
- ✅ All commands have descriptions
|
|
- ✅ All commands implement required methods
|
|
- ✅ All help text accessible
|
|
- ✅ No orphaned files
|
|
- ✅ All file paths correct
|
|
- ✅ All subcommands work
|
|
|
|
---
|
|
|
|
## Verification Commands
|
|
|
|
Test the refactored CLI:
|
|
|
|
```bash
|
|
# Version check
|
|
tito --version
|
|
|
|
# Module commands
|
|
tito module -h
|
|
tito module status
|
|
|
|
# System commands
|
|
tito system -h
|
|
tito system info
|
|
tito system doctor
|
|
|
|
# Package commands
|
|
tito package -h
|
|
tito package reset -h
|
|
|
|
# Run all tests
|
|
pytest tests/cli/ -v
|
|
|
|
# Quick import test
|
|
python -c "from tito.main import TinyTorchCLI; print('Success')"
|
|
```
|
|
|
|
All passing! ✅
|
|
|
|
---
|
|
|
|
## Architecture Decision
|
|
|
|
**Question**: Should we organize commands with subcommands into subfolders?
|
|
**Answer**: YES! ✅
|
|
|
|
**Follows best practices from**:
|
|
- Git (`git/builtin/`)
|
|
- AWS CLI (`awscli/customizations/`)
|
|
- Django (`django/core/management/commands/`)
|
|
- Click (Python CLI framework)
|
|
|
|
**Key insight**: Flat worked when small, but with 34 files it became unmaintainable. Hierarchical structure scales better and makes ownership crystal clear.
|
|
|
|
---
|
|
|
|
## Future Additions
|
|
|
|
When adding new commands:
|
|
|
|
### Simple Command (no subcommands)
|
|
```bash
|
|
# Create at top level
|
|
tito/commands/newcmd.py
|
|
```
|
|
|
|
### Complex Command (with subcommands)
|
|
```bash
|
|
# Create subfolder
|
|
tito/commands/newcmd/
|
|
├── __init__.py # Export main command
|
|
├── newcmd.py # Main command
|
|
└── helper.py # Subcommand
|
|
```
|
|
|
|
Tests will automatically validate! 🎉
|
|
|
|
---
|
|
|
|
## Impact Summary
|
|
|
|
| Metric | Before | After |
|
|
|--------|--------|-------|
|
|
| Total files in commands/ | 34 | 29 (+ 3 subfolders) |
|
|
| Flat files | 34 | 19 |
|
|
| Organized in subfolders | 0 | 10 |
|
|
| Orphaned files | Unknown | 0 (archived) |
|
|
| Tests passing | 52 | 52 |
|
|
| User-facing changes | N/A | 0 |
|
|
| Developer clarity | ⚠️ Confusing | ✅ Crystal clear |
|
|
|
|
**Result**: Much cleaner, easier to maintain, zero user impact! 🚀
|