diff --git a/.planning/phases/04-notifications-et-i3bar/04-CONTEXT.md b/.planning/phases/04-notifications-et-i3bar/04-CONTEXT.md new file mode 100644 index 0000000..0e210b0 --- /dev/null +++ b/.planning/phases/04-notifications-et-i3bar/04-CONTEXT.md @@ -0,0 +1,91 @@ +# Phase 4: Notifications et i3bar - Context + +**Gathered:** 2026-03-24 +**Status:** Ready for planning + + +## Phase Boundary + +Notifications desktop (dunst) quand une session passe de Working à Needs Input, mode focus avec timer pour supprimer temporairement les notifications, et widget i3bar affichant le statut des sessions en temps réel. + + + + +## Implementation Decisions + +### Notifications dunst +- **D-01:** Notifier uniquement sur transition Working → Needs Input. Pas de notif pour Idle → Needs Input ou Working → Idle. +- **D-02:** Pas de debounce en v1. Un event hook = une transition = une notification (si pas en mode focus). +- **D-03:** Envoyer les notifications via `notify-send` (ou esiqveland/notify D-Bus). Claude décide l'approche. + +### Mode focus +- **D-04:** Timer uniquement : `vmux focus 30` (30 min). Se désactive automatiquement après la durée. Pas de toggle on/off sans durée. +- **D-05:** Le mode focus supprime les notifications dunst. Le widget i3bar reste visible. + +### Widget i3bar +- **D-06:** Format liste courte : `vmux: auth[!] portal[W] neia[I]`. Les noms sont le dernier segment du cwd ou le label si défini. `[!]` = Needs Input, `[W]` = Working, `[I]` = Idle. +- **D-07:** Quand aucune session n'attend : `vmux: all working (3)`. +- **D-08:** Couleurs selon urgence : rouge si ≥1 session attend, vert sinon. + +### Claude's Discretion +- Protocole i3bar (i3status-rs, i3blocks, ou script custom) +- Implémentation des notifications (notify-send vs D-Bus natif) +- Fréquence de rafraîchissement du widget i3bar +- Stockage du timer focus (en mémoire dans le daemon, persisté ou non) + + + + +## Canonical References + +**Downstream agents MUST read these before planning or implementing.** + +### Existing codebase (Phases 1-3) +- `daemon.go` — Daemon struct avec poll loop, hook server, handlers. Les notifications se déclenchent dans la transition d'état. +- `protocol.go` — SessionInfo avec WaitType. Le widget i3bar consomme la liste des sessions. +- `hook.go` — processHookEvent, UpdateFromHook. Point d'intégration pour les notifications. +- `display.go` — DisplaySessionInfos. Pattern pour le formatage. +- `main.go` — CLI dispatch. Ajouter `vmux focus ` et potentiellement `vmux i3bar`. + + + + +## Existing Code Insights + +### Reusable Assets +- `SessionRegistry.List()` — retourne toutes les sessions actives, utilisable pour le widget i3bar +- `processHookEvent` dans hook.go — point d'intégration pour déclencher les notifications +- `Daemon.handleConnection` — pattern pour ajouter de nouvelles actions (focus) + +### Established Patterns +- Sous-commandes CLI via switch dans main.go +- Request/Response JSON sur Unix socket +- Goroutines daemon (acceptLoop, pollLoop, hookServerLoop) + +### Integration Points +- hook.go `processHookEvent` ou `UpdateFromHook` — déclencher la notif après un changement Working → Needs Input +- daemon.go — ajouter le state focus (timer) et le handler focus +- main.go — ajouter les sous-commandes `focus` et `i3bar` + + + + +## Specific Ideas + +- Le widget i3bar peut être un script que i3blocks/i3bar appelle périodiquement. Le script query le daemon via le socket Unix et formate la sortie. +- Le mode focus est un timer dans le daemon : timestamp d'expiration. Si `time.Now()` < expiration, pas de notification. +- Les noms courts dans le widget i3bar : label si défini, sinon dernier segment du cwd (ex: `/home/pierre/Code/vibe/vmux` → `vmux`). + + + + +## Deferred Ideas + +None — discussion stayed within phase scope + + + +--- + +*Phase: 04-notifications-et-i3bar* +*Context gathered: 2026-03-24*