docs(04-01): complete notifications et mode focus plan

- SUMMARY.md with execution results
- STATE.md updated (position, decisions, metrics)
- ROADMAP.md progress updated
- Requirements NOTIF-01, NOTIF-02 marked complete
This commit is contained in:
Pierre Martin
2026-03-23 21:27:10 +01:00
parent efbe31928e
commit 399e3e8f02
4 changed files with 118 additions and 16 deletions

View File

@@ -29,8 +29,8 @@ Requirements for initial release. Each maps to roadmap phases.
### Notifications ### Notifications
- [ ] **NOTIF-01**: vmux notifie (dunst) quand une session passe de "travaille" à "attend input" - [x] **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-02**: vmux supporte un mode focus qui supprime temporairement les notifications
## v2 Requirements ## v2 Requirements
@@ -77,8 +77,8 @@ Which phases cover which requirements. Updated during roadmap creation.
| I3-01 | Phase 2 | Complete | | I3-01 | Phase 2 | Complete |
| I3-02 | Phase 2 | Complete | | I3-02 | Phase 2 | Complete |
| I3-03 | Phase 4 | Pending | | I3-03 | Phase 4 | Pending |
| NOTIF-01 | Phase 4 | Pending | | NOTIF-01 | Phase 4 | Complete |
| NOTIF-02 | Phase 4 | Pending | | NOTIF-02 | Phase 4 | Complete |
**Coverage:** **Coverage:**
- v1 requirements: 13 total - v1 requirements: 13 total

View File

@@ -75,7 +75,7 @@ Plans:
**Plans**: 2 plans **Plans**: 2 plans
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 - [ ] 04-02-PLAN.md — Widget i3bar avec format compact, wrapping i3status, CLI vmux i3bar
## Progress ## Progress

View File

@@ -2,14 +2,14 @@
gsd_state_version: 1.0 gsd_state_version: 1.0
milestone: v1.0 milestone: v1.0
milestone_name: milestone milestone_name: milestone
status: Ready to plan status: Ready to execute
stopped_at: Phase 4 context gathered stopped_at: Completed 04-01-PLAN.md
last_updated: "2026-03-23T19:31:54.299Z" last_updated: "2026-03-23T20:27:01.799Z"
progress: progress:
total_phases: 4 total_phases: 4
completed_phases: 3 completed_phases: 3
total_plans: 7 total_plans: 9
completed_plans: 7 completed_plans: 8
--- ---
# Project State # Project State
@@ -19,12 +19,12 @@ progress:
See: .planning/PROJECT.md (updated 2026-03-23) 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. **Core value:** Savoir instantanement quelle session Claude Code a besoin de moi, sans scanner manuellement mes workspaces.
**Current focus:** Phase 03hook-server **Current focus:** Phase 04notifications-et-i3bar
## Current Position ## Current Position
Phase: 4 Phase: 04 (notifications-et-i3bar) — EXECUTING
Plan: Not started Plan: 2 of 2
## Performance Metrics ## Performance Metrics
@@ -52,6 +52,7 @@ Plan: Not started
| Phase 02 P02 | 4min | 2 tasks | 7 files | | Phase 02 P02 | 4min | 2 tasks | 7 files |
| Phase 03 P01 | 3min | 2 tasks | 4 files | | Phase 03 P01 | 3min | 2 tasks | 4 files |
| Phase 03 P02 | 3min | 2 tasks | 5 files | | Phase 03 P02 | 3min | 2 tasks | 5 files |
| Phase 04 P01 | 3min | 2 tasks | 9 files |
## Accumulated Context ## Accumulated Context
@@ -73,6 +74,9 @@ Recent decisions affecting current work:
- [Phase 03]: WaitType omitempty pour compatibilite clients existants - [Phase 03]: WaitType omitempty pour compatibilite clients existants
- [Phase 03]: hookPort=0 dans tests pour eviter bind accidentel - [Phase 03]: hookPort=0 dans tests pour eviter bind accidentel
- [Phase 03]: time.After dynamique remplace ticker fixe pour poll interval - [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 ### Pending Todos
@@ -84,6 +88,6 @@ None yet.
## Session Continuity ## Session Continuity
Last session: 2026-03-23T19:31:54.294Z Last session: 2026-03-23T20:27:01.792Z
Stopped at: Phase 4 context gathered Stopped at: Completed 04-01-PLAN.md
Resume file: .planning/phases/04-notifications-et-i3bar/04-CONTEXT.md Resume file: None

View File

@@ -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 <minutes> 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 <minutes>` 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 <minutes>", 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*