Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 37 additions & 42 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -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

Expand Down Expand Up @@ -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

Expand Down
46 changes: 39 additions & 7 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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/<version>.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.)
Expand Down Expand Up @@ -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
Expand Down
Loading