Skip to content

Releases: TumbleOwlee/ferrowl

v0.7.0

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 22 Oct 20:26
e45a385

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-store cell API: one Access enum, 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...
Read more

Nightly

Nightly Pre-release
Pre-release

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 22 Oct 20:59
e45a385

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

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 09 Aug 13:40
37468f9

What's Changed

Full Changelog: v0.5.1...v0.6.0

v0.5.1

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 20 Jul 23:24
b702451

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

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 19 Jul 12:05
d6adb44

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

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 17 Jul 15:13
9ddb279

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

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 13 Jul 22:33
f2a5446

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
    loaded StdLib::ALL_SAFE, which leaves io, os (incl. os.execute) and
    package/require reachable. Since scripts live inside config files, loading a
    shared config ran untrusted code with full process privileges. Scripts now get
    only string/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 returned IllegalFunction on FCs 1-6/15/16 but IllegalDataAddress on
    FC 23. IllegalFunction is 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 whose uniqueId was readable got no reply and
    waited out its own timeout. It now gets a FormationViolation CallError.
    (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.kind read-code comment — the 3/4 mapping
    was inverted. Harmless; the field serializes by name.

Features

  • feat(tui): run the selected script once with e — e on 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, same C_* 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.md and ARCHITECTURE.md added at the root.
  • AGENTS.md rewritten as a router into docs/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.md points at it.
  • CONTRIBUTING.md requires a same-PR spec update on behavior changes, nudged by a
    warning-only lefthook pre-commit hook.
  • docs/agents/, docs/prd.md and the stale ferrowl-ocpp/README.md deleted.

Full Changelog: v0.4.12...v0.4.13

v0.4.12

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 12 Jul 14:16

What's Changed

Session Scripts & Module System

  • feat(lua): add C_Module cross-module access module
  • feat(app): add module registry with C_Module lua bridges
  • feat(app): add session script config and session sim runner
  • feat(app): add :session dialog 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 GetConnectors to 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 Level enum and colorized Level column
  • feat(log): split dedicated script_log ring per module
  • feat(lua): rename C_Log:Print to Info, add Warn/Error methods
  • fix(log): thread Level through every LogRing::write/emit call site
  • fix: give command results an explicit log Level instead 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 swap to 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 :session dialog 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 swap to help overlay
  • docs(readme): document session scripts and C_Module api

Full Changelog: v0.4.11...v0.4.12

v0.4.11

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 07 Jul 23:06

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

Choose a tag to compare

@TumbleOwlee TumbleOwlee released this 06 Jul 20:32

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(..) and Fail(..) 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