--- phase: 04-notifications-et-i3bar plan: 01 subsystem: notifications tags: [notify-send, dunst, focus-mode, desktop-notifications] requires: - phase: 03-hooks-claude-code provides: "Hook server, processHookEvent, UpdateFromHook with PrevState tracking" provides: - "Notifier interface (ExecNotifier + NullNotifier)" - "FocusTimer thread-safe (Set/IsActive/Remaining)" - "Notification on Working -> Needs Input transition" - "CLI vmux focus command" affects: [04-02-i3bar] tech-stack: added: [notify-send via os/exec] patterns: [interface-based notification injection, spy pattern for testing side-effects] key-files: created: [notify.go, notify_test.go, focus.go, focus_test.go] modified: [daemon.go, hook.go, protocol.go, main.go, daemon_test.go] key-decisions: - "notify-send via os/exec (pas de lib D-Bus) pour simplicite" - "FocusTimer par timer uniquement, pas de toggle on/off" - "Notification uniquement sur Working -> Needs Input (pas Idle -> Needs Input)" patterns-established: - "spyNotifier pattern: spy struct pour tester les side-effects de notification" - "Interface injection: Notifier injectable dans Daemon pour testabilite" requirements-completed: [NOTIF-01, NOTIF-02] duration: 3min completed: 2026-03-23 --- # Phase 04 Plan 01: Notifications Desktop et Mode Focus Summary **Notifications dunst via notify-send sur transition Working -> Needs Input, avec mode focus pour supprimer temporairement les alertes** ## Performance - **Duration:** 3 min - **Started:** 2026-03-23T20:23:04Z - **Completed:** 2026-03-23T20:26:11Z - **Tasks:** 2 - **Files modified:** 9 ## Accomplishments - Notifier interface avec ExecNotifier (notify-send --urgency=critical) et NullNotifier - FocusTimer thread-safe qui supprime les notifications pendant N minutes - Integration dans processHookEvent : notifie uniquement sur Working -> Needs Input - CLI `vmux focus ` pour activer le mode focus ## Task Commits Each task was committed atomically: 1. **Task 1: Notifier interface, FocusTimer, et tests** - `b96c6d0` (feat) 2. **Task 2: Integration notifications dans daemon + CLI focus** - `efbe319` (feat) ## Files Created/Modified - `notify.go` - Notifier interface, ExecNotifier (notify-send), NullNotifier, shortName helper - `notify_test.go` - Tests ExecNotifier, NullNotifier, shortName - `focus.go` - FocusTimer struct thread-safe (Set/IsActive/Remaining) - `focus_test.go` - Tests FocusTimer Set/Expired/Remaining/ZeroValue - `daemon.go` - Champs notifier + focus dans Daemon, handler "focus" - `hook.go` - Lecture PrevState avant UpdateFromHook, notification conditionnelle - `protocol.go` - FocusArgs, FocusRemaining dans Response - `main.go` - CLI "focus ", usage mis a jour - `daemon_test.go` - spyNotifier, tests transitions notification, test focus handler ## Decisions Made - notify-send via os/exec avec timeout 5s (pas de lib D-Bus, simplicite) - Notification uniquement sur Working -> Needs Input (D-01) - Focus = timer uniquement, pas de toggle (D-04) - Focus bloque les notifications mais pas l'i3bar (D-05) ## Deviations from Plan None - plan executed exactly as written. ## Issues Encountered None ## User Setup Required None - no external service configuration required. ## Next Phase Readiness - Notification infrastructure en place, prete pour le widget i3bar (plan 04-02) - FocusTimer expose pour usage futur dans l'i3bar --- *Phase: 04-notifications-et-i3bar* *Completed: 2026-03-23*