Settings store, logging & settings dialog (#5) #38

Merged
gronod merged 1 commits from feat/5-settings-logging into milestone/m1-foundation 2026-09-08 19:14:40 +01:00
Owner

Implements issue #5 (M1).

  • AppSettings — snake_case Codable model at ~/Library/Application Support/com.gronod.iccery2/settings.json (v1 path never read): argyll_binary_dir, default_instrument (stored, never applied to argv — docs/04 §0.1), log_level (nil → Debug debug / Info release), delta_e_good_max 2.0 / delta_e_warning_max 5.0, custom_presets, enable_i1pro2_leds, calibration_stale_days 30, default_install_location user, ask_before_overwrite_profile, open_color_panel_after_install.
  • Validation with the exact contract strings; invalid settings are never written; corrupt/missing JSON → defaults; settingsDidChange posted on save (for #20).
  • LogSink — rolling ~/Library/Logs/com.gronod.iccery2/iccery.log, 5 MiB × 5 segments; setLevel is runtime state applied at startup and on save (#158); AppLogger gates os_log + file through it; tailExcerpt for the copy button.
  • SettingsView sheet — Argyll dir picker (#6 selectDirectory), default instrument (display-only caveat), i1Pro2 LEDs toggle, ΔE fields + inline errors, stale days, install location, overwrite + ColorSync toggles, log level picker, open-log-folder / copy-path / copy-excerpt.

Verified: 60/60 tests pass (validation strings, corrupt JSON, rotation, live level change).

Closes #5

Implements issue #5 (M1). - `AppSettings` — snake_case `Codable` model at `~/Library/Application Support/com.gronod.iccery2/settings.json` (v1 path never read): `argyll_binary_dir`, `default_instrument` (stored, **never** applied to argv — docs/04 §0.1), `log_level` (nil → Debug debug / Info release), `delta_e_good_max` 2.0 / `delta_e_warning_max` 5.0, `custom_presets`, `enable_i1pro2_leds`, `calibration_stale_days` 30, `default_install_location` `user`, `ask_before_overwrite_profile`, `open_color_panel_after_install`. - Validation with the exact contract strings; invalid settings are never written; corrupt/missing JSON → defaults; `settingsDidChange` posted on save (for #20). - `LogSink` — rolling `~/Library/Logs/com.gronod.iccery2/iccery.log`, 5 MiB × 5 segments; `setLevel` is runtime state applied at startup **and** on save (#158); `AppLogger` gates os_log + file through it; `tailExcerpt` for the copy button. - `SettingsView` sheet — Argyll dir picker (#6 `selectDirectory`), default instrument (display-only caveat), i1Pro2 LEDs toggle, ΔE fields + inline errors, stale days, install location, overwrite + ColorSync toggles, log level picker, open-log-folder / copy-path / copy-excerpt. Verified: 60/60 tests pass (validation strings, corrupt JSON, rotation, live level change). Closes #5
gronod added the
Priority
Medium
3
Priority
Low
4
Project/ICCery-v2Feature/Backend
labels 2026-09-08 19:14:27 +01:00
gronod added 1 commit 2026-09-08 19:14:29 +01:00
- AppSettings: snake_case Codable model — argyll_binary_dir,
  default_instrument (stored, never applied to argv), log_level (nil ->
  Debug debug / Info release), delta_e thresholds (2.0/5.0),
  custom_presets, enable_i1pro2_leds, calibration_stale_days 30,
  default_install_location user, ask_before_overwrite_profile,
  open_color_panel_after_install
- Validation with the exact contract strings; save() refuses invalid
  settings; corrupt/missing JSON -> defaults; settingsDidChange
  notification posted on save (for #20)
- LogSink: rolling file at ~/Library/Logs/com.gronod.iccery2/
  iccery.log, 5 MiB x 5 segments, runtime setLevel applied at startup
  and on save (#158); AppLogger gates os_log+file through it
- SettingsView sheet: Argyll dir picker, instrument (display-only
  caveat), i1Pro2 LEDs, ΔE fields + inline errors, stale days, install
  location, overwrite + ColorSync toggles, log level, open-log-folder /
  copy-path / copy-excerpt
- v1 settings path never read; writes atomic via AtomicFileWriter
- 13 new tests; 60/60 green

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
gronod merged commit ea9409ddd4 into milestone/m1-foundation 2026-09-08 19:14:40 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gronod/iccery-v2-mac#38