diff --git a/CHANGES.md b/CHANGES.md index e75c46522..10201ef2e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,47 +1,5 @@ # Release History -## Unreleased - -### Changed - -* Nu's own artwork everywhere: the splash screen, the window icon and the - **Mode** button still showed Mu's logo and codewith.mu. -* Starting Nu while it's already running brings the open Nu to the front (and - opens any files it was given) instead of silently doing nothing. -* The first start is much faster: the bundled packages are installed with one - `uv` command instead of one pip run per package. -* When a program run with **Run** finishes, the output pane says so above the - `>>>` prompt, so it no longer looks as if it's still running. -* **Quit** asks first if a program is still running. -* The mode picker lists Python 3 first; clicking the mode's name in the status - bar opens it. -* The REPL starts with a short greeting instead of IPython's banner, panes have - plainer titles ("Python REPL", "Python Plotter"), and the debugger's variable - list leaves out Python's own `__dunder__` names. -* Panes open below the editor at a third of the window's height, so the editor - keeps most of the room. -* A mode's workspace folders (Pygame Zero's `images`, `sounds` and so on) are - made the first time the mode is used, not for every mode at every start. - For plugin authors: `ensure_workspace_assets` is now called then. - -### Fixed - -* The debugger reported "exit code: 0" for a program that ended with an error. -* Tracebacks on Windows showed the program's path in lower case. -* The Environment tab's commands used Windows short paths (`MU_VEN~1`); the - workaround behind them (for a Python bug fixed before 3.11) is gone, and so - is the `pywin32` dependency. -* The Plugins tab drew a stray empty box on the selected row (Windows 11). -* The log tab opens at the newest entries. - -### Removed - -* Code and files left over from Mu's removed modes: the micro:bit special case - in **Check** (modes can now declare `star_imports`, and the micro:bit plugin - does), unused REPL and file-system hooks, about 35 icon files that were never - loaded, the unused `nudatus` and `semver` dependencies, and obsolete - translations of strings Nu no longer has. - ## 2.0.0 The first stable release of **Nu**, a maintained continuation of the @@ -149,6 +107,27 @@ Please report problems at https://github.com/kovirlabs/nu/issues. ### Changed +* **Nu looks like Nu:** the splash screen, the window icon and the **Mode** + button show Nu's logo; the betas still showed Mu's, with codewith.mu. +* **Starting Nu while it's already running** brings the open Nu to the front, + and opens any files it was given, instead of silently doing nothing. +* **The first start is quicker:** the packages Nu needs in your programs' + environment are installed with one `uv` command (seconds) instead of one + pip run each (a couple of minutes). +* When a program run with **Run** finishes, the output pane says so above the + `>>>` prompt where you can look at its variables, so it no longer looks as + if it's still running. **Quit** asks first if a program is still running. +* The mode picker lists Python 3 first, with plainer instructions, and + clicking the mode's name in the status bar opens it again (as in Mu). +* The **REPL** starts with a short greeting naming its Python, instead of + IPython's banner; panes have plainer titles (**Python REPL**, **Python + Plotter**); and the debugger's variable list leaves out Python's own + `__dunder__` names, showing just your variables. +* Panes open below the editor at a third of the window's height, so the + editor keeps most of the room. +* A mode's folders in your workspace (Pygame Zero's `images`, `sounds` and so + on) are made the first time you use that mode, not for every mode at every + start. * **Pygame Zero and CircuitPython are now plugins that come with Nu** (`nu-pygamezero`, `nu-circuitpython`). They're installed and switched on as before, saved sessions in those modes carry on, and they work the same way, @@ -193,6 +172,8 @@ PyQt6 and uv, found by checking Nu against Mu: * Opening a file Nu can't handle no longer suggests micro:bit `.hex` files. * When a program finishes, the footer shows `status: 0` again rather than `status: ExitStatus.NormalExit`. +* The Plugins tab no longer draws a stray empty box on the selected row + (Windows 11). * **Translations restored for the renamed strings.** Text that changed when Mu became Nu (the admin dialog's title, the Quit and Help tooltips, file and mode messages, and more) had fallen back to English in every language; @@ -211,6 +192,12 @@ And older problems, found while checking the whole app: saved; they were lost when Nu closed. * Opening the admin dialog in a board's mode no longer runs `uv pip list` for a package list that mode doesn't show. +* The debugger reports a program that ends with an error as such ("exit code: + 1"), not "exit code: 0". +* On Windows, tracebacks show your program's path as you wrote it, not in + lower case, and the Environment tab's commands show full paths, not short + ones like `MU_VEN~1`. +* The **Current Log** tab opens at the newest entries, not the oldest. ### Security @@ -252,6 +239,14 @@ And older problems, found while checking the whole app: elsewhere. Every test file can be run on its own, in any order. * Every text file in the repository uses LF line endings (`.gitattributes`). +* A mode can declare `star_imports` (a module and the names its `import *` + brings in) so **Check** can still spot undefined names; the micro:bit plugin + uses it for `from microbit import *`, which the core no longer names. A + mode's `ensure_workspace_assets` is called the first time the mode is used + in a session, not for every mode at start-up. +* Gone, with Mu's removed modes: the unused `nudatus`, `semver` and `pywin32` + dependencies, dead REPL and file-system hooks, the icon files nothing + loaded, and obsolete translations of strings Nu no longer has. ## Mu 1.2.2 and earlier diff --git a/TODO.md b/TODO.md index cdb0e40a6..424519490 100644 --- a/TODO.md +++ b/TODO.md @@ -12,11 +12,11 @@ smaller codebase (less to port, lower risk). Keep the test suite green at every step — it's what makes the bigger changes safe. Baseline test suite (Python 3.8 + PyQt5, pre-changes): **1120 passed, 20 skipped**. -Current baseline (Python 3.11–3.14 + PyQt6): **1638 passed, 20 skipped** (after Phase 4b -part 2; 1572 after the post-Phase 5/6 hardening; 1545 after Phase 6a/6b, 1267 after Phase 4b part 1, 929 after +Current baseline (Python 3.11–3.14 + PyQt6): **1778 passed, 20 skipped** (after the +Windows review, #39/#40; 1638 after Phase 4b part 2; 1572 after the post-Phase 5/6 hardening; 1545 after Phase 6a/6b, 1267 after Phase 4b part 1, 929 after Phase 4a's packaging work). Run headless with: ``` -QT_QPA_PLATFORM=offscreen LANG=en_GB.utf8 uv run --no-sync pytest -p no:randomly -q +QT_QPA_PLATFORM=offscreen LANG=en_GB.utf8 uv run --no-sync pytest -q --random-order-bucket=none ``` (On a headless box without Mesa, Qt6 needs `libEGL.so.1` on `LD_LIBRARY_PATH` even for the `offscreen` platform plugin. Where `/tmp` is mounted `noexec`, add @@ -256,7 +256,8 @@ part 2 ✅ (2026-11, `feature/env-advanced-multi`) `VirtualEnvironment.remove_old_bundled_pythons`.) - [x] Build a wheelhouse — `python -m mu.wheels --package` builds `mu/wheels/.zip` (pgzero/pygame/ipykernel + deps), bundled via `sources`; the first-run baseline install - is offline (pip from the zip, see `install_from_zipped_wheels`). Bumped the stale + is offline (one `uv pip install --no-index --no-deps` of the zip's wheels since #39; it + was one pip run per wheel, see `install_from_zipped_wheels`). Bumped the stale `pygame<2.1.3` cap (no 3.12+ wheels) → `pygame>=2.6`. (`UV_FIND_LINKS` not wired: only *new* user-package installs hit the network, which is expected; baseline is already offline.) @@ -637,12 +638,43 @@ English; every mode, toolbar button, pane and admin tab), then the deferred fixe Variables texts still say "Python 3 mode" (translated upstream strings) though Pygame Zero uses the environment too; the overflow button stays a thin strip. +## Windows review ✅ (2026-11, #37, #39, #40) + +A hands-on pass over a fresh install on Windows 11 (first run, every Python 3 toolbar +button, the debugger, the admin dialog's tabs, Pygame Zero Play, a second launch), plus +an audit for what Mu left behind. +- [x] #37: the first start crashed after #34 removed the Web mode's templates that + `Editor.setup` still copied into the workspace. +- [x] #39 (learner-facing): Nu's own splash, window icon and Mode button + (`utils/make_artwork.py` draws them from `icon.png`); a second launch hands over to + the running Nu (`QLocalServer`: front, open its files) instead of exiting silently; + baseline wheels in one `uv` call (about 9 s, was minutes); the 8.3 short-path + workaround and `pywin32` gone; debugger exit codes; "program finished" note above + `>>>`; Quit asks while a program runs; mode picker (Python 3 first, status-bar click); + friendlier REPL banner, pane titles, debug inspector (no `__dunder__`s), pane height; + Plugins-tab focus frame; log opens at the end and follows `MU_DATA_DIR`; + `ensure_workspace_assets` on a mode's first use. +- [x] #40 (cleanup): Check's micro:bit special case → the `star_imports` mode attribute; + dead REPL/file-system hooks, `device_list`, `_del_`, `find_next_match`; `nudatus`, + `semver`, `mu/contrib`; 36 unused images; the Web API generator, `make video`, the + CodeQL config; about 1,600 obsolete translations (`translate_begin` now passes + `--ignore-obsolete`). +- Kept on purpose: the `mu_code` / `mu_venv` / data-folder names and the Briefcase app id + (renaming needs a migration); the `venv_path` session key (documented); the docs' + Mu design archive (`docs/swag`, `docs/logo_design`, `docs/icon_brief`). +- [ ] Check #39's changes on **macOS and Linux** (the second-launch hand-over uses a + socket file there; the one-call wheel install; the new artwork) and in the installers. +- [ ] **Release 2.0.0**: `v2.0.0` was never tagged (the latest tag is `v2.0.0b3`); follow + `docs/release.md`. The releases page still lists Mu's `v1.0.0-beta0.1`, and the + `v1.0.0-beta0.1` / `v1.2.2.alpha.1` tags are Mu's too: consider removing them. + ## Notes / deferred - `virtual_environment.py` (~1.5k lines) powers "install packages from the UI" — reshaped - around uv in Phase 4 (venv creation, `uv pip`, `uv run`); the baseline install at first - run still goes through the venv's pip from the bundled wheelhouse. -- Orphaned resource icons / locale strings for removed modes are harmless; sweep later. + around uv in Phase 4 (venv creation, `uv pip`, `uv run`); since #39 the baseline install + at first run is uv too (only `pip --version` and listing the baseline packages still + use the venv's pip). +- ~~Orphaned resource icons / locale strings for removed modes~~ — swept in #40. - 100%-coverage mandate is great for the Qt6 port; can relax to "don't regress" afterward if it slows iteration. - ~~**Translations re-extraction after the in-app "Mu" → "Nu" rename**~~ — done