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
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
<!-- Tests/coverage are hand-updated static badges (no coverage service wired up).
Re-measure and edit both after any release:
uv run python -m pytest tests/ -q -m "not live" --cov=bambu_cli --cov-report=term -->
[![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)

Expand Down Expand Up @@ -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) |
Expand Down
17 changes: 7 additions & 10 deletions docs/MASTER-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions docs/plan/done.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions docs/plan/inbox.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading