543 Commits

Author SHA1 Message Date
e143fc18cc docs(repo): mark BL-R1 (revert a setting) done 2026-06-08 08:49:21 -04:00
6d4505ad2c test(repo): revert round-trip integration tests for da12 + da07 2026-06-08 08:43:30 -04:00
94586416ae feat(da07): wire revert writer into the four setting-history call sites 2026-06-08 08:39:09 -04:00
eb6142fa6e feat(da07): setting_writer maps history keys to set_* methods 2026-06-08 08:33:29 -04:00
6bbf626a29 feat(da12): wire revert writer into the four setting-history call sites 2026-06-08 08:29:01 -04:00
cb89c7458a feat(da12): setting_writer maps history keys to set_* methods 2026-06-08 08:24:41 -04:00
071dbb25ff feat(repo): right-click "Set to this value" in the setting history dialog
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 08:18:56 -04:00
59d4f812a6 docs(repo): implementation plan for reverting a setting (BL-R1)
Seven TDD tasks: core dialog right-click menu + writer_for injection, per-module
setting_writer resolvers (da12 + da07), wiring the eight call sites, revert
round-trip integration tests, and doc updates marking BL-R1 done.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 08:03:06 -04:00
d7b02a88e0 docs(repo): design for reverting a setting to a historical value (BL-R1)
Right-click a row in the "Setting history…" dialog to write that historical
value back to the connected station. The dialog stays module-agnostic via an
injected writer_for(setting_key) resolver; each module's repo_snapshot maps
writable keys to their set_* method and returns None for read-only ones
(MAC/firmware/serial/stats, type_code<0 station lines). Read-only rows show a
disabled menu item with a tooltip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 07:57:54 -04:00
efce03b759 build(packaging): single-source installer version; document release flow
The Inno Setup script hardcoded AppVersion '0.1.0' - a stale second source of truth that would ship the wrong version in Add/Remove Programs. It now takes the version at compile time via /DAppVersion (0.0.0-dev sentinel if omitted), and the README/CLAUDE.md build commands derive it from cim_suite.__version__. Also documents the full release sequence and notes-before-bump ordering in the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:33:55 -04:00
2132363cd5 chore: release 1.0.2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.0.2
2026-06-06 12:18:10 -04:00
667882995a fix(release): write pyproject.toml with LF newlines
bump.py wrote via Python text mode, which translated newlines to CRLF on Windows and produced a 'CRLF will be replaced by LF' warning on every release. Write with newline='' so the file stays LF, matching .gitattributes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:17:32 -04:00
f2c94b3f71 chore: release 1.0.1
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.0.1
2026-06-06 12:15:25 -04:00
fec31b3c68 fix(release): avoid non-ASCII dash in bump.py console output
The em-dash in the 'nothing to bump' message rendered as a replacement char on Windows' cp1252 console; use a plain hyphen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:13:40 -04:00
63169a7644 feat: add versioning and changelog system
Conventional-Commit-driven version bumps (scripts/bump.py), a commit-msg validation hook, and a /release-notes workflow that produces a human-reviewed CHANGELOG.md. Adds an in-app version badge + 'What's new' dialog on the launcher. The version is single-sourced from pyproject.toml (cim_suite.__version__), and the deterministic bump backbone lives in scripts/release/ with tests in tests/release/. Marks the 1.0.0 baseline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.0.0
2026-06-06 11:31:22 -04:00
1219517d14 fix(repository): stretch the Value column in Setting history dialog
The dialog stretched the middle "Setting" column, leaving "Value" stuck at
the ~100px default with no draggable handle (it's the last column next to a
stretch section). Switch to the codebase convention used by the sibling
da12 history dialog: stretch the last column ("Value"), keep sections
Interactive (resizable), and resizeColumnsToContents for sensible initial
widths. Value now fills the space, Setting fits its label, columns resize.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:48:41 -04:00
db3519da01 Merge feat/device-settings-repository: suite-wide device settings repository
Adds a shared SQLite store that change-logs DA-12/DA-07 configuration
settings keyed by station MAC (first sighting + on change; live values
excluded), surfaced via a reusable "Setting history..." dialog (per-row +
whole-device). Simulator runs use a separate devices.sim.db. Revert-to-
previous is tracked as BL-R1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:39:07 -04:00
5c0bcc3a05 polish(repository): export honors active filter; note station config-only HW item
- SettingHistoryDialog.export_to now writes the currently-shown (filtered)
  rows instead of always the full set, matching what the user sees.
- Flag the station-settings wholesale-record assumption in
  HARDWARE-VERIFICATION.md for confirmation against real D/E/B/C frames.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:03:49 -04:00
283cf032f9 docs: device repository status, BL-R1 revert backlog, CLAUDE.md note
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 09:55:41 -04:00
586e955614 feat(da07): whole-device Setting history action; thread repo to tabs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:53:36 -04:00
a624d2f3af feat(da07): per-row Setting history on Station tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:51:06 -04:00
f444845ec3 feat(da07): per-row Setting history on Channels tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:49:04 -04:00
0c944e2e06 feat(da07): per-row Setting history on Devices tab 2026-06-06 09:46:42 -04:00
a2573a306b feat(da12): whole-device Setting history action; thread repo to tabs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:44:45 -04:00
45d9db2a18 feat(da12): per-row Setting history on Station tab 2026-06-06 09:42:16 -04:00
b7cdea7a5c feat(da12): per-row Setting history on Alarm Limits tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:40:21 -04:00
43158da28a feat(da12): per-row Setting history on Sensors tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:38:25 -04:00
e882f5bf82 feat(repository): reusable SettingHistoryDialog + action helper
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:36:13 -04:00
5dfa8603ec feat(da07): wire repository recorder into module lifecycle
Construct DeviceRepository + RepositoryRecorder in create_widget (before
refresh()) so loadFinished is caught; stop/close both in shutdown() to
prevent a pending debounce flush hitting a closed connection. Mirrors the
DA-12 Task 8 wiring. Integration test confirms first > 0 and idempotency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:26:34 -04:00
cfadec7dac feat(da07): repository snapshot adapter (serial-keyed, config fields)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 09:22:00 -04:00
30cbb52c6c refactor(repository): add RepositoryRecorder.stop() to encapsulate timer cancel
Replaces the module reaching into _recorder._timer with a public stop()
called before closing the repo, so a pending debounced flush can't hit a
closed SQLite connection. Reused by both module shutdowns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 09:19:38 -04:00
abf9f01927 feat(da12): wire repository recorder into module lifecycle
Build DeviceRepository + RepositoryRecorder in create_widget so all
live sessions record config changes; stop the recorder debounce timer
before closing the repo in shutdown to prevent use-after-close errors.
Add integration tests that exercise make_recorder end-to-end against
the simulator (refresh dedup + sensor-name edit round-trip via refresh).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 09:18:02 -04:00
5c7949df23 feat(da12): repository snapshot adapter (config fields, MAC by label)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 09:10:57 -04:00
b754d2c7d9 feat(repository): RepositoryRecorder with debounce, gates, per-MAC hydration 2026-06-06 09:05:01 -04:00
0205f0df27 feat(repository): history query with word-boundary-safe prefix filter 2026-06-06 09:01:03 -04:00
1818aa1c07 feat(repository): record (first-sight + on-change) and current_values 2026-06-06 08:59:37 -04:00
0d46d36836 feat(repository): DeviceRepository schema + ensure_device
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 08:57:56 -04:00
a48730a800 feat(repository): resolve suite-level db path with sim isolation 2026-06-06 08:56:14 -04:00
ed0b7c2ebc feat(repository): add canonical MAC normalization
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 08:54:30 -04:00
392b03ddda docs: add device settings repository implementation plan
20 TDD tasks: core SQLite store + recorder + reusable history dialog,
per-module snapshot adapters (config-only whitelist, MAC-by-label,
serial-keyed DA-07 pods), module wiring with sim isolation, per-row +
whole-device "Setting history..." UI, and BL-R1 revert backlog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 08:51:32 -04:00
b6e9e35194 docs: isolate simulator from device settings repository
In --simulate mode the repository points at a separate devices.sim.db so
the simulator's fixed MAC never pollutes real device history, while the
record/history feature stays interactively testable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 08:31:01 -04:00
8fdfe5b5cd docs: add device settings repository design spec
Suite-wide SQLite store keyed by MAC that change-logs DA-12/DA-07
configuration settings (first sighting + on change), with a reusable
"Setting history..." dialog (per-row + whole-device) and a placeholder
backlog item for reverting to a previous value.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 08:25:43 -04:00
316e876a4c Merge chore/iomodbus-add-pa35-rename-pa: add PA-35 factory device; rename PA-01/14/15 and PA-02
Folds the missing PA-35 device from the supplied docs/IOModbus.txt into the
bundled factory catalog, and renames the existing PA Visual/PA Audible entries
(id 0x2/0x1) to PA-01/14/15 and PA-02 to match the supplied naming.
2026-06-06 07:40:58 -04:00
b8392aa9fa feat(iomodbus): add PA-35 factory device; rename PA Visual/Audible to PA-01/14/15 and PA-02
Folds the missing device from the supplied docs/IOModbus.txt into the bundled
factory catalog. Only PA-35 (id 0x35) was genuinely absent; PA-01/14/15 (id 0x2)
and PA-02 (id 0x1) already shipped under the names "PA Visual" and "PA Audible"
with identical register maps, so they are renamed (device names + the
"Timeout"->"Communication Timeout" channel label) rather than duplicated.
Register attributes of the renamed entries are left as the factory's (e.g. the
static firmware-version flag). All 138 iomodbus tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 07:37:49 -04:00
6b95a8c80a Merge feat/iomodbus-supported-devices-list: Supported Devices browser
Read-only catalog browser listing every factory + user device in a
sortable table (Name/ID/Manufacturer/Min FW/Channels/Settings/Origin),
evolving the Manage User Devices dialog. Delete limited to user rows;
overridden factory rows marked. Backed by pure catalog_view.build_device_rows
and config.supported_devices().
2026-06-05 23:17:47 -04:00
18f50aa871 fix(iomodbus): make Supported Devices initial sort order explicit (no-op indicator) 2026-06-05 23:17:29 -04:00
4bfbbde457 docs(iomodbus): note the Supported Devices browser in rebuild status
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 23:09:16 -04:00
246072772e fix(iomodbus): numeric/hex column sort + scope supported-dialog test refs to the dialog
- _populate_supported_table: Channels/Settings use int DisplayRole for numeric
  header-click sorting; ID and Min FW zero-padded to 4 hex digits so
  lexicographic order equals numeric order.
- _build_supported_dialog: test-access refs (_table, _delete_btn) stored on
  the dialog object rather than self, so they don't outlive the widgets.
- Tests updated to read from dlg._table / dlg._delete_btn accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 23:07:08 -04:00
b69150faef feat(iomodbus): Supported Devices browser (factory + user table)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 22:58:00 -04:00
cbe56c2f7b style(iomodbus): name supported_devices base var 'base' for consistency 2026-06-05 22:55:55 -04:00