Files
Codewalkers/.planning/phases/01-core-infrastructure/01-03-PLAN.md
Lukas May 074f79b855 docs(01): create phase 1 plan
Phase 01: Core Infrastructure
- 5 plans in 3 waves
- Wave 1: Project foundation (01-01)
- Wave 2: CLI, process mgmt, logging (01-02, 01-03, 01-04) [parallel]
- Wave 3: Server mode & shutdown (01-05)
- Ready for execution
2026-01-30 13:06:38 +01:00

101 lines
3.6 KiB
Markdown

---
phase: 01-core-infrastructure
plan: 03
type: execute
wave: 2
depends_on: ["01-01"]
files_modified: [src/process/registry.ts, src/process/manager.ts, src/process/types.ts]
autonomous: true
---
<objective>
Create process management utilities for spawning, tracking, and stopping child processes.
Purpose: Infrastructure for managing agent processes in later phases. Agents are child processes that need lifecycle management.
Output: ProcessManager class with spawn, stop, list, and restart operations.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/execute-plan.md
@~/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
</context>
<tasks>
<task type="auto">
<name>Task 1: Create process types and registry</name>
<files>src/process/types.ts, src/process/registry.ts</files>
<action>
Create src/process/types.ts:
- ProcessInfo interface: { id: string, pid: number, command: string, args: string[], startedAt: Date, status: 'running' | 'stopped' | 'crashed' }
- SpawnOptions: { id: string, command: string, args?: string[], cwd?: string, env?: Record<string, string> }
Create src/process/registry.ts:
- ProcessRegistry class with Map<string, ProcessInfo> storage
- register(info: ProcessInfo): void
- unregister(id: string): void
- get(id: string): ProcessInfo | undefined
- getAll(): ProcessInfo[]
- getByPid(pid: number): ProcessInfo | undefined
- clear(): void
Registry is in-memory for now (Phase 2 adds SQLite persistence).
</action>
<verify>TypeScript compiles, registry can add/remove/list processes</verify>
<done>ProcessRegistry class works with full CRUD operations</done>
</task>
<task type="auto">
<name>Task 2: Create process manager with spawn/stop</name>
<files>src/process/manager.ts, src/process/index.ts</files>
<action>
Create src/process/manager.ts:
- Import execa for process spawning
- ProcessManager class:
- constructor takes ProcessRegistry instance
- spawn(options: SpawnOptions): Promise<ProcessInfo> - spawns detached child, registers in registry, returns info
- stop(id: string): Promise<void> - sends SIGTERM, waits up to 5s, then SIGKILL if needed
- stopAll(): Promise<void> - stops all registered processes
- restart(id: string): Promise<ProcessInfo> - stops then respawns with same config
- isRunning(id: string): boolean - checks if process is alive
Use execa with { detached: true } for background processes.
Store spawned process reference to enable stop/restart.
Handle process exit events to update registry status.
Create src/process/index.ts - export ProcessManager, ProcessRegistry, types.
</action>
<verify>Can spawn a simple process (e.g., sleep 10), list it, stop it</verify>
<done>ProcessManager can spawn, stop, restart, and list child processes</done>
</task>
</tasks>
<verification>
Before declaring plan complete:
- [ ] `npm run build` succeeds
- [ ] ProcessRegistry correctly tracks process info
- [ ] ProcessManager.spawn() starts a detached process
- [ ] ProcessManager.stop() terminates running process
- [ ] ProcessManager.isRunning() correctly reports status
- [ ] Process exit updates registry status automatically
</verification>
<success_criteria>
- All tasks completed
- All verification checks pass
- Process lifecycle (spawn → track → stop) works end-to-end
- Infrastructure ready for agent management in Phase 4
</success_criteria>
<output>
After completion, create `.planning/phases/01-core-infrastructure/01-03-SUMMARY.md`
</output>