From 7506f291d8a5eada47c96d41a06db0d96473ec83 Mon Sep 17 00:00:00 2001 From: DLANSAMA <258674612+DLANSAMA@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:53:34 -0500 Subject: [PATCH 1/2] chore: release 0.6.0 Set the version to 0.6.0 and move the Unreleased changelog entries under 0.6.0 (2026-11-06). Refresh the README test and coverage figures to measured values (2,217 tests, 93.5%, 90% floor). Retire plan box D-1 (PR #153 merged) and fold L-3 into L-2. --- CHANGELOG.md | 7 +++++-- README.md | 8 ++++---- docs/MASTER-PLAN.md | 17 +++++++---------- docs/plan/done.md | 2 ++ pyproject.toml | 2 +- uv.lock | 4 ++-- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f0ac4e..38b673b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,11 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version ## [Unreleased] +## [0.6.0] - 2026-11-06 + ### Printer safety -- **A printer command is sent at most once.** When the connection dropped +- **A dropped connection no longer resends a command.** When the connection dropped after a command reached the printer but before its acknowledgement came back, the MQTT client reconnected by itself and resent it: a `gcode` move, `stop` or `light` ran twice while the command reported success. Automatic @@ -1135,7 +1137,8 @@ Initial development version: LAN-mode printer control (MQTT/FTPS), one-shot `job ### Removed - `requirements.txt`, which duplicated the `dependencies` already declared in `pyproject.toml`. Install with `uv pip install -e .` (or `pip install platecli`) instead. -[Unreleased]: https://github.com/DLANSAMA/platecli/compare/v0.5.1...HEAD +[Unreleased]: https://github.com/DLANSAMA/platecli/compare/v0.6.0...HEAD +[0.6.0]: https://github.com/DLANSAMA/platecli/compare/v0.5.1...v0.6.0 [0.5.1]: https://github.com/DLANSAMA/platecli/compare/v0.5.0...v0.5.1 [0.5.0]: https://github.com/DLANSAMA/platecli/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/DLANSAMA/platecli/compare/v0.3.0...v0.4.0 diff --git a/README.md b/README.md index ff09ce9..093f14b 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ -[![Tests](https://img.shields.io/badge/tests-1535%20passing-brightgreen)](#tested-and-hardened) -[![Coverage](https://img.shields.io/badge/coverage-91%25-brightgreen)](#tested-and-hardened) +[![Tests](https://img.shields.io/badge/tests-2217%20passing-brightgreen)](#tested-and-hardened) +[![Coverage](https://img.shields.io/badge/coverage-93%25-brightgreen)](#tested-and-hardened) [Install](#install) · [Print something](#print-something) · [Try it without a printer](#try-it-in-30-seconds) · [Quality](#tested-and-hardened) · [User guide](https://github.com/DLANSAMA/platecli/blob/main/docs/manual.md) · [Troubleshooting](https://github.com/DLANSAMA/platecli/blob/main/docs/troubleshooting.md) · [For AI agents](#built-for-ai-agents) @@ -159,8 +159,8 @@ The numbers in the badges are measured on this repo, not aspirational: | | | |---|---| -| **Tests** | 1,535 passing (`pytest -m "not live"`, v0.5.1) — unit, contract, property-based (Hypothesis), and Textual pilot tests | -| **Coverage** | **91.1%** line+branch across the package; CI fails the build below **86%** | +| **Tests** | 2,217 passing (`pytest -m "not live"`, v0.6.0) — unit, contract, property-based (Hypothesis), and Textual pilot tests | +| **Coverage** | **93.5%** line+branch across the package; CI fails the build below **90%** | | **Platforms** | Linux, macOS, and Windows in CI, on Python 3.10 / 3.12 / 3.14 | | **Blocking gates** | `ruff`, `ruff format`, `mypy` (whole package, `check_untyped_defs`), `bandit`, `pip-audit`, plus layer-boundary and JSON-schema-drift checks | | **Mutation testing** | Nightly, scoped to the safety-critical modules (download validation, SSRF guards, slicer options, job payload) | diff --git a/docs/MASTER-PLAN.md b/docs/MASTER-PLAN.md index cca3157..14bd6d7 100644 --- a/docs/MASTER-PLAN.md +++ b/docs/MASTER-PLAN.md @@ -10,26 +10,23 @@ The work we chose, in order. **No task from the user? Take the top 🤖 box unde ## Waiting on you 🧑 -- [ ] **D-1 · Merge the audit-round4 PR (#153)** · P1 · 🧑 - Branch `fix/audit-round4`: at-most-once MQTT delivery, pin precedence, heater limits for raw and pre-sliced G-code, AMS re-read before a guided print, confirmed mDNS results, terminal-escape hardening, config value checks. Needs the 6 CI checks green. - [ ] **D-2 · Dependabot PRs #150 (actions) and #152 (python deps)** · P2 · 🧑 Open since 2026-10-26 and 2026-11-02. *Done when:* merged or closed. - [ ] **D-3 · Keep `"bambu"` in the PyPI keywords?** · P2 · 🧑 Unruled since 2026-07-25; recommendation was keep (nominative search term, not a name). - [ ] **L-1 · Post to r/BambuLab** · P1 · both · after L-2 🤖 rewrites the held copy to lead with `plate tui`/`plate go`; 🧑 posts (Tue–Thu, 10–11 EDT). -- [ ] **L-2 · Cut 0.6.0** · P1 · both · after D-1 - `[Unreleased]` holds the A1 slicing fix and two audit waves. 🤖 prepares the release PR per `docs/releasing.md`; 🧑 approves the tag push (it publishes to PyPI). +- [ ] **L-2 · Cut 0.6.0** · P1 · both + Release PR on `release/0.6.0` (2026-11-06) sets 0.6.0 and dates the changelog. 🧑 merges it and approves the `v0.6.0` tag push (it publishes to PyPI). + Then 🤖: `pip install platecli==0.6.0` and `'platecli[tui]==0.6.0'` in a clean venv (`plate --version`, `plate --sim status`), then the `0.7.0.dev0` bump PR (`docs/releasing.md` steps 4 and 6). ## Next -- [ ] **L-3 · Check that 0.5.1 installs from PyPI** · P2 · 🤖 - Never verified after the 2026-08-28 publish. Clean venv, `pip install platecli==0.5.1`, `plate --version`, `plate --sim status`. - *Done when:* the result is recorded in `docs/plan/done.md`. +- [ ] **L-4 · Re-record the hero GIF with `plate job`** · P2 · both + The README hero shows `status`/`slice`, not the command the pitch rests on. Recording starts a real print: 🧑 says yes and is at the printer. ## Later -- [ ] **L-4 · Re-record the hero GIF with `plate job`** · P2 · both - The README hero shows `status`/`slice`, not the command the pitch rests on. Recording starts a real print: 🧑 says yes and is at the printer. +Nothing chosen yet; new findings go in `docs/plan/inbox.md`. -**Highest ids given:** D-3 · L-4 · S-3 · retired: S-1, S-2, S-3 +**Highest ids given:** D-3 · L-4 · S-3 · retired: D-1, L-3, S-1, S-2, S-3 diff --git a/docs/plan/done.md b/docs/plan/done.md index 10f19d5..697b47b 100644 --- a/docs/plan/done.md +++ b/docs/plan/done.md @@ -2,6 +2,8 @@ One line per finished plan box, newest first: `- date · id · what happened · commit`. +- 2026-11-06 · L-3 · closed: folded into L-2, which checks the 0.6.0 install from PyPI (a 0.5.1 check is stale once 0.6.0 ships) · this commit +- 2026-11-06 · D-1 · PR #153 (audit round 4) squash-merged after all 6 checks passed on its last commit · e925f96 - 2026-11-05 · S-3 · setup shows a lone mDNS result and asks (no → manual entry); unspecified/multicast addresses are skipped, public/loopback ones need an explicit yes, also when picked from several · this commit - 2026-11-05 · S-2 · real (the slot was read once, at material choice): `plate go` and the TUI re-read the AMS on Start print and refuse with nothing sent if it changed or can't be read; confirm summary gains Feed and Temperatures rows; pilot + wizard tests · 8cae64c - 2026-11-05 · S-1 · `upload`/`job`/`send` scan every `.gcode` member of a 3MF (and plain `.gcode`) for M104/M109/M140/M190 over 350/150 °C before upload; `job --dry-run` reports it too; unreadable members fail closed; 0.5 s for 2M lines · ef01a1d diff --git a/pyproject.toml b/pyproject.toml index ebc5e35..52d098d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "platecli" # Unreleased work carries a .devN suffix so a source build is never mistaken # for the released wheel of the same number. Drop the suffix when tagging. -version = "0.6.0.dev0" +version = "0.6.0" description = "platecli — local CLI for Bambu Lab printers (not affiliated with Bambu Lab)" readme = "README.md" requires-python = ">=3.10" diff --git a/uv.lock b/uv.lock index 74aea2b..5e9a277 100644 --- a/uv.lock +++ b/uv.lock @@ -154,7 +154,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -431,7 +431,7 @@ wheels = [ [[package]] name = "platecli" -version = "0.6.0.dev0" +version = "0.6.0" source = { editable = "." } dependencies = [ { name = "paho-mqtt" }, From 930895a1915dee79e4ea69dc6cff833b169d05d6 Mon Sep 17 00:00:00 2001 From: DLANSAMA <258674612+DLANSAMA@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:54:07 -0500 Subject: [PATCH 2/2] docs(plan): note the unpushed coverage tests in the inbox --- docs/plan/inbox.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/plan/inbox.md b/docs/plan/inbox.md index 28d3361..eab1da2 100644 --- a/docs/plan/inbox.md +++ b/docs/plan/inbox.md @@ -21,3 +21,4 @@ Noticed but not chosen, one line each, oldest first: `- date · where · what · - 2026-11-05 · bambu_cli/commands/doctor.py · the capabilities file is written with `json.dump` defaults, so a NaN in a report would make it invalid JSON (unverified) · (review of the round-4 fixes) - 2026-11-05 · bambu_cli/gcode_limits.py · the pre-sliced scan has no cap on total decompressed size: a highly compressible 3MF can take minutes to scan (memory stays bounded) · (review of the S-1 fix) - 2026-11-05 · bambu_cli/gcode_limits.py · whether Bambu firmware ends a G-code line at a bare CR is unconfirmed; the scanner treats CR as a break, the safe reading · (review of the S-1 fix) +- 2026-11-06 · main checkout, branch `fix/audit-round3` · 4 local commits (`13cb15c`..`a04ac04`, 2026-11-05) add 223 coverage test files and were never pushed; decide whether to land them as a PR · (seen while cutting 0.6.0)