v0.1.3
Fixed
- Job error attribution race: after a GRBL error halted a job, the
emergency cancel's safety shutdown could race into the alarm state and
overwrite the recorded error with a secondaryerror:9("Commands
Locked"). The first error recorded now wins, so consumers reliably see
the root-cause failure instead of a teardown side effect. - Secondary errors during teardown no longer break recovery: they still
resolve pending interactive command futures and still trigger the job
halt — only the redundant state mutation is skipped. test_error_halts_streamwas flaky on slow runners: an emergency soft
reset racing in-flight motion legitimately leaves the machine
alarm-locked (real Grbl behaves the same). The test now recovers with
$Xand waits for the status poller to report Idle before starting
the next job.
Added
init_logging(filter, path)binding: Rust-side session diagnostics
(stall detection, liveness, unexpected device lines) now reach stderr
or a dedicated log file instead of being silently dropped when no
logger is installed. Theraydriver runCLI gains--log-file.- Terminal job errors are published through the device state
(state.error):run()resolves normally even on failure, so the
state is the only way consumers can detect a failed job. Protocol
errors keep their proper GRBL error codes; a stale error is cleared
on the next job start. - Newline-terminated, rate-limited progress output when stdout is not a
TTY, so redirected log output never interleaves with the progress
line.
Tooling
- Type checking is now enforced: pyright runs over
python/and
tests/in CI, and a.pre-commit-config.yaml(ruff + pyright) was
added. Generated stubs were fixed along the way — parser functions
previously landed in the root stub, where they do not exist at
runtime, leavingraydriver.grbl.parseruntyped. - CI simplified to a plain four-platform test matrix
(ubuntu, windows, macos-15-intel, macos-15).
Full changelog: v0.1.2...v0.1.3