Goal
Frontend plumbing for terminals. Add src/shared/ipc/terminals.ts (typed wrappers around the 5 IPC commands) and src/features/terminals/store.ts (Zustand store tracking open terminals, focused id, optimistic open/close).
Store shape:
type TerminalsState = {
byId: Record<TerminalId, TerminalSnapshot>;
order: TerminalId[];
focusedId: TerminalId | null;
open(spec: OpenSpec): Promise<TerminalId>;
close(id: TerminalId): Promise<void>;
focus(id: TerminalId): void;
hydrateFromBackend(): Promise<void>;
};
Acceptance criteria
Files to create/modify
- create
src/shared/ipc/terminals.ts
- create
src/features/terminals/store.ts
- create
src/features/terminals/store.test.ts
References
- CLAUDE.md §Conventions TypeScript / React
- Mirror patterns from
src/features/projects/store.ts and src/features/kanban/store.ts
Dependencies
Blocked by T-232.
Goal
Frontend plumbing for terminals. Add
src/shared/ipc/terminals.ts(typed wrappers around the 5 IPC commands) andsrc/features/terminals/store.ts(Zustand store tracking open terminals, focused id, optimistic open/close).Store shape:
Acceptance criteria
src/shared/ipc/terminals.tsexportsinvokeTerminalsOpen,invokeTerminalsWrite,invokeTerminalsResize,invokeTerminalsClose,invokeTerminalsList, all typed via generated DTOsuseTerminalsStorecovers open / close / focus / hydrate with optimistic updates + rollback on IPC errorterminal:chunkandterminal:exitedvialisten()on store init; cleanup unlisten on teardownit("should open a terminal optimistically and roll back on error")it("should mark a terminal as exited when terminal:exited event arrives")it("should focus a newly opened terminal")pnpm exec oxlint . --max-warnings=0green;pnpm exec tsc -bgreenFiles to create/modify
src/shared/ipc/terminals.tssrc/features/terminals/store.tssrc/features/terminals/store.test.tsReferences
src/features/projects/store.tsandsrc/features/kanban/store.tsDependencies
Blocked by T-232.