diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index efe155d..cca64eb 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -9,8 +9,8 @@ Requirements for initial release. Each maps to roadmap phases. ### Session Discovery -- [ ] **DISC-01**: vmux détecte automatiquement les processus Claude Code actifs sur le poste -- [ ] **DISC-02**: vmux identifie le cwd et le worktree git de chaque session +- [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") @@ -66,8 +66,8 @@ Which phases cover which requirements. Updated during roadmap creation. | Requirement | Phase | Status | |-------------|-------|--------| -| DISC-01 | Phase 1 | Pending | -| DISC-02 | Phase 1 | Pending | +| DISC-01 | Phase 1 | Complete | +| DISC-02 | Phase 1 | Complete | | DISC-03 | Phase 1 | Pending | | DISC-04 | Phase 2 | Pending | | STATE-01 | Phase 1 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index a5d9314..1fe1fe6 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -31,7 +31,7 @@ Decimal phases appear between their surrounding integers in numeric order. **Plans**: 2 plans Plans: -- [ ] 01-01-PLAN.md — Scaffolding projet Go + detection des processus Claude via /proc +- [x] 01-01-PLAN.md — Scaffolding projet Go + detection des processus Claude via /proc - [ ] 01-02-PLAN.md — Parsing JSONL, heuristique d'etat et CLI vmux list ### Phase 2: Daemon et i3 Bridge diff --git a/.planning/STATE.md b/.planning/STATE.md index eeca2a5..daf18fa 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,16 +2,14 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone -status: planning -stopped_at: Phase 1 context gathered -last_updated: "2026-03-23T11:53:05.837Z" -last_activity: 2026-03-23 — Roadmap created +status: Ready to execute +stopped_at: Completed 01-01-PLAN.md +last_updated: "2026-03-23T12:26:26.157Z" progress: total_phases: 4 completed_phases: 0 - total_plans: 0 - completed_plans: 0 - percent: 0 + total_plans: 2 + completed_plans: 1 --- # Project State @@ -21,16 +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 1 - Session Discovery +**Current focus:** Phase 01 — session-discovery ## Current Position -Phase: 1 of 4 (Session Discovery) -Plan: 0 of 2 in current phase -Status: Ready to plan -Last activity: 2026-03-23 — Roadmap created - -Progress: [░░░░░░░░░░] 0% +Phase: 01 (session-discovery) — EXECUTING +Plan: 2 of 2 ## Performance Metrics @@ -52,6 +46,7 @@ Progress: [░░░░░░░░░░] 0% - Trend: - *Updated after each plan completion* +| Phase 01 P01 | 2min | 2 tasks | 5 files | ## Accumulated Context @@ -62,6 +57,7 @@ Recent decisions affecting current work: - Roadmap: CLI one-shot en Phase 1 (pas de daemon), daemon en Phase 2, hooks en Phase 3 - Roadmap: 4 phases derives des 4 categories de requirements +- [Phase 01]: procDir injectable pour testabilite (pas de /proc en dur) ### Pending Todos @@ -73,6 +69,6 @@ None yet. ## Session Continuity -Last session: 2026-03-23T11:53:05.835Z -Stopped at: Phase 1 context gathered -Resume file: .planning/phases/01-session-discovery/01-CONTEXT.md +Last session: 2026-03-23T12:26:26.155Z +Stopped at: Completed 01-01-PLAN.md +Resume file: None diff --git a/.planning/phases/01-session-discovery/01-01-SUMMARY.md b/.planning/phases/01-session-discovery/01-01-SUMMARY.md new file mode 100644 index 0000000..503ad5c --- /dev/null +++ b/.planning/phases/01-session-discovery/01-01-SUMMARY.md @@ -0,0 +1,91 @@ +--- +phase: 01-session-discovery +plan: 01 +subsystem: process-detection +tags: [go, proc, linux, cli] + +requires: [] +provides: + - "Go module scaffold (shell.nix, go.mod)" + - "Shared types: Process, Session, SessionState" + - "FindClaudeProcesses() scanning /proc for Claude PIDs" + - "EncodePath() converting absolute paths to ~/.claude/projects/ folder names" +affects: [01-02, 02-session-state] + +tech-stack: + added: [go-1.25, go-stdlib-os] + patterns: [injectable-procdir-for-testing, fake-proc-fixtures] + +key-files: + created: [shell.nix, go.mod, types.go, proc.go, proc_test.go] + modified: [] + +key-decisions: + - "filepath.Base matching for Claude binary detection (handles full paths)" + - "procDir parameter injection for testability (no hardcoded /proc)" + +patterns-established: + - "Fake /proc fixtures: createFakeProc() builds temp dirs with cmdline files and cwd symlinks" + - "Silent error skipping: permission denied and vanished processes are skipped, not fatal" + +requirements-completed: [DISC-01, DISC-02] + +duration: 2min +completed: 2026-03-23 +--- + +# Phase 01 Plan 01: Scaffolding + Process Detection Summary + +**Go module with FindClaudeProcesses() scanning /proc for active Claude Code PIDs and EncodePath() for session folder mapping** + +## Performance + +- **Duration:** 2 min +- **Started:** 2026-03-23T12:23:44Z +- **Completed:** 2026-03-23T12:25:44Z +- **Tasks:** 2 +- **Files created:** 5 + +## Accomplishments +- Go project scaffolded with NixOS shell.nix, go.mod, and shared types (Process, Session, SessionState) +- FindClaudeProcesses() scans configurable /proc directory, filters by "claude" binary name, reads cwd via Readlink +- EncodePath() converts paths to ~/.claude/projects/ folder format (replace / and . with -) +- 5 tests covering normal detection, permission denied, empty proc, and path encoding edge cases + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Scaffolding projet + types partages** - `12e1ba7` (feat) +2. **Task 2 RED: Failing tests for proc scanning** - `81ee7dc` (test) +3. **Task 2 GREEN: Implement FindClaudeProcesses and EncodePath** - `166e441` (feat) + +## Files Created/Modified +- `shell.nix` - NixOS dev environment with go and gopls +- `go.mod` - Go module github.com/pieMusic/vmux +- `types.go` - Shared types: Process, Session, SessionState (Working/NeedsInput/Idle/Unknown) +- `proc.go` - FindClaudeProcesses() and EncodePath() +- `proc_test.go` - 5 unit tests with fake /proc fixtures + +## Decisions Made +- Used `filepath.Base(parts[0])` for binary detection to handle full paths like `/nix/store/.../claude` +- Injected procDir as parameter for full testability without mocking os functions + +## Deviations from Plan + +None - plan executed exactly as written. + +## Issues Encountered +- shell.nix was in Pierre's global gitignore; force-added with `git add -f` since it is project-specific + +## User Setup Required + +None - no external service configuration required. + +## Next Phase Readiness +- Types and process detection ready for plan 01-02 (JSONL session matching, state heuristics, display) +- EncodePath enables PID-to-session folder mapping + +--- +*Phase: 01-session-discovery* +*Completed: 2026-03-23*