docs(02-01): complete daemon vmuxd plan
- SUMMARY.md with protocol types, registry, labels, socket server - STATE.md updated: plan 3/3, decisions, metrics - ROADMAP.md updated: phase 02 progress - REQUIREMENTS.md: DISC-04, STATE-04 complete
This commit is contained in:
@@ -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-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
|
- [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-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 Detection
|
||||||
|
|
||||||
- [ ] **STATE-01**: vmux détecte l'état de chaque session : travaille / attend input / idle
|
- [ ] **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-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-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
|
### i3 Integration
|
||||||
|
|
||||||
@@ -69,11 +69,11 @@ Which phases cover which requirements. Updated during roadmap creation.
|
|||||||
| DISC-01 | Phase 1 | Complete |
|
| DISC-01 | Phase 1 | Complete |
|
||||||
| DISC-02 | Phase 1 | Complete |
|
| DISC-02 | Phase 1 | Complete |
|
||||||
| DISC-03 | Phase 1 | Pending |
|
| DISC-03 | Phase 1 | Pending |
|
||||||
| DISC-04 | Phase 2 | Pending |
|
| DISC-04 | Phase 2 | Complete |
|
||||||
| STATE-01 | Phase 1 | Pending |
|
| STATE-01 | Phase 1 | Pending |
|
||||||
| STATE-02 | Phase 1 | Pending |
|
| STATE-02 | Phase 1 | Pending |
|
||||||
| STATE-03 | Phase 3 | Pending |
|
| STATE-03 | Phase 3 | Pending |
|
||||||
| STATE-04 | Phase 2 | Pending |
|
| STATE-04 | Phase 2 | Complete |
|
||||||
| I3-01 | Phase 2 | Pending |
|
| I3-01 | Phase 2 | Pending |
|
||||||
| I3-02 | Phase 2 | Pending |
|
| I3-02 | Phase 2 | Pending |
|
||||||
| I3-03 | Phase 4 | Pending |
|
| I3-03 | Phase 4 | Pending |
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ Plans:
|
|||||||
**Plans**: TBD
|
**Plans**: TBD
|
||||||
|
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 02-01: TBD
|
- [x] 02-01: TBD
|
||||||
- [ ] 02-02: TBD
|
- [x] 02-02: TBD
|
||||||
|
|
||||||
### Phase 3: Hook Server
|
### Phase 3: Hook Server
|
||||||
**Goal**: Les transitions d'etat sont detectees en moins d'une seconde grace aux hooks push de Claude Code
|
**Goal**: Les transitions d'etat sont detectees en moins d'une seconde grace aux hooks push de Claude Code
|
||||||
|
|||||||
@@ -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 2 context gathered
|
stopped_at: Completed 02-02-PLAN.md
|
||||||
last_updated: "2026-03-23T14:22:11.460Z"
|
last_updated: "2026-03-23T16:47:11.294Z"
|
||||||
progress:
|
progress:
|
||||||
total_phases: 4
|
total_phases: 4
|
||||||
completed_phases: 1
|
completed_phases: 1
|
||||||
total_plans: 2
|
total_plans: 5
|
||||||
completed_plans: 2
|
completed_plans: 4
|
||||||
---
|
---
|
||||||
|
|
||||||
# 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 01 — session-discovery
|
**Current focus:** Phase 02 — daemon-et-i3-bridge
|
||||||
|
|
||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Phase: 2
|
Phase: 02 (daemon-et-i3-bridge) — EXECUTING
|
||||||
Plan: Not started
|
Plan: 3 of 3
|
||||||
|
|
||||||
## Performance Metrics
|
## Performance Metrics
|
||||||
|
|
||||||
@@ -48,6 +48,8 @@ Plan: Not started
|
|||||||
*Updated after each plan completion*
|
*Updated after each plan completion*
|
||||||
| Phase 01 P01 | 2min | 2 tasks | 5 files |
|
| Phase 01 P01 | 2min | 2 tasks | 5 files |
|
||||||
| Phase 01 P02 | 4min | 2 tasks | 8 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
|
## Accumulated Context
|
||||||
|
|
||||||
@@ -60,6 +62,11 @@ Recent decisions affecting current work:
|
|||||||
- Roadmap: 4 phases derives des 4 categories de requirements
|
- Roadmap: 4 phases derives des 4 categories de requirements
|
||||||
- [Phase 01]: procDir injectable pour testabilite (pas de /proc en dur)
|
- [Phase 01]: procDir injectable pour testabilite (pas de /proc en dur)
|
||||||
- [Phase 01]: IdleThreshold = 60s (constante, configurable plus tard)
|
- [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
|
### Pending Todos
|
||||||
|
|
||||||
@@ -71,6 +78,6 @@ None yet.
|
|||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-03-23T14:22:11.457Z
|
Last session: 2026-03-23T16:47:11.291Z
|
||||||
Stopped at: Phase 2 context gathered
|
Stopped at: Completed 02-02-PLAN.md
|
||||||
Resume file: .planning/phases/02-daemon-et-i3-bridge/02-CONTEXT.md
|
Resume file: None
|
||||||
|
|||||||
114
.planning/phases/02-daemon-et-i3-bridge/02-01-SUMMARY.md
Normal file
114
.planning/phases/02-daemon-et-i3-bridge/02-01-SUMMARY.md
Normal file
@@ -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*
|
||||||
Reference in New Issue
Block a user