Repository navigation
Releases: TumbleOwlee/ferrowl
Releases · TumbleOwlee/ferrowl
Release list
v0.7.0
What's Changed
- update: increment version to 0.6.1 by @TumbleOwlee in #175
- update: cargo deps by @TumbleOwlee in #179
- ci: bump peter-evans/create-pull-request from 7 to 8 by @dependabot[bot] in #176
- update: bump rust-modbus/rust-ocpp git revs by @TumbleOwlee in #180
- Modbus Rtu/Ascii server: stay silent for a slave id it doesn't own by @TumbleOwlee in #191
- Add bridge mode: headless Modbus relay between an upstream and downstream interface (TCP/RTU) by @TumbleOwlee in #192
- docs: rewrite bridge --help text to be self-contained by @TumbleOwlee in #193
- Scripting: interruptible execution ceiling for sim scripts by @TumbleOwlee in #194
- Modbus: warn on silently-rejected register declarations (MB-R-129) by @TumbleOwlee in #195
- Modbus server + OCPP reconnect via a shared backoff driver by @TumbleOwlee in #196
- TLS setup dialogs: exclude stale hidden cert/CA fields; OCPP Self-Signed parity; self-signed precedence flip by @TumbleOwlee in #198
- TLS: role-split ServerTlsPolicy/ClientTlsPolicy with multi-CA mTLS support by @TumbleOwlee in #202
- OCPP client: additional HTTP headers on the WebSocket upgrade request by @TumbleOwlee in #203
- Resolve
~in user-supplied file paths (config, log, TLS, CLI flags) by @TumbleOwlee in #216 - Add a Modbus RTU/Ascii bus monitor module (passive traffic viewer) by @TumbleOwlee in #218
- fix(ocpp): constant-time Basic Auth credential comparison by @TumbleOwlee in #230
- fix(ocpp): abort in-flight inbound Call handlers on connection teardown by @TumbleOwlee in #231
- fix(modbus): validate client read start address against u16 by @TumbleOwlee in #232
- refactor(modbus): narrow Role to ClientOrServer in client/server-only paths by @TumbleOwlee in #233
- fix(ocpp): remote-started transactions visible to the CSMS by @TumbleOwlee in #234
- Modbus: cross-check RTU/Ascii serial paths across module instances before opening (MB-R-150) by @TumbleOwlee in #235
- fix(cli): key --exit-on-error off log level, not a string prefix by @TumbleOwlee in #236
- fix(modbus): monitor's unit id list includes exception/unmatched slav… by @TumbleOwlee in #237
- support RtuOverTcp/AsciiOverTcp as upstream or downstream by @TumbleOwlee in #238
- Feat/update readme by @TumbleOwlee in #239
- Fix/validate address as u16 by @TumbleOwlee in #242
- fix(modbus): skip client write of read-only register (#240) by @TumbleOwlee in #243
- Show CONNECTED/RECONNECTING/DISCONNECTED status across every module, and log OCPP CS reconnect attempts by @TumbleOwlee in #244
- fix(util): document NoTls serde asymmetry, dedup TLS field-triple matches by @TumbleOwlee in #246
- build: bump uuid from 1.24.1 to 1.25.0 by @dependabot[bot] in #245
- chore(agents): guard tool-attribution trailers via PreToolUse hook, fix sh/bash script mismatch by @TumbleOwlee in #247
- perf(modbus): gate monitor view's 100ms tick refresh on RecordLog generation by @TumbleOwlee in #248
- docs(specs): close spec-coverage gap for 11 requirement IDs by @TumbleOwlee in #249
- docs(specs): fix stale crate count, contradicting comment, NF-R restatements by @TumbleOwlee in #250
- refactor(modbus): collapse monitor's Input/Selection dialog twins into one focus-conditional struct by @TumbleOwlee in #251
- feat(ui-derive): opt-in nested-focus support for #[derive(Focus)] by @TumbleOwlee in #252
- docs(workflow): per-stage approval gate, gate 1 skip for non-spec changes, wire pr-view.sh by @TumbleOwlee in #253
- chore: mechanical clippy/derive harvest (#208) by @TumbleOwlee in #254
- chore: strip comment bloat, review every stage, clear clippy --all-targets by @TumbleOwlee in #255
- Extract shared TlsSection widget; extend #[derive(Focus)] with nested-focus support (#229) by @TumbleOwlee in #256
- refactor(modbus): collapse ASCII/RTU serial triads onto framing-generic helpers by @TumbleOwlee in #257
- refactor(bridge): collapse 16-arm transport dispatch and TCP-family downstream wrappers by @TumbleOwlee in #258
- refactor(ocpp): dedup signature-verification plumbing between the skip-verify TLS verifiers by @TumbleOwlee in #259
- chore: small cleanups across ferrowl-lua, ferrowl-codec and ferrowl-util by @TumbleOwlee in #260
- refactor(cli): share now_ms, --log-file opener and the headless log drain by @TumbleOwlee in #262
- refactor(ui): collapse three dialog widget factories into one shared module by @TumbleOwlee in #261
- chore: drop workflow citations and historical narration from comments by @TumbleOwlee in #268
- refactor: unify the three reconnect-backoff waiters into ferrowl-util by @TumbleOwlee in #267
- docs(ocpp): record why the CS and CSMS connection drivers stay separate by @TumbleOwlee in #274
- update: fix path resolution in hooks by @TumbleOwlee in #275
- docs(workflow): never continue the planner as implementer by @TumbleOwlee in #276
- Collapse the Format/Value/UnscaledValue variant explosion in ferrowl-codec by @TumbleOwlee in #278
- Pass display_by_variant!'s literal as an argument rather than as the format string by @TumbleOwlee in #279
- Assert which error survives the first-error-wins builder short-circuit by @TumbleOwlee in #280
- State current design in monitor comments that narrated replaced structures by @TumbleOwlee in #281
- Pin the single-focus invariant every setup dialog opens with by @TumbleOwlee in #282
- refactor(comments): drop change-history narration from comments across the workspace by @TumbleOwlee in #283
- docs(agents): orchestrator coordinates only, never touches spec or code by @TumbleOwlee in #284
- Sync workflow improvements from the template by @TumbleOwlee in #285
- Clean up the
ferrowl-storecell API: oneAccessenum, no duplicated payload, idiomatic getters by @TumbleOwlee in #286 - chore(agents): enforce read-only Bash for spec-reviewer via hook by @TumbleOwlee in #287
- Model TLS configuration as tagged enums by @TumbleOwlee in #288
- Compact agent docs and specs, one line per paragraph by @TumbleOwlee in #289
- chore(agents): add show-file.sh to open artifacts outside the context by @TumbleOwlee in #290
- Deduplicate the Modbus client transports: one shared connect, one shared spawn by @TumbleOwlee in #292
- Add agent workflow diagram to CONTRIBUTING.md and bring PRD.md up to date by @TumbleOwlee in #294
- Give edge-case entries stable IDs and drop section-number cross-references from the specs by @TumbleOwlee in #295
- Tests take ports and temp directories from a held-guard fixture crate by @TumbleOwlee in #296
- Derive the Modbus monitor view's panel focus and overlay key routing by @TumbleOwlee in #303
- Agents write a capped user-facing summary next to each full artifact by @TumbleOwlee in #302
- update: upgrade dependencies by @TumbleOwlee in #304
- build: bump convert_case from 0.11.0 to 0.12.0 by @dependabot[bot] in #299
- Tighten the specs, split multi-rule requirements, and m...
Nightly
Warning
This is an continuously updated Nightly release - containing upcoming features. It may be unstable and also can contain some bugs.
Full Changelog: v0.7.0...nightly
Built from commit e45a385 on 2026-10-22.
v0.6.0
What's Changed
- Persist charge point boot identity (model/vendor/firmware/serial) via :wd by @TumbleOwlee in #139
- Add ICCID, IMSI, and meter identity fields to OCPP 1.6 boot notification by @TumbleOwlee in #140
- Update Cargo.lock by @TumbleOwlee in #146
- feat(ocpp): split column fairly to show actions on small windows by @TumbleOwlee in #147
- Build Ferrowl's Modbus support on rust-modbus instead of tokio-modbus by @TumbleOwlee in #154
- feat(cargo): update dependencies by @TumbleOwlee in #155
- Fix the build after the dependency upgrade (syn 3, validator 0.21) by @TumbleOwlee in #156
- feat(claude): update workflow based on template by @TumbleOwlee in #157
- feat(modbus): optional TLS for Modbus/TCP client and server by @TumbleOwlee in #159
- Feat/update workflow by @TumbleOwlee in #161
- Feat/update workflow by @TumbleOwlee in #162
- Add RtuOverTcp transport support to Modbus by @TumbleOwlee in #165
- Feat/update workflow by @TumbleOwlee in #166
- Add Modbus-over-UDP transport support (client + server) by @TumbleOwlee in #167
- Add Modbus ASCII and AsciiOverTcp transport support (client + server) by @TumbleOwlee in #168
- docs(agents): clarify cargo test -p still needed with a test-name filter by @TumbleOwlee in #169
- docs(readme): document all six Modbus transports and TLS config by @TumbleOwlee in #170
- docs: update impressions by @TumbleOwlee in #171
- deps: bump rust-modbus to ff9f305 (ASCII inter-character timeout) by @TumbleOwlee in #172
- update: increment version to 0.6.0 by @TumbleOwlee in #173
- ci: auto-bump patch version after a release tag by @TumbleOwlee in #174
Full Changelog: v0.5.1...v0.6.0
v0.5.1
What's Changed
- Add configurable register order for multi-register Modbus types by @TumbleOwlee in #136
Full Changelog: v0.5.0...v0.5.1
v0.5.0
What's Changed
- Fix ARCHITECTURE.md's Lua-bridge and OCPP crate boundaries by @TumbleOwlee in #119
- Pin the toolchain and CI action refs, and align the local clippy hook with CI by @TumbleOwlee in #120
- Stop OCPP wire-log encoding from swallowing encode errors by @TumbleOwlee in #121
- Extract the Lua script templates into a ferrowl-templates crate by @TumbleOwlee in #122
- Close the spec-to-test traceability gap for 21 untested requirements by @TumbleOwlee in #123
- Make GitHub the sole nightly artifact builder and mirror the quality gate to GitHub by @TumbleOwlee in #124
- Deduplicate the OCPP 2.x client handler plumbing, keep decision logic fully typed by @TumbleOwlee in #125
- Update ci.yml permissions by @TumbleOwlee in #126
- Harden swallowed error paths and tighten dead-code hygiene by @TumbleOwlee in #127
- Pin rust-ocpp to an explicit commit and drop a stale cargo-deny ignore by @TumbleOwlee in #129
- Fix flaky restart test that bound a fixed port instead of an ephemeral one by @TumbleOwlee in #128
- Fix flaky sim test that bound a fixed port instead of an ephemeral one by @TumbleOwlee in #130
- Document that tests must bind ephemeral ports only by @TumbleOwlee in #131
- Unify each view's command dispatch with its help list, fixing the unhandled :write-device by @TumbleOwlee in #133
- update(version): update to v0.5.0 by @TumbleOwlee in #134
Full Changelog: v0.4.14...v0.5.0
v0.4.14
What's Changed
- docs(agents): add issue and PR gates to the workflow by @TumbleOwlee in #60
- feat(tui): bundled Lua script templates, template browser, script rename by @TumbleOwlee in #62
- feat(tui): ? opens script-table keybind help; shrink the table title by @TumbleOwlee in #64
- docs: add a pull request template by @TumbleOwlee in #69
- ci: enforce fmt and clippy, run the check pipeline on pull requests by @TumbleOwlee in #68
- docs(agents): describe what CI actually enforces by @TumbleOwlee in #70
- build: centralize crate metadata, dependencies, and lints in the workspace manifest by @TumbleOwlee in #73
- ci: check the whole workspace, and audit the dependency tree by @TumbleOwlee in #75
- fix(ocpp): parse PEM via rustls-pki-types, drop unmaintained rustls-pemfile by @TumbleOwlee in #82
- build: bump uuid from 1.23.3 to 1.23.5 by @dependabot[bot] in #81
- build: bump quote from 1.0.45 to 1.0.46 by @dependabot[bot] in #80
- build: bump ratatui from 0.30.1 to 0.30.2 in the ratatui group by @dependabot[bot] in #79
- build: bump rustls from 0.23.41 to 0.23.42 in the rustls group by @dependabot[bot] in #78
- build: bump the tokio group with 2 updates by @dependabot[bot] in #77
- ci: bump actions/checkout from 6 to 7 by @dependabot[bot] in #76
- feat(deps): update cargo deps by @TumbleOwlee in #83
- Require human-friendly issue/PR titles and keep implementation detail out of issues by @TumbleOwlee in #86
- refactor: ban bare unwrap in non-test code, document each site with expect by @TumbleOwlee in #85
- Add integration-test coverage for codec, store, syntax, and util by @TumbleOwlee in #88
- build: bump itertools from 0.14.0 to 0.15.0 by @dependabot[bot] in #94
- build: bump syn from 2.0.118 to 2.0.119 by @dependabot[bot] in #93
- build: bump toml from 0.9.12+spec-1.1.0 to 1.1.3+spec-1.1.0 by @dependabot[bot] in #92
- build: bump mlua from 0.11.6 to 0.12.0 by @dependabot[bot] in #91
- Add a convention: don't split source files for size alone by @TumbleOwlee in #90
- Split oversized files with real seams and regroup the ferrowl crate root by @TumbleOwlee in #95
- Exit the app when the startup new-module dialog is cancelled instead of leaving an empty shell by @TumbleOwlee in #97
- Cite requirement IDs on the test suite, and add the missing requirements it surfaced by @TumbleOwlee in #101
- Raise unit-test coverage of the testable logic layer (76% → 84%) by @TumbleOwlee in #102
- update(cargo): update cargo lock by @TumbleOwlee in #103
- Backfill citing tests for 66 untested Modbus and OCPP requirements by @TumbleOwlee in #105
- Record which requirements are intentionally not unit-tested by @TumbleOwlee in #106
- Cover the 5 OCPP view-lifecycle requirements with citing tests by @TumbleOwlee in #107
- Add process-level and in-crate tests for the CLI, headless runner, and app-free shell by @TumbleOwlee in #109
- Make App's screen generic so it can be mocked in tests by @TumbleOwlee in #110
- Make the App shell unit-testable and cover the nav/command/quit/:write requirements by @TumbleOwlee in #111
Full Changelog: v0.4.13...v0.4.14
v0.4.13
What's Changed
The spec-driven restructure (#58) dominates this release: every capability area got
an authoritative spec written from the code, which surfaced six behavior gaps — all
fixed here. One is a security fix.
Security
- fix(lua): restrict sim scripts to a real safe stdlib subset — sim contexts
loadedStdLib::ALL_SAFE, which leavesio,os(incl.os.execute) and
package/requirereachable. Since scripts live inside config files, loading a
shared config ran untrusted code with full process privileges. Scripts now get
onlystring/table/math/utf8/coroutine, with the dynamic-code loaders
cleared. (SC-R-006, SC-R-007)
Fixes
- fix(store): merge every intersecting region when declaring a range — a range
bridging two slices left them overlapping, so reads of the overlap returned zeros
instead of real values. (MB-R-095, MB-R-096) - fix(modbus/server): answer bad addresses with
IllegalDataAddress— a bad
address returnedIllegalFunctionon FCs 1-6/15/16 butIllegalDataAddresson
FC 23.IllegalFunctionis now reserved for unsupported function codes.
(MB-R-059, MB-R-060) - fix(ocpp): answer a malformed Call with a CallError when its id survives — a
peer whose Call was malformed but whoseuniqueIdwas readable got no reply and
waited out its own timeout. It now gets aFormationViolationCallError.
(OC-R-098..100) - fix(ocpp): let the endpoint scheme decide server TLS — a
ws://server with
certs configured bound a TLS listener, so clients dialing that URL failed. The
scheme is now authoritative in both roles;wss://keeps its self-signed
fallback. (OC-R-042, OC-R-096, OC-R-097) - fix: skip an OCPP tab with a warning when its device file fails to load — a
missing OCPP device file silently produced a default-config tab instead of a
visible skip, unlike Modbus. (CS-R-053) - fix(docs): correct the
RegisterDef.kindread-code comment — the 3/4 mapping
was inverted. Harmless; the field serializes by name.
Features
- feat(tui): run the selected script once with
e—eon the focused script
table runs it immediately, using the editor's unsaved content and ignoring its
enabled flag, so the edit → run → read-log loop stays in the dialog. The run is
isolated: fresh Lua context, short-lived thread, sameC_*modules, no running
sim needed and no state shared with one. Errors log under[run], not[sim].
All four ScriptDialog owners support it. (UI-R-051, SC-R-035)
Documentation
docs/specs/is now authoritative for six areas (modbus, ocpp, scripting, tui,
config-session, cli-headless) — requirements, API/data contracts, edge cases, plus
cross-cutting non-functional requirements. IDs are stable and append-only.PRD.mdandARCHITECTURE.mdadded at the root.AGENTS.mdrewritten as a router intodocs/specs/, and now defines the
agent workflow: two approval gates (normative spec text, then the staged plan and
its test-to-requirement-ID table), triggered by behavior change, not diff size.
CLAUDE.mdpoints at it.CONTRIBUTING.mdrequires a same-PR spec update on behavior changes, nudged by a
warning-only lefthook pre-commit hook.docs/agents/,docs/prd.mdand the staleferrowl-ocpp/README.mddeleted.
Full Changelog: v0.4.12...v0.4.13
v0.4.12
What's Changed
Session Scripts & Module System
- feat(lua): add
C_Modulecross-module access module - feat(app): add module registry with
C_Modulelua bridges - feat(app): add session script config and session sim runner
- feat(app): add
:sessiondialog for session-level lua scripts - feat(app): run session lua scripts in headless mode
- feat(app): ship demo session script showcasing
C_Module - feat(lua): add
GetConnectorsto retrieve connector ids of client - refactor(modbus): decouple lua sim from instance lifecycle
- refactor: unify SessionDialog into ScriptDialog
- test(app): add session lua e2e regression tests
Logging
- feat(log): add
Levelenum and colorized Level column - feat(log): split dedicated script_log ring per module
- feat(lua): rename
C_Log:PrinttoInfo, addWarn/Errormethods - fix(log): thread
Levelthrough everyLogRing::write/emitcall site - fix: give command results an explicit log
Levelinstead of guessing from text - fix: use case-insensitive "failed" matching in log-level classifiers
UI & Input
- feat(ui): keystroke-level allowed-char filtering for
InputField - feat(app): wire allowed-char filtering into input fields
- feat(app): Esc opens confirm-close in dialogs;
?shows Lua bindings - feat(cmd): add command
swapto reorder tabs - refactor(ui): port views to Focus/Overlay derives, dedup dialogs
- fix(ui): support line wrap on descriptions of help
- fix(ui): cap scripts table width in script and session dialogs
- fix(ui): make
:sessiondialog own its widgets in one overlay - fix(ocpp): send action with Space on Send button without closing dialog
- fix(ocpp/server): Space key didn't activate CsTable/ScriptsButton/Actions
Config
- feat(config): add per-module script-cycle interval
Fixes & Maintenance
- fix: resolve 17 bugs from workspace-wide code review
- refactor: address BOILERPLATE/SIMPLIFY findings, plus error-handling and test-coverage rounds
- fix(help): update session script help overlay
- fix(test): add missing methods to lua mocks
- feat(cmd): add
swapto help overlay - docs(readme): document session scripts and
C_Moduleapi
Full Changelog: v0.4.11...v0.4.12
v0.4.11
What's Changed
- fix(ocpp): ws-edit security wipe and cleanups by @TumbleOwlee
- fix(ui): dialogs reclaum the space of hidden row siblings by @TumbleOwlee
- feature(ui): vim-like model editing in CodeInputField state by @TumbleOwlee
Full Changelog: v0.4.10...v0.4.11
v0.4.10
What's Changed
- feature: flush file sink once per tick, not per line by @TumbleOwlee
- feature: typed Lua value path by @TumbleOwlee
- feature: headless mode for CI usage by @TumbleOwlee
- feature: Lua test module for
Assert(..)andFail(..)by @TumbleOwlee - feature: option to activate auto-reconnect for Modbus client modules by @TumbleOwlee
- feature: full TLS configuration in OCPP modules for
wss://usage by TumbleOwlee
Full Changelog: v0.4.9...v0.4.10