diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 888bdfb..2231a8d 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -29,8 +29,8 @@ Requirements for initial release. Each maps to roadmap phases. ### Notifications -- [ ] **NOTIF-01**: vmux notifie (dunst) quand une session passe de "travaille" à "attend input" -- [ ] **NOTIF-02**: vmux supporte un mode focus qui supprime temporairement les notifications +- [x] **NOTIF-01**: vmux notifie (dunst) quand une session passe de "travaille" à "attend input" +- [x] **NOTIF-02**: vmux supporte un mode focus qui supprime temporairement les notifications ## v2 Requirements @@ -77,8 +77,8 @@ Which phases cover which requirements. Updated during roadmap creation. | I3-01 | Phase 2 | Complete | | I3-02 | Phase 2 | Complete | | I3-03 | Phase 4 | Pending | -| NOTIF-01 | Phase 4 | Pending | -| NOTIF-02 | Phase 4 | Pending | +| NOTIF-01 | Phase 4 | Complete | +| NOTIF-02 | Phase 4 | Complete | **Coverage:** - v1 requirements: 13 total diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 9dc6293..29f652c 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -75,7 +75,7 @@ Plans: **Plans**: 2 plans Plans: -- [ ] 04-01-PLAN.md — Notifications dunst (Working->Needs Input), mode focus avec timer, CLI vmux focus +- [x] 04-01-PLAN.md — Notifications dunst (Working->Needs Input), mode focus avec timer, CLI vmux focus - [ ] 04-02-PLAN.md — Widget i3bar avec format compact, wrapping i3status, CLI vmux i3bar ## Progress diff --git a/.planning/STATE.md b/.planning/STATE.md index 9fa4740..b98a034 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,14 +2,14 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone -status: Ready to plan -stopped_at: Phase 4 context gathered -last_updated: "2026-03-23T19:31:54.299Z" +status: Ready to execute +stopped_at: Completed 04-01-PLAN.md +last_updated: "2026-03-23T20:27:01.799Z" progress: total_phases: 4 completed_phases: 3 - total_plans: 7 - completed_plans: 7 + total_plans: 9 + completed_plans: 8 --- # Project State @@ -19,12 +19,12 @@ progress: See: .planning/PROJECT.md (updated 2026-03-23) **Core value:** Savoir instantanement quelle session Claude Code a besoin de moi, sans scanner manuellement mes workspaces. -**Current focus:** Phase 03 — hook-server +**Current focus:** Phase 04 — notifications-et-i3bar ## Current Position -Phase: 4 -Plan: Not started +Phase: 04 (notifications-et-i3bar) — EXECUTING +Plan: 2 of 2 ## Performance Metrics @@ -52,6 +52,7 @@ Plan: Not started | Phase 02 P02 | 4min | 2 tasks | 7 files | | Phase 03 P01 | 3min | 2 tasks | 4 files | | Phase 03 P02 | 3min | 2 tasks | 5 files | +| Phase 04 P01 | 3min | 2 tasks | 9 files | ## Accumulated Context @@ -73,6 +74,9 @@ Recent decisions affecting current work: - [Phase 03]: WaitType omitempty pour compatibilite clients existants - [Phase 03]: hookPort=0 dans tests pour eviter bind accidentel - [Phase 03]: time.After dynamique remplace ticker fixe pour poll interval +- [Phase 04]: notify-send via os/exec avec timeout 5s (pas de lib D-Bus) +- [Phase 04]: Notification uniquement sur Working -> Needs Input (D-01) +- [Phase 04]: FocusTimer par timer uniquement, pas de toggle (D-04) ### Pending Todos @@ -84,6 +88,6 @@ None yet. ## Session Continuity -Last session: 2026-03-23T19:31:54.294Z -Stopped at: Phase 4 context gathered -Resume file: .planning/phases/04-notifications-et-i3bar/04-CONTEXT.md +Last session: 2026-03-23T20:27:01.792Z +Stopped at: Completed 04-01-PLAN.md +Resume file: None diff --git a/.planning/phases/04-notifications-et-i3bar/04-01-SUMMARY.md b/.planning/phases/04-notifications-et-i3bar/04-01-SUMMARY.md new file mode 100644 index 0000000..e40dcb5 --- /dev/null +++ b/.planning/phases/04-notifications-et-i3bar/04-01-SUMMARY.md @@ -0,0 +1,98 @@ +--- +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*