Add encoding='utf-8' and errors='replace' to subprocess.run() calls in
workflow.py so unit and integration test output decode correctly on
Windows (cp1252) when output contains UTF-8 characters.
Co-authored-by: Pratham-ja <114498234+Pratham-ja@users.noreply.github.com>
The VS Code extension no longer implements any business logic — every
capability (module discovery, path resolution, system info, builds,
tests, clean) lives in Tito CLI commands. The extension is a pure UI
shell that delegates via `python3 -m tito.main`.
Tito CLI additions:
- `module list --json` for machine-readable module discovery
- `module path <num> --notebook|--source|--about` for file resolution
- `system info --json` for environment info
- `dev build html|serve|pdf|paper` wrapping make targets
- `dev clean [all|site]` wrapping make clean
- Banner suppression for --json and module path output
Extension hardening:
- Centralized CLI integration in utils/tito.ts (single TITO_CMD constant,
callTito, callTitoJson, titoTerminalCommand, isTitoAvailable, log/logError)
- Replaced all silent catch{} blocks with logged errors and user feedback
- Module tree shows error/empty states with actionable Setup/Health buttons
- Info tree shows "Tito CLI unavailable" when CLI is unreachable
- Removed all setTimeout refresh hacks — file watcher on .tito/progress.json
is the sole refresh mechanism
- Exit code tracking via onDidEndTerminalShellExecution
- Tito availability pre-flight check on activation
- BUILD_OUTPUTS constants for build artifact paths
- Zero execSync calls outside tito.ts, zero hardcoded command strings
Polish the contributor's Windows fix with proper comments explaining
the Microsoft Store alias issue and WinError 32 file lock. Move
is_windows check closer to usage site for clarity.
- Prefer python over python3 in Git Bash to avoid Microsoft Store alias and incorrect venv paths
- Skip TinyTorch self-reinstall on Windows if already installed (prevents WinError 32 file lock)
Students hit "No module named 'tinytorch.core.tensor'" in notebooks because
the Jupyter kernel used a different Python than where tinytorch was installed.
- setup: install ipykernel + nbdev, register named kernel during tito setup
- health: add Notebook Readiness checks (import, kernel, Python match)
- export: verify exported file exists and has content (fail loudly)
- Windows: add get_venv_bin_dir() helper for cross-platform venv paths
The nbdev_export CLI was not reading settings.ini correctly in CI,
causing exports to silently fail. Using nbdev.export.nb_export()
Python API directly with explicit lib_path ensures exports work
reliably regardless of environment.
The nbdev_export command wasn't in PATH in CI. Using sys.executable
with -m nbdev.export ensures we use the same Python environment that's
running tito, which is more reliable across different environments.
Fixed in:
- tito/commands/dev/export.py (both _export_all_modules and _run_nbdev_export)
- tito/commands/module/workflow.py (_export_notebook)
The directory check was looking for tinytorch/tinytorch/__init__.py
when running from the tinytorch directory (as CI does). Fixed to check
for either repo root or tinytorch project directory structure.
- Skip "sync to profile" prompt when not in interactive terminal
(was hanging in CI waiting for input that never comes)
- Increase milestone timeout from 180s to 300s for heavy milestones
(CNN and Transformer training can take 2-3 minutes on CI)
Bug Fix:
- Export failures now return early in module complete, preventing
progress from being updated when export fails. This fixes the issue
where students could start Module 02 even though tensor.py was
never exported.
New --user-journey test:
- Simulates exact student flow: module start --no-jupyter → module complete
- Runs milestones at natural unlock checkpoints (not all at end)
- Milestone checkpoints: after modules 03, 08, 09, 13, 19
- Explicit step-by-step output for easy CI debugging
New --no-jupyter flag:
- Added to 'tito module start' for CI/testing
- Creates notebook but skips opening Jupyter
Ref: https://github.com/harvard-edge/cs249r_book/discussions/1147
Rich's legacy Windows console rendering uses cp1252 encoding which
doesn't support emoji characters. Setting legacy_windows=False makes
Rich use ANSI escape codes instead, which work in modern Windows
Terminal, Git Bash, and most terminal emulators.
Unit tests now skip @pytest.mark.slow tests to avoid CI timeouts.
Milestone tests explicitly run all tests (including slow ones).
This ensures:
- Unit tests run quickly (~43s instead of timing out)
- Milestone tests still validate full milestone execution
- CI passes stages 1-5 reliably
- Remove Stage 6 (milestone tests) from CI workflow since test files were
removed as redundant with integration tests
- Renumber Stage 7 (release) to Stage 6
- Update summary job to remove milestone references
- Fix _trigger_submission() to skip interactive prompts in CI mode
by checking CI, GITHUB_ACTIONS env vars and stdin.isatty()
The milestone demo scripts remain available for student use via
'tito milestone run', but are no longer run as automated tests.
Text.append() does not interpret Rich markup - it treats strings as
literal text. Split the markup into separate append calls with proper
style parameters so the 'Next: tito module start XX' hint renders
correctly instead of showing literal [bold cyan] tags.
The _run_pytest method was missing PYTHONPATH in the subprocess
environment, causing tinytorch imports to fail in CI where the
package isn't installed system-wide.
Source files like src/02_activations/02_activations.py import from
tinytorch.core.tensor. When running these as subprocesses, the Python
path needs to include the project root so the imports resolve correctly.
This was causing CI to fail at module 02 because it couldn't find
tinytorch.core.tensor even though module 01 had exported it.
- Added complete_all_modules() method that iterates through all modules
- Runs tests + export for each module in sequence (01 → 20)
- Stops on first failure for fail-fast behavior
- Skips modules without notebooks (shows as 'skipped')
- Useful for CI validation and students exporting all work
Distinction from dev export --all:
- dev export --all: Rebuilds from src/ (overwrites student notebooks)
- module complete --all: Tests + exports existing notebooks (safe for students)
- _build_package now uses 'tito dev export --all' which properly:
1. Converts src/*.py to modules/*.ipynb (jupytext)
2. Exports to tinytorch/core/ (nbdev_export)
- Fixes issue where 'module complete --all' didn't iterate through modules
- Added CI streaming output for better visibility during builds
- Each CI stage that needs the package will build it independently
The inline tests were calling 'module complete' directly, but the notebook
doesn't exist until 'dev export' creates it from src/.
Now the flow is:
1. tito dev export <module> - Creates notebook from src/
2. tito module complete <module> - Runs tests and exports to core/
This matches the proper progressive build workflow.
New command that resets TinyTorch to a clean state:
- Clears modules/ directory (all numbered module folders)
- Clears tinytorch/core/ (all .py except __init__.py)
- Optionally resets progress tracking (--keep-progress to skip)
Usage:
tito system reset # Interactive confirmation
tito system reset --force # Skip confirmation
tito system reset --ci # CI mode with exit codes
tito system reset --keep-progress # Keep completion history
This is useful for:
- Testing fresh install experience
- CI/CD pipeline resets
- Starting over with a clean slate
The previous approach used 'dev export --all' which only exports notebooks
but doesn't run inline tests or copy code to tinytorch/core/.
Now uses 'module complete --all' which:
1. Exports notebooks from src/ to modules/
2. Runs inline tests in each module
3. Copies tested code to tinytorch/core/
This ensures 'from tinytorch import Tensor' works in unit tests.
Critical fixes:
1. bin/tito now uses sys.exit(main()) to propagate exit codes
- Previously the exit code was discarded, causing CI to pass even on failures
2. Collection errors are now counted and displayed
- 'ERROR tests/...' lines (collection failures) are now tracked
- Summary shows 'X errors, Y failed, Z passed' for clarity
Without these fixes, CI stages could show green even when tests failed.
In CI mode, all test types (unit, CLI, integration, E2E, milestone) now show:
- Header with test type and path
- Per-test progress as they run (✓ PASSED / ✗ FAILED)
- Summary footer with counts
This makes CI logs much more informative - you can see exactly which tests
are running and their status in real-time.
In CI mode, inline tests now show:
- Header with total module count
- Per-module progress: [1/20] Module 01: tensor... ✓ PASSED
- Error details if a module fails
- Summary footer with result
This makes CI logs much more informative for debugging.
The `tito src` command was never implemented. All documentation
references have been updated to use the correct commands:
- `tito src export` → `tito dev export`
- `tito src test` → `tito dev test`
Also removed 'src' from developer_commands list in main.py since
it doesn't exist as a registered command.
Introduces a comprehensive testing command with explicit test type flags:
- --inline: Progressive inline tests from src/ (nbgrader tests)
- --unit: Pytest unit tests
- --cli: CLI command tests
- --integration: Cross-module tests
- --e2e: End-to-end user journey tests
- --milestone: Historical milestone tests
- --all: Run all test types (except release)
- --release: Full destructive release validation
- --module N: Test specific module
Default behavior runs unit tests only.
This consolidates validate, provides clear test hierarchy, and
matches PyTorch's explicit, predictable interface philosophy.
The validate command functionality has been consolidated into
`tito dev test --release` for a unified testing interface.
This follows the PyTorch philosophy: one clear way to do things.
- Update all-contributors-add.yml to use Ollama (llama3.1:8b) for parsing
natural language descriptions instead of requiring exact syntax
- Trim contribution types to 8 actually used: bug, code, doc, design,
ideas, review, test, tool
- Update generate_main_readme.py and generate_readme_tables.py to match
- Remove unused tito module export subcommand (fixes#1134)
Students should use tito module complete instead
Now you can write naturally:
@all-contributors @user helped verify the fix worked
@all-contributors @user found a bug in the dataloader
- Update all-contributors-add.yml to use Ollama (llama3.1:8b) for parsing
natural language descriptions instead of requiring exact syntax
- Trim contribution types to 8 actually used: bug, code, doc, design,
ideas, review, test, tool
- Update generate_main_readme.py and generate_readme_tables.py to match
- Remove unused tito module export subcommand (fixes#1134)
Students should use tito module complete instead
Now you can write naturally:
@all-contributors @user helped verify the fix worked
@all-contributors @user found a bug in the dataloader
Bug fixes:
- Move test_autograd_core.py from 05_dataloader/ to 06_autograd/ (fixes#1127)
- Fix integration test mapping: tests now only run after their dependencies
are available (module 4 loss tests moved to module 7+)
- Remove premature test_unit_function_classes() call in 06_autograd.py
that ran before enable_autograd() (fixes#1128)
- Handle EOFError in milestone prompts for non-interactive mode (fixes#1129)
Improvements:
- Read version from pyproject.toml as single source of truth
- Add try/except for sync prompt in milestone completion
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update pyproject.toml version to 0.1.4
- Set put_version_in_init = False in settings.ini to prevent nbdev overwrite
- Update tito/main.py to read version from pyproject.toml
- Update tito/__init__.py to read version from pyproject.toml
- Sync settings.ini version to 0.1.4
This ensures tito dev validate doesn't reset the version number.
- Update remaining 1957→1958 references across all documentation
- Add tito dev commands (preflight, export, validate) to CLI reference
- Update CLI validation script to recognize new dev subcommands
- Fix milestone year references in tests and workflow code
- Update timeline visualization JavaScript
This completes the Perceptron year standardization to align with
the publication year and academic citation format (rosenblatt1958perceptron).
Cherry-picked from: ebf3fb17b (feature/tito-dev-validate)
- Rename milestone directory from 01_1957_perceptron to 01_1958_perceptron
- Update all references to use 1958 (publication year) for consistency
with academic citation format (rosenblatt1958perceptron)
- Changes affect: READMEs, docs, tests, milestone tracker
Rationale: Using 1958 aligns with the publication year and standard
academic citations, while 1957 was the development year.
Cherry-picked from: 28ca41582 (feature/tito-dev-validate)
This merge brings critical student work preservation features:
Key Changes:
- Rewrote 'tito system update' to preserve student work
- Uses git sparse checkout for selective updates
- Preserves: modules/, tinytorch/core/, .tito/, .venv/
- Updates: src/, tito/, tests/, milestones/, datasets/
- Added consistent Panel warnings for destructive actions
- Removed unused TestCommand and ExportCommand (replaced by module/dev commands)
- Fixed integration tests and training module tests
- Improved optimizer and training module error handling
This addresses issue #1112 and ensures students can safely update
TinyTorch without losing their work in progress.
Commits merged:
- e7051671d chore(tito): remove unused TestCommand and ExportCommand
- abc033d8d fix(tito): rewrite update command to preserve student work
- f9fd2c8fe style(tito): use Panel warnings consistently for destructive actions
- 2ed310d6f fix(tinytorch): fix integration tests and improve update command
These commands were never registered in main.py and have been replaced by:
- TestCommand → tito module test (ModuleTestCommand)
- ExportCommand → tito module export / tito dev export
Also removed unused import and variable in milestone.py.
The previous update command tried to re-run the install script, which
would fail on existing installations and could wipe student work.
New implementation:
- Downloads latest via git sparse checkout to temp directory
- Selectively updates: src/, tito/, tests/, milestones/, datasets/
- Preserves: modules/, tinytorch/core/*.py, .tito/, .venv/
- Reinstalls pip package to update CLI entry points
This allows students to safely run `tito system update` without
losing their work in progress.
Addresses #1112