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
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
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
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.
- _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.
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.
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.
- 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)
- Remove pip install -e . requirement from CI workflow
- Add bin/tito wrapper script that sets PYTHONPATH and cwd
- Update preflight.py to use bin/tito instead of python -m tito.main
- Fix milestone command name (singular not plural)
- Use vars.TINYTORCH_ROOT with fallback to 'tinytorch'
The tinytorch/ package directory is generated via 'tito export' and
gitignored, so it won't exist in fresh CI clones. Changed from FAIL
to WARN since this is expected behavior in CI.