diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index cca64eb..f7cca39 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -12,14 +12,14 @@ Requirements for initial release. Each maps to roadmap phases. - [x] **DISC-01**: vmux détecte automatiquement les processus Claude Code actifs sur le poste - [x] **DISC-02**: vmux identifie le cwd et le worktree git de chaque session - [ ] **DISC-03**: vmux affiche le nom de la branche git de chaque session -- [ ] **DISC-04**: vmux permet d'associer un label humain à une session (ex: "review MR !456") +- [x] **DISC-04**: vmux permet d'associer un label humain à une session (ex: "review MR !456") ### State Detection - [ ] **STATE-01**: vmux détecte l'état de chaque session : travaille / attend input / idle - [ ] **STATE-02**: vmux affiche un aperçu des dernières lignes de sortie de chaque session - [ ] **STATE-03**: vmux distingue le type d'attente (permission prompt, question utilisateur, idle prompt) -- [ ] **STATE-04**: vmux affiche le temps écoulé depuis que la session attend ("depuis 3 min") +- [x] **STATE-04**: vmux affiche le temps écoulé depuis que la session attend ("depuis 3 min") ### i3 Integration @@ -69,11 +69,11 @@ Which phases cover which requirements. Updated during roadmap creation. | DISC-01 | Phase 1 | Complete | | DISC-02 | Phase 1 | Complete | | DISC-03 | Phase 1 | Pending | -| DISC-04 | Phase 2 | Pending | +| DISC-04 | Phase 2 | Complete | | STATE-01 | Phase 1 | Pending | | STATE-02 | Phase 1 | Pending | | STATE-03 | Phase 3 | Pending | -| STATE-04 | Phase 2 | Pending | +| STATE-04 | Phase 2 | Complete | | I3-01 | Phase 2 | Pending | | I3-02 | Phase 2 | Pending | | I3-03 | Phase 4 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 1fe1fe6..5a47d6a 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -47,8 +47,8 @@ Plans: **Plans**: TBD Plans: -- [ ] 02-01: TBD -- [ ] 02-02: TBD +- [x] 02-01: TBD +- [x] 02-02: TBD ### Phase 3: Hook Server **Goal**: Les transitions d'etat sont detectees en moins d'une seconde grace aux hooks push de Claude Code diff --git a/.planning/STATE.md b/.planning/STATE.md index e77575e..e411e2e 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 2 context gathered -last_updated: "2026-03-23T14:22:11.460Z" +status: Ready to execute +stopped_at: Completed 02-02-PLAN.md +last_updated: "2026-03-23T16:47:11.294Z" progress: total_phases: 4 completed_phases: 1 - total_plans: 2 - completed_plans: 2 + total_plans: 5 + completed_plans: 4 --- # 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 01 — session-discovery +**Current focus:** Phase 02 — daemon-et-i3-bridge ## Current Position -Phase: 2 -Plan: Not started +Phase: 02 (daemon-et-i3-bridge) — EXECUTING +Plan: 3 of 3 ## Performance Metrics @@ -48,6 +48,8 @@ Plan: Not started *Updated after each plan completion* | Phase 01 P01 | 2min | 2 tasks | 5 files | | Phase 01 P02 | 4min | 2 tasks | 8 files | +| Phase 02 P01 | 5min | 2 tasks | 5 files | +| Phase 02 P02 | 4min | 2 tasks | 7 files | ## Accumulated Context @@ -60,6 +62,11 @@ Recent decisions affecting current work: - Roadmap: 4 phases derives des 4 categories de requirements - [Phase 01]: procDir injectable pour testabilite (pas de /proc en dur) - [Phase 01]: IdleThreshold = 60s (constante, configurable plus tard) +- [Phase 02]: WaitingSince gere par transition dans le registre, pas par le caller +- [Phase 02]: Scan initial synchrone avant socket listen (evite reponses vides) +- [Phase 02]: X11PIDResolver interface pour abstraire ewmh et tester sans X11 +- [Phase 02]: maxPPIDDepth=20 pour securiser la remontee de chaine PPID +- [Phase 02]: Priorite fuzzy match : label > branche > cwd ### Pending Todos @@ -71,6 +78,6 @@ None yet. ## Session Continuity -Last session: 2026-03-23T14:22:11.457Z -Stopped at: Phase 2 context gathered -Resume file: .planning/phases/02-daemon-et-i3-bridge/02-CONTEXT.md +Last session: 2026-03-23T16:47:11.291Z +Stopped at: Completed 02-02-PLAN.md +Resume file: None diff --git a/.planning/phases/02-daemon-et-i3-bridge/02-01-SUMMARY.md b/.planning/phases/02-daemon-et-i3-bridge/02-01-SUMMARY.md new file mode 100644 index 0000000..a8c9deb --- /dev/null +++ b/.planning/phases/02-daemon-et-i3-bridge/02-01-SUMMARY.md @@ -0,0 +1,114 @@ +--- +phase: 02-daemon-et-i3-bridge +plan: 01 +subsystem: daemon +tags: [go, unix-socket, ipc, json, proc, registry] + +requires: + - phase: 01-session-discovery + provides: "FindClaudeProcesses, FindSessionForProcess, DetectState, ExtractPreview" +provides: + - "SessionRegistry avec tracking WaitingSince" + - "LabelStore persistent dans ~/.vmux/labels.json" + - "Protocol IPC (Request/Response/SessionInfo) sur Unix socket" + - "Daemon avec poll loop 5s et socket server list/label/stop" +affects: [02-02, 02-03, 03-notifications] + +tech-stack: + added: [net/unix-socket] + patterns: [registry-update-pattern, stale-socket-cleanup, json-ipc] + +key-files: + created: [protocol.go, protocol_test.go, daemon.go, daemon_test.go] + modified: [types.go] + +key-decisions: + - "WaitingSince tracked par transition dans le registre (pas par le caller)" + - "LabelStore avec MkdirAll pour creer ~/.vmux/ au premier Set" + - "Scan initial synchrone avant d'accepter les connexions socket" + - "workspaceResolver comme fonction injectable (nil dans ce plan)" + +patterns-established: + - "Registry Update pattern: caller passe SessionInfo, le registre gere les transitions" + - "Stale socket cleanup: dial avant listen, supprimer si pas de reponse" + - "Test daemon pattern: tmpdir pour socket/proc/claude, populate apres Start" + +requirements-completed: [DISC-04, STATE-04] + +duration: 5min +completed: 2026-03-23 +--- + +# Phase 02 Plan 01: Daemon vmuxd Summary + +**Daemon vmuxd avec registre de sessions, Unix socket IPC (list/label/stop), labels persistants et tracking WaitingSince** + +## Performance + +- **Duration:** 5 min +- **Started:** 2026-03-23T16:41:05Z +- **Completed:** 2026-03-23T16:46:06Z +- **Tasks:** 2 +- **Files modified:** 5 + +## Accomplishments +- SessionRegistry avec suivi automatique des transitions WaitingSince +- LabelStore persistant en JSON avec creation automatique du repertoire +- Unix socket server gerant list, label et stop +- Poll loop toutes les 5s avec scan initial synchrone +- 14 tests dedies (protocol + registry + label + daemon integration), tous passent avec -race + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Protocol types + SessionRegistry + LabelStore** - `a49f7d1` (test) + `5315e88` (feat) +2. **Task 2: Unix socket server + poll loop + stop handler** - `4b142a7` (feat) + +## Files Created/Modified +- `protocol.go` - Types IPC : Request, Response, SessionInfo, SwitchArgs, LabelArgs +- `protocol_test.go` - Tests serialisation/deserialisation JSON +- `daemon.go` - SessionRegistry, LabelStore, Daemon (socket server + poll loop) +- `daemon_test.go` - Tests registre, labels, daemon integration via socket +- `types.go` - Session enrichi avec Workspace, Label, WaitingSince + +## Decisions Made +- WaitingSince est gere entierement par le registre lors des transitions d'etat, pas par le caller +- LabelStore cree le repertoire parent au premier Set (MkdirAll) +- Le daemon fait un scan synchrone avant d'ouvrir le socket (evite les reponses vides au demarrage) +- workspaceResolver est une fonction injectable, nil par defaut (plan 02-02 fournira l'implementation) + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 1 - Bug] Test populate apres Start au lieu d'avant** +- **Found during:** Task 2 (daemon tests) +- **Issue:** Le scan initial supprimait les sessions pre-populees via RemoveStale +- **Fix:** Populer le registre apres Start() dans les tests +- **Files modified:** daemon_test.go +- **Verification:** Tests passent avec -race +- **Committed in:** 4b142a7 + +--- + +**Total deviations:** 1 auto-fixed (1 bug) +**Impact on plan:** Fix necessaire pour la coherence du scan initial. Pas de scope creep. + +## Issues Encountered +None + +## User Setup Required +None - no external service configuration required. + +## Known Stubs +None - all code is fully wired. + +## Next Phase Readiness +- Protocol types et registry prets pour le plan 02-02 (i3 bridge) +- workspaceResolver a brancher sur ResolveWorkspace du plan 02-02 +- Handler "switch" a ajouter dans le plan 02-03 + +--- +*Phase: 02-daemon-et-i3-bridge* +*Completed: 2026-03-23*